[Gelöst] Schleifenproblem (einen hab ich noch)

4. April 2008 16:42

Sorry, ist dann das letzte mal!

Ich habe eine Tabelle names LAGE0000 da steht jeder Artikel einmal drin und dort gibt es ein Feld "Saldo".

Dann habe ich noch eine Tabelle "STAT0000", dort stehen einzelBuchungen für die Artikel. Wenn man dort pro Artikel den "EINGANG" und "AUSGANG" summiert und die Differenz bildet kommt man auf den Saldo der in der LAGE0000 steht.

Da durch eine Reorganisation (die vor längerer Zeit stattgefunden hat), Einzelbuchungen fehlen der momentan vorh. Saldo in der Tabelle LAGE0000 aber noch stimmt (da die DB nicht mehr benutzt wurde seit Reorganisation) will ich durch eine Korrektur Buchung pro Artikel in die Tabelle STAT0000 denselben Bestand erzeugen der in Tabelle LAGE0000 steht.

Also als Beispiel Artikel xy, steht in Tabelle LAGE0000 drin mit Bestand 100.

Wenn man die Einzelbuchungen summiert so kommt man bei EINGANG auf 1500 und bei AUSGANG auf 1300. Sprich lt. Buchungen wäre es ein Bestand von 200. Da aber der Bestand von 100 durch eine Korrekturbuchung entstehen soll (in die Tabelle STAT0000) ist die Frage wie man sowas macht.

Ich muss also durch eine Schleife jeden Datensatz abfragen in Tabelle LAGE0000 , dann schauen welche Buchungen da sind, summieren und einen Insert in Tabelle STAT0000 mache (mit einem Korrekturbuchungssatz).

Mein eigentliches Problem ist die Schleife, ich will anhand ARTIKELNR abfragen welche Buchunggssätze es pro Artikel gibt und pro Artikel die summen bilden. Und wenn ich das habe noch nen Insert in die Buchungstabelle.

Kann mir jemand nen Tip geben wie man sowas am einfachsten löst?


Code:
IF rec_lage0000.FIND('-') THEN
Berechnungbestandeinnahmen := 0;
Berechnungbestandausgaben := 0;

//BERECHNE die Summen der Ein -u. Ausgaben für den je Artikel

REPEAT
  rec_stat0000.SETRANGE(rec_stat0000.ARTIKELNR,rec_lage0000.ARTIKELNR);

  Berechnungbestandeinnahmen := (Berechnungbestandeinnahmen + rec_stat0000.EINGANG);
  Berechnungbestandausgaben := (Berechnungbestandausgaben + rec_stat0000.AUSGANG);
  BerechnungSaldo := (Berechnungbestandeinnahmen - Berechnungbestandausgaben);


UNTIL rec_lage0000.NEXT = 0;
Zuletzt geändert von tesarolle am 7. April 2008 15:41, insgesamt 1-mal geändert.

Re: Schleifenproblem (einen hab ich noch

4. April 2008 17:04

Zwei Dinge, dir mir negativ auffallen:
1. Unterschätze den Sinn und die Wichtigkeit von BEGIN ... END nicht - fehlt nämlich.
2. Ohne GET oder FIND werde keine Datensätze geholt.

Ergebnis:
Code:
IF rec_lage0000.FIND('-') THEN
  REPEAT // für jeden Datensatz in reclage0000
    //BERECHNE die Summen der Ein -u. Ausgaben für den je Artikel

    Berechnungbestandeinnahmen := 0;
    Berechnungbestandausgaben := 0;
    BerechnungSaldo := 0;

    rec_stat0000.SETRANGE(rec_stat0000.ARTIKELNR, rec_lage0000.ARTIKELNR);
    IF rec_stat0000.FIND('-') THEN
      REPEAT // für j
        Berechnungbestandeinnahmen += rec_stat0000.EINGANG;
        Berechnungbestandausgaben += rec_stat0000.AUSGANG;
      UNTIL rec_stat0000.NEXT = 0;

    BerechnungSaldo := Berechnungbestandeinnahmen - Berechnungbestandausgaben;
  UNTIL rec_lage0000.NEXT = 0;


Der Text muss so gegliedert sein, als würdest du deinem Azubi, der statt dem Rechner für dich zählen soll, erklären, was er wie in welcher Reihenfolge zu tun hat.

4. April 2008 21:47

Hallo Natalie,

ja mit den großen Schleifen hab ich so meine Probleme aber vielen Dank, ich denke ich bekomme das hin, ein kleines Problem habe ich noch. In meinem "Gesamtkunstwerk" brauche ich eine Funktion welche mir in der Tabelle in der ich inserte die letzte Nr immer um 1 erhöht, die Funktion habe ich schon, nur in meiner Schleife funktioniert sie nicht!

Das ist die Funktion:

Code:
      IF rec_stat0000.FINDLAST THEN;
      letzteNr :=  rec_stat0000.NR + 1;


Wo muss ich die richtig einbauen? Ich hab nun schon einiges probiert aber ich komm da nicht drauf


Code:
IF rec_lage0000.FIND('-') THEN
  REPEAT // für jeden Datensatz in reclage0000
    //BERECHNE die Summen der Ein -u. Ausgaben für den je Artikel

    Berechnungbestandeinnahmen := 0;
    Berechnungbestandausgaben := 0;
    BerechnungSaldo := 0;

    rec_stat0000.SETRANGE(rec_stat0000.ARTIKELNR, rec_lage0000.ARTIKELNR);
    IF rec_stat0000.FIND('-') THEN
      REPEAT // für j
        Berechnungbestandeinnahmen += rec_stat0000.EINGANG;
        Berechnungbestandausgaben += rec_stat0000.AUSGANG;
      UNTIL rec_stat0000.NEXT = 0;
    BerechnungSaldo := Berechnungbestandeinnahmen - Berechnungbestandausgaben;

IF NOT rec_lage0000.GET(rec_lage0000.ARTIKELNR) THEN
    rec_stat0000.INIT;

      IF rec_stat0000.FINDLAST THEN;
      letzteNr :=  rec_stat0000.NR + 1;
 
    rec_stat0000.NR := letzteNr;
    rec_stat0000.ARTIKELNR := rec_lage0000.ARTIKELNR;
    rec_stat0000.BEMERKUNG := 'DIES IST EINE MASCHINELLE BUCHUNG';
    rec_stat0000.DATUM := TODAY;
    rec_stat0000.FWPREIS := rec_lage0000.FWEINKAUF;
    rec_stat0000.FWTYP := rec_lage0000.FWTYP;
    rec_stat0000.TRANSARTIKEL := rec_lage0000.TRANSARTIKEL;
    rec_stat0000.FWKURS := rec_lage0000.FWKURS;
    rec_stat0000.SALDO := BerechnungSaldo;
    rec_stat0000.INSERT(TRUE);
  UNTIL rec_lage0000.NEXT = 0;

4. April 2008 22:05

Hallo,

am besten du machst dir eine neue Funktion und übergibst deinen Record an die Funktion: Bsp: fInsertRecord(rec_lage0000)

in dieser Funktionträgst du deinen neuen Datensatz ein (auch das rec_stat0000.INIT in die neue Funktion). Auch erst in dieser Funktion holst du dir mit Findlast die letzte Nummer aber nicht auf deinem rec_lage0000 Record sondern auf einer anderen Variable.

oder du machst es so:

IF rec_lage0000.GET('ARTIKELNR') THEN BEGIN

IF rec_stat0000.FINDLAST THEN letzteNr:=rec_stat0000.NR;
letzteNr+=1;

rec_stat0000.INIT;
rec_stat0000.NR := letzteNr;
rec_stat0000.ARTIKELNR := rec_lage0000.ARTIKELNR;
rec_stat0000.BEMERKUNG := 'DIES IST EINE ...';
rec_stat0000.DATUM := TODAY;
rec_stat0000.FWPREIS := rec_lage0000.FWEINKAUF;
rec_stat0000.FWTYP := rec_lage0000.FWTYP;
rec_stat0000.TRANSARTIKEL := rec_lage0000.TRANSARTIKEL;
rec_stat0000.FWKURS := rec_lage0000.FWKURS;
rec_stat0000.SALDO := BerechnungSaldo;
rec_stat0000.INSERT(TRUE);

END;

evtl. solltest du die Tabelle sperren, wenn du die letzte Nummer holst

4. April 2008 23:01

Code:
IF rec_lage0000.FIND('-') THEN BEGIN

  IF rec_stat0000.FINDLAST THEN
    letzteNr :=  rec_stat0000.NR
  ELSE
    letzteNr := 0;

  REPEAT // für jeden Datensatz in reclage0000
    //BERECHNE die Summen der Ein -u. Ausgaben für den je Artikel

    Berechnungbestandeinnahmen := 0;
    Berechnungbestandausgaben := 0;
    BerechnungSaldo := 0;

    rec_stat0000.SETRANGE(rec_stat0000.ARTIKELNR, rec_lage0000.ARTIKELNR);
    IF rec_stat0000.FIND('-') THEN
      REPEAT // für j
        Berechnungbestandeinnahmen += rec_stat0000.EINGANG;
        Berechnungbestandausgaben += rec_stat0000.AUSGANG;
      UNTIL rec_stat0000.NEXT = 0;
    BerechnungSaldo := Berechnungbestandeinnahmen - Berechnungbestandausgaben;

    IF BerechnungSaldo <> 0 THEN BEGIN // Wenn der Saldo stimmt, brauchst du keinen neuen Datensatz
      letzteNr += 1;

      IF NOT rec_lage0000.GET(rec_lage0000.ARTIKELNR) THEN     
        rec_stat0000.INIT;
      rec_stat0000.NR := letzteNr
      rec_stat0000.ARTIKELNR := rec_lage0000.ARTIKELNR;
      rec_stat0000.BEMERKUNG := 'DIES IST EINE MASCHINELLE BUCHUNG';
      rec_stat0000.DATUM := TODAY;
      rec_stat0000.FWPREIS := rec_lage0000.FWEINKAUF;
      rec_stat0000.FWTYP := rec_lage0000.FWTYP;
      rec_stat0000.TRANSARTIKEL := rec_lage0000.TRANSARTIKEL;
      rec_stat0000.FWKURS := rec_lage0000.FWKURS;
      rec_stat0000.SALDO := BerechnungSaldo;
      rec_stat0000.INSERT(TRUE);
    END;
  UNTIL rec_lage0000.NEXT = 0;
END;

7. April 2008 10:04

Guten Morgen!

Ihr arbeitet ja auch am WE :-) Erstmal vielen lieben Dank.

Nun funktioniert das soweit, beim Test ist mir noch ein "Fehler" aufgefallen, die Schleife die ich habe springt von Datensatz zu Datensatz in TAbelle LAGE0000 und anhand der ARTIKELNR dort schaut sie in der STAT0000 ob Buchungen da sind, berechnet das usw. und fügt dann eine Buchung in STAT0000 ein.

Nun habe ich aber festgestellt das wenn es gar keine Buchungen gibt in STAT0000, das er dann gar keine Buchung einfügt! Wie muss man das abfangen oder ermöglichen? Ich möchte ja auch wenn es gar keine Buchungen gibt das er dann eine Anfangsbuchung macht!

Wenn ich mich nicht irre macht er das ja hier in der Codezeile:

Code:
    IF rec_stat0000.FIND('-') THEN BEGIN


auch wenn er eben keinen DAtensatz in STAT0000 findet soll er den nachfolgenden Code halt ausführen... Die SChleife sieht komplett nun so aus:


Code:
IF rec_lage0000.FIND('-') THEN BEGIN

  IF rec_stat0000.FINDLAST THEN
    letzteNr :=  rec_stat0000.NR
  ELSE
    letzteNr := 0;

  REPEAT // für jeden Datensatz in reclage0000
    //BERECHNE die Summen der Ein -u. Ausgaben für den je Artikel

    Berechnungbestandeinnahmen := 0;
    Berechnungbestandausgaben := 0;
    BerechnungSaldo := 0;

    rec_stat0000.SETRANGE(rec_stat0000.ARTIKELNR, rec_lage0000.ARTIKELNR);
    IF rec_stat0000.FIND('-') THEN BEGIN
      REPEAT // für j
        Berechnungbestandeinnahmen += rec_stat0000.EINGANG;
        Berechnungbestandausgaben += rec_stat0000.AUSGANG;
      UNTIL rec_stat0000.NEXT = 0;
    BerechnungSaldo := (Berechnungbestandeinnahmen - Berechnungbestandausgaben);
    BerechnungDifferenz := rec_lage0000.BESTAND -BerechnungSaldo;

   // IF BerechnungSaldo <> 0 THEN BEGIN // Wenn der Saldo stimmt, brauchst du keinen neuen Datensatz
      letzteNr += 1;

      IF NOT rec_lage0000.GET(rec_lage0000.ARTIKELNR) THEN     
        rec_stat0000.INIT;
      rec_stat0000.NR := letzteNr;
      rec_stat0000.ARTIKELNR := rec_lage0000.ARTIKELNR;
      rec_stat0000.BEMERKUNG := 'DIES IST EINE MASCHINELLE BUCHUNG';
      rec_stat0000.DATUM := TODAY;
      rec_stat0000.FWPREIS := rec_lage0000.FWEINKAUF;
      rec_stat0000.FWTYP := rec_lage0000.FWTYP;
      rec_stat0000.TRANSARTIKEL := rec_lage0000.TRANSARTIKEL;
      rec_stat0000.FWKURS := rec_lage0000.FWKURS;
      rec_stat0000.EINGANG := BerechnungDifferenz;
      rec_stat0000.SALDO := rec_lage0000.BESTAND;
      rec_stat0000.INSERT(TRUE);
    END;
  UNTIL rec_lage0000.NEXT = 0;
END;

7. April 2008 10:26

Deine erste Schleife muss dann halt über die Tabelle Item (Artikel) gehen.

Moment: Was willst du jetzt miteinander vergleichen, wenn du sagst, es fehlen Buchungen?

Im Übrigen verhakelst du dich wieder mit dem BEGIN ... END.

Streiche folgendes:
IF rec_stat0000.FIND('-') THEN BEGIN
und
rec_stat0000.INSERT(TRUE);
END;

Nochmal: Der gesamte Quelltext zwischen BEGIN und END wird nur dann aufgeführt, waenn die vorhergehende Bedingung (IF rec_stat0000.FIND('-')) wahr ist.

Ohne dieses BEGIN und END wird nur die nachfolgende REPEAT-Schleife von der IF-Abfrage abhängig gemacht. Der Rest wird in jedem Falll ausgeführt.
Eine standardkonforme Formatierung macht dies deutlicher.

Dein Quelltext:
Code:
IF rec_lage0000.FIND('-') THEN BEGIN

  IF rec_stat0000.FINDLAST THEN
    letzteNr :=  rec_stat0000.NR
  ELSE
    letzteNr := 0;

  REPEAT // für jeden Datensatz in reclage0000
    //BERECHNE die Summen der Ein -u. Ausgaben für den je Artikel

    Berechnungbestandeinnahmen := 0;
    Berechnungbestandausgaben := 0;
    BerechnungSaldo := 0;

    rec_stat0000.SETRANGE(rec_stat0000.ARTIKELNR, rec_lage0000.ARTIKELNR);
    IF rec_stat0000.FIND('-') THEN BEGIN
      REPEAT // für j
        Berechnungbestandeinnahmen += rec_stat0000.EINGANG;
        Berechnungbestandausgaben += rec_stat0000.AUSGANG;
      UNTIL rec_stat0000.NEXT = 0;
      BerechnungSaldo := (Berechnungbestandeinnahmen - Berechnungbestandausgaben);
      BerechnungDifferenz := rec_lage0000.BESTAND -BerechnungSaldo;

      letzteNr += 1;

      IF NOT rec_lage0000.GET(rec_lage0000.ARTIKELNR) THEN     
        rec_stat0000.INIT;
      rec_stat0000.NR := letzteNr;
      rec_stat0000.ARTIKELNR := rec_lage0000.ARTIKELNR;
      rec_stat0000.BEMERKUNG := 'DIES IST EINE MASCHINELLE BUCHUNG';
      rec_stat0000.DATUM := TODAY;
      rec_stat0000.FWPREIS := rec_lage0000.FWEINKAUF;
      rec_stat0000.FWTYP := rec_lage0000.FWTYP;
      rec_stat0000.TRANSARTIKEL := rec_lage0000.TRANSARTIKEL;
      rec_stat0000.FWKURS := rec_lage0000.FWKURS;
      rec_stat0000.EINGANG := BerechnungDifferenz;
      rec_stat0000.SALDO := rec_lage0000.BESTAND;
      rec_stat0000.INSERT(TRUE);
    END;
  UNTIL rec_lage0000.NEXT = 0;
END;


Nach Korrektur:
Code:
IF rec_lage0000.FIND('-') THEN BEGIN

  IF rec_stat0000.FINDLAST THEN
    letzteNr :=  rec_stat0000.NR
  ELSE
    letzteNr := 0;

  REPEAT // für jeden Datensatz in reclage0000
    //BERECHNE die Summen der Ein -u. Ausgaben für den je Artikel

    Berechnungbestandeinnahmen := 0;
    Berechnungbestandausgaben := 0;
    BerechnungSaldo := 0;

    rec_stat0000.SETRANGE(rec_stat0000.ARTIKELNR, rec_lage0000.ARTIKELNR);
    IF rec_stat0000.FIND('-') THEN
      REPEAT // für j
        Berechnungbestandeinnahmen += rec_stat0000.EINGANG;
        Berechnungbestandausgaben += rec_stat0000.AUSGANG;
      UNTIL rec_stat0000.NEXT = 0;

    BerechnungSaldo := (Berechnungbestandeinnahmen - Berechnungbestandausgaben);
    BerechnungDifferenz := rec_lage0000.BESTAND -BerechnungSaldo;

    letzteNr += 1;
    IF NOT rec_lage0000.GET(rec_lage0000.ARTIKELNR) THEN
      rec_stat0000.INIT;
    rec_stat0000.NR := letzteNr;
    rec_stat0000.ARTIKELNR := rec_lage0000.ARTIKELNR;
    rec_stat0000.BEMERKUNG := 'DIES IST EINE MASCHINELLE BUCHUNG';
    rec_stat0000.DATUM := TODAY;
    rec_stat0000.FWPREIS := rec_lage0000.FWEINKAUF;
    rec_stat0000.FWTYP := rec_lage0000.FWTYP;
    rec_stat0000.TRANSARTIKEL := rec_lage0000.TRANSARTIKEL;
    rec_stat0000.FWKURS := rec_lage0000.FWKURS;
    rec_stat0000.EINGANG := BerechnungDifferenz;
    rec_stat0000.SALDO := rec_lage0000.BESTAND;
    rec_stat0000.INSERT(TRUE);
  UNTIL rec_lage0000.NEXT = 0;
END;

7. April 2008 11:05

Moment :-)

7. April 2008 11:08

Dann sollte doch die Änderung ("Nach Korrektur: ") so funktionieren, wie du es erwartest.

7. April 2008 15:40

Hallo Natalie,

also ... es funktioniert!

Mein eigentliches Problem war das ich nicht geschnallt habe was das THEN BEGIN auslöst, ich hatte das generell bei manchen Schleifen gehabt das Problem! Nun da ich das dank Deiner Hilfe geschnallt habe dürfte ich keine Probleme mehr haben mit Schleifen :-)!

Vielen lieben Dank nochmal! Das hat mir wirklich weiter geholfen!!!