[Gelöst] DELETEALL Problem

30. November 2007 15:25

Hallo,

hab ein problem bei einem trigger, und zwar bei der funktion deleteall bei record.

ich habe 2 tabellen nennen wir sie mal x und y

in beiden habe ich eine spalte umsatz,

aus der tabelle x möchte ich die datensätze in die tabelle y übertragen.

natürlich sollte vor der übertragung überprüft werden ob schon umsätze vorhanden sind, wenn ja diese löschen und die neuen eintragen.

und genau hier liegt mein problem.

Karneval.DELETEALL;

dieser befehlt funktioniert einfach nicht, er addiert die umsätze immer weiter auf.

weiß jemand woran das liegen könnte???

gruß micha
Zuletzt geändert von Micha2703 am 30. November 2007 16:54, insgesamt 1-mal geändert.

30. November 2007 15:56

Sorry, aber das musst du noch ein bisschen genauer beschreiben.

Wie lautet dein Quelltext mit dem DELETEALL, und was genau soll er erreichen?

30. November 2007 16:07

Umsatz.RESET;
Karneval.DELETEALL;
COMMIT;

IF Umsatz.FIND('-') THEN

REPEAT

IF Karneval.GET(Umsatz.ZNAME, Umsatz.ZARTIKEL, Umsatz.JAHR) THEN //wenn schon ein Datensatz vorhanden ist Umsatz addieren
BEGIN
Karneval.UMSATZ:=Karneval.UMSATZ+Umsatz.UMSATZBETRAG_Netto; // Umsatz addieren
Karneval.MODIFY;
END

ELSE
BEGIN
Karneval.ZNAME:=Umsatz.ZNAME;
Karneval.ZARTIKEL:=Umsatz.ZARTIKEL;
Karneval.ZJAHR:=Umsatz.JAHR;
Karneval.INSERT;
END;
UNTIL Umsatz.NEXT<=0; //Geht bis zum ende der Tabelle

das deleteall funktioniert einfach nicht, er löscht vorher KEINE daten

30. November 2007 16:13

Fasse deinen Quelltext bitte in code-tags, dann ist er leichter les- und bearbeitbar.

Ist Karneval vielleicht eine temporäre Recordvariable, also Eigenschaft Temporary = yes?

Ganz abgesehen davon hier ein paar Verbesserungsvorschläge:

Code:
Umsatz.RESET;
Karneval.RESET // War vielleicht ein Filter darauf? Dann besser RESET
Karneval.DELETEALL;
COMMIT;  // Ist das wirklich notwendig? Sonst besser raus.

IF Umsatz.FINDSET(FALSE) THEN // FINDSET statt FIND('-')
  REPEAT
    IF Karneval.GET(Umsatz.ZNAME, Umsatz.ZARTIKEL, Umsatz.JAHR) THEN BEGIN
      Karneval.UMSATZ += Umsatz.UMSATZBETRAG_Netto; // Kurzschreibweise, wers mag
      Karneval.MODIFY;
    END ELSE BEGIN
      Karneval.ZNAME := Umsatz.ZNAME;
      Karneval.ZARTIKEL := Umsatz.ZARTIKEL;
      Karneval.ZJAHR := Umsatz.JAHR;
      Karneval.INSERT;
    END;
  UNTIL Umsatz.NEXT = 0; //Standardschreibweise, nicht <= 0

30. November 2007 16:30

Funktioniert fast aber noch nicht 100%

Meine Tabelle Umsätze enthält 20 Datensätze
Nachdem ich den Controllbutton ausgeführt habe erscheinen die Datensätze auch in der Tabelle y aber die additionen sind falsch!

30. November 2007 16:36

Langsam - heißt das also, dass dein Fehler im fehlenden Karneval.RESET gelegen hat?

Und was die Additionen angeht: Wie soll Karneval.GET jemals wahr werden, wenn du zuvor doch Karneval.DELETEALL ausgeführt hast?

30. November 2007 16:43

Ja der Fehler lag an dem Karneval.reset.

Also ich bin der Meinung das er als erstes Karneval.Deleteall EINMAL ausführt

dann wenn schon ein datensatz vorhanden ist addiert er diesen, wenn nicht füllt er diesen datensatz auf. und diese schleife durchläuft er immer und immer wieder, sprich er geht nur einmal auf die Deleteall funktion

30. November 2007 16:48

Kann es sein, dass bei der Aufsummierung immer genau ein einziger Wert fehlt?
In deiner Schleife wird nämlich nur aufsummiert, wenn der "Umsatz" schon in "Karneval" gefunden wird, nicht, wenn er zum ersten mal eingetragen wird.

Könnte dies die Lösung sein:
Code:
Umsatz.RESET;
Karneval.RESET;
Karneval.DELETEALL;
COMMIT;

IF Umsatz.FINDSET(FALSE) THEN
  REPEAT
    IF Karneval.GET(Umsatz.ZNAME, Umsatz.ZARTIKEL, Umsatz.JAHR) THEN BEGIN
      Karneval.UMSATZ += Umsatz.UMSATZBETRAG_Netto;
      Karneval.MODIFY;
    END ELSE BEGIN
      Karneval.ZNAME := Umsatz.ZNAME;
      Karneval.ZARTIKEL := Umsatz.ZARTIKEL;
      Karneval.ZJAHR := Umsatz.JAHR;
      Karneval.UMSATZ := Umsatz.UMSATZBETRAG_Netto;  // <-- Diese Zeile fehlte
      Karneval.INSERT;
    END;
  UNTIL Umsatz.NEXT = 0;

30. November 2007 16:54

@timo genau das ist uns vor ca 5min aufgefallen ;) danke dir und auch natalie für eure hilfe, es klappt alles ;)

gruß micha

30. November 2007 16:59

Trotzdem, bei Karneval.RESET und Karneval.DELETEALL kann man sich das Karneval.GET sparen, das kann dann ja gar nicht eintreten und verursacht nur unnötige Datenbankzugriffe (und zwar genauso viele wie es Umsatz-Datensätze gibt).

30. November 2007 17:17

Natalie hat geschrieben:Trotzdem, bei Karneval.RESET und Karneval.DELETEALL kann man sich das Karneval.GET sparen, das kann dann ja gar nicht eintreten und verursacht nur unnötige Datenbankzugriffe (und zwar genauso viele wie es Umsatz-Datensätze gibt).

Dies ist so nicht korrekt, denn der GET liefert immer nur beim ersten mal FALSE zurück, danach existiert der Datensatz ja und wird dann nur noch aufsummiert.

30. November 2007 17:26

Ach sooooooo *BrettvormKopp*