Auto-Wert bzw. Nummernkreis

Hallo, wie bringen ich Navision dazu in einer Tabelle beim Anlegen eines neuen Datensatzes, das Feld id automatisch um einen Wert hochzuzählen ? Vielen Dank für Eure Hilfe ! Gruss Chris

Hallo, es gibt die Möglichkeit der Nummernserie (siehe table 36). Ansonsten etwa so: Dazu wird eine rec-Variable der aktuellen Tabelle benötigt! rec = aktuelle Tabelle rec2 = Variable der aktuellen Tabelle Im OnInsert- trigger (der Tabelle):


rec2.setcurrentkey(DeineNummer); //Schlüssel setzen
rec2.find('+');                  //letzten finden
x := rec2.DeineNummer + 1;       //Nummer holen und hochzählen
rec.DeineNummer := x;            // Nummer zuweisen

PS Ich habe vergessen, zu erwähnen, dass dazu die Entwickler-Lizenz benötigt wird! Andre

Frage: Ist hier ein rec2.LOCKTABLE wünschenswert oder gar notwendig? Ich mache das bei dieser Gelegenheit immer, da zwischen dem FIND und dem endgültigen Speichern des neuen Wertes theoretisch ein anderer Benutzer die selbe Operation ausführen könnte und der Wert zweimal vergeben werden kann. In den diversen Standard- und angepassten Objekten wird manchmal ein LOCKTABLE gemacht, manchmal nicht. [:0] Oder wird hier beim OnInsert automatisch die Tabelle gesperrt? Nutzt’s nix, dann schad’ts nix, oder doch?

Juhu, es hat gefunzt ! ! Vielen vielen Dank. Gruss Chris

Heinz: OK, es macht Sinn ein LockTable einzusetzen. Wobei, funktioniert das bei rec-Variablen? Man müßte ein Locktable auf die Original-Tabelle machen, oder? Chris: Freut mich. Andre

quote:


Originally posted by Andre DDB
Heinz: OK, es macht Sinn ein LockTable einzusetzen. Wobei, funktioniert das bei rec-Variablen? Man müßte ein Locktable auf die Original-Tabelle machen, oder?


Meines Wissens geht das NUR bei Rec-Variablen, oder? Wie würde man die “Original-Tabelle” ansprechen? [?] Mit dem Lock auf die Rec-Variable sollte die zugehörige Tabelle automatisch vollständig gelockt sein, denke ich…

Hallo Heinz, sorry, ich war etwas unklar. Für mich ist im Bespiel rec = Original und rec2 = Variable (ich weiß, es sind beides Variablen). Du hast oben rec2.LockTable geschrieben. Die Frage ‘ob das funktioniert’ bezog sich darauf, ob ich im OnInsert- Trigger ein LockTable auf die gleiche Tabelle machen kann. Ich habs noch nie probiert. Andre

Ach so, alles klar… Ich denke, die einzige Besonderheit von Rec ist, daß es vordefiniert und vorbelegt ist, ansonsten ist es eine Variable wie jede andere auch. Ich mache das LOCK aus rein intuitiv-stilistischen Gründen [;)] immer auf die zweite Record-Variable, aber meines Wissens sollte es völlig egal sein, welche Variable geLOCKt wird. Es hat bisher immer problemlos so funktioniert, jedenfalls habe ich in dieser Hinsicht noch nie eine Beschwerde eines unserer Benutzer bekommen [:D]

Wir sind mit LockTable ein gebranntes Kind. Es gab zu ‘Blau’- Zeiten einige Verarbeitungen, wie z.B. eine Vefügbarkeitsprüfung über mehrere Läger, bei denen es möglich war, die Datenbank so zu ‘LockTabeln’, daß am Ende alles steht. Das ups daran ist ja, dass Navision einen in die Falle laufen lässt, um dann ein weisses Fenster (Blau) oder die Meldung in der Statusleiste anzuzeigen. Zurück gehts es dann aber nicht mehr! Andre

Ja, ich kann mir durchaus vorstellen, daß man damit auch schöne Deadlocks produzieren kann [xx(] Leider lehrt uns die Betriebssystemtheorie, daß Deadlock-Recognition wesentlich leichter ist als Deadlock-Prevention - insbesondere dann, wenn man die Recognition samt darauf folgender Resolution auf den User abwälzen kann [:p]

quote:


Originally posted by Andre DDB
Im OnInsert- trigger (der Tabelle):


rec2.setcurrentkey(DeineNummer); //Schlüssel setzen
rec2.find('+');                  //letzten finden
x := rec2.DeineNummer + 1;       //Nummer holen und hochzählen
rec.DeineNummer := x;            // Nummer zuweisen


Hm, nur was, wenn es noch KEINEN Datensatz in der Tabelle gibt. Dann funkt das aber nicht! Besser so: rec2.setcurrentkey(DeineNummer); //Schlüssel setzen if rec2.find(’+’) then //letzten finden rec.DeineNummer := rec2.DeineNummer + 1 // Nummer zuweisen else rec.DeineNummer := 1; Gruesse Walter