[gelöst] Automatische Zeilennummer vergeben

28. Oktober 2008 11:49

Hallo zusammen,

folgendes Problem:
In einer SalesLine habe ich (als dritte Spalte) ein neues Lookup-Feld ("erweiterter Text") eingefügt.

In der VK-Zeile:
Nach Auswahl der "Art" = Artikel und "Nr." = 123 kann im neuen Lookup-Feld "erweiterter Text" etwas ausgewählt werden. Je nach Auswahl werden Kommentarzeilen zu dieser aktuellen VK-Zeile automatisch angehängt.

Beispiel:
VK-Zeile 1: "Art" = Artikel , "Nr." = 123, "erweiterter Text" = 2 Kommentarzeilen anhängen, "Beschreibung" = Artikel 123", "Line Nr." = 10000
VK-Zeile 2: "Art" = "" , "Nr." = "" , "erweiterter Text" = "" , "Beschreibung" = Kommentar 1, "Line Nr." = 10001
VK-Zeile 2: "Art" = "" , "Nr." = "" , "erweiterter Text" = "" , "Beschreibung" = Kommentar 2, "Line Nr." = 10002

Damit ich in der Codeunit, in der die VK-Zeilen 2 und 3 angelegt werden, auf die aktuelle Zeilennummer des Artikels ("Line Nr." = 10000) zur Laufzeit zugreifen kann, habe ich in der "Sales Order Subform" im "On After Input" Trigger des Lookup-Felder
Code:
"CurrForm.SAVERECORD;"
eingefügt.
Das muss dort auch geschehen, da ansonsten der AutoSplitKey einen Fehler meldet (AutoSplitKey kann keinen Schlüssel zwischen dem aktuellen und dem vorherigen datensatz finden).

Das klappt auch alles wunderbar.

Wenn ich jedoch einen weiteren Artikel anlege
VK-Zeile 4: "Art" = Artikel , "Nr." = 456, "erweiterter Text" = 2 Kommentarzeilen anhängen, "Beschreibung" = Artikel 456", "Line Nr." = ??????
und beim Verlassen des neuen Lookup-Feldes wieder
Code:
"CurrForm.SAVERECORD;"
aufgerufen wird, wird die "Line Nr." der VK-Zeile 4 auf 5000 gesetzt, also so, als wenn ich mit F3 etwas vor VK-Zeile 1 einfüge.

Zum Vergleich.
Wenn ich die VK-Zeile 4 anlege OHNE das neue Lookup-Feld zu benutzten und mit dem Cirsor eine Zeile tiefer gehe (sodass dann NAV automatisch den neuen Datensatz speichert), ist alles OK -> die "Line Nr." der VK-Zeile 4 ist dann 20000.

Eben nur, wenn ich die VK-Zeile 4 im Trigger "On After Input" mit
Code:
"CurrForm.SAVERECORD;"
speicher, wird die "Line No." auf 5000 gesetzt.

Wo bzw. wie kann ich feststellen, ob die neue VK-Zeile 4 nur eingefügt (5000) oder angehängt (20000) wird?

Ich hoffe, dass ich das Problem verständlich geschildert habe.

naviii
Zuletzt geändert von Naviii am 3. November 2008 11:40, insgesamt 1-mal geändert.

Re: Automatische Zeilennummer vergeben

28. Oktober 2008 12:15

Ich würde eher den OnValidate nehmen, da man laut C/Side-Hilfe im OnAfterInput nicht in die DB schreiben kann. Schau dir doch mal im OnValidate des Feldes "No." (in der VK-Subform) die Funktion InsertExtendedText an, die macht mehr oder minder das Gleiche, was du vorhast.

Re: Automatische Zeilennummer vergeben

3. November 2008 11:20

Hallo,
auch, wenn ich meine CodeUnit später aufrufe (also z.B. nicht im OnAfterInput sondern im OnValidate) ist dadurch mein Problem nicht gelöst.
Die per CodeUnit von mir eingefügten Zeilen landen korrekt in den SalesLines (z.B. 10000 bis 10004).
Wenn ich nun aber eine weitere SalesLine eingebe (also einen nächsten Artikel der dann wieder per Codeunit automatisch ein paar weitere SalesLines angehängt bekommt), will NAV diese neue SalesLine beim Speichern (nun ja im OnValidate) mit LineNo. 5000 einfügen (also vor dem ersten Artikel mit der LineNo. 10000), obwohl ja die letzte per CodeUnit eingefügte SalesLine die LineNo. z.B. 10004 hat.

Die Frage ist nun, an welcher Stelle muss evtl. zusätzlich WAS??? passieren, damit die nächste Zeile die 20004 wird (wenn die Zeilen 10000 bis 10004 schon da sind)?

Habe auch schon im NAV Quellcode (kompletes Cronus als Text-Datei exportiert und alle Stellen der Art LineNo. := LineNo. + 10000) überall Breakpoint hingesetzt. Das Einfügen einer neuen SalesLine scheint tief im Sourcecode (C++) von NAV zu stecken.

Hat jemand vielleicht noch einen Tip??

Lege ich (ganz normal) eine neue SalesLine an (also Art + Artikel No. eintragen und in die nächste Zeile springen) hat die nächste SalesLine korrekt die LineNo. 20004.

Gruß,
naviii

Re: Automatische Zeilennummer vergeben

3. November 2008 11:39

Hallo,
Problem gelöst!

Das problem war, dass meine CodeUnit aus dem OnValidate-Trigger des neuen Feldes in der SaleLine-Tabelle aufgerufen wurde.
Das war anscheinend zu früh.

Ich habe nun eine Funktion in die SalesLine-Tabelle eingefügt, die meine CodeUnit aufruft und die weiteren SalesLines automatisch einfügt.
Diese neue Funktion rufe ich nun aus dem OnOfterValidet der SalesOrderSubform auf.
Das Speichern des Records (CurrForm.SAVERECORD) habe ich aus dem (falschen) Trigger der SalesOrderSubform OnAfterInput rausgenommen.

Und nun klappt es auch.

Danke, dass ihr mir zgehört habt ;-)

Gruß,
naviii