Webservicefehler --> There is not sufficient memory ..

24. Januar 2011 21:09

Hallo,
über ein Webservice (C#-Applikation) wird ein Abbuchung-Artikelblatt befüllt und danach mit diesen Code
Code:
IF LineNo = 0 THEN
  ERROR(Text51501);

CLEAR(ItemJnlLine);
ItemJnlLine.RESET;
ItemJnlLine.SETRANGE("Journal Template Name", TemplateCode);
ItemJnlLine.SETRANGE("Journal Batch Name", BatchName);
ItemJnlLine.SETRANGE("Line No.", LineNo);
IF ItemJnlLine.FINDSET THEN BEGIN
  IF NOT ItemJnlPostBatch.RUN(ItemJnlLine) THEN BEGIN
    ItemJnlLine.DELETE(TRUE);
    COMMIT;
    ERROR(GETLASTERRORTEXT);
  END;
END;

abgearbeitet.
Nun habe ich das Problem, das machmal die Buchung nicht funktioniert.
Wenn ich den Befehl ERROR(GETLASTERRORTEXT) vor der Zeile ItemJnlLine.DELETE(TRUE) gebe erhalte ich die Fehlermeldung:
'There is insufficient memory to execute this function this can be caused by recursive function call.'

Wie schon erwähnt tritt diese Fehler nur teilweise auf. Aufgefallen ist mir das die Häufigkeit des Fehler zunimmt.
Wie könnte ich dies herausfinden.

lg
stony

Re: Webservicefehler --> There is not sufficient memory ..

24. Januar 2011 21:19

Der Reihe nach - was soll im Falle der Nichtbuchung passieren? Die Buchblattzeile (wirklich nur eine?) soll gelöscht werden UND eine Fehlermeldung ausgegeben werden?

Ansonsten: Kein GETLASTERRORTEXT ohne CLEARLASTERROR vor der Buchung.

Dann noch ein bisschen Kosmetik:

Statt
Code:
CLEAR(ItemJnlLine);
ItemJnlLine.RESET;
ItemJnlLine.SETRANGE("Journal Template Name", TemplateCode);
ItemJnlLine.SETRANGE("Journal Batch Name", BatchName);
ItemJnlLine.SETRANGE("Line No.", LineNo);
IF ItemJnlLine.FINDSET THEN BEGIN

schreibe
Code:
IF ItemJnlLine.GET(TemplateCode, BatchName, LineNo) THEN BEGIN

Re: Webservicefehler --> There is not sufficient memory ..

24. Januar 2011 21:24

Bei Nichtbuchung soll die Zeile gelöscht werden (wirklich nur eine, da immer nur eine Zeile eingegeben werden kann) und wie du erwähnt hast auch eine Fehlermeldung.
Wenn ich dich richtig verstehe, soll ich vorher ein CLEARLASTERROR machen.

lg
stony

Re: Webservicefehler --> There is not sufficient memory ..

24. Januar 2011 21:40

stony hat geschrieben:Wenn ich dich richtig verstehe, soll ich vorher ein CLEARLASTERROR machen.

Ja, auf jeden Fall vor Aufruf der Buchungs-Codeunit.

Wenn du sicher stellen möchtest, dass du wirklich nur diese eine Zeile buchen möchtest (weil vielleicht doch noch eine zweite sich im Buchblatt befinden könnte), dann versuch mal folgendes:

Code:
IF ItemJnlLine.GET(TemplateCode, BatchName, LineNo) THEN BEGIN
  ItemJnlLine.SETRECFILTER;  // Auf aktuellen DS filtern
  CLEAR(ItemJnlPostBatch); // wichtig: Codeunit-Variable initialisieren
  CLEARLASTERROR;
  IF NOT ItemJnlPostBatch.RUN(ItemJnlLine) THEN BEGIN
    ItemJnlLine.DELETE(TRUE); // evtl. debuggen, ob wir noch immer
                             // auf dem richtigen Datensatz stehen
    COMMIT;
    ERROR(GETLASTERRORTEXT); // Muss es eigentlich ERROR sein?
  END;
END;


Was mich stutzig macht, ist jedoch die Fehlermeldung.
Wann genau wird dein Quelltext überhaupt ausgeführt? Wo hast du ihn eingehängt?

Re: Webservicefehler --> There is not sufficient memory ..

25. Januar 2011 07:23

Was meinst du mit
ERROR(GETLASTERRORTEXT); // Muss es eigentlich ERROR sein?

Der Code ist in einer C#-Applikation, welche auf einen Scanner mit Windows CE läuft.
Der Aufruf sieht folgermaßen aus: (dabei handelt es sich um eine Methode)
Code:
public static bool WriteArtikelZubuchungLinieFertigProdBuchblatt()
        {
            bool ret = true;
            try
            {
                SCHWSArtikelBuchblatt.SCHWSArtikelBuchblatt_Service artikelbuchblattserv = new SCHWSArtikelBuchblatt.SCHWSArtikelBuchblatt_Service();
                SCHWSArtikelBuchblatt.SCHWSArtikelBuchblatt artikelbuchblatt = new SCHWSArtikelBuchblatt.SCHWSArtikelBuchblatt();

                SCHMSMDEManagement.SCHWSMDEManagement wsmde = new SCHMSMDEManagement.SCHWSMDEManagement();
                wsmde.Credentials = Userdata.getCredentials();

                //Damit werden alle Zeile, welche zu diesen Buchblatt gehören, aus der Tabelle "Item Journal Line" gelöscht.
                //Dies ist notwendig, da teilweise Zeilen nicht verbucht werden und danach nichts mehr geht.
                wsmde.ItemJnlLineDelete(SCHZubuchungLinieFertigProdProcess.Template, SCHZubuchungLinieFertigProdProcess.Batch);

                artikelbuchblattserv.Credentials = Userdata.getCredentials();

                artikelbuchblatt.Line_No = 10;     
                artikelbuchblatt.Line_NoSpecified = true;
                artikelbuchblatt.Posting_Date = DateTime.Today;
                artikelbuchblatt.Item_No = SCHZubuchungLinieFertigProdProcess.ArtikelNr;
                artikelbuchblatt.Location_Code = "LAGERA";
                artikelbuchblatt.Bin_Code = SCHZubuchungLinieFertigProdProcess.Lagerplatz;
                artikelbuchblatt.Quantity = SCHZubuchungLinieFertigProdProcess.Qty * SCHZubuchungLinieFertigProdProcess.PKUmrechnungsfaktor;
                artikelbuchblatt.QuantitySpecified = true;

                artikelbuchblatt.Posting_Line = true;
                artikelbuchblatt.Posting_LineSpecified = true;

                artikelbuchblattserv.Create(SCHZubuchungLinieFertigProdProcess.Batch, ref artikelbuchblatt);


                //Buchung durchführen
                WSWMSManagement.WMSManagment WMS = new WSWMSManagement.WMSManagment();
                WMS.Url = SCHNavision.AutocompleteUrl(ConfigReader.GetValue("WebserviceUrlWMSManagment"));
                WMS.Credentials = Userdata.getCredentials();

                try
                {
                    WMS.SCHPostItemItemJnlLineZu(
                        SCHZubuchungLinieFertigProdProcess.Template,
                        SCHZubuchungLinieFertigProdProcess.Batch,
                        SCHZubuchungLinieFertigProdProcess.ArtikelNr,
                        10);    //ist die Zeilennummer, diese wird auf mit Line_No 10 beim erzeugen des artikelbuchblattes gesetzt.
                }
                catch (Exception e)
                {
                    Log.Error("Fehler bei der Buchung von ZubuchungLinieFertigProd " + e.ToString());
                    Navision.LastErrorMessage = e.Message;

                    ret = false;
                }
            }
            catch (Exception e)
            {
                Navision.LastErrorMessage = e.Message;
                ret = false;
            }
            return ret;
        }

Re: Webservicefehler --> There is not sufficient memory ..

1. Februar 2011 04:48

Hallo,
hat jemand von euch noch eine Idee, wie ich den Fehler finden könnte.
lg
stony

Re: Webservicefehler --> There is not sufficient memory ..

1. Februar 2011 12:20

Ich würde ein IF Codeunit.run Segment einbauen, der vor dem Benutzen der Buchungs-CU eingehangen wird.
So grob

Code:
CLEARLASTERRORTEXT;
IF NOT Codeunit.RUN(12) THEN BEGIN
  //create log entry
  LogEntry."Error Message" = copystr(GETLASTERRORTEXT, 1, "Fieldlength"(LogEntry."Error Message"))
  LogEntry.INSERT;
END;


Dann hast du die letzte Fehlermeldung aus der Buchungsroutine in deiner Log-Datei und kannst dies dir dann anschauen.
Ich finde dies immer praktisch bei Buchungsautomatismen.

Re: Webservicefehler --> There is not sufficient memory ..

1. Februar 2011 12:51

Meinst du bei Fieldlenght ein die Funktion STRLEN.

Re: Webservicefehler --> There is not sufficient memory ..

1. Februar 2011 15:02

Ich meine die Funktion MAXSTRLEN.
Damit soll verhindert werden, dass es zu einem Text -> Text Konvertierungsfehler kommt, da die Fehlermeldung auch gerne mal mehr Zeichen hat als in dem Feld platz ist.
Meistens reicht ja der Anfang, um den Fehler zu verstehen. (zB ersten 100 oder 250 Zeichen)