Hallo Christian zuerstmal die simple Lösung.
Ich würde es wie folgt schreiben.
- Code: Alles auswählen
IF Tabelle1.FINDSET THEN
REPEAT
IF NOT Tabelle2.GET(Tabelle1.Code) THEN BEGIN
Tabelle2.INIT;
Tabelle2."No." := Tabelle1."No.";
Tabelle2.Description := Tabelle2.Description;
Tabelle2.INSERT;
END;
UNTIL Tabelle1.NEXT = 0;
Hintergrund:Durch den Primärschlüssel der eindeutig sein muss ist erstmal Verhindert das du jemals mit einem Insert Datensätze überschreiben kannst oder doppelt einfügst.
Es würde Crashen mit der Datensatz ist bereits vorhanden und das ist gut so. Das Prinzip nennt sich "Fast Fail".
Es wäre auch immer einem If insert then; vorzuziehen.
Weiterhin beschreibt in Tabelle1 Der Primärschlüssel deinen Datensatz so kannst du ihn z.b. in Tabelle 2 mit GET wiederfinden. Wie wenn nicht mit der Nummer ?
Das Get verhindert weiterhin unnötige Ausführungen für Datensätze die schon vorhanden sind.
Wenn du die Nummern nicht Synchron hättest müsstest du das Feld "Document ID" abfiltern und gucken ob du diesen schon hast oder ähnliches.
Auch hier macht sich wieder eine Helperfunktion DocumentNumberExist praktisch.
Wenn du neue Datensätze anlegen willst Initialisierst du diese immer erst mit Init. Du stehst dann weder am Ende, der Mitte oder am Anfang der Tabelle. Du bist dann wie außerhalb. Erst wenn du Insert ausführst kümmert sich der Datenbankserver wo dieser Datensatz eingetragen wird.
Hinweis: Init setzt nicht den Schlüsselwert zurück. Diesen musst du dann mit der neuen Nummer überschreiben. Sonst hast du einen "Datensatz existiert schon" Fehler beim Insert (Guter Fehler! -> Fast Fail)Weiterhin beliebt:
- Code: Alles auswählen
IF Tabelle1.FINDSET THEN
REPEAT
IF NOT Tabelle2.GET(Tabelle1."No.") THEN BEGIN
Tabelle2.INIT;
Tabelle2."No." := GetLastNoFromTable2;
Tabelle2.Description := Tabelle2.Description;
Tabelle2.INSERT;
END;
UNTIL Tabelle1.NEXT = 0;
Eine Helperfunktion die immer frisch die Nummer zieht.
Ein Locktable ist hier immer eine Überlegung Wert da bei stark beanspruchten Tabellen während des buchens/suchens sich die Nummer weiterbewegen könnte.
- Code: Alles auswählen
LOCAL GetLastNoFromTable2() : Integer
Local Var Tabelle2
Tabelle2.Locktable;
IF Tabelle2.findlast THEN
EXIT(Tabelle2."No." + 1)
ELSE
EXIT(1);
Findset solltest du immer benutzen wenn du nicht genau den ersten(Findfirst) oder den letzten (Findlast) finden willst oder danach mit einer Schleife über das Recordset iterierst.
Find('-') oder ähnliches wird nur noch in speziellen fällen benutzt seit dem Dynamics Nav für SQL optimiert wurde.
Wenn du dich fragst wie du dinge schreibst oder warum, dann finde ich die Microsoft Hilfe oder andere Seiten hilfreich.
Oder halt mal hier fragen
Es lohnt sich außerdem alle Befehle mal in der Hilfe gelesen zu haben. Du kannst so nutzlose Zeichen weglassen.
FINDSET = FINDSET(FALSE,FALSE) DefaultValue FALSE,FALSE
NEXT = NEXT(1) Defaulf Value = 1
Insert = Insert(FALSE) DefaultValue FALSE
Counter += 1 = Counter := Counter + 1
etc.
Und Regel Nummer 1
https://user-images.githubusercontent.com/12088142/27789036-25cd94d0-5feb-11e7-9634-fc5bff0bc858.png