Fehlende Verknüpfungen zwischen zwei Artikeln finden

6. September 2023 17:08

Wir haben eine Tabelle "Related Items" mit zwei Feldern:
Item No.
Related Item No.

In Zukunft sollen fehlende Verknüpfungen automatisch erstellt werden bei Anlage einer neuen Verknüpfung.

Beispiel 1: folgende Verknüpfungen vorhanden:
A - B
B - A
A - C
C - A
Dann fehlen die Verknüpfungen:
B - C
C - B

weiteres Beispiel 2):
vorhanden:
A - B
fehlt:
B - A

weiteres Beispiel 3)
vorhanden:
A - B
B - A
B - C
C - B
fehlt:
A - C
C - A

Ich kriege es einfach nicht hin, den Algorithmus dazu hinzuschreiben.

Ich hatte folgendes gedacht, wenn ich von einem neu angelegten RelatedItems - Datensatz A - B komme:
* gehe alle RelatedItems von A aus durch und schreibe die Related Item No. in einen TempItem-Datensatz
* gehe alle RelatedItems von B aus durch und schreibe die Related Item No. in einen TempItem-Datensatz
* gehe alle RelatedItems zu A durch und schreibe die Item No. in einen TempItem-Datensatz
* gehe alle RelatedItems zu B durch und schreibe die Item No. in einen TempItem-Datensatz
* Dann gehe pro Eintrag in TempItem alle RelatedItems durch. Bei Beispiel 3 könnte es ja noch C - Y geben und dann muss ich auch A, B und C mit Y verknüpfen. Also müsste ich da (rekursiv?) auch nochmal pro neu gefundenem Artikel von dem aus alle RelatedItems prüfen? Hier steige ich gedanklich aber aus, da komme ich doch in eine Endlosschleife? Ich müsste dann irgendwie die "fertig durchgeprüften Artikel" speichern und die irgendwie rausfiltern? Das kriege ich nicht auf die Kette :oops:

Ich hoffe, dass ich da einfach gerade zu Matsche zu im Kopf bin und es irgendwie machbar ist, hat jemand eine Idee? Danke euch!

Re: Fehlende Verknüpfungen zwischen zwei Artikeln finden

6. September 2023 17:52

Anderer Ansatz: Wenn ich die Verbindung A-B habe, wozu brauche ich dann noch B-A? Man muss nur dort wo die Verbindungen geprüft oder verwendet werden sowohl im ersten als auch im zweiten Feld suchen/filtern. Das würde zumindest mal die Anzahl der Datensätze in der Verbindungstabelle halbieren.

Re: Fehlende Verknüpfungen zwischen zwei Artikeln finden

7. September 2023 09:52

Ich glaube der Grund für die wechselseitige Beziehung lag darin, dass man dann nur auf ein Feld filtern muss und so an alle relevanten Beziehungen eines Artikels kommt. Sonst müsste man da zwei Mal ran (einmal filtern auf Item No. und einmal auf Related Item No.)

Das grundlegende Problem, dass ich nicht weiß, wie ich an alle fehlenden Beziehungen komme, hätte ich dann glaube ich immer noch. Angenommen ich lege die Beziehung A - B an. B - C und C-Y gibt es schon. Wie komme ich dann darauf, dass ich A-Y und B-Y anlegen muss (und A-C, aber das wäre der einfache Teil)?

Re: Fehlende Verknüpfungen zwischen zwei Artikeln finden

7. September 2023 10:09

Hallo,

ehrlich gesagt glaube ich, das da bald jeder Artikel mit jedem verwandt ist. Ein falscher Eintrag und das Ganze fliegt dir um die Ohren. :-?

Ich würde einen anderen Ansatz wählen. Der ist viel einfacher und vor allem stabiler.
Was du willst ist ja eigentlich auf sehr kompliziertem Weg Artikel zusammen zu fassen.
Das macht man im allgemeinen in dem man Artikel einer Gruppe zuordnet. Im Standard gibt es dazu die Artikelkategorien und in NAV2016 auch noch die Produktgruppen (entfallen ab NAV2018)

Wenn dir das zu grob ist, dann definierst du deine eigenen Gruppen, fügst den Artikeln ein neues Feld XX-Gruppe hinzu (Schlüssel nicht vergessen) und ordnest den zusammengehörenden Artikeln die gleiche Gruppe zu.

Gruß Fiddi

Re: Fehlende Verknüpfungen zwischen zwei Artikeln finden

7. September 2023 11:18

Wir hatten vor, da einen Schwellenwert zu definieren, ab dem eine Abfrage kommt, ob man das wirklich machen möchte, wenn jetzt automatisch mehr als x neue Related Item - Datensätze angelegt würden (was für mich glaube ich hieße, dass ich einmal alles in einem TempRelatedItem-Record speichern müsste, damit ich kein Problem mit laufenden Transaktionen + Confirm bekomme. Evtl. sollte man da noch einen zweiten Schwellenwert festlegen, ab dem das gar nicht erlaubt ist.

Die Gruppierungs-Idee gefällt mir, allerdings haben wir bereits zigtausend Related Item - Datensätze (davon etliche inkonsistent, die aber hoffentlich zum Großteil zu alten, irrelevanten Artikeln gehören), die ich dann erstmal zu den Gruppen umformen müsste. Wenn man das aber erstmal so hätte, wäre das der sauberere Weg. EDIT: ich glaube, das ist echt das richtige, das sollten wir tun, danke dir!

Re: Fehlende Verknüpfungen zwischen zwei Artikeln finden

7. September 2023 13:45

Als Anregung, vielleicht hilft es ja :wink: .
Ich hatte mal die Ausgabe, Belege frei miteinander zu verknüpfen.
Das habe ich mit 2 Zusatzfeldern in der Belegtabelle gelöst und einer Zusatztabelle.

Belegtabelle (DocTable)
Feld 1: No.
Feld 50000: Follow-Up No.
Feld 50001: Previous No.

Follow-up Tabelle
Feld 1: Initial Parent No.
Feld 2: Follow-Up No.
Pro neuer Verknüpfung erhält die einen Datensatz, immer ausgehend von der ersten Nummer, die kommt in Feld 1.
Feld 1 als Initial Parent No. ist die No. des ersten Belegs.

Beispiel:
Beleg 4711 hat Follow-up 5711
Beleg 5711 hat Follow-up 6177 und als Previous. No. 4711, welche hier gleichzeitig auch die Parent No. ist
Beleg 6711 hat Previous No. Beleg 5177, über den wird die Parent No. Beleg 4711 angezeigt.
Beleg 6711 hat auch einen Follow-up, Beleg 7711 mit ebenfalls Parent 4711 usw.

In der Follow-up Tabelle werden dafür die Datensätze angelegt
  1. Initial Parent 4711 Follow-up 5711
  2. Initial Parent 4711 Follow-up 6711
  3. Initial Parent 4711 Follow-up 7711

Funktion zur Ermittlung der Parent No., hier für maximal 100 Verknüpfungen (nach Bedarf einstellbar). Die wird bei allen Belegen über diese Funktion angezeigt. Wenn man alle Verknüpfungen sehen will, ruft man erst diese Funktion und dann die Follow-Up-Tabelle mit Filterung auf die Parent No. auf.
Code:
FindParentNo(VAR DocTable : Record "DocTable") ParentNo : Code[20]
IF (DocTable."Previous No." = '') AND (DocTable."Follow-Up No." = '') THEN
  EXIT('');
// wenn auf Parent  selber
IF (DocTable."Previous No." = '') AND (DocTable."Follow-Up No." <> '') THEN
  EXIT(DocTable."No.");
// wenn irgendwo unterhalb vom Parent
IF DocTable."Previous No." <> '' THEN BEGIN
  ParentNo := DocTable."Previous No.";
  REPEAT
    IF DocTable2.GET(ParentNo) THEN BEGIN
      IF DocTable2."Previous No." <> '' THEN
        ParentNo := DocTable2."Previous No."
      ELSE
        ParentNo := DocTable2."No.";
    END;
    i+=1;
  UNTIL (DocTable2."Previous No." = '') OR (i = 100);
END;
EXIT(ParentNo);


Die die Versorgung der Felder bei der Anlage des Follow-ups gibt es eine Funktion, im Ausschnitt:
Code:
NewDocTableRec."Previous No." := OldDocTableRec."No.";

OldDocTableRec."Follow-Up No." := NewDocTableRec."No.";

ParentNo := FindParentNo(OldDocTableRec);
IF ParentNo <> '' THEN BEGIN
   FollowUpTable."Initial Parent No." := ParentNo;
   FollowUpTable."Follow-Up No." := NewDocTableRec."No.";
END ELSE BEGIN
   FollowUpTable."Initial Parent No." := OldDocTableRec."No.";
   FollowUpTable."Follow-Up No." := NewDocTableRec."No.";
END;
InsertOK := FollowUpTable.INSERT;