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