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

Bild Microsoft Dynamics NAV 2009 (aka "NAV 6")
Forumsregeln
Impressum • Community-Knigge • Nutzungsbedingungen • Datenschutzrichtlinie

Bitte unbedingt angeben, ob sich eure Frage auf den RoleTailored-Client (RTC) oder den Classic-Client (CC) bezieht!

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

Beitragvon AhmedA » 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.
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon jm » 22. Februar 2011 16:00

Wie sieht denn der Primärkey deiner Tabelle aus?
MfG
Josef Metz
jm
Microsoft Partner
Microsoft Partner
 
Beiträge: 139
Registriert: 18. April 2005 11:32
Wohnort: WĂĽrzburg
Realer Name: Josef Metz
Arbeitsort: WĂĽrzburg
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: DOS..

Re: Feld vom Typ integer hochzählen

Beitragvon AhmedA » 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
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon Timo Lässer » 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: Alles auswählen
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;
Gruß, Timo Lässer

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂĽr ist dieses Forum da.
Hier kannst du fĂĽr MSDynamics.de spenden.
Benutzeravatar
Timo Lässer
Administrator
Administrator
 
Beiträge: 5274
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14, BC21

Re: Feld vom Typ integer hochzählen

Beitragvon AhmedA » 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: Alles auswählen
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: Alles auswählen
SETRANGE(OrderNo,Rec.OrderNo);
SETRANGE(ItemNo,Rec.ItemNo);
...


Danke im Voraus!
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon Timo Lässer » 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).
Gruß, Timo Lässer

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂĽr ist dieses Forum da.
Hier kannst du fĂĽr MSDynamics.de spenden.
Benutzeravatar
Timo Lässer
Administrator
Administrator
 
Beiträge: 5274
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14, BC21

Re: Feld vom Typ integer hochzählen

Beitragvon AhmedA » 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: Alles auswählen
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??
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon Timo Lässer » 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.
Gruß, Timo Lässer

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂĽr ist dieses Forum da.
Hier kannst du fĂĽr MSDynamics.de spenden.
Benutzeravatar
Timo Lässer
Administrator
Administrator
 
Beiträge: 5274
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14, BC21

Re: Feld vom Typ integer hochzählen

Beitragvon AhmedA » 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: Alles auswählen
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???
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon AhmedA » 22. Februar 2011 17:25

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

Code: Alles auswählen

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
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon AhmedA » 22. Februar 2011 17:36

Mit Sortierung meinte ich, dass die zeilen sich langsam sortieren, ansonsten super
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon AhmedA » 22. Februar 2011 17:51

Wie wird denn schnell sortiert, gibt es denn einen Trick?
Weil der sortiert wirklich sehr sehr langsam...
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: Feld vom Typ integer hochzählen

Beitragvon JanGD » 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.
JanGD
 
Beiträge: 1765
Registriert: 19. März 2008 12:33
Arbeitsort: NRW
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2013R2

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

Beitragvon AhmedA » 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.
AhmedA
 
Beiträge: 60
Registriert: 31. Januar 2011 12:15
Realer Name: Altinata
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

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

Beitragvon derPat18 » 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
Mit Freundlichen GrĂĽĂźen
Patrick
Benutzeravatar
derPat18
 
Beiträge: 79
Registriert: 5. April 2018 12:38
Wohnort: Greiz
Realer Name: Patrick K.
Arbeitsort: Greiz/Gera
Bezug zu Microsoft Dynamics: SchĂĽler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2018


ZurĂĽck zu NAV 2009

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot], Unbekannter Crawler und 1 Gast