2. November 2010 12:15
CustRec.RESET;
CustLedEntry.RESET;
CustLedEntry2.RESET;
CustRec.SETCURRENTKEY("No.");
CustLedEntry.SETCURRENTKEY("Customer No.","Posting Date","Document Type",Open);
CustLedEntry2.SETCURRENTKEY("Customer No.","Posting Date","Document Type",Open);
CustLedEntry.CALCFIELDS(Amount);
CustLedEntry2.CALCFIELDS(Amount);
FOR i := 10000 TO 69412 DO BEGIN // 69412
CustLedEntry.SETRANGE("Customer No.",FORMAT(i));
CustLedEntry.SETFILTER("Posting Date",'01.01.2006..31.12.2006');
CustLedEntry.SETRANGE("Document Type",CustLedEntry."Document Type"::Payment);
CustLedEntry.SETFILTER(Amount,'<>%1',0.00);
IF CustLedEntry.COUNT > 0 THEN BEGIN
IF CustLedEntry.FINDFIRST THEN
first := CustLedEntry."Entry No.";
IF CustLedEntry.FINDLAST THEN
last := CustLedEntry."Entry No.";
FOR j := first TO last DO BEGIN
IF CustLedEntry.GET(j) THEN BEGIN
MyCode := CustLedEntry."Document No.";
//CustLedEntry.CALCFIELDS(Amount);
//CustLedEntry2.CALCFIELDS(Amount);
CustLedEntry2.RESET;
CustLedEntry2.SETRANGE("Customer No.",CustRec."No.");
CustLedEntry2.SETFILTER("Posting Date",'01.01.2006..31.12.2006');
CustLedEntry2.SETRANGE("Document Type",CustLedEntry2."Document Type"::Payment);
CustLedEntry2.SETRANGE(Amount,CustLedEntry.Amount);
IF CustLedEntry2.COUNT > 1 THEN BEGIN
IF CustLedEntry2.FINDFIRST THEN
first2 := CustLedEntry."Entry No.";
IF CustLedEntry2.FINDLAST THEN
last2 := CustLedEntry."Entry No.";
FOR k := first2 TO last2 DO BEGIN
CustLedEntry2.GET(k);
CustLedEntry2.Check := TRUE;
CustLedEntry2.CheckCode := MyCode;
CustLedEntry2.MODIFY;
END; //FOR k :=
END; //COUNT > 1
END; //CustLedEntry.GET(j)
END; //FOR j :=
END; //COUNT > 0
END; //FOR i :=
2. November 2010 12:24
Lord_British hat geschrieben:(10000 bis 69412 ist die Nr. der Debitoren, ich hab FOR-Schleife gewählt, da diese angeblich schneller ist als REPEAT/UNTIL und WHILE/DO,
2. November 2010 12:27
Natalie hat geschrieben:Lord_British hat geschrieben:(10000 bis 69412 ist die Nr. der Debitoren, ich hab FOR-Schleife gewählt, da diese angeblich schneller ist als REPEAT/UNTIL und WHILE/DO,
Sind denn bei euch die Debitorennummern zwischen 10000 und 69412 lückenlos? Falls nein, macht die FOR-Schleife viele überflüssige Lesezugriffe. Dann wäre es besser, die Debitorentabelle von ... bis ... zu durchlauen.
2. November 2010 12:31
Lord_British hat geschrieben:Nein, sind sie nicht. Hieße das, dass ich mit REPEAT UNTIL NEXT = 0 schneller wäre bei vorherigem CustomerRecord.CALCFIELDS("Saldo(MW)") <> 0 ?
2. November 2010 12:39
Natalie hat geschrieben:Lord_British hat geschrieben:Nein, sind sie nicht. Hieße das, dass ich mit REPEAT UNTIL NEXT = 0 schneller wäre bei vorherigem CustomerRecord.CALCFIELDS("Saldo(MW)") <> 0 ?
Ich wette, ja - aber alle Angaben ohne Gewähr
Immerhin gibt es in der Debitorenpostentabelle (=Basistabelle für das FlowField) viel mehr Datensätze zu durchsuchen als für die Debitorentabelle.
Ich verzichte grundsätzlich auf jede vermeidbare Berechnung von FlowFields.
2. November 2010 12:44
CustRec.RESET;
CustLedEntry.RESET;
CustLedEntry2.RESET;
CustRec.SETCURRENTKEY("No.");
CustLedEntry.SETCURRENTKEY("Customer No.","Posting Date","Document Type",Open);
CustLedEntry2.SETCURRENTKEY("Customer No.","Posting Date","Document Type",Open);
CustLedEntry.CALCFIELDS(Amount);
CustLedEntry2.CALCFIELDS(Amount);
Cust.SETRANGE("No.", '10000', '69412'); // NEU
Cust.FIND('-'); // NEU
REPEAT // NEU
CustLedEntry.SETRANGE("Customer No.",Cust."No."); // NEU
CustLedEntry.SETFILTER("Posting Date",'01.01.2006..31.12.2006');
CustLedEntry.SETRANGE("Document Type",CustLedEntry."Document Type"::Payment);
CustLedEntry.SETFILTER(Amount,'<>%1',0.00);
IF CustLedEntry.COUNT > 0 THEN BEGIN
IF CustLedEntry.FINDFIRST THEN
first := CustLedEntry."Entry No.";
IF CustLedEntry.FINDLAST THEN
last := CustLedEntry."Entry No.";
FOR j := first TO last DO BEGIN
IF CustLedEntry.GET(j) THEN BEGIN
MyCode := CustLedEntry."Document No.";
//CustLedEntry.CALCFIELDS(Amount);
//CustLedEntry2.CALCFIELDS(Amount);
CustLedEntry2.RESET;
CustLedEntry2.SETRANGE("Customer No.",CustRec."No.");
CustLedEntry2.SETFILTER("Posting Date",'01.01.2006..31.12.2006');
CustLedEntry2.SETRANGE("Document Type",CustLedEntry2."Document Type"::Payment);
CustLedEntry2.SETRANGE(Amount,CustLedEntry.Amount);
IF CustLedEntry2.COUNT > 1 THEN BEGIN
IF CustLedEntry2.FINDFIRST THEN
first2 := CustLedEntry."Entry No.";
IF CustLedEntry2.FINDLAST THEN
last2 := CustLedEntry."Entry No.";
FOR k := first2 TO last2 DO BEGIN
CustLedEntry2.GET(k);
CustLedEntry2.Check := TRUE;
CustLedEntry2.CheckCode := MyCode;
CustLedEntry2.MODIFY;
END; //FOR k :=
END; //COUNT > 1
END; //CustLedEntry.GET(j)
END; //FOR j :=
END; //COUNT > 0
UNTIL Cust.NEXT = 0; // NEU
2. November 2010 12:55
2. November 2010 21:45
McClane hat geschrieben:Wirf doch mal das "CustLedEntry2.RESET;" raus, weil das den Schlüssel wieder auf Standard zurück setzt. Außerdem müsstest du, wenn ich das alles recht verstehe, verhindern, dass schon gecheckte Datensätze nochmal überprüft werden.
2. November 2010 23:20
Lord_British hat geschrieben:Nun hat der User sowohl seine, als auch meine importierten Buchblätter mit F11 verbucht.
Nun stellt er fest, dass Zahlungseingänge doppelt drin sind.
Leider weiss weder er noch ich welche Buchblätter von wem erstellt wurden, nur dass die Buchungssätze von 1.1.6..31.12.06 sind.
3. November 2010 01:11
Anke S. hat geschrieben:Lord_British hat geschrieben:Nun hat der User sowohl seine, als auch meine importierten Buchblätter mit F11 verbucht.
Nun stellt er fest, dass Zahlungseingänge doppelt drin sind.
Leider weiss weder er noch ich welche Buchblätter von wem erstellt wurden, nur dass die Buchungssätze von 1.1.6..31.12.06 sind.
Darf ich mal einfach blond nachfragen, waurm ihr nicht im Fibu-Journal nachguckt (in dem ja bekanntlich der Buchblattname mitgeführt wird) und das "zuviel gebuchte Journal" dann entsprechend einfach storniert?
VG,
Anke