[gelöst] Dataport richtigen Datensatz finden

22. April 2014 09:24

Hallo liebe Community,

ich habe ein Problem in einem Dataport und komme einfach nicht auf die Lösung. :-(
Ich hoffe das mir einer von euch weiterhelfen kann. :)
Leider habe ich kein passendes Thema gefunden.

Ich möchte von meinem Dataitem "Sales Shipment Header" die dazugehörigen Packmittel von meinen Geb. Lieferscheinen auslesen.
Es gibt maximal 3 Datensätze.

Deshalb folgender Code:
Code:
Sales Shipment Header - OnBeforeExportRecord()

PackmittelTabelle[1].SETCURRENTKEY(Type,"No.","Source No.","Source Document","Line No.");
PackmittelTabelle[1].SETFILTER(Type,'%1',2);
PackmittelTabelle[1].SETRANGE(PackmittelTabelle[1]."No.","Sales Shipment Header"."No.");
IF PackmittelTabelle[1].FINDFIRST THEN BEGIN
  PackmittelColliEins := PackmittelTabelle[1].Count;
  PackmittelTypEins := PackmittelTabelle[1]."Packaging Type";
END;

PackmittelTabelle[2].SETCURRENTKEY(Type,"No.","Source No.","Source Document","Line No.");
PackmittelTabelle[2].SETFILTER(Type,'%1',2);
PackmittelTabelle[2].SETRANGE(PackmittelTabelle[2]."No.","Sales Shipment Header"."No.");
IF PackmittelTabelle[2].FINDFIRST THEN BEGIN
  PackmittelTabelle[2].NEXT(+1) ;
  PackmittelColliZwei := PackmittelTabelle[2].Count;
  PackmittelTypZwei := PackmittelTabelle[2]."Packaging Type";
END;

PackmittelTabelle[3].SETCURRENTKEY(Type,"No.","Source No.","Source Document","Line No.");
PackmittelTabelle[3].SETFILTER(Type,'%1',2);
PackmittelTabelle[3].SETRANGE(PackmittelTabelle[3]."No.","Sales Shipment Header"."No.");
IF PackmittelTabelle[3].FINDFIRST THEN BEGIN
   PackmittelTabelle[3].NEXT(+2);
  PackmittelColliDrei := PackmittelTabelle[3].Count;
  PackmittelTypDrei := PackmittelTabelle[3]."Packaging Type";
END;


Das klappt auch wunderbar wenn 3 Datensätze in der Tabelle Packmittel vorhanden sind.
Aber nicht wenn nur 1 oder 2 Datensätze vorhanden sind, dann gibt er mir den selben Wert mehrmals und hier müsste Navision bspw. PackmittelColliZwei leer übergeben (Wenn nur 1 Datensatz vorhanden ist)
Wie Programmiere ich den das?
Ich stehe echt auf dem schlauch und bin für jede Hilfe dankbar.

MFG SuppeDroops
Zuletzt geändert von SuppeDroops am 22. April 2014 16:04, insgesamt 1-mal geändert.

Re: Dataport richtigen Datensatz finden

22. April 2014 09:45

So, wie ich den Verwendungszweck verstehe, hätte der Quelltext so lauten müssen (da gibts noch weitere kosmetische Optimierungsmöglichkeiten, aber die lasse ich jetzt mal außer Acht):

Sales Shipment Header - OnBeforeExportRecord()

Code:
PackmittelTabelle.SETCURRENTKEY(Type,"No.","Source No.","Source Document","Line No.");
PackmittelTabelle.SETFILTER(Type,'%1',2);
PackmittelTabelle.SETRANGE(PackmittelTabelle."No.","Sales Shipment Header"."No.");
IF PackmittelTabelle.FINDFIRST THEN BEGIN
  
// erster Datensatz
  PackmittelColliEins := PackmittelTabelle.Count;
  PackmittelTypEins := PackmittelTabelle."Packaging Type";

  IF PackmittelTabelle.NEXT THEN BEGIN
    
// zweiter Datensatz
    PackmittelColliZwei := PackmittelTabelle.Count;
    PackmittelTypZwei := PackmittelTabelle."Packaging Type";
  END;

  IF PackmittelTabelle.NEXT THEN BEGIN
    
// dritter Datensatz
    PackmittelColliDrei := PackmittelTabelle.Count;
    PackmittelTypDrei := PackmittelTabelle."Packaging Type";
  END; 
END


Wofür soll PackmittelTabelle.Count gut sein, bzw. was soll PackkmittelColliX aussagen?

Re: Dataport richtigen Datensatz finden

22. April 2014 10:01

Du bist aber fix Natalie. :)

Um vielleicht noch einmal textuell zu unterstützen. Du nutzt ein Array und filterst bei allen drei Arrays auf genau die selben Werte. Dein "NEXT" Befehl sorgt nur dafür das der Cursor die entsprechenden Schritte weiterspringt, damit änderst du aber nicht die Anzahl der Datensätze innerhalb deiner Variable. Und dadurch ist es momentan egal wie viele Datensätze vorhanden sind. Deine drei Abfragen liefern bei dem "COUNT" immer die selbe Anzahl Datensätze, nur dein Cursor steht jeweils auf einem anderen Datensatz.

Re: Dataport richtigen Datensatz finden

22. April 2014 10:02

Hallo Natalie,

erstmal vielen Dank für deine Hilfe.

PackmittelTabelle.Count ist die Anzahl wie viel Europaletten ich bspw. verladen habe.

Leider stoße ich bei deiner Programmierung an der angehängten Fehlermeldung.

Was muss ich hier noch anpassen?!

MFG
SuppeDroops
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Dataport richtigen Datensatz finden

22. April 2014 10:40

SuppeDroops hat geschrieben:Leider stoße ich bei deiner Programmierung an der angehängten Fehlermeldung.

Haben oben nochmal ein "= 0" ergänzt; versuchs bitte nochmal.
Das war Quatsch, bitte warte ab.

PackmittelTabelle.Count ist die Anzahl wie viel Europaletten ich bspw. verladen habe.

Verstehe ich nicht. Mal angenommen, wir haben drei Datensätze gefunden. Soll dann in jedem der drei Datensätze die Zahl 3 stehen?

Re: Dataport richtigen Datensatz finden

22. April 2014 11:04

Es ist ein einfaches Mengefeld in der PackmittelTabelle es hat nichts mit dem Programmierungs COUNT zu tun.
Dieses Feld wird vor der Buchung von einem Mitarbeiter ausgefüllt. Bspw. Wir verladen 5 Europaletten, dann tragt hier der Mitarbeiter 5 ein.
Also es ist ein einfaches Mengenfeld wo nur leider PackmittelTabelle.Count heißt, aber nichts mit meiner Programmierung zu tun hat.

Ich hoffe ich habe das gut formuliert, sodass man das begreift :D

Re: Dataport richtigen Datensatz finden

22. April 2014 11:17

Bitte benennt das Feld Count um, z.B. in Counter oder besser Quantity.
COUNT ist ein bereits reserviertes Wort in C/AL, und bei Recordvariable.COUNT handelt es sich um eine Funktion, nicht um deinen gewünschten Feldinhalt.

Was den Quelltext ansonsten angeht:
Lege PackmittelColli & -typ als Array mit 3 Dimensionen an. Außerdem brauchst du eine lokale integer-Variable namens i.
Code:
// bitte immer initialisieren
CLEAR(PackmittelColli);
CLEAR(PackmittelTyp);

PackmittelTabelle.SETCURRENTKEY(Type,"No.","Source No.","Source Document","Line No.");
PackmittelTabelle.SETFILTER(Type,'%1',2);
PackmittelTabelle.SETRANGE("No.","Sales Shipment Header"."No.");
IF PackmittelTabelle.FINDSET THEN BEGIN
  REPEAT
    i 
:= i + 1;
    PackmittelColli[i] := PackmittelTabelle.Quantity;
    PackmittelTyp[i] := PackmittelTabelle."Packaging Type";
  UNTIL (PackmittelTabelle NEXT = 0) OR (= 3);
END

Re: Dataport richtigen Datensatz finden

22. April 2014 16:04

Hallo Natalie,

vielen Dank für deine Hilfe funktioniert jetzt einwandfrei. :)

Gruß SuppeDroops