16. Juli 2009 10:51
16. Juli 2009 11:07
16. Juli 2009 11:33
16. Juli 2009 12:07
16. Juli 2009 12:45
16. Juli 2009 12:48
16. Juli 2009 13:57
16. Juli 2009 14:06
"Test SU".SETRANGE(irgend ein Filter, oder auch nicht!);
IF NOT "Test SU".ISEMPTY THEN BEGIN
TempRec.SETRANGE(TempRec."Document No.", "Test SU".belegnr);
IF TempRec.FINDSET THEN BEGIN
REPEAT
"Test SU".menge := TempRec.Quantity;
"Test SU".MODIFY;
UNTIL TempRec.NEXT = 0;
END;
END;
16. Juli 2009 14:13
"Test SU".SETRANGE(irgend ein Filter, oder auch nicht!);
IF "Test SU".FINDFIRST THEN BEGIN // <---- wichtig
TempRec.SETRANGE(TempRec."Document No.", "Test SU".belegnr);
IF TempRec.FINDSET THEN BEGIN
REPEAT
"Test SU".menge += TempRec.Quantity; // aufaddieren, nicht gleichsetzen
UNTIL TempRec.NEXT = 0;
Test SU".MODIFY;
END;
END;
16. Juli 2009 14:15
mikka hat geschrieben:Dieses ist sehr un-Performand (auf einem SQL-Server), besser ist es ein FINDSET zu nutzen
16. Juli 2009 14:20
McClane hat geschrieben:mikka hat geschrieben:Dieses ist sehr un-Performand (auf einem SQL-Server), besser ist es ein FINDSET zu nutzen
Das sagt man, aber ich hab´s mal gemessen, und da war bei einigen hundert Datensätzen kein Unterschied zwischen findset und findfirst
16. Juli 2009 14:25
Natalie hat geschrieben:Hm, kann es sein, dass deine Datenmenge bei <= 500 Datensätzen war? 500 ist ja die typische Datensatzmenge (voreingestellt unter Datenbank -> Ändern), die "mit einem Haps" gelesen werden kann. Vielleicht hättest du bei einer Menge deutlich größer als 500 mehr Unterschied gemessen...
Wild geraten, stryk wird wahrscheinlich entsetzt mit den Augen rollen
16. Juli 2009 14:58
16. Juli 2009 14:59
16. Juli 2009 15:02
IF (testRec2.datum <> "Test SU".datum) AND (testRec2.beschreibung <>"Test SU".beschreibung) THEN BEGIN
testRec2.zeilennr := "Test SU".zeilennr;
testRec2.datum := "Test SU".datum;
testRec2.beschreibung := "Test SU".beschreibung;
testRec2.menge := "Test SU".menge;
testRec2.einheit := "Test SU".einheit;
testRec2.INSERT;
END
ELSE BEGIN
testRec2.menge += "Test SU".menge;
testRec2.MODIFY;
END;
16. Juli 2009 15:07
16. Juli 2009 15:13
Natalie hat geschrieben:Kennst du den Unterschied zwischen Beiträge editieren und neu schreiben?
16. Juli 2009 15:22
flowerdog hat geschrieben:aber ob das schon reicht???
16. Juli 2009 15:26
testRec2.FIND;
IF (testRec2.datum <> "Test SU".datum) AND (testRec2.beschreibung <>"Test SU".beschreibung) THEN BEGIN
testRec2.zeilennr := "Test SU".zeilennr;
testRec2.datum := "Test SU".datum;
testRec2.beschreibung := "Test SU".beschreibung;
testRec2.menge := "Test SU".menge;
testRec2.einheit := "Test SU".einheit;
testRec2.INSERT;
END
ELSE BEGIN
testRec2.menge += "Test SU".menge;
testRec2.MODIFY;
END;
16. Juli 2009 15:30
testRec2.FIND; // Keine Filterung? Kein REPEAT? Und keine Absicherung -> Wenn testRec2 leer sein sollte, gibts einen Laufzeitfehler.
IF (testRec2.datum <> "Test SU".datum) AND (testRec2.beschreibung <>"Test SU".beschreibung) THEN BEGIN
// Vorsicht - womit ist "Test SU" gefüllt? Wo wurde es gefüllt?
testRec2.zeilennr := "Test SU".zeilennr;
testRec2.datum := "Test SU".datum;
testRec2.beschreibung := "Test SU".beschreibung;
testRec2.menge := "Test SU".menge;
testRec2.einheit := "Test SU".einheit;
testRec2.INSERT; // Was ist der Primärschlüssel von testRec2? Stellst du sicher, dass du keinen Datensatz einfügst, den es schon gibt?
END
ELSE BEGIN
testRec2.menge += "Test SU".menge;
testRec2.MODIFY;
END;
16. Juli 2009 15:34
McClane hat geschrieben:mikka hat geschrieben:Dieses ist sehr un-Performand (auf einem SQL-Server), besser ist es ein FINDSET zu nutzen
Das sagt man, aber ich hab´s mal gemessen, und da war bei einigen hundert Datensätzen kein Unterschied zwischen findset und findfirst
// Alle mit nachfolgender REPEAT .. UNTIL Schleife!
// Zufriff auf Kreditorposten mit diversen Filtern
//Anzahl Datensätze im Filter 9926
Test 1.: Ohne geeigneten KEY (Key.: Lfd.)
FIND('-') FINDSET FINDFIRST
4015 2556 3844
3688 2672 3718
4094 2687 4031
4437 2656 3797
Test 2.: Mit (teils) geeignetem Key (Nicht alle gefilterten Felder sind im Key enthalten)
FIND('-') FINDSET FINDFIRST
4188 2766 4485
4125 2844 3859
4594 2797 4281
4156 2813 4968
16. Juli 2009 15:40
16. Juli 2009 15:50
mikka hat geschrieben:Hier ist klar das FINDSET der Sieger.
Allerdings such ich noch das Problem, wenn ich einen Key setzte, der alle gefilterten Felder enthält, das dieses langsamer ist.
16. Juli 2009 15:51
flowerdog hat geschrieben:testRec2 ist leer das es eine temporäre Tabelle es sollen ja bloß die daten gespeichert werden
LineNo := 0;
IF "Test SU".FINDSET THEN BEGIN // Laufe durch alle Zeilen von "Test SU".
REPEAT
// schaue nach, ob es bereits einen Datensatz TestRec2 gibt,
// wo Datum und Beschreibung mit dem aktuellen "Test SU" identisch sind
TestRec2.RESET;
TestRec2.SETRANGE(Datum, "Test SU".datum);
testRec2.SETRANGE(beschreibung,"Test SU".beschreibung);
IF TestRec2.FINDFIRST THEN BEGIN
// TestRec2 ist nun mit dem gefundenen Datensatz gefüllt
testRec2.menge += "Test SU".menge;
testRec2.MODIFY;
END ELSE BEGIN
LineNo += 10000;
TestRec2.INIT;
testRec2.zeilennr := LineNo;
testRec2.datum := "Test SU".datum;
testRec2.beschreibung := "Test SU".beschreibung;
testRec2.menge := "Test SU".menge;
testRec2.einheit := "Test SU".einheit;
testRec2.INSERT;
END;
UNTIL "Test SU".NEXT = 0;
END;
16. Juli 2009 17:02