[Gelöst] Überlauf bei Export verhindern?

9. Oktober 2006 14:03

Moin moin - folgendes Problem:

Ein Filter soll in eine Textdatei exportiert werden,
die Filter Elemente werden automatisch generiert,
da eine Text Variable ja nur 250 Zeichen oder so speichern kann,
soll nach 250 Zeichen in die Textdatei geschrieben werden,
danach die Variable geleert werden und so weiter.

Dachte eigentlich das es so funktioniert,
jedoch bekomme ich immer die Meldung "Überlauf bei der Typkonvertierung von Text to Text." - toll sagt mir viel.

Was habe ich falsch gemacht,wisst Ihr Rat?

Code:
lTxtTableFilter := '';
lIntGetLines := 0;
lIntGetLines2 := 0;
lDatDate := TODAY;
lTxtDate := FORMAT(lDatDate, 0, '<Year4><Month,2><Day,2>');
lTimTime := TIME;
lTxtTime := FORMAT(lTimTime, 6, 2);
lTxtDateTime := lTxtDate+' '+lTxtTime;

gRecVerg.SETFILTER(gRecVerg.fBlnDiffersInAnyAttribute,'Ja');
IF gRecVerg.FIND('-') THEN BEGIN
  REPEAT
    lIntGetLines := lIntGetLines + 1;
  UNTIL gRecVerg.NEXT = 0;
END;

IF gRecVerg.FIND('-') THEN BEGIN
  REPEAT
    lIntGetLines2 := lIntGetLines2 + 1;
    IF gRecVerg.GET(
      Code,
      gRecVerg.Type,
      gRecVerg.ID)
    THEN BEGIN
      IF lIntGetLines2 < lIntGetLines
      THEN BEGIN
        IF STRLEN(lTxtTableFilter) < 250 THEN BEGIN
          lTxtTableFilter := lTxtTableFilter + FORMAT(gRecVerg.ID) + '|';
        END
        ELSE IF STRLEN(lTxtTableFilter) = 250 THEN BEGIN
          lFilOutputFile.TEXTMODE(TRUE);
          lFilOutputFile.CREATE(lTxtDateTime+' Objektvergleich'+'.txt');
          lFilOutputFile.WRITE(lTxtTableFilter);
        END
        ELSE IF STRLEN(lTxtTableFilter) > 250 THEN BEGIN
          MESSAGE('Achtung: Überlauf, Vorgang wird angehalten!');
        END
      END
      ELSE
        IF STRLEN(lTxtTableFilter) < 250 THEN BEGIN
          lTxtTableFilter := lTxtTableFilter + FORMAT(gRecVerg.ID);
        END
        ELSE IF STRLEN(lTxtTableFilter) = 250 THEN BEGIN
          lFilOutputFile.TEXTMODE(TRUE);
          lFilOutputFile.CREATE(lTxtDateTime+' Objektvergleich'+'.txt');
          lFilOutputFile.WRITE(lTxtTableFilter);
        END
        ELSE IF STRLEN(lTxtTableFilter) > 250 THEN BEGIN
          MESSAGE('Achtung: Überlauf, Vorgang wird angehalten!');
        END

    END
    ELSE
      MESSAGE('Kein Unterschied gefunden,Filter Export wird abgebrochen.');
  UNTIL gRecVerg.NEXT = 0;
END;


lFilOutputFile.TEXTMODE(TRUE);
lFilOutputFile.CREATE(lTxtDateTime+' Objektvergleich'+'.txt');
lFilOutputFile.WRITE(lTxtTableFilter);

9. Oktober 2006 15:03

Die Meldung 'Überlauf bei...' erscheint immer dann, wenn ein Wert von einer Variablen in eine andere geschrieben werden soll, und die Zielvariable weniger Zeichen aufnehmen kann, als in der Ausgangsvariablen vorhanden sind.

Vermeiden lässt sich das mit dem Befehlt COPYSTR. Damit kann man eine bestimmte Länge eines Strings verwenden. Wird oft auch im Zusammenhang mit MAXSTRLEN verwendet, um die maximale Grösse des Zieles zu berücksichtigen.

In der Online-Hilfe sind diese beiden Befehle gut beschrieben.

9. Oktober 2006 15:08

Code:
IF STRLEN(lTxtTableFilter) < 250 THEN BEGIN
          lTxtTableFilter := lTxtTableFilter + FORMAT(gRecVerg.ID) + '|';

So darf man in diesem Fall nicht vergleichen. gRecVerg.ID hat ja keine festgelegte Länge.
Hier gibt es den Überlauf, wenn die Variablenlänge schon bei z.B. 248 steht. Dann wird versucht anzuhängen und es kommt zum Abbruch, wenn die ID mehr als eine Stelle hat. Es muss vorher über STRLEN die "Länge alt" plus "Länge Anhang" verglichen werden um festzustellen, ob noch angehängt werden kann.
Zuletzt geändert von Kowa am 10. Oktober 2006 12:05, insgesamt 1-mal geändert.

10. Oktober 2006 09:05

Danke für den Hinweis Kowa - das war mein Denkfehler..
schon wieder eine so simple sache auf die ich nicht kam.. schrecklich!