[gelöst]Feld vom Typ integer hochzählen

22. Februar 2011 14:52

Hallo zusammen,

habe ein Problem (eigentlich viele, aber der reicht erst mal :-) )!

Ich habe eine neue Tabelle mit folgenden Feldern (sind nicht alle, aber nur die relevanten):
- Artikelnr -- Bezug auf Tabelle Artikel usw.
- Zeilennr

Folgendes:
Meine Tabelle ist wie folgt ausgefükkt:

Artiklenr Zeilennr
----------------------------------
1 9999 1000
2 8888 2000
3 1111 3000

Ich möchte nun eine neue Zeile einfügen für die Artikelnr = 8888.
Jedoch soll die Zeilennr (bezogen auf die ausgewählte Artikelnr) um eins hochgezählt werden, sobald ich das Feld Artikelnr verlasse.

Ergebnis sollte so aussehen:

Artiklenr Zeilennr
----------------------------------
1 9999 1000
2 8888 2000
3 8888 2001
4 1111 3000


Den Code schreibe ich im Trigger "Artikelnr - OnValidate". Oder nicht?
Wie sieht der Code aus?


Ich danke für Eure Hilfen!

Gruß
Ahmed
Zuletzt geändert von AhmedA am 25. Februar 2011 14:29, insgesamt 1-mal geändert.

Re: Feld vom Typ integer hochzählen

22. Februar 2011 16:00

Wie sieht denn der Primärkey deiner Tabelle aus?

Re: Feld vom Typ integer hochzählen

22. Februar 2011 16:08

Also vielleicht sollte ich noch einen Feld nennen = OrderNo
PrimaryKey sind OrderNo und ItemNo!

OrderNo______ItemNo_____LineNo
------------------------------------------
12345________9999_______1000
12345________8888_______2000
12345________2222_______3000

Wenn ich jetzt eine neue zeile einfüge, sollte natürlich die OrderNo immer gleich sein und vergleichen ob es schon die ItemNo gibt!
Wenn ja soll der letztermittelte Wert (LineNo) um eins erhöht werden.
Kann ich den Datensatz mit SETFILTER ermitteln? UNd wie würde der Code dafür aussehen?
Bin neuling, daher noch sehr unerfahren!

Danke!

Gruß
Ahmed

Re: Feld vom Typ integer hochzählen

22. Februar 2011 16:16

Hallo,

die Lösung ist relativ einfach - wenn man sie kennt:

Mit einer zweiten Record-Variablen (welche auf dieselbe Tabelle zeigt), ermitteln wir einfach die nächste LineNo:

Code:
DeineTabelle.SETRANGE(OrderNo,Rec.OrderNo);
DeineTabelle.SETRANGE(ItemNo,Rec.ItemNo);
IF DeineTabelle.FINDLAST THEN BEGIN
  Rec.LineNo := DeineTabelle.LineNo + 1;
END ELSE BEGIN
  // Es existiert noch kein Eintrag für diese OrderNo / ItemNo
  DeineTabelle.RESET;  // Alle Filter aufheben
  IF DeineTabelle.FINDLAST THEN BEGIN
    Rec.LineNo := DeineTabelle.LineNo + 1000;
  END ELSE BEGIN
    // Es existiert noch gar kein Eintrag in der Tabelle (z. B. neuer Mandant ;-) )
    Rec.LineNo := 1000;
  END;
END;

Re: Feld vom Typ integer hochzählen

22. Februar 2011 16:33

Hallo,

danke für die Antwort erstmals.

Timo Lässer hat geschrieben:Hallo, die Lösung ist relativ einfach - wenn man sie kennt:

JA wenn man es weiss, ist alles einfach :-)

Timo Lässer hat geschrieben: Mit einer zweiten Record-Variablen (welche auf dieselbe Tabelle zeigt), ermitteln wir einfach die nächste LineNo:

Das verstehe ich ja auch noch, dass ich eine zweite glob. Variable definiere...

Timo Lässer hat geschrieben:
Code:
DeineTabelle.SETRANGE(OrderNo,Rec.OrderNo);
DeineTabelle.SETRANGE(ItemNo,Rec.ItemNo);
IF DeineTabelle.FINDLAST THEN BEGIN
Rec.LineNo := DeineTabelle.LineNo + 1;
END ELSE BEGIN
// Es existiert noch kein Eintrag für diese OrderNo / ItemNo
DeineTabelle.RESET; // Alle Filter aufheben
IF DeineTabelle.FINDLAST THEN BEGIN
Rec.LineNo := DeineTabelle.LineNo + 1000;
END ELSE BEGIN
// Es existiert noch gar kein Eintrag in der Tabelle (z. B. neuer Mandant ;-) )
Rec.LineNo := 1000;
END;
END;

Jedoch verstehe ich nicht was siem mit "DeineTabelle" meinen. Soll ich das wo sie "DeineTabelle" stehen haben im Code einfach frei lassen, aslo z.B.

Code:
SETRANGE(OrderNo,Rec.OrderNo);
SETRANGE(ItemNo,Rec.ItemNo);
...


Danke im Voraus!

Re: Feld vom Typ integer hochzählen

22. Februar 2011 16:42

Hallo,
(bei uns hat sich übrigens das "Du" eingebürgert)

DeineTabelle ist der Name der Record-Variablen, welche auf dieselbe Tabelle verweist.
Ohne diese RecordVariablen würdest du mit deinem "eigenen" Record (dem du gerade die Zeilennr. zuordnen möchtest) nach der Zeilennummer suchen und dabei alle Feldwerte verlieren (bzw. mit den Feldwerten des "vorherigen" Datensatzes überschreiben).

Re: Feld vom Typ integer hochzählen

22. Februar 2011 16:50

Ich bin hingegangen und habe mir eine glob. Variable definiert = "Wert" vom Typ "Record".

den Code habe zuerst in den Trigger "Item No. - OnValidate" getan, leider kommen dann sehr viele zielen dazu.
dann ich habe den Code in den Trigger "Line No. - OnValidate" getan:

Code:
SETRANGE("Order No.", Wert."Order No.");
SETRANGE("Item No.", Wert."Item No.");
IF FINDLAST THEN
  BEGIN
    Wert."Line No." := "Line No." + 1;
  END ELSE
    BEGIN
      RESET;
      IF FINDLAST THEN
        BEGIN
          Wert."Line No." := "Line No." + 10000;
        END ELSE
          BEGIN
            Wert."Line No." := 10000;
          END;
    END;


Er tut es aber nichts.

Was mache ich falsch??

Re: Feld vom Typ integer hochzählen

22. Februar 2011 17:01

Versuche es doch mal mit dem Trigger OnInsert.
Das wäre die optimale Stelle.

Sollten die Datensätze in der Tabelle jedoch nicht (nur) durch die Anwender angelegt werden, sondern auch durch Programmcode an anderer Stelle, so müsste sichergestellt werden, dass die Datensätze immer mit DeineTabelle.INSERT(TRUE); eingefügt werden, da ansonsten die "Zeilennummern-Ermittlung" nicht durchlaufen würde.

Re: Feld vom Typ integer hochzählen

22. Februar 2011 17:16

Also, es ist wirklich so, dass die ersten 5 zeilen sage ich mal automatisch eingefügt/generiert werden.

nochmals sorry, aber ich habe das mit deineTabelle und Rec nicht verstanden.

Code:
DeineTabelle.SETRANGE(OrderNo,Rec.OrderNo);

DeineTabelle.SETRANGE soll heissen, dass DeineTabelle die aktuelle ist, wo ich gerade bin...
Und Rec.OrderNo ist die neue Variable die ich erstellt habe...
was ist denn dann die OrderNo???

Re: Feld vom Typ integer hochzählen

22. Februar 2011 17:25

Nun habe ich einige Änderungen gemacht.
Wert ist bei mir die neue Variable.

Code:

Wert.SETRANGE(Wert."Order No.", "Order No.");
Wert.SETRANGE(Wert."Item No.", "Item No.");
IF Wert.FINDLAST THEN
  BEGIN
    "Line No." := Wert."Line No." + 1;
  END ELSE
    BEGIN
      Wert.RESET;
      IF Wert.FINDLAST THEN
        BEGIN
          "Line No." := Wert."Line No." + 10000;
        END ELSE
          BEGIN
            "Line No." := 10000;
          END;
    END;



So klappt es....
Jedoch happerts an der Sortierung etwas...

Woran kann das denn sein??

Danke Timo

Re: Feld vom Typ integer hochzählen

22. Februar 2011 17:36

Mit Sortierung meinte ich, dass die zeilen sich langsam sortieren, ansonsten super

Re: Feld vom Typ integer hochzählen

22. Februar 2011 17:51

Wie wird denn schnell sortiert, gibt es denn einen Trick?
Weil der sortiert wirklich sehr sehr langsam...

Re: Feld vom Typ integer hochzählen

22. Februar 2011 19:52

ein SETCURRENTKEY vor den SETRANGES einbauen mit den Feldern aus den Setranges. Muss natürlich als Schlüssel in der Tabelle hinterlegt sein.
Man muss nicht zwingend genau den Schlüssel nehmen. Man könnte auch einen Schlüssel nehmen der die Filterfelder recht weit vorne stehen hat.

[gelöst]Re: Feld vom Typ integer hochzählen

25. Februar 2011 12:35

Hallo zusammen,

habe es gelöst. Der Code ist OK.
Ich hatte vergessen in NAV den ItemNo zu den zusammengesetzten Primärschlüsseln zu nehmen, d.h. meine Primärschlüssel setzt sich zusammen aus: OrderNo, ItemNo und LineNo.

Re: [gelöst]Feld vom Typ integer hochzählen

5. September 2019 14:55

hallo , und wo habt ihr jetzt den code reingeschrieben? in einen trigger in der page oder in eine codeunit?

MFG