[gelöst]Datensatz aus Tabelle finden

24. April 2012 09:51

Hallo,

ich schreib jetzt Daten aus einer csv-Datei in eine Tabelle (jtl_daten). Diese Daten sollen jetzt über eine Codeunit in die Tabelle Sales Header übernommen werden und dirt entsprechend Aufträge angelegt werden.

Die Tabelle htl_daten ist so aufgebaut, das pro Artikel eine Zeile angelegt ist. Das bedeutet bei einem Auftrag mit mehreren Positionen müsste ich dort ja ein Filter auf die Bestellnummer bsp. setzten und dann Sales Line solange füllen bis dort alle Datensätze abgearbeitet sind.

Jetzt ist die Frage wie kann ich dort angeben, dass Für jede auftragsnummer ein Auftrag angelegt wird. Oder besser gesagt bei mir wird immoment nur ein auftrag angelegt und alle positionen darunter. Das heißt es funktioniert der FIND ausdruck nicht...würde ich vermuten...

Kann mir jemand helfen?!
Zuletzt geändert von simon123 am 24. April 2012 14:20, insgesamt 1-mal geändert.

Re: Datensatz aus Tabelle finden

24. April 2012 10:10

Zur Fehlersuche wäre dein Code hilfreich.
Hier mal der allgemeine Ablauf um deine Tabelle zu durchlaufen und für alle Bestellnummern einen neuen Auftrag zu erzeugen.
Code:
htl : Record htl_daten;
SalesHeader : Record 36;
SalesLine: Record 37;
LastOrderNo : Code 20;

htl.SETCURRENTKEY(Belegnummer,Artikelnummer);
IF htl.FINDSET THEN BEGIN
  WITH SalesLine DO BEGIN 
    REPEAT
      IF htl.Bestellnummer <> LastOrderNo THEN BEGIN
        LasrOrderNo := htl.Bestellnummer;
        SalesHeader.INIT;
        ...
        SalesHeader.INSERT(TRUE);
      END;
      INIT;
      "Document Type" := SalesHeader."Document Type";
      "Document No." := SalesHeader."Document No.";
      Type := Type::Item;
      "No." := hlt.Artikelnummer;
      ...
      INSERT(TRUE);
    UNTIL htl.NEXT = 0;
  END;
END;

Re: Datensatz aus Tabelle finden

24. April 2012 11:53

Habe jetzt folgenden Code, aber jetzt erkennt er keine Zeilennummer....

Code:
jtl_daten.SETCURRENTKEY(jtl_daten."lfd. nr");
IF jtl_daten.FINDSET THEN BEGIN
  WITH zeile DO BEGIN
    REPEAT
      IF jtl_daten.auftragsnummer <> LastOrderNo THEN BEGIN
        LastOrderNo := jtl_daten.auftragsnummer;
        Sales_Header.INIT;
        Sales_Header."Document Type" := Sales_Header."Document Type"::Order;
        Sales_Header."No." := '';
        Sales_Header.INSERT(TRUE);
        Sales_Header.SetHideValidationDialog(TRUE);
        Sales_Header.VALIDATE("Sell-to Customer No.", '2946000000');
        Sales_Header."Ship-to Name" := jtl_daten.name1;
        Sales_Header."Ship-to Name 2" := jtl_daten.firma;
        Sales_Header."Ship-to Address" := jtl_daten.adresse1;
        Sales_Header."Ship-to City" := jtl_daten.ort;
        Sales_Header."Ship-to Post Code" := FORMAT(jtl_daten.plz);
        Sales_Header."Ship-to Address 2" := jtl_daten.adresse2;
        Sales_Header."External Document No." := jtl_daten.auftragsnummer;
        Sales_Header."Ship-to Contact" := jtl_daten.kontakt;

      END;
      INIT;
      //j :=j+ 10000;
      //zeile.VALIDATE(zeile."Line No.", j);
      zeile."Line No." := '';
      zeile.INSERT;
     
     
      zeile."Document Type" := zeile."Document Type" :: Order;
      zeile."Document No." := Sales_Header."No.";


      zeile."Sell-to Customer No." := Sales_Header."Sell-to Customer No.";
      MODIFY;

      //zeile."Line No." := j;
      Type := Type::Item;
       zeile.VALIDATE(zeile."No.", jtl_daten.ean);
      zeile.MODIFY;


      zeile.Quantity := jtl_daten.menge;

      INSERT(TRUE);
    UNTIL jtl_daten.NEXT = 0;
  END;
END;

Re: Datensatz aus Tabelle finden

24. April 2012 12:10

Suche doch einfach je Zeile, ob es einen Auftrag mit der Auftragsnummer im Feld "External Document No." schon gibt. Wenn nicht, legst du den Header an. Und danach suchst du immer die letzte Zeile des Auftrags und ergänzt die neue.

Re: Datensatz aus Tabelle finden

24. April 2012 12:15

Suche doch einfach je Zeile, ob es einen Auftrag mit der Auftragsnummer im Feld "External Document No." schon gibt. Wenn nicht, legst du den Header an. Und danach suchst du immer die letzte Zeile des Auftrags und ergänzt die neue.



Danke für den Tip, werde ich gleich mal ausprobieren...leider funktioniert das anlegen von Zeilen in der Sales Line nicht...


Erst war der Fehler :Zeilen nummer existiert nicht. Und jetzt ist der Fehler: Typkonvertierung Integer:= Text

Re: Datensatz aus Tabelle finden

24. April 2012 12:16

Das mit der Zeilennummer hängt jetzt davon ab ob du genrell neue Aufträge erstellst oder ob auch welche ergänzt werden.
Wenn du immer neue Aufträge erstellst kannst du eine Variable LineNo beim INSERT des Headers auf 10000 setzen.
Nach dem zuweisen der Zeilennummer in der Zeile dann um 10000 hoch zählen.
Code:
// Header
LineNo := 10000;
Header.INSERT
...
// Line
Line."Line No." := LineNo;
LineNo := LineNo + 10000;
...

Re: Datensatz aus Tabelle finden

24. April 2012 12:53

Danjo hat geschrieben:Das mit der Zeilennummer hängt jetzt davon ab ob du genrell neue Aufträge erstellst oder ob auch welche ergänzt werden.

Beides, oder hab ich das nun missverstanden? Ein neuer Auftrag wird erstellt, sobald die Auftragsnummer in der csv-Datei sich geändert hat. Ist es die gleiche wie in der Zeile davor, wird angehängt.

Re: Datensatz aus Tabelle finden

24. April 2012 13:00

McClane hat geschrieben:
Danjo hat geschrieben:Das mit der Zeilennummer hängt jetzt davon ab ob du genrell neue Aufträge erstellst oder ob auch welche ergänzt werden.

Beides, oder hab ich das nun missverstanden? Ein neuer Auftrag wird erstellt, sobald die Auftragsnummer in der csv-Datei sich geändert hat. Ist es die gleiche wie in der Zeile davor, wird angehängt.

OK, das mach das ganze minimal komplexer, da ja in dem Fall noch Datenbankabfragen notwendig sind.
Ich hatte es so verstanden das eine CSV-Datei importiert wird und diese dann Zeile für Zeile abgearbeitet wird, wobei sich alle x Zeilen die Bestellnummer ändert. Und beim nächsten mal ist es eine neue CSV-Datei.

Re: Datensatz aus Tabelle finden

24. April 2012 13:11

Danjo hat geschrieben:Ich hatte es so verstanden das eine CSV-Datei importiert wird und diese dann Zeile für Zeile abgearbeitet wird, wobei sich alle x Zeilen die Bestellnummer ändert. Und beim nächsten mal ist es eine neue CSV-Datei.

Dann sind wir eigentlich einer Meinung :-)

Und wenn's grad nur noch an einer Typkonvertierung hapert, müsste simon doch schon kurz vorm Ziel sein.

Re: Datensatz aus Tabelle finden

24. April 2012 13:13

Es ist eine csv-datei, aus der die die Daten in eine Tabelle geschrieben werden.

In der Tabelle wird pro bestellposition eine zeile angelegt, d.h. in der Tabelle sind bei einer Bestellung mit 2 Positionen zwei zeilen angelegt. Diese haben eine identische auftragsnummer über die dann festgestellt werden kann ob die artikel zu einer oder ggfs. zu zwei unterschiedlichen bestellungen gehören.


Die csv datei wird jeden Tag neu gefüllt und neu in die Tabelle eingelesen...Es wird hierbei immer das aktuelle Tagesadatum TODAY mit angegeben. Hierdrüber wird dann auch gefilter bzw. ausgesucht welche Aufträge eingelesen werden sollen...

Re: Datensatz aus Tabelle finden

24. April 2012 13:16

So ich habe jetzt Folgenden Code....

Es erscheint die Fehlermeldung wie unten im Bild beigefügt....

Code:
jtl_daten.SETCURRENTKEY(jtl_daten."lfd. nr");
IF jtl_daten.FINDSET THEN BEGIN
  WITH zeile DO BEGIN
    REPEAT

      IF jtl_daten.auftragsnummer <> LastOrderNo THEN BEGIN
        Line := 10000;
        LastOrderNo := jtl_daten.auftragsnummer;
        Sales_Header.INIT;
        Sales_Header."Document Type" := Sales_Header."Document Type"::Order;
        Sales_Header."No." := '';
        Sales_Header.INSERT(TRUE);
        Sales_Header.SetHideValidationDialog(TRUE);
        Sales_Header.VALIDATE("Sell-to Customer No.", '2946000000');
        Sales_Header."Ship-to Name" := jtl_daten.name1;
        Sales_Header."Ship-to Name 2" := jtl_daten.firma;
        Sales_Header."Ship-to Address" := jtl_daten.adresse1;
        Sales_Header."Ship-to City" := jtl_daten.ort;
        Sales_Header."Ship-to Post Code" := FORMAT(jtl_daten.plz);
        Sales_Header."Ship-to Address 2" := jtl_daten.adresse2;
        Sales_Header."External Document No." := jtl_daten.auftragsnummer;
        Sales_Header."Ship-to Contact" := jtl_daten.kontakt;

      END;
      INIT;

      zeile.INSERT;
      zeile."Document Type" := zeile."Document Type" :: Order;
      zeile."Document No." := Sales_Header."No.";
      zeile."Line No." := Line;
      Line := Line + 10000;

      zeile."Sell-to Customer No." := '2946000000';
      zeile.MODIFY;
      Type := Type::Item;
      zeile.VALIDATE(zeile."No.", jtl_daten.ean);
      zeile.MODIFY;
      zeile.Quantity := jtl_daten.menge;

      INSERT(TRUE);
    UNTIL jtl_daten.NEXT = 0;
  END;
END;
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Datensatz aus Tabelle finden

24. April 2012 13:20

Der Debugger hält an folgender Stelle an....
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Datensatz aus Tabelle finden

24. April 2012 13:25

Verschieb mal das zeile.INSERT an die Stelle nachdem du die Zeilennummer zugewiesen hast.

Und das With Zeile DO brauchst du nur wenn du später nicht immer Zeile davor schreiben willst.

Code:
jtl_daten.SETCURRENTKEY(jtl_daten."lfd. nr");
    IF jtl_daten.FINDSET THEN BEGIN
      WITH zeile DO BEGIN
        REPEAT

          IF jtl_daten.auftragsnummer <> LastOrderNo THEN BEGIN
            Line := 10000;
            LastOrderNo := jtl_daten.auftragsnummer;
            Sales_Header.INIT;
            Sales_Header."Document Type" := Sales_Header."Document Type"::Order;
            Sales_Header."No." := '';
            Sales_Header.INSERT(TRUE);
            Sales_Header.SetHideValidationDialog(TRUE);
            Sales_Header.VALIDATE("Sell-to Customer No.", '2946000000');
            Sales_Header."Ship-to Name" := jtl_daten.name1;
            Sales_Header."Ship-to Name 2" := jtl_daten.firma;
            Sales_Header."Ship-to Address" := jtl_daten.adresse1;
            Sales_Header."Ship-to City" := jtl_daten.ort;
            Sales_Header."Ship-to Post Code" := FORMAT(jtl_daten.plz);
            Sales_Header."Ship-to Address 2" := jtl_daten.adresse2;
            Sales_Header."External Document No." := jtl_daten.auftragsnummer;
            Sales_Header."Ship-to Contact" := jtl_daten.kontakt;

          END;
          INIT;

          "Document Type" := zeile."Document Type" :: Order;
          "Document No." := Sales_Header."No.";
          "Line No." := Line;
          Line := Line + 10000;

          "Sell-to Customer No." := '2946000000';
          INSERT(TRUE);
          Type := Type::Item;
          VALIDATE(zeile."No.", jtl_daten.ean);
          Quantity := jtl_daten.menge;

          //INSERT(TRUE);
          MODIFY;
        UNTIL jtl_daten.NEXT = 0;
      END;
    END;


Noch besser wäre es denke ich wenn du dein INSERT und dein MODIFY weglässt und nur das INSERT(TRUE) am Ende stehen lässt, was aber vermutlich Probleme mit dem VALIDATE bringt.

Re: Datensatz aus Tabelle finden

24. April 2012 13:29

Außerdem fehlt da noch ein Sales_Header.modify.

Re: Datensatz aus Tabelle finden

24. April 2012 13:34

Vielen Dank....

Der Code zum Glück....es geht...

Code:
jtl_daten.SETCURRENTKEY(jtl_daten."lfd. nr");
    IF jtl_daten.FINDSET THEN BEGIN
      WITH zeile DO BEGIN
        REPEAT

          IF jtl_daten.auftragsnummer <> LastOrderNo THEN BEGIN
            Line := 10000;
            LastOrderNo := jtl_daten.auftragsnummer;
            Sales_Header.INIT;
            Sales_Header."Document Type" := Sales_Header."Document Type"::Order;
            Sales_Header."No." := '';
            Sales_Header.INSERT(TRUE);
            Sales_Header.SetHideValidationDialog(TRUE);
            Sales_Header.VALIDATE("Sell-to Customer No.", '2946000000');
            Sales_Header."Ship-to Name" := jtl_daten.name1;
            Sales_Header."Ship-to Name 2" := jtl_daten.firma;
            Sales_Header."Ship-to Address" := jtl_daten.adresse1;
            Sales_Header."Ship-to City" := jtl_daten.ort;
            Sales_Header."Ship-to Post Code" := FORMAT(jtl_daten.plz);
            Sales_Header."Ship-to Address 2" := jtl_daten.adresse2;
            Sales_Header."External Document No." := jtl_daten.auftragsnummer;
            Sales_Header."Ship-to Contact" := jtl_daten.kontakt;
            Sales_Header.MODIFY;

          END;
          INIT;

          "Document Type" := zeile."Document Type" :: Order;
          "Document No." := Sales_Header."No.";
          "Line No." := Line;
          Line := Line + 10000;

          "Sell-to Customer No." := '2946000000';
          INSERT(TRUE);
          Type := Type::Item;
          VALIDATE(zeile."No.", jtl_daten.ean);
          Quantity := jtl_daten.menge;

          //INSERT(TRUE);
          MODIFY;
        UNTIL jtl_daten.NEXT = 0;
      END;
    END;

Re: Datensatz aus Tabelle finden

24. April 2012 14:08

So jetzt habe ich noch ein Problem bei dem einlesen der csv Datei in die Tabelle. Die Daten aus der Datenbank könne nur per Ansi ausgegeben werden...Jetzt bekomme ich bei umlauten einem "ü" beispielsweise ein "³" in der Tabelle nur angezeigt. Sprich die Umlaute sind nicht korrekt dargestellt. Kann mir hier jemand helfen.

Ich kann aus der Datenbank nur ANSI, UNICODE und OEM ausgeben....Bei unicode wird jedoch gar kein Code in die Tabelle geschrieben...

Re: Datensatz aus Tabelle finden

24. April 2012 14:19

Das Problem mit den Umlauten ist auch gelöst.

Danke...

Re: [gelöst]Datensatz aus Tabelle finden

24. April 2012 14:47

Entschuldige, ich dachte, es sei vorher schon alles in Ordnung gewesen.

Re: [gelöst]Datensatz aus Tabelle finden

24. April 2012 14:50

Kein Problem, ist jetzt alles erledigt...