[gelöst] Dataport mit vorbelegtem Filter

10. Februar 2014 16:16

Hallo,

ich habe einen Dataport zum Einlesen von Verkaufszeilen aus einem Vorsystem: DataItem = Sales Line
Als ReqFilterField ist "Document No." in den Properties aufgeführt.

Aufgerufen wird dieser Dataport aus dem Verkaufsangebot (Form 41), nach dem eine neue Angebotsnummer vergeben wurde. Und diese Angebotsnummer sollte nun schon als Filter in dem Feld "Document No." stehen, damit nicht versehentlich falsche Zeilen importiert werden, nur ich weiß nicht, wie ich das bewerkstelligen soll.

Bin wieder mal für jede Hilfe dankbar!
Zuletzt geändert von FJS am 11. Februar 2014 21:15, insgesamt 1-mal geändert.

Re: Dataport mit vorbelegtem Filter

10. Februar 2014 17:09

Wenn ich mich richtig erinnere (habe ewig nicht mehr mit Dataports gearbeitet), funktioniert der Aufruf analog Reports:
http://www.navision24.de/tutorials/repo ... rufen.html

Re: Dataport mit vorbelegtem Filter

10. Februar 2014 21:23

Hallo Natalie,

vielen Dank für den Link.

Mit einem festen String bekomme ich auch einen Filter gesetzt, aber ich schaff es nicht, die aktuelle Belegnummer als Filter in den Dataport-Aufruf zu bekommen.

Meine Codeunit sieht jetz so aus:
Code:
Angebot:= SalesHeader."No.";
SalesLine.SETRANGE("Document No.", Angebot);
ImportDataport.SETTABLEVIEW(Angebot);
ImportDataport.RUN;


Ich hab folgende Variablen deklariert:
SalesHeader = Record "Sales Header"
SalesLine = Record "Sales Line"
ImportDataport = Dataport "Import"

Beim Start erscheint jetzt im Filterfeld der Belegnummer: ''

Was muss ich noch einstellen?

Re: Dataport mit vorbelegtem Filter

10. Februar 2014 22:43

Du musst den Dataport mit einer Funktion erweitern, die eine Variable für die Angebotsnummer setzt.
Quatsch, Natalie hat Recht.

Re: Dataport mit vorbelegtem Filter

10. Februar 2014 23:10

McClane hat geschrieben:Du musst den Dataport mit einer Funktion erweitern, die eine Variable für die Angebotsnummer setzt.
Echt, das geht nicht über den o.g. Code?

Re: Dataport mit vorbelegtem Filter

10. Februar 2014 23:54

Doch, du hast Recht, denke ich. Man kann vermutlich den Filter auf das DataItem bzw. die Belegnummer auslesen und im OnAfterImportRecord setzen. Aber eine Funktion wäre deutlicher zu verstehen und auch nicht mehr Aufwand.
Edit: auch Quatsch.

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 08:29

Hallo,

"Angebot" ist lt. deinem Programmcode eine Variable vom Typ "Code" mit Länge 20.
Ein SETTABLEVIEW mit einer Code-Variablen bringt m.W. nichts.
Du solltest SETTABLEVIEW(Salesline) verwenden, sofern die Tabelle "Sales Line" das DataItem im Dataport ist.

Gruß
Jörg

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 10:04

McClane hat geschrieben:Du musst den Dataport mit einer Funktion erweitern, die eine Variable für die Angebotsnummer setzt.


Hallo McClane,

kannst Du mir sagen, wie ich das machen muss?

JRenz hat geschrieben:"Angebot" ist lt. deinem Programmcode eine Variable vom Typ "Code" mit Länge 20.
Ein SETTABLEVIEW mit einer Code-Variablen bringt m.W. nichts.
Du solltest SETTABLEVIEW(Salesline) verwenden, sofern die Tabelle "Sales Line" das DataItem im Dataport ist.


Hallo Jörg,

Ich hab der Variable Angebot bereits den Typ Code und den Typ Text zugewiesen, aber leider ohne Auswirkungen.


McClane hat geschrieben:Doch, du hast Recht, denke ich. Man kann vermutlich den Filter auf das DataItem bzw. die Belegnummer auslesen und im OnAfterImportRecord setzen. Aber eine Funktion wäre deutlicher zu verstehen und auch nicht mehr Aufwand.


Hallo McClane,

wie kann ich im OnAfterImportRecord den Filter setzen? Muss ich da die gleiche Variable (Angebot) auch noch mal verwenden?

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 10:09

Hallo,

da hast du mich falsch verstanden.
Ich meinte, dass du die Zeile mit SETTABLEVIEW ändern solltest, also von

Code:
...
ImportDataport.SETTABLEVIEW(Angebot);
ImportDataport.RUN;


auf:
Code:
...
ImportDataport.SETTABLEVIEW(SalesLine);
ImportDataport.RUN;

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 10:16

Hallo Community,

ich glaub mein Problem liegt bereits in der Codeunit, denn bei der Ausgabe der Variablen Angebot über eine Message Box erhalte ich bereits keinen Wert:

Code:
Angebot:= SalesHeader."No.";
SalesLine.SETRANGE("Document No.", Angebot);
ImportDataport.SETTABLEVIEW(SalesLine);
MESSAGE(Angebot);

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 10:25

@ Natalie und JRenz: klärt mich doch bitte mal auf, wieso ihr bei einem Import mit Settableview arbeiten wollt :roll:

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 10:25

JRenz hat geschrieben:Hallo,

da hast du mich falsch verstanden.
Ich meinte, dass du die Zeile mit SETTABLEVIEW ändern solltest, also von

Code:
...
ImportDataport.SETTABLEVIEW(Angebot);
ImportDataport.RUN;


auf:
Code:
...
ImportDataport.SETTABLEVIEW(SalesLine);
ImportDataport.RUN;


Hallo Jörg,

das hab ich schon gemacht, allerdings ebenfalls ohne Erfolg. Wie ich vorhin schon gepostet habe, bekomme ich den Wert schon nicht in die Variable Angebot.

Sobald ich den Code auf einen festen String ändere, erscheint auch dieser Wert als Filter in meinem Dataport:


Code:
Angebot:= '123';//SalesHeader."No.";
SalesLine.SETRANGE("Document No.", Angebot);
ImportDataport.SETTABLEVIEW(SalesLine);
//MESSAGE(Angebot);
ImportDataport.RUN;

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 10:34

Hallo,

in diesem Fall gehe ich davon aus, dass deine Variable "SalesHeader" noch nicht initialisiert bzw. nícht auf dem gewünschten Datensatz steht.
Die Variable "SalesHeader" ist vermutlich eine lokale oder globale Record-Variable in der Codeunit.
Bekommt die Codeunit bzw. die Funktion beim Aufruf denn den aktuellen bzw. gewünschten Datensatz von deinem Verkaufsangebot?
Dann müsstest du noch zuerst noch mit deiner Record-Variablen ein GET oder SETRANGE + FINDFIRST ausführen, damit die Record-Variable auf dem richtigen Datensatz steht.

Gruß
Jörg

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 10:48

FJS hat geschrieben:Und diese Angebotsnummer sollte nun schon als Filter in dem Feld "Document No." stehen, damit nicht versehentlich falsche Zeilen importiert werden, nur ich weiß nicht, wie ich das bewerkstelligen soll.

Ach so, das habe ich überlesen: die Importzeilen haben bereits die Angebotsnummer, die neu vergeben wurde? Wenn das so ist, kannst du mit Hilfe der übergebenen Angebotsnummer die eingelesenen Zeilen überspringen, die du nicht übernehmen möchtest. das so machen, wie die anderen beiden sagen.

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 11:20

McClane hat geschrieben:@ Natalie und JRenz: klärt mich doch bitte mal auf, wieso ihr bei einem Import mit Settableview arbeiten wollt

Ich nehme alles zurück; ihr habt recht :oops:

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 14:45

JRenz hat geschrieben:Hallo,

in diesem Fall gehe ich davon aus, dass deine Variable "SalesHeader" noch nicht initialisiert bzw. nícht auf dem gewünschten Datensatz steht.
Die Variable "SalesHeader" ist vermutlich eine lokale oder globale Record-Variable in der Codeunit.
Bekommt die Codeunit bzw. die Funktion beim Aufruf denn den aktuellen bzw. gewünschten Datensatz von deinem Verkaufsangebot?
Dann müsstest du noch zuerst noch mit deiner Record-Variablen ein GET oder SETRANGE + FINDFIRST ausführen, damit die Record-Variable auf dem richtigen Datensatz steht.

Gruß
Jörg


Hallo Jörg,

ich hab jetzt die Codeunit wie folgt ergänzt:


Code:
SalesHeader.GET;
Angebot:= (SalesHeader."No.");
SalesLine.SETRANGE("Document No.", Angebot);
ImportDataport.SETTABLEVIEW(SalesLine);
//MESSAGE(Angebot);
ImportDataport.RUN;


Ich bekomme jetzt folgende Fehlermeldung:
Die Verkaufskopf existiert nicht. Identifizierende Felder und Werte: Belegart='Angebot', Nr.=''

Irgendwie fehlt beim Aufruf der Codeunit aus der Form die Verbindung zu dem aktuellen Angebot. Wie könnte ich die noch herstellen?

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 14:52

Hallo,

auch da kann dir wahrscheinlich geholfen werden, aber dazu solltest du uns zunächst mal die Programmstelle posten, an der die Codeunit bzw. die Funktion aus der Codeunit aufgerufen wird und solltest du uns noch die gesamte Funktion (zumindest den Funktionsbeginn, damit eventuelle Parameter sichtbar sind) senden.

Gruß
Jörg

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 17:19

JRenz hat geschrieben:Hallo,

auch da kann dir wahrscheinlich geholfen werden, aber dazu solltest du uns zunächst mal die Programmstelle posten, an der die Codeunit bzw. die Funktion aus der Codeunit aufgerufen wird und solltest du uns noch die gesamte Funktion (zumindest den Funktionsbeginn, damit eventuelle Parameter sichtbar sind) senden.

Gruß
Jörg


Hallo Jörg,

das ganze sieht so aus:

Form 41 (Verkaufsangebot)
Command Button
Properties:
PushAction - RunObject
RunObjekt - Codeunit AufrufMeinDataport

Codeunit AufrufMeinDataport
OnRun()
Code:
SalesHeader.GET;
Angebot:= (SalesHeader."No.");
SalesLine.SETRANGE("Document No.", Angebot);
ImportDataport.SETTABLEVIEW(SalesLine);
ImportDataport.RUN;


In der Codeunit sind folgende Variablen:
SalesLine, Record, Sales Line
SalesHeader, Record, Sales Header
ImportDataport, Dataport, MeinDataport
Angebot, Text, 30

Aufgerufen wird die Codeunit wie schon gesagt aus der Form 41, nach dem eine Belegnummer vergeben wurde.

Wenn ich den Debugger anmache, sehe ich das die Variable Angebot leer ("") ist und bei der Record-Variable SalesHeader (und auch bei SalesLine) "Uninitialised" steht.

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 18:42

Hallo,

du solltest in den Properties der Codeunit im Property "TableNo" die Table 36 "Sales Header" eintragen, damit der Salesheader als Parameter im OnRun-Trigger steht.
Danach solltest du die PushAction ausprogrammieren (z.B. wie beim Button "Auftrag erstellen") und dort deine Codeunit mit dem aktuellen Datensatz (rec) aufrufen.
Dadurch bekommt deine Codeunit den aktuellen SalesHeader übergeben und du kannst dann in deinen Codezeilen den GET-Befehl so ändern, damit deine Record-Variable des Verkaufskopfes den aktuellen Datensatz bekommt.

Code:
SalesHeader.GET(rec."Document Type",rec."No.");


Als Beispiel kannst du z.B. den Button "Auftrag erstellen" und die zugehörige Codeunit 83 anschauen.

gruß
Jörg

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 21:15

Hallo Jörg,

Bingo! Tausend Dank Euch allen, jetzt klappt`s.

Re: Dataport mit vorbelegtem Filter

11. Februar 2014 21:19

FJS hat geschrieben:Bingo! Tausend Dank Euch allen, jetzt klappt`s.

Würdest du deinen finalen Code mit uns teilen, damit der nächste Fragende nachschlagen kann?