Codeproblem

Bild Microsoft Dynamics NAV 3.xx
(ehem. Navision Attain)

Codeproblem

Beitragvon mgerhartz » 2. Oktober 2006 15:27

Hi,

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

Code: Alles auswählen
//-----------------------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.
mgerhartz
 
Beiträge: 308
Registriert: 13. Februar 2006 15:18
Wohnort: Koblenz

Beitragvon feri » 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
feri
 
Beiträge: 261
Registriert: 16. März 2006 16:59
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Beitragvon mgerhartz » 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.
mgerhartz
 
Beiträge: 308
Registriert: 13. Februar 2006 15:18
Wohnort: Koblenz

Beitragvon mgerhartz » 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: Alles auswählen
//---------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.
mgerhartz
 
Beiträge: 308
Registriert: 13. Februar 2006 15:18
Wohnort: Koblenz

Beitragvon rotsch » 3. Oktober 2006 16:38

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


Ich wĂĽrde stattdessen folgendes verwenden:

Code: Alles auswählen
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.
Gruss und besten Dank, Roger
Benutzeravatar
rotsch
Microsoft Partner
Microsoft Partner
 
Beiträge: 1703
Registriert: 8. März 2006 14:44
Bezug zu Microsoft Dynamics: Freiberufler
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: Ab Version 1.3 bis Aktuell

Beitragvon mgerhartz » 3. Oktober 2006 16:58

Hi Rotsch,

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

GruĂź

Markus
mgerhartz
 
Beiträge: 308
Registriert: 13. Februar 2006 15:18
Wohnort: Koblenz


ZurĂĽck zu NAV 3.xx

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron