Codeproblem

2. Oktober 2006 15:27

Hi,

ich habe folgendes Problem. Ich habe einen paar Zeilen Code in einen Bericht eingefügt.

Code:
//-----------------------UO1.39.001----Start-------------------------------
AnzZeilen := 0;
AktuellesJahr := DATE2DMY(TODAY, 3);
IF AktuellesJahr = buja THEN                                                  // wenn das Buchungsjahr dem aktuellen entspricht,
  ReBePflicht := Structure."Accounts Statement Liability"                     // dann in der Gliederung schauen
ELSE
BEGIN
  StructureHistory.SETCURRENTKEY(StructureHistory."Structure No.");
  StructureHistory.SETRANGE(StructureHistory."Structure No.","Structure No.");
  StructureHistory.SETRANGE(StructureHistory.Year,buja);

//---------Prüfen, ob innerhalb des Filtes mehr als eine Zeile existiert---------

  IF StructureHistory.FIND('-') THEN                                         // gibt es einen Eintrag, dann Zeilen zählen
  BEGIN
    REPEAT
    AnzZeilen := AnzZeilen + 1;
    UNTIL StructureHistory.NEXT = 0;
  END
    ELSE                                                                     // gibt es keinen Eintrag, dann Range lösen und solange
  BEGIN                                                                      // zurückgehen, bis Eintrag gefunden wurde
    REPEAT
    StructureHistory.SETRANGE(StructureHistory.Year);
    StructureHistory.SETRANGE(StructureHistory.Year,(buja-1));
    UNTIL StructureHistory.FIND('-');
    BEGIN
      REPEAT                                                                 // gibt es einen Eintrag, dann Zeilen zählen
      AnzZeilen := AnzZeilen + 1;
      UNTIL StructureHistory.NEXT = 0;
    END
  END;

// ------------------------------

  IF AnzZeilen = 1 THEN                                               // existiert nur eine Zeile, dann wird diese genommen
    ReBePflicht := StructureHistory."Accounts Statement Liability"
  ELSE                                                                // gibt es mehr Zeilen, dann eine Zeile zurück und diesen Wert
    StructureHistory.FIND('+');                                       // nehmen und das Ergebnis umkehren
    ZeilenNr := StructureHistory."Line No.";
    IF StructureHistory.GET("Structure No.",(ZeilenNr)) THEN
      ReBePflicht :=  StructureHistory."Accounts Statement Liability";
    IF StructureHistory.GET("Structure No.",(ZeilenNr - 1)) THEN
      ReBePflicht1 := StructureHistory."Accounts Statement Liability";
    IF ReBePflicht <> ReBePflicht1 THEN
    BEGIN
      IF ReBePflicht = TRUE THEN
        ReBePflicht := FALSE
      ELSE
        ReBePflicht := TRUE;
    END
      ELSE
      ReBePflicht :=  StructureHistory."Accounts Statement Liability";
END;


Führe ich den Report mit dem Filter Gliederungsnummer = 13* aus funktioniert das reibungslos. Nehme ich einen größen Bereich bspw. 07000000..13000000, dann hängt sich Navision auf.

Nehme an, dass die Repeat Until Schleife nicht sauber programmiert ist.

2. Oktober 2006 16:49

hi,
die Schleifen zum Zaehlen kannst du mit dem Befehl Anzahl := Tabelle.Count() vereinfachen.

Das schaut mir spontan nach einer Endlosschleife aus. buja selbst wird nicht veraendert, und wenn er im ersten Durchgang nichts findet bleibt er da drinnen ;). Ist StructureHistory.Year ein Date Feld? Ich frage mich gerade, ob nicht ein SETFILTER kombiniert mit CALCDATE() notwendig ist.

Zum Testen wegen der Endlosschleife kannst du ja den Debugger aktivieren.

Bei der 2. Schleife kannst du wieder den COUNT Befehl verwenden.

mgerhartz hat geschrieben:REPEAT
StructureHistory.SETRANGE(StructureHistory.Year);
StructureHistory.SETRANGE(StructureHistory.Year,(buja-1));
UNTIL StructureHistory.FIND('-');
BEGIN
REPEAT
AnzZeilen := AnzZeilen + 1;
UNTIL StructureHistory.NEXT = 0;
END

2. Oktober 2006 16:56

Hi Feri,

danke für die Antwort. Habe die Zähl-Schleife durch COUNT ersetzt. Das Feld StructureHistory.Year ist vom Typ Integer. So muss jetzt meinen Zug bekommen. Werde aber zu Hause weiter daran arbeiten.

3. Oktober 2006 16:19

Ich benötige noch ein richtiges Ausstiegskriterium. Die Zeile

"UNTIL ((StructureHistory.Year = 2000) OR (StructureHistory.FIND('-')));"

sollte auch einen Ausstieg bewirken, wenn ein Eintrag gefunden wurde und der Filter das Jahr 2000...

StructureHistory.SETRANGE(Year,2000);

...erreicht hat. Habe ich den Code so richtig geschrieben?

Übrigens habe ich, glaube ich zumindest, den Grund fürs Aufhängen gefunden. Einige Datensätze wurden erst in diesem Jahr angelegt. Wenn man den Filter BuJa = 2005 wählt, dann findet er keinen entsprechenden Eintrag. Jedenfalls lasse ich vorher prüfen, ob das Jahr im Filter kleiner ist als das Jahr der Erstellung des Datensatzes. Ist das der Fall, dann CurrReport.SKIP;

Code:
//---------Prüfen, ob innerhalb des Filtes mehr als eine Zeile existiert-----------------------------------------------------------

  StructureHistory.SETRANGE(StructureHistory."Structure No.","Structure No.");
  StructureHistory.SETRANGE(StructureHistory.Year,buja);
  IF StructureHistory.FIND('-') THEN                                          // BuJa = SH.Year (Treffer)
  BEGIN
    AnzZeilen := StructureHistory.Count;                                      // Zeilen zählen
  END
    ELSE
  BEGIN
    REPEAT
    StructureHistory.SETRANGE(StructureHistory.Year);                         // Alte RANGE lösen
    StructureHistory.SETRANGE(StructureHistory.Year,(buja-1));                // BuJa = SH.Year (Kein Treffer), dann (BuJa-1)
    UNTIL ((StructureHistory.Year = 2000) OR (StructureHistory.FIND('-')));   // bis Year = 2000 ODER Treffer
    IF StructureHistory.FIND('-') THEN
    BEGIN
      AnzZeilen := StructureHistory.Count;                                    // Zeilen zählen
    END
  END;


So, nun genug für heute gekrübelt. Schließlich ist heute Feiertag. Morgen wieder frisch ans Werk.

P.S.: Kann auch keine genaue Aussagen darüber treffen, ob der Fehler behoben ist, da ich zu Hause eine älter Version der Datenbank habe.

3. Oktober 2006 16:38

mgerhartz hat geschrieben:"UNTIL ((StructureHistory.Year = 2000) OR (StructureHistory.FIND('-')));"


Ich würde stattdessen folgendes verwenden:

Code:
UNTIL (StructureHistory.Year = 2000) OR (StructureHistory.NEXT = 0);


Dann hört die Schleife auf, wenn keine Datensätze mehr vorhanden sind. Mit FIND('-') springst du ja jeweils wieder an den Anfang der Tabelle.

3. Oktober 2006 16:58

Hi Rotsch,

danke für den Hinweis. Habe ich sofort geändert.

Gruß

Markus