[gelöst] Array aller Feldnummern eines Records

25. Oktober 2006 17:22

Hallo Forenmitglieder

Hat jemand von euch vielleicht eine Ahnung, wie ich das bewerkstelligen könnte?

Das Problem ist folgendermassen:
Es gibt ein Parent-Item. Aus diesem werden dann Child-Items generiert (für jede Artikelvariante eines). Die Änderungen die beim Parent-Item gemacht werden sollen sich auch auf die Child-Items auswirken, aber nur die Felder, die beim Parent-Item auch geändert wurden.

Um das zu realisieren muss ich alle Felder eines Datensatzes mit dem Originaldatensatz vergleichen. Da die Tabelle 27 sehr viele Felder besitzt währe es sehr sehr umständlich die alle zu checken, daher möchte ich das in einer Schleife bewerkstelligen, brauche aber dazu natürlich ein Array aller Feldnummern oder Namen.

Danke vielmals für eure Hilfe

Grüssle
Boris
Zuletzt geändert von neoroot am 26. Oktober 2006 17:40, insgesamt 1-mal geändert.

25. Oktober 2006 18:41

Ich nehme mal an, dass es in dem ParentItem ein Feld gibt, dass festlegt, dass es sich um ein Parentitem handelt, und im ChildItem ein Feld mit der ParentItemNo.
ich würde einfach hingehen und im OnValidate-Trigger der infrage kommenden Felder alle Childitems gleich mit aktualisiert werden, wenn es ein Parentitem ist.

also etwa so:
Code:
IF Feldname <>xrec.Feldname THEN BEGIN
//hier die Befehle die dann sowieso ausgeführt werden sollen
//...
  IF ParentItem THEN BEGIN
    ChildItem.RESET;
    ChildItem.SETRANGE(ParentItemNo,"No.");
    if ChildItem.FINDFIRST THEN REPEAT
      ChildItem.VALIDATE(FeldName,FeldName);
      ChildItem.MODIFY(TRUE);
    UNTIL ChildItem.NEXT=0;
  END;
END;

25. Oktober 2006 19:08

Um flexibel zu bleiben (falls mal ein Feld hinzukommt), könnte man auch mit RecordRef und FieldRef arbeiten und im OnModify-Trigger des ParentItem automatisch alle Felder des Datensatzes durchlaufen und mit allen ChildItems vergleichen.

Sowas ähnliches hatte ich mal mandantenübergreifend programmieren müssen, wo jedoch noch unzählige weitere Hürden auf einen warten.
Der reine Feldabgleich der einzelnen Datensätze ist mit FieldRef einfach und elegant. (Vor allem braucht man den Code nicht jedesmal anpassen, wenn ein neues Feld hinzukommt.)

HINWEIS: FieldRef hat einen kleinen Fehler!
Text bzw. Code-Felder, welche kleiner als 10 Zeichen definiert sind, bringen Navision zum Absturz, sobald mit FieldRef auf den Feldinhalt zugegriffen wird.
Workaround: Alle Code- und Text-Felder mindestens 10 Zeichen lang definieren oder die Verarbeitung dieser Felder vor dem Zugriff auf den Feldinhalt abbrechen.

25. Oktober 2006 19:49

Dafür bräuchte er aber eine zusätzliche Tabelle, in der er die nötigen Feldnummern hinterlegt, es sollen ja scheinbar nicht alle Felder (z.B. keine Preise, die ja bei varianten unterschiedlich sein können) synchronisiert werden. Ausserdem, wie soll er anschließend feststellen, welche Felder verändert wurden, nur diese sollen ja durchgereicht werden, ich nehme an, weil einzelne Felder nachträglich in den Childs geändert werden.
Sinnvollerweise macht man da eine Funktion SynchChild(Feldnr) die mit Fieldref arbeitet und ruft diese aus den Validatetriggern auf. dann muss er dort jeweils nur die aufrufzeile reinkopieren und die Feldnummer ändern.

25. Oktober 2006 20:02

neoroot hat geschrieben:Um das zu realisieren muss ich alle Felder eines Datensatzes mit dem Originaldatensatz vergleichen.

Somit wird keine weitere Tabelle mit den zu synchronisierenden Feldern benötigt.

Jedoch hast du Recht: Wenn der Preis der Child-Item geändert wird, würde er bei meiner Methode wieder auf den Preis des Parent-Item zurückgesetzt, obwohl dieser nicht geändert wurde.

In diesem Fall bleibt wohl wirklich nur die Lösung mit der Funktion, welche aus allen Feldern mit der jeweiligen Feldnr. aufgerufen wird.
Diese Funktion würde dann mittels FieldRef das jeweilige Feld in den zugehörigen Child-Items aktualisieren.

(Mein Hinweis auf den Fehler im FieldRef hat dennoch Gültigkeit.)

26. Oktober 2006 10:15

Erstma vielen dank für eure schnelle Antworten!

Timo schreibt:
Funktion, welche aus allen Feldern mit der jeweiligen Feldnr. aufgerufen wird.


Das heisst ich muss bei allen Feldern im OnValidate-Trigger diese Funktion aufrufen? (Tabelle 27 - Item hat seeeehr viele Felder...)

Gruss
Boris

26. Oktober 2006 10:48

nur bei allen Feldern, die durchgereicht werden sollen,
Artikelnummer, Flowfields und -Filter kannst du wohl auslassen ;-)

26. Oktober 2006 11:11

neoroot hat geschrieben:[...]
Das heisst ich muss bei allen Feldern im OnValidate-Trigger diese Funktion aufrufen? (Tabelle 27 - Item hat seeeehr viele Felder...)
[...]

Unter der Voraussetzung, dass alle Änderungen in den ChieldItems verloren gehen dürfen, wenn ein einziges Feld im ParentItem geändert wird, kannst du auch die Variante einsetzen, im OnModify-Trigger alle Felder mit den zugehörigen ChildItems abzugleichen und ggfls. zu ersetzen.

Dies spart natürlich viel Programmierarbeit.

26. Oktober 2006 11:30

Folgende Variante wäre auch möglich:

Definieren einer Record-Variablen für die Tabelle 'Field'. Diese filtern auf TableNo = 27. Jetzt kann diese Tabelle mit REPEAT-UNTIL durchlaufen werden. FlowFields, FlowFilter, etc. können übergangen werden. Mit RecordRec und FieldRef sind jetzt auch variable Zugriffe möglich.

In einer separaten Einrichtungstabelle könnten sogar die zu berücksichtigenden Felder hinterlegt werden. Diese könnte der Anwender selber pflegen, da mittels Lookup-Funktionen die Felder als Auswahl zur Verfügung gestellt werden können.

26. Oktober 2006 13:47

Hoi Roger

Du hast geschrieben:

rotsch hat geschrieben:Record-Variablen für die Tabelle 'Field'.


Ich finde im System keine Tabelle, die Field heisst.

Gruss
Boris

26. Oktober 2006 14:21

Die Tabelle 'Field' ist im ObjectDesigner nicht sichtbar. Erstelle ein neues Form und nimm als SourceTable Field. Dann bekommst du die Records zu sehen (das Form aber für Änderungen sperren EDITABLE = FALSE)

26. Oktober 2006 15:16

Hey Super! Genau, das was ich gesucht habe.

Wieso hast du mir das gestern nicht schon gezeigt? :-D

Danke! Bild

26. Oktober 2006 15:29

Die Idee kam mir auch erst im Verlaufe dieser Diskussion hier. Hauptsache, das Problem ist jetzt gelöst.

Better late than never :wink: