[Gelöst] Umgehen von OnInsert() => Doubletten

23. Oktober 2014 16:13

Hallo NAVerianer,

Vorgeschichte:
Unerklärlicherweise kommen bei uns Doubletten (ItemVariants) vor, die nicht vorkommen sollten.
Wir haben über die Benutzeroberfläche mit biegen und brechen versucht diesen Fall nachzustellen - keine Chance.
Also haben wir - zusätzlich zu den bereits existierenden Prüfroutinen, eine Prüfroutine direkt in den
OnInsert()-Trigger der Tabelle eingebaut, der ganz klar per SETRANGE eingrenzt, und dann auf NOT .ISEMPTY prüft.
=> Alle bis zu diesem Zeitpunkt existierenden Doubletten geradegezogen. Prüfroutine manuell getestet, funktioniert.

Einige Wochen später (jetzt), ist eine neue Doublette im System, und wieder können wir uns nicht erklären wie.

Frage: Gibt es eine Möglichkeit den OnInsert()-Trigger zu umgehen?

Anmerkung: Ich habe bereits alle Objekte per grep nach einem INSERT(FALSE) durchsucht, ohne Treffer.

Beste Grüße,

NAV-0-Mat
Zuletzt geändert von NAV-0-Mat am 24. Oktober 2014 10:11, insgesamt 1-mal geändert.

Re: Umgehen von OnInsert() => Doubletten

23. Oktober 2014 16:35

NAV-0-Mat hat geschrieben:Frage: Gibt es eine Möglichkeit den OnInsert()-Trigger zu umgehen?

  • INSERT per Code, aber ohne INSERT(TRUE).
    Was meinst du mit grep? Suche nach INSERT(FALSE) reicht nicht, du musst auch nach "nur" INSERT suchen, da INSERT = INSERT(FALSE) ist.
  • Direkteingabe über SQL-Server
  • Import über Webservices

Re: lokalisieren von Doubletten / OnInsert() Alternative

23. Oktober 2014 16:36

Ich habe bereits alle Objekte per grep nach einem INSERT(FALSE) durchsucht, ohne Treffer


Hast du auch nur nach "INSERT" gesucht? weil INSERT ohne Parameter ist das gleiche wie INSERT(FALSE)

Außerdem werden Records normalerweise in der Form
Code:
Item.INIT;
Item."No." := ''; // oder Artikelnummer
Item.INSERT(TRUE);
// restliche Felder zuordnen
Item.MODIFY(TRUE);

angelegt (z.B. auf der Artikelkarte).
D.h. eine Prüfung im Oninsert- Trigger bringt hier nur sehr wenig. :-?

Gruß, Fiddi

Re: Umgehen von OnInsert() => Doubletten

23. Oktober 2014 16:45

Natalie hat geschrieben:Was meinst du mit grep?


global search for a regular expression and print out matched lines :mrgreen:

mfg,
winfy

Re: Umgehen von OnInsert() => Doubletten

23. Oktober 2014 17:07

Natalie hat geschrieben:Was meinst du mit grep?

grep ist etwas, was Unix schon konnte, als es Windows noch gar nicht gab :mrgreen: .
War auch im Forum schon im Einsatz, siehe hier.

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 07:20

Kowa hat geschrieben:grep ist etwas, was Unix schon konnte, als es Windows noch gar nicht gab :mrgreen: .

Hehe, ja, grep gibt es wahrscheinlich länger als mich :lol:

Natalie hat geschrieben:INSERT per Code, aber ohne INSERT(TRUE).

Wie meinst du das?

Natalie hat geschrieben:Suche nach INSERT(FALSE) reicht nicht, du musst auch nach "nur" INSERT suchen, da INSERT = INSERT(FALSE) ist.

Das habe ich vergessen zu erwähnen. Es gibt nur ItemVariant.INSERT(TRUE|FALSE) in unserem NAV, aber ja, ich habe auch nach "nur" INSERT gesucht.

Natalie hat geschrieben:Direkteingabe über SQL-Server

Ist für uns auszuschließen. Nur meine Wenigkeit und der Kollege, der neben mir sitzt, verbinden sich per SSMS.

Natalie hat geschrieben:Import über Webservices

Ich hatte zwar mit Webservice noch nichts zu tun, kann aber ausschließen das dies bei uns im Einsatz ist.

Beste Grüße und einen angenehmen Freitag,

NAV-0-Mat

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 07:59

prüfst du denn auch im OnModify-Trigger auf Doubletten?

Gruß, Fiddi

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 08:16

fiddi hat geschrieben:prüfst du denn auch im OnModify-Trigger auf Doubletten?

Guten Morgen fiddi,

ja auch da wird die Prüffunktion aufgerufen.
Ich poste mal den Code der Prüffunktion, die im OnInsert() und OnModify() aufgerufen wird (nicht von mir, also Namenskonventionen etc. bitte nicht kritisieren :wink: )

Code:
Item_LT.GET("Item No.");
IF Item_LT."Ident Numbers Type" = Item_LT."Ident Numbers Type"::Default THEN
  EXIT;

Variant_GT.SETCURRENTKEY("Item No.");
Variant_GT.SETRANGE("Item No.","Item No.");
Variant_GT.SETFILTER(Code,'<>%1',Code);
Variant_GT.SETRANGE(Colour,Colour);
Variant_GT.SETRANGE("Size Run","Size Run");
Variant_GT.SETRANGE(Size,Size);
IF NOT Variant_GT.ISEMPTY THEN
  ERROR(Text5079201_G,FIELDCAPTION("Item No."),"Item No.",FIELDCAPTION("Size Run"),"Size Run",
    FIELDCAPTION(Colour),Colour,FIELDCAPTION(Size),Size);


Ich erkenne da keinen Fehler, denn diese 5 Felder machen eine Variante unique.

Beste Grüße,

NAV-0-Mat

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 08:30

NAV-0-Mat hat geschrieben:
Natalie hat geschrieben:INSERT per Code, aber ohne INSERT(TRUE).

Wie meinst du das?
Dass das INSERT per C/AL-Code ausgeführt wird, aber ohne den TRUE-Parameter. Wie schon vorher besprochen.

Es gibt nur ItemVariant.INSERT(TRUE|FALSE) in unserem NAV, aber ja, ich habe auch nach "nur" INSERT gesucht.

Der Standard hält ein "Nur-INSERT" in Report 11511, Funktion CopyItem, also beim Kopieren von Artikeln, bereit.
Ein ernstzunehmender Kandidat ;-)

Grundsätzlich hat aber fiddi recht, als er vorher gesagt hat, dass uns die INSERT-Prüfung wenig nützt.
NAV-0-Mat hat geschrieben:OnInsert()-Trigger der Tabelle eingebaut, der ganz klar per SETRANGE eingrenzt, und dann auf NOT .ISEMPTY prüft.

Wie definierst du eine Duplette, also WAS filterst du bei deinem SETRANGE? Die Beschreibung? Diese Prüfung gehört wirklich in den OnModify-Trigger, weil zum Zeitpunkt OnInsert die Beschreibung ohnehin leer sein wird.
Edit: War zu spät :-)

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 08:35

NAV-0-Mat hat geschrieben:
Code:
IF Item_LT."Ident Numbers Type" = Item_LT."Ident Numbers Type"::Default THEN
  EXIT;

Kann es sein, dass die Duplette für einen Artikel mit "Ident Numbers Type" = Default aufgetreten ist .....?

Ist Variant_GT lokal oder global definiert? Wenn global, führe vorher ein Variant_GT.RESET durch durch.

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 08:42

Auch interessant wäre ob die Dublette wirklich exakt identisch ist. Manchmal sind eventuell auch unsichtbare (Leerzeichen z.B.) Zeichen die Ursache.

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 09:35

Natalie hat geschrieben:Kann es sein, dass die Duplette für einen Artikel mit "Ident Numbers Type" = Default aufgetreten ist .....?

Das können wir nicht sagen, da wir diese Option-Feld nicht kennen (durch ext. Dienstleister eingebaut).
Ich habe die Prüfung auf den "Ident Numbers Type" auskommentiert. Wenn sich nun gar keine Varianten
mehr anlegen lassen, bekommen wir bestimmt schnell Feedback von den Usern :roll: :wink:

Natalie hat geschrieben:Ist Variant_GT lokal oder global definiert? Wenn global, führe vorher ein Variant_GT.RESET durch durch.

War global, ist jetzt lokal, somit brauchen wir keinen RESET?!

m_schneider hat geschrieben:Auch interessant wäre ob die Dublette wirklich exakt identisch ist. Manchmal sind eventuell auch unsichtbare (Leerzeichen z.B.) Zeichen die Ursache.

Werde bei der nächsten Doublette (die hoffentlich jetzt nicht mehr auftritt), per SSMS als csv exportieren.
Dann sollten sowas ersichtlich werden :) Danke für die Idee.

Ich denke, nach so viel gutem Feedback, kann der Beitrag erstmal geschlossen werden.

Beste Grüße und besten Dank,

NAV-0-Mat

Re: Umgehen von OnInsert() => Doubletten

24. Oktober 2014 09:45

NAV-0-Mat hat geschrieben:Das können wir nicht sagen, da wir diese Option-Feld nicht kennen (durch ext. Dienstleister eingebaut).
Ich habe die Prüfung auf den "Ident Numbers Type" auskommentiert.

Das halte ich nicht für den richtigen Weg, da du den Zweck des Feldes nicht kennst. Kommt NACH deiner Funktion noch weiterer Quelltext im OnMOdify-Trigger? Wenn ja, schiebe deinen Quelltext ganz an den Anfang des Triggers, also vor die Prüfung des Dienstleisters, anstatt sie zu entfernen.

War global, ist jetzt lokal, somit brauchen wir keinen RESET?!

Nein, da nun bei jeder Ausführung des Triggers die Recordvariable neu erstellt wird und somit auch nicht zurückgesetzt werden braucht.

Ich denke, nach so viel gutem Feedback, kann der Beitrag erstmal geschlossen werden.
Siehe bitte meine Signatur in Blau; hier schließt jeder seinen Beitrag selbst ;-)