15. Dezember 2010 14:48
REPEAT
IF STRLEN(Vendor."No.") < 6 THEN BEGIN
Vendor."No" := PADSTR(Vendor."No.",0) + '1';
RENAME(Vendor."No."); //weil Primärschlüssel
Vendor.VALIDATE("No."); //damit auch die historischen Kreditorposten mitgeändert werden, oder muss ich die manuell ändern=
END;
UNTIL
15. Dezember 2010 15:10
NeueKredNr := '1' + AlteKredNr;
15. Dezember 2010 15:18
Natalie hat geschrieben:Muss es unbedingt PADSTR sein?
- Code:
NeueKredNr := '1' + AlteKredNr;
15. Dezember 2010 15:47
Natalie hat geschrieben:Muss es unbedingt PADSTR sein?
- Code:
NeueKredNr := '1' + AlteKredNr;
VenRec.RESET;
WHILE STRLEN(VenRec."No.") < 6 DO BEGIN
VenRec."No." := '1' + VenRec."No.";
RENAME(VenRec."No.");
VenRec.VALIDATE("No.");
END;
15. Dezember 2010 15:50
15. Dezember 2010 16:04
McClane hat geschrieben:Lies dir doch noch mal ganz genau deine While-Bedingung durch
VenRec.RESET
REPEAT
VenRec."No." := '1' + VenRec."No.";
RENAME...
VALIDATE...
UNTIL VenRec.NEXT = 0
VenRec1.RESET;
IF VenRec1.FINDSET THEN
REPEAT
VenRec1."No." := '1' + VenRec1."No.";
RENAME(VenRec1."No.");
VenRec1.VALIDATE("No.");
UNTIL (VenRec1.NEXT = 0) AND (STRLEN(VenRec1."No.") < 6);
VenRec1.RESET;
REPEAT
IF VenRec1.FINDLAST THEN BEGIN
VenRec1."No." := '1' + VenRec1."No.";
RENAME(VenRec1."No.");
VenRec1.VALIDATE("No.");
END;
UNTIL (VenRec1.NEXT = 0);
15. Dezember 2010 16:53
15. Dezember 2010 17:01
Natalie hat geschrieben:Durchlaufe ALLE Vendor-Datensätze (einfaches REPEAT ... UNTIL NEXT = 0).
Innerhalb der REPEAT-Schleife: Nur wenn Zeichen kleiner 6, dann auffüllen.
Nach einem RENAME kein VALIDATE, das ist überflüssig.
Und am wichtigsten: Nicht auf dem originären Vendor-Record (Vendor1) ein RENAME durchführen, das macht die Repeat-Schleife kaputt.
Nimm für die Umbenennung statt dessen eine zweite Vendor-Recordvariable. Setze Vendor2 := Vendor1, danach auf Vendor2 das RENAME.
VenRec.RESET;
VenRec2.RESET;
VenRec.SETRANGE("No.",'10000','70531');
IF VenRec.FINDLAST THEN
REPEAT
VenRec2.GET(VenRec."No.");
VenRec2 := '1' + VenRec."No.";
RENAME(VenRec2."No.");
UNTIL (VenRec.NEXT(-1) = 0) AND STRLEN(VenRec."No") >= 6;
15. Dezember 2010 17:08
VenRec.RESET;
VenRec.SETRANGE("No.",'10000','70531');
IF VenRec.FIND('+') THEN // kein FINDLAST mit REPEAT!
REPEAT
VenRec2 := VenRec;
VenRec2.RENAME('1' + VenRec."No.); // schau mal in die Onlinehilfe ;-)
UNTIL VenRec.NEXT(-1) = 0;
15. Dezember 2010 17:31
VendRec.setrange("No.",'','99999'); // Filter funktioniert nur bei numerischen Kundennummern, sonst Filterwerte anpassen
IF VenRec.FINDSET THEN // kein FINDLAST mit REPEAT!
REPEAT
VenRec2 := VenRec;
VenRec2.RENAME('1' + VenRec."No.); // schau mal in die Onlinehilfe ;-)
UNTIL VenRec.NEXT = 0
15. Dezember 2010 17:56
fiddi hat geschrieben:Hallo
- Code:
VendRec.setrange("No.",'','99999'); // Filter funktioniert nur bei numerischen Kundennummern, sonst Filterwerte anpassen
IF VenRec.FINDSET THEN // kein FINDLAST mit REPEAT!
REPEAT
VenRec2 := VenRec;
VenRec2.RENAME('1' + VenRec."No.); // schau mal in die Onlinehilfe ;-)
UNTIL VenRec.NEXT = 0
so würd ich das machen
Aber der Rename funktioniert nur bei den Tabellen/Feldern, die eine Tablerelation auf Vendor haben. Solltest du irgendwo Tabellen haben, wo die Vendor."No." eingetragen ist, ohne Tablerelation, funktioniert der Rename dort nicht. Und ob der Rename bei bedingten Tablerelations (z.B. in den Postentabellen "Source Code" ) sauber funktioniert, solltest du vorher mal testen.
Sollte deine Datenbank etwas größer sein, mit vielen Posten, ist der Rename er subperformant
Gruß, Fiddi
VenRec.RESET;
VenRec.SETRANGE("No.",'70000','70448');
IF VenRec.FIND('+') THEN
REPEAT
IF VenRec2.GET(VenRec."No.") THEN
VenRec2.RENAME('1' + VenRec."No.");
COMMIT;
UNTIL (VenRec.NEXT(-1) = 0) AND (STRLEN(VenRec."No.") > 5);
15. Dezember 2010 18:17
Lord_British hat geschrieben:EDIT: das mit FINDLAST hab ich gemacht, weil ich gemerkt hab, dass die Sortierung von NAV nach der Umbenennung den umbenannten Kreditor ans Ende der Liste setzt. Daher benenne ich von unten nach oben, damit die Sortierung nicht durcheinander kommt. Aber da Natalie gesagt hat, dass man 2 Record-Variablen definieren soll, denke ich, dass auch von oben nach unten klappen wird.
VenRec2 := VenRec;
15. Dezember 2010 18:20
fiddi hat geschrieben:Lord_British hat geschrieben:EDIT: das mit FINDLAST hab ich gemacht, weil ich gemerkt hab, dass die Sortierung von NAV nach der Umbenennung den umbenannten Kreditor ans Ende der Liste setzt. Daher benenne ich von unten nach oben, damit die Sortierung nicht durcheinander kommt. Aber da Natalie gesagt hat, dass man 2 Record-Variablen definieren soll, denke ich, dass auch von oben nach unten klappen wird.
Das ist genau der Grund, warum Nataliein Ihren Code eingefügt hat.
- Code:
VenRec2 := VenRec;
Damit wird dafür gesorgt, das der ursprüngliche Recordzeiger in VenRec nicht durch den Rename (wie bei dir geschehen) zerstört wird.
Außerdem musst du kein Get mehr auf VenRec mehr machen, da der Venrec.Next den schon gefunden hat. (obige Zuweisung und den Code von Natalie bzw. mir vorausgesetzt)
Gruß, Fiddi
15. Dezember 2010 18:31
Lord_British hat geschrieben:Ich erinnere mich mal an den Spruch eines Informatik-Profs, wonach 50% aller C++ Fehler durch falsche Zeigerarithmetik entstehen.