IF Abfrage, vorletzer Datensatz?

7. September 2006 10:54

Moin - ich mal wieder ;)

Problem diesmal:

Ich habe eine IF Abfrage, dann wird eine Repeat schleife gestartet:
Code:
IF gRecVerg.FIND('-') THEN BEGIN
  REPEAT
    IF gRecVerg.GET(
      Code,
      gRecVerg.Type,
      gRecVerg.ID)
    THEN BEGIN
//      IF gRecVerg.NEXT >= 1
//      THEN BEGIN
        lTxtTableFilter := lTxtTableFilter + FORMAT(gRecVerg.ID) + '|';
//      END
//      ELSE
//        lTxtTableFilter := lTxtTableFilter + FORMAT(gRecVerg.ID);
    END
    ELSE
      MESSAGE('Kein Unterschied gefunden,Filter Export wird abgebrochen.');
  UNTIL gRecVerg.NEXT = 0;
END;


So, das ausgeklammerte war ein kleiner Gedankengang von mir der aber nicht funktioniert..
Er sollte, wenn er beim letzen Datensatz angekommen ist, einfach das '|' weglassen.
Funktioniert zwar,jedoch lässt er auch den ALLERERSTEN Wert im Datensatz weg,sprich er schreibt jeden gewollten Datensatz rein, nur den ersten nicht.

Kleiner Denkfehler von mir, oder komplett falscher weg?
Hoffe auf eure Hilfe :)

7. September 2006 12:05

selbst auf die lösung gekommen,
warscheinlich nicht das "edelste" aber es funktioniert ;)

Lösung:

Code:
lTxtTableFilter := '';
lIntGetLines := 0;
lIntGetLines2 := 0;

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
        lTxtTableFilter := lTxtTableFilter + FORMAT(gRecVerg.ID) + '|';
      END
      ELSE
        lTxtTableFilter := lTxtTableFilter + FORMAT(gRecVerg.ID);
    END
    ELSE
      MESSAGE('Kein Unterschied gefunden,Filter Export wird abgebrochen.');
  UNTIL gRecVerg.NEXT = 0;
END;



Erst einmal Linien zählen -> in ne lokale Variable,
dann anstatt es mit next zu versuchen, eine zweite lokale Zählvariable,
die dann immer miteinander vergleichen:

WENN LokalZähl2 < LokalZähl1 DANN Bedingung 1,
sonst Bedingung 2



wieder mal so simpel gewesen .. :D

7. September 2006 12:23

Kleiner Tipp, der häufig hilft:
Nicht zu kompliziert denken und auch mal andere Lösungswege in Erwägung ziehen.

Hier zwei Alternativen:

1. Wir prüfen erst gar nicht, ob wir auf dem vorletzten Datensatz sind und schneiden zum Schluß einfach das überflüssige | ab:
Code:
IF gRecVerg.FIND('-') THEN BEGIN
  REPEAT
    IF gRecVerg.GET(
      Code,gRecVerg.Type,gRecVerg.ID)
    THEN
        lTxtTableFilter += FORMAT(gRecVerg.ID) + '|';
    ELSE
      MESSAGE('Kein Unterschied gefunden,Filter Export wird abgebrochen.');
  UNTIL gRecVerg.NEXT = 0;
  lTxtTableFilter := DELCHR(lTxtTableFilter,'>','|');
END;


2. Wir drehen die Abfrage um und prüfen, ob wir im ersten Durchlauf sind:
Code:
IF gRecVerg.FIND('-') THEN BEGIN
  IsFirstRun := TRUE;
  REPEAT
    IF gRecVerg.GET(
      Code,gRecVerg.Type,gRecVerg.ID)
    THEN
      IF IsFirstRun THEN BEGIN
        lTxtTableFilter := FORMAT(gRecVerg.ID);
        IsFirstRun := FALSE;
      END ELSE
        lTxtTableFilter += '|' + FORMAT(gRecVerg.ID);
    ELSE
      MESSAGE('Kein Unterschied gefunden,Filter Export wird abgebrochen.');
  UNTIL gRecVerg.NEXT = 0;
END;

7. September 2006 13:00

Danke dir für diese beiden weiteren Möglichkeiten,
die erste hatte ich auch schon in erwägung gezogen,
wusste aber nicht wie ich den letzten buchstaben abschneiden soll,
versuchte es mit

lTxtTableFilter - '|'


das ging natürlich nicht ;)

16. September 2006 14:16

Etwas spät, aber hab mich gerade erst angemeldet. Also Hallo zusammen :)

Ich bevorzuge die ganz "stumpfe" Methode, in der ich die Filtervariable mit einem nicht vorkommenden Wert initialisiere und den Filter in der Schleife nur erweitere:

Code:
IF gRecVerg.FIND('-') THEN BEGIN
  lTxtTableFilter := '0':
  REPEAT
    IF gRecVerg.GET(
      Code,
      gRecVerg.Type,
      gRecVerg.ID)
    THEN BEGIN
        lTxtTableFilter := lTxtTableFilter + '|' + FORMAT(gRecVerg.ID);
    END
    ELSE
      MESSAGE('Kein Unterschied gefunden,Filter Export wird abgebrochen.');
  UNTIL gRecVerg.NEXT = 0;
END;