Seite 1 von 1

Datensatze durchsuchen

Verfasst: 10. Oktober 2006 09:27
von mgerhartz
Hallo zusammen,

ich habe da mal eine Frage. Ich möchte eine Tabelle durchsuchen. Hierfür grenze ich diese mit SETRANGE auf eine bestimmtes Jahr ab. Gibt es mehrere Einträge innerhalb des Suchergebnisses, möchte ich den letzten mit dem vorletzten Eintrag vergleichen. Die Tabelle hat neben einer "Gliederungsnummer" noch eine eine Spalte "Zeilennummer". Deshalb habe ich zuerst folgendes versucht:

Code:
    StructureHistory.SETRANGE(Year, buja);
    StructureHistory.FIND('+');
    ZeilenNr := StructureHistory."Line No.";
   
    StructureHistory.GET("StrNo.",(ZeilenNr));
    ReBe1 :=  StructureHistory."Accounts Statement Liability";
   
    StructureHistory.GET("StrNo.",(ZeilenNr - 1));
    ReBe2 := StructureHistory."Accounts Statement Liability";


Allerdings habe ich dann festgestellt, dass das Ergebnis nicht zu gebrauchen war. Das Ergebnis konnte bspw. so aussehen:

"Gl. Nr."---"Jahr"-----"Zeile Nr."-----"Ergebnis"
123--------2005---------3---------------Ja
123--------2005---------4---------------Ja
123--------2005---------6---------------Ja


Sprich, es hatte sich ein Eintrag aus dem Jahr 2004 (123-------2004------5----Ja) dazwischen gemogelt.

Wie springe ich in meinem o. g. Suchergebnis Zeilenweise nach hinten? StructurHistory.FIND('-1') funktioniert nicht.

Verfasst: 10. Oktober 2006 09:42
von Michael Schumacher
versuchs mal mit structurhistory.next(-1)

Verfasst: 10. Oktober 2006 09:49
von mgerhartz
Hi Michael,

dann erscheint leider folgender Hinweis:

Verfasst: 10. Oktober 2006 09:53
von rotsch
Du musst sicherstellen, dass die Schleife beim letzten gefundenen Satz aufhört, also

Code:
UNTIL structurhistory.next(-1) = 0;

Verfasst: 10. Oktober 2006 09:58
von Michael Schumacher
Da die Zeile, wo du zurückgehen wolltest, nicht im Programmcode enthalten war, konnte ich nicht wissen, dass du das Rückgabeergebnis brauchst.
wenn kein vorheriger datensatz mehr existiert, ist das Rückgabeergebnis 0 sonst der Wert, der in der Klammer steht in diesem Fall also -1
lies Dir dazu auch mal die Onlinehilfe zum NEXT Befehl durch, dann wird das klarer.
wenn du also ein True brauchst solange es einen vorherigen Datensatz gibt, schreibst du:
IF (structurhistory.next(-1)<>0) then.....

Verfasst: 10. Oktober 2006 10:01
von mgerhartz
Hi Rotsch,

wieso Schleife?
Code:

  IF AnzZeilen > 1 THEN
  BEGIN
    StructureHistory.SETRANGE(Year, buja);
    IF StructureHistory.FIND('+') THEN
      ReBePflicht1 :=  StructureHistory."Accounts Statement Liability";
   
    IF StructureHistory.NEXT(-1) THEN
      ReBePflicht2 := StructureHistory."Accounts Statement Liability";


Nun gut, ich habe natürlich nicht den ganzen Code eingestellt. Zuvor prüfe ich (AnzZeilen) ob mehrere Zeilen vorhanden sind. Und dann brauch ich ja nur eine Zeile zurück gehen.

Verfasst: 10. Oktober 2006 10:06
von Michael Schumacher
ok, dann mach es so:
Code:
    StructureHistory.SETRANGE(Year, buja);
    IF StructureHistory.FIND('+') THEN
      ReBePflicht1 :=  StructureHistory."Accounts Statement Liability";
   
    IF (StructureHistory.NEXT(-1)<>0) THEN
      ReBePflicht2 := StructureHistory."Accounts Statement Liability";


Die Abfrage für Anzzeilen brauchst du dann auch nicht mehr.
Du solltest nur vorher dafür sorgen, dass ReBePflicht1 und ReBePflicht2 auf nein gesetzt werden, damit nur dann ein Ja kommt, wenn auch eine Zeile existiert, die ein Ja erhält. Sonst hast du auf einmal ein Ja, obwohl es gar keine Zeile gibt, weil das von der vorherigen Abfrage noch in der Variablen steht.

Verfasst: 10. Oktober 2006 10:43
von mgerhartz
Danke erst mal für Eure schnelle Hilfe. Muss mich gerade noch um eine andere Sache kümmern. Ich melde mich wieder, wenn ich damit fertig bin... So long...