Sales Line Auto Zeile anlegen / löschen

30. November 2017 10:58

Hallo Zusammen,

ich will eine neue Zeile Automatisch in Verkaufsaufträge Zeilen (Tabelle Sales Line) hinzufügen.
Also, wenn mann Manuel eine Zeile mit dem Art "Charge (Item)" erstellt, muss die Funktion das Feld "No." in der Tabelle "Item Charge" suchen und in der nächsten Zeile muss das Ergebnis der Suche im Feld "No." hinzugefügt werden.

Mein Code:

Code:
IF SalesLine.Type = SalesLine.Type::"Charge (Item)" THEN BEGIN
  SalesLine.SETRANGE("No.", ItemCharge."No.");
  SalesLine.INSERT;
  SalesLine."No." := ItemCharge."No.";
  SalesLine.MODIFY;
END;


Es funktioniert aber leider nicht. Kann jemand mir bitte helfen?
Danke.

Re: Sales Line Auto Zeile anlegen / löschen

30. November 2017 13:38

Ich verstehe nicht ganz was du willst. Wenn ich eine Zeile mit Zu-/Abschlag und Nr. erfasst habe dann soll der Zu-/Abschlag gesucht werden?

Code:
IF SalesLine.Type = SalesLine.Type::"Charge (Item)" THEN BEGIN
  ItemCharge.GET(SalesLine."No.");
  [...]
END;

Re: Sales Line Auto Zeile anlegen / löschen

30. November 2017 14:11

Hallo,

ich will, wenn ich eine neue Zeile mit dem Typ "Aufschlag / Rabatt" Manuel erstelle, wird automatisch die nächste Zeile angelegt und im Feld "Nr." wird das Ergebnis des Suchelement-Item Charge setzen und wenn diese Zeile gelöscht wird, wird die nächste Zeile auch gelöscht. Also soll ich zwei Funktionen aufbauen, eine für anlegen und eine für löschen.

Gruß
Sam
Zuletzt geändert von McClane am 30. November 2017 15:07, insgesamt 1-mal geändert.
Grund: Bitte nicht den darüberstehenden Beitrag komplett zitieren!!

Re: Sales Line Auto Zeile anlegen / löschen

30. November 2017 14:33

OK, also immer zwei Zu-/Abschlag Zeilen mit gleicher Nummer. Dann müsstest du den Primärschlüssel noch setzen (Belegart, Belegnr., Zeilennr.) vor dem Insert, insbesondere die Zeilennr. hochzählen.

Dass die Zeilen zusammengehören kann man machen. Im Standard gibt es das ja bei den Textbausteinen (Feld "Attached to Line No."). Ich würde das mit einem eigenen Feld lösen und die Logik entsprechend programmieren (insbesondere im OnDelete Trigger der Tabelle Sales Line).

Re: Sales Line Auto Zeile anlegen / löschen

30. November 2017 14:49

Genau, will ich auch so machen. Kannst du bitte mir erklären, genau was soll ich tun?
Danke.
Zuletzt geändert von McClane am 30. November 2017 15:08, insgesamt 1-mal geändert.
Grund: Bitte nicht den darüberstehenden Beitrag komplett zitieren!!

Re: Sales Line Auto Zeile anlegen / löschen

30. November 2017 16:24

Hier nur ganz grob, ohne Anspruch auf Vollständigkeit. Mein Code basiert auf NAV 2013 R2, kann sein dass der Standard Code in NAV 2017 anders aussieht:

Neues Feld anlegen in Table 37 Sales Line, 113 Sales Invoice Line, Table 115 Sales Cr.Memo Line, Sales Line Archive (ich nenne es hier mal "Attached to XXX Line No.").

Table 37 Sales Line
OnDelete:
Code:
IF "Line No." <> 0 THEN BEGIN
  SalesLine2.RESET;
  SalesLine2.SETRANGE("Document Type","Document Type");
  SalesLine2.SETRANGE("Document No.","Document No.");
  SalesLine2.SETRANGE("Attached to Line No.","Line No.");
  SalesLine2.SETFILTER("Line No.",'<>%1',"Line No.");
  SalesLine2.DELETEALL(TRUE);
// Anpassung Start
  SalesLine2.RESET;
  SalesLine2.SETRANGE("Document Type","Document Type");
  SalesLine2.SETRANGE("Document No.","Document No.");
  SalesLine2.SETRANGE("Attached to XXX Line No.","Line No.");
  SalesLine2.SETFILTER("Line No.",'<>%1',"Line No.");
  SalesLine2.DELETEALL(TRUE);
// Anpassung Stop
END;


Page 46 Sales Order Subform
function NoOnAfterValidate
Code:
// Anpassung Start
IF (Type = Type::Item) AND ("No." <> xRec."No.") THEN
BEGIN
  IF ...
  // Bedingungen abprüfen, also Type = Charge Item usw.
  THEN
    BEGIN
        CurrPage.SAVERECORD;
        COMMIT;
        // Ausführen, also neue Zeile anlegen, Zeilennr. erhöhen usw.
        CurrPage.UPDATE(FALSE);
    END;
END;
// Anpassung Stop


Meine Funktion bzw. Codeunit die das "Ausführen" übernimmt. Achtung, ich hab da was zusammengestrichen, weil die eigentlich was anderes tut, daher die BOM Component geschichten, soll nur als Entwurf/Beispiel dienen, musst du entsprechend adaptieren, bei dir dann auch kein Repeat weil nur eine weitere Zeile angelegt wird, usw.

Code:
WITH SalesLineP DO
BEGIN
        // ggf. vorhandene zugehörige Zeilen (Art=Artikel) löschen  ** müsste bei dir dann Art Zu-/Abschlag sein!
        SalesLineLoc.SETRANGE("Document Type","Document Type");
        SalesLineLoc.SETRANGE("Document No.","Document No.");
        SalesLineLoc.SETRANGE(Type,Type);
        SalesLineLoc.SETRANGE("Attached to XXX Line No.","Line No.");
        SalesLineLoc := SalesLineP;
        IF SalesLineLoc.FIND('>') THEN
          REPEAT
            SalesLineLoc.DELETE(TRUE);
          UNTIL SalesLineLoc.NEXT = 0;

        // nächste Zeilen-Nr. ermitteln
        SalesLineLoc.RESET;
        SalesLineLoc.SETRANGE("Document Type","Document Type");
        SalesLineLoc.SETRANGE("Document No.","Document No.");
        SalesLineLoc := SalesLineP;
        IF SalesLineLoc.FIND('>') THEN
        BEGIN
          LineSpacing := (SalesLineLoc."Line No." - "Line No.") DIV (1 + BOMComponentLoc.COUNT);
          IF LineSpacing = 0 THEN ERROR(ErrText001);
        END ELSE
          LineSpacing := 10000;
        NextLineNo := "Line No." + LineSpacing;

        // Zeilen einfügen
        REPEAT
          SalesLineLoc.INIT;
          SalesLineLoc."Document Type"         := "Document Type";
          SalesLineLoc."Document No."          := SalesLineLoc."Document No.";
          SalesLineLoc."Line No."              := NextLineNo;
          SalesLineLoc.INSERT;
          SalesLineLoc."Sell-to Customer No."  := "Sell-to Customer No.";
          SalesLineLoc.VALIDATE(Type,SalesLineLoc.Type::Item);  // ** bei Dir Zu-/Abschlag
          SalesLineLoc.VALIDATE("No.",BOMComponentLoc."No.");  // ** bei Dir die Zu-/Abschlag Nr.
          SalesLineLoc."Location Code"         := "Location Code";
          SalesLineLoc."Shipment Date"         := "Shipment Date";
          SalesLineLoc.VALIDATE(Quantity,Quantity);
          SalesLineLoc.VALIDATE("Unit Price",xxxxx);
          IF "Line Discount %" <> 0 THEN
            SalesLineLoc.VALIDATE("Line Discount %","Line Discount %");
          IF "Shortcut Dimension 1 Code" <> '' THEN
            SalesLineLoc.VALIDATE("Shortcut Dimension 1 Code","Shortcut Dimension 1 Code");
          SalesLineLoc."Customer Price Group"      := "Customer Price Group";
          SalesLineLoc."Bill-to Customer No."      := "Bill-to Customer No.";
          SalesLineLoc."Gen. Bus. Posting Group"   := "Gen. Bus. Posting Group";
          SalesLineLoc.VALIDATE("VAT Bus. Posting Group","VAT Bus. Posting Group");
          SalesLineLoc."Currency Code"             := "Currency Code";
          SalesLineLoc."Attached to XXX Line No."      := "Line No.";
          SalesLineLoc.MODIFY;
          NextLineNo := NextLineNo + LineSpacing;
        UNTIL BOMComponentLoc.NEXT = 0;
END;

Re: Sales Line Auto Zeile anlegen / löschen

30. November 2017 17:02

Danke, aber diese Anpassung macht nicht für mich!

Mein Sales Line muss wie dieses Bild wird und bei löschen, sollen auch 10040 und andere Zeile gelöscht werden.
Meine"Item Charge" Tabelle ist auch so.
Eine Frage über deine Funktion. Welche Codeunit oder Tabelle soll geändert werden?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Sales Line Auto Zeile anlegen / löschen

1. Dezember 2017 13:18

Ich habe so geschrieben, aber geht nicht!

Code:
WITH SalesLineLocs DO BEGIN
  IF SalesLineLocs.Type = SalesLineLocs.Type::"Charge (Item)" THEN BEGIN
    NextLineNo := "Line No." + 10000;
    SalesLineLoc.INIT;
    SalesLineLoc."Document Type" := "Document Type";
    SalesLineLoc."Document No." := "Document No.";
    SalesLineLoc."Line No." := NextLineNo;
    SalesLineLoc.INSERT;
    SalesLineLoc.VALIDATE(Type, SalesLineLoc.Type::" ");
    SalesLineLoc.VALIDATE("No.", ItemChargeLoc."No.");
    SalesLineLoc.MODIFY;
  END;
END;


Hast du oder jemand anderes bitte eine Idee!?

Re: Sales Line Auto Zeile anlegen / löschen

1. Dezember 2017 22:07

iSam hat geschrieben:
Mein Code:

Code:
IF SalesLine.Type = SalesLine.Type::"Charge (Item)" THEN BEGIN
  SalesLine.SETRANGE("No.", ItemCharge."No.");
  SalesLine.INSERT;
  SalesLine."No." := ItemCharge."No.";
  SalesLine.MODIFY;
END;


Es funktioniert aber leider nicht. Kann jemand mir bitte helfen?
Danke.


Ohne den tieferen Sinn deiner Anforderung zu verstehen fällt mir auf: du hast ein INSERT, aber kein INIT.
Ich hab mal vor langer Zeit in Programming 1 gelernt, dass beim Anlegen von neuen Datensätzen INIT und INSERT immer Hand in Hand gehen.

Außerdem erinnere ich mich an folgende Ablauflogik:
(1) Filtern auf Tabelleninstanz 1
(2) Abfragen auf Filterergebnis auf Tabelleninstanz 1
(3) Datenmanipulation (Iteration mit INIT-INSERT oder MODIFY) auf Tabelleninstanz 2

Vielleicht schickt dich dein Arbeitgeber (NAV-Partner) auf die Programming 1 + 2 Schulung bei Impuls Nürnberg (get&use Academy) oder du guckst unter http://www.navision24.de ob du da was findest.

Schönes WE und viel Erfolg

Re: Sales Line Auto Zeile anlegen / löschen

2. Dezember 2017 16:04

Danke.
wenn du schaust, ist mein Code jetzt so mit INIT und ...:

Code:
WITH SalesLineLocs DO BEGIN
  IF SalesLineLocs.Type = SalesLineLocs.Type::"Charge (Item)" THEN BEGIN
    NextLineNo := "Line No." + 10000;
    SalesLineLoc.INIT;
    SalesLineLoc."Document Type" := "Document Type";
    SalesLineLoc."Document No." := "Document No.";
    SalesLineLoc."Line No." := NextLineNo;
    SalesLineLoc.INSERT;
    SalesLineLoc.VALIDATE(Type, SalesLineLoc.Type::" ");
    SalesLineLoc.VALIDATE("No.", ItemChargeLoc."No.");
    SalesLineLoc.MODIFY;
  END;
END;


Ich habe Introduction Kurs schon gemacht, aber Advanced leider noch nicht.
Aber ich soll diese Aufgabe lösen, vor Kursen oder anderen Lösungen 8-)
Also wenn jemand kann, hilf mir bitte.

Re: Sales Line Auto Zeile anlegen / löschen

5. Dezember 2017 15:57

Jetzt mein Code ist:

Code:
IF SalesLineP.Type = SalesLineP.Type::"Charge (Item)" THEN BEGIN
  WITH SalesLineP DO BEGIN
    SalesLineLoc.RESET;
    SalesLineLoc.SETRANGE("Document Type", "Document Type");
    SalesLineLoc.SETRANGE("Document No.", "Document No.");
    SalesLineLoc := SalesLineP;
    IF FIND('>') THEN BEGIN
      LineSpacing := 10000;
      NextLineNo := "Line No." + LineSpacing;
    END;
    REPEAT
      SalesLineLoc.INIT;
      SalesLineLoc."Document Type" := "Document Type";
      SalesLineLoc."Document No." := "Document No.";
      SalesLineLoc."Line No." := NextLineNo;
      SalesLineLoc.INSERT;
      SalesLineLoc.VALIDATE("No.", ItemChargeLoc."Standard Text Module");
      SalesLineLoc.MODIFY;
      NextLineNo := NextLineNo + LineSpacing;
    UNTIL ItemChargeLoc.NEXT = 0;
  END;
END;


und mein Ergebnis ist wie das Bild, aber ich möchte nur 10040 Zeile unter "Zu-/Abschlag (Artikel) ohne leer Zeile in oben habe.
Kann jemand mir helfen?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Sales Line Auto Zeile anlegen / löschen

5. Dezember 2017 19:11

sorry, aber ich versteh die Anforderung schon garnicht - hab auch keine Lust, mir die div. Einträge und Codebeispiele durchzulesen.
Ist wirklich nicht böse gemeint, aber kannst du deine Anforderung vll. auf englisch schreiben - mir fällt es sehr schwer, deinem Satzbau zu folgen und ich hoffe, dass es
vll. auf Englisch besser geht.

Oder geht es nur mir so?

Re: Sales Line Auto Zeile anlegen / löschen

6. Dezember 2017 00:07

@sweikelt: nein, Du bist nicht allein, mir geht es genau so, eigentlich, so wie es aussieht, auch wie allen anderen in diesem Thema, die versucht haben, die Anforderung genau zu verstehen (wenn ich mir alles durchlese)

Re: Sales Line Auto Zeile anlegen / löschen

6. Dezember 2017 01:44

Es tut mir sehr leid, dass ich das nicht klar erklärt habe.
Wenn ich manuell eine Zeile mit dem Art "Charge (Item)" erstelle, muss automatisch eine weitere Zeile mit der Nummer unter dieser Zeile angelegt wird. Diese Nummer erhält es aus der Tabelle "Item Charge" genau wie die folgenden Bilder.
Diese Nummer hängt von den Feldern "No." und "Standardtextmodul" in der Tabelle "Item Charge" ab.
Es ist besser zu sagen, dass wenn der "Zu/Abschlag" eingefügt wird, wird auch der "Standard Text Module" eine Zeile darunter eingefügt und wenn die "Zu-Abschlagszeile" gelöscht wird, wo wird auch die "Standard Text Module" gelöscht.

Ich erkläre auch auf Englisch, ob mein Deutsch vielleicht schlecht ist!

If I manually create a line with the type "Charge (Item)", another line with the number under this line must be created automatically. This number is obtained from the "Item Charge" table just like the following pictures.
This number depends on the fields "No." and "Standard Text Module" in the "Item Charge table".
It is better to say that if the "Zu/Abschlag" is inserted, the "Standard Text Module" will also be inserted one line below it, and if the "Zu/Abschlag" will be deleted, also the "Standard Text Module" will be deleted.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Sales Line Auto Zeile anlegen / löschen

6. Dezember 2017 13:17

Ist es jetzt klar? Könnt ihr mir helfen?

Re: Sales Line Auto Zeile anlegen / löschen

6. Dezember 2017 14:22

Hi,

also erstmal gibst du dem Record ItemChargeLoc keinen Filter mit, daher werden auch mehrere Zeilen erstellt.
Lass die Repeat-Until-Schleife weg und verwende IF ItemChargeLoc.GET(SalesLine."No.") THEN ...

Folgende Dinge müsstest du noch betrachten:
- Was passiert, wenn die Zu-Abschlagszeile erneut validiert wird?
- Was passiert, wenn schon vor dem Einfügen weitere Zeilen nach deiner Zu-Abschlagszeile existieren?
- Was passiert, wenn jemand zwischen deinen Beiden Zeilen weitere Zeilen einfügt und danach die Zu-Abschlagszeile löscht?

Vielleicht solltest du einfach die Line No der aktuellen Zeile nur um 1 erhöhen. Damit verhinderst du ein Einfügen weiterer Zeilen zwischen deinen beiden Zeilen. Zudem dürfte das Anlegen und auch Löschen auch leichter sein.

Also z.B. so (ungetestet!)
Code:
IF SalesLine.Type = SalesLine.Type::"Charge (Item)" THEN
  IF ItemChargeLoc.GET(SalesLine."No.") THEN
    IF NOT SalesLineLoc.GET(SalesLine."Document Type",SalesLine."Document No.",SalesLine."Line No." + 1) THEN BEGIN
      SalesLineLoc.RESET;
      SalesLineLoc.INIT;
      SalesLineLoc."Document Type" := SalesLine."Document Type";
      SalesLineLoc."Document No." := SalesLine."Document No.";
      SalesLineLoc."Line No." := SalesLine."Line No." + 1;
      SalesLineLoc.INSERT;
      SalesLineLoc.VALIDATE("No.", ItemChargeLoc."Standard Text Module");
      SalesLineLoc.MODIFY;
    END;

Re: Sales Line Auto Zeile anlegen / löschen

6. Dezember 2017 18:04

Bei den Artikeln gibt es die gleiche Funktion mit den Textbausteinen. Schau dir mal Page 46 "OnValidate No." und Codeunit 378 an. Da solltest du alles finden.

Re: Sales Line Auto Zeile anlegen / löschen

7. Dezember 2017 11:13

m_schneider hat geschrieben:Bei den Artikeln gibt es die gleiche Funktion mit den Textbausteinen. Schau dir mal Page 46 "OnValidate No." und Codeunit 378 an. Da solltest du alles finden.


Danke, ich habe genau so gemacht und mein Ergebnis ist so aber.
Mit Filter hat es leider keine Ausgabe!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Sales Line Auto Zeile anlegen / löschen

15. Dezember 2017 17:57

Ich habe es geschafft, aber ich habe nur bei NextlineNo Problem! Es wird nicht korrekt abgerechnet, aber wenn ich es z. B. 50000 anstatt NextlineNo eingebe, funktioniert!