[gelöst]SETFILTER

15. Juni 2012 09:58

Hallo,

wir lesen Auftragsdaten per csv. Datei in eine Tabelle ein. Für jeden Artikel wird eine Zeile angelegt. Es kann also vorkommen dass ein Auftrag aus mehreren Zeilen besteht.

Jetzt will ich mit SETFILTER verhindern, dass Daten doppelt eingelesen werden. Hierzu verwende ich folgenden Code.

Code:
"jtl auftragsdaten".SETFILTER("jtl auftragsdaten".auftragsnummer,nr);
"jtl auftragsdaten".SETFILTER("jtl auftragsdaten".ean,ean);

IF "jtl auftragsdaten".FIND('-') THEN BEGIN
  "jtl auftragsdaten".RESET;
END ELSE BEGIN...


Dies soll bewirken, dass zuerst ein Filter auf die externe Auftragsnummer gesetzt wird. Anschließend soll ein Filter auf den EAN gesetzt werden. Wenn es einen Datensatz gibt, bei dem sowohl der EAN wie auch die externe Auftragsnummer identisch sind, soll er zum nächsten Datensatz gehen. Finde er keinen Datensatz soll es weiter gehen und die Zeile angelegt werden...

Allerdings funktioniert der Filter nicht... Kann mir da jemand bei helfen?!
Zuletzt geändert von simon123 am 4. Juli 2012 09:43, insgesamt 1-mal geändert.

Re: SETFILTER

15. Juni 2012 10:07

Kannst du genauer beschreiben, was du damit meinst, dass der Filter nicht funktioniert? In was für einem Objekt ist dein Code, und wo da?

Re: SETFILTER

15. Juni 2012 10:14

Es ist ein Dataport. Der Dataport liest nur die Aufträge ein.

Der Filter so wie der ganze Code zum einlesen befindet sich in OnAfterImportRecord().

Die Aufträge mit nur einem Artikel (sprich einer Zeile) werden alle eingelesen. Jedoch wenn ein Auftrag mehr als eine Zeile hat wird immer nur die erste eingelesen. Die nachfolgenden fehlen. Das bedeutet er Filtert nur auf die externe Belegnummer und wenn es die schon einmal gibt, dann springt er automatisch zum nächsten Datensatz.
Aber das Programm soll auf die externe Belegnummer UND den EAN filtern. Erst wenn es beides gibt. Sprich ein Datensatz mit der externen Nummer und auch dem EAN bereitsvorhanden ist, soll er zum nächsten Datensatz gehen.

Re: SETFILTER

15. Juni 2012 10:15

Wie McClane bereits geschrieben hat wären ein paar mehr Informationen hilfreich.

Noch nicht als Lösung auf dein Problem, aber als Verbesserungsvorschlag da ihr ja bereits NAV 5 verwendet.
Code:
    "jtl auftragsdaten".SETRANGE(auftragsnummer,nr);
    "jtl auftragsdaten".SETRANGE(ean,ean);

    IF "jtl auftragsdaten".FINDFIRST THEN BEGIN
      "jtl auftragsdaten".RESET;
    END ELSE BEGIN...

Re: SETFILTER

15. Juni 2012 10:59

Es wäre noch interessant, was hinter dem "End else begin" passiert. Da sollte ebenfalls ein "jtl auftragsdaten".RESET; stehen.

Klappen sollte es dann aber so:

Code:
    "jtl auftragsdaten".SETRANGE(auftragsnummer,nr);
    "jtl auftragsdaten".SETRANGE(ean,ean);

    IF "jtl auftragsdaten".FINDFIRST THEN BEGIN
      "jtl auftragsdaten".RESET;
      CurrDataport.skip; <---
    END ELSE BEGIN...


Sauberer wäre es, anstelle des DataItems "jtl auftragsdaten" auf eine Variable JTLAuftragsdaten2 zu filtern und darüber nachzusehen, ob schon eine Auftragsnummer/EAN-Zeile existiert. So musst du dich nicht darum kümmern, was damit passiert, wenn man Filter darauf stehen lässt oder den Zeiger bewegt (auch wenn das in einem Dataport hinhauen sollte. In einem Report kann Filtern und Suchen auf dem DataItem aber sehr lustige Effekte haben).

Re: SETFILTER

15. Juni 2012 13:22

Am sauberstern hier ist NOT ISEMPTY statt FINDFIRST, sofern ISEMPTY schon in NAV 5 verfügbar ist.

Re: SETFILTER

15. Juni 2012 13:30

Ist bei einer Importtabelle meiner Meinung nach vernachlässigbar, aber: ja, isempty gibt's.