26. September 2009 16:33
Viele NAV-Programmier-Einsteiger scheitern an der Datensatzbeschaffung per C/AL. Wer mit technisch-abstrakten Beschreibungen kein Problem hat, findet mitterweile online schöne Hilfeartikel zum Thema: Essential C/AL Functions - lesen! Dieser Artikel dagegen ist für Programmierneulinge gedacht, die problemorientiert an die Sache gehen möchten. Ich versuche zu beschreiben, wie die "Maschine" denkt und daher Eingaben von euch erwartet: anhand des Beispiels eines Tellerwäschers (ihr) und seinem Helfer (NAV):-) Wer dagegen einen Überblick über die vorhandenen Recordfunktionen und deren Unterschiede zueinander haben möchte, dem empfehle ich den englischsprachigen Eintrag bei mibuso: How to work with record-variables (version 2)? |
Teller.GET(oval, gelb);
SalesHeader.GET("Document Type", "No.");
MyOptionVar := Rec."Document Type";
MyCodeVar := Rec."No.";
SalesHeader.GET(MyOptionVar, MyCodeVar);
Document Type,Document No.,Line No.
SalesLine.GET(Auftrag, '1014', 10000); // Achtung, syntaktisch noch nicht richtig
SalesLine.GET(SalesLine."Document Type"::Order, '1014', 10000);
Teller.SETFILTER(Form, oval); // 1)
IF Teller.FIND('-') THEN // 2)
REPEAT
// spüle Teller
UNTIL Teller.NEXT = 0; // 3)
18. März 2010 10:49
Jörg Nissen hat geschrieben:habe mal in einem quelltext einsprich get ohne parmeter gesehen.
- Code:
record.get;
Was passiert hier ?
McClane hat geschrieben:Kenn ich nur von Einrichtungstabellen, also zB Company Information. Das zieht den Datensatz mit leerem PK.
Einrichtungstabelle.GET('');
18. März 2010 11:04
Natalie hat geschrieben:2. In jeder Einrichtungstabelle kann max. ein Datensatz erzeugt werden
28. März 2010 01:43
McClane hat geschrieben:Natalie hat geschrieben:2. In jeder Einrichtungstabelle kann max. ein Datensatz erzeugt werden
Wer unbedingt möchte, kann auch mehrere da rein schreiben. Wär halt nur sinnlos, da immer auf den DS mit leerem PK zugegriffen wird.
26. Juni 2018 17:55
27. Juni 2018 08:17
derPat18 hat geschrieben:Bei der Erklärung, muss ich voraussetzen, dass eine Form (oval) und Farbe (gelb) in der Tabelle existiert?
Ich möchte realisieren, dass die Daten aus dem ausgewählten Objekt (Zeile) ausgelesen werden.... dafür ist der befehl nicht geeignet oder ?
27. Juni 2018 08:23
derPat18 hat geschrieben:Bei der Erklärung, muss ich voraussetzen, dass eine Form (oval) und Farbe (gelb) in der Tabelle existiert?
IF Teller.GET('oval','gelb') THEN BEGIN
// Teller gefunden
END ELSE BEGIN
// Teller NICHT gefunden
END;
27. Juni 2018 20:18
Ich möchte realisieren, dass die Daten aus dem ausgewählten Objekt (Zeile) ausgelesen werden.... dafür ist der befehl nicht geeignet oder ?
Record.GET(oval, gelb); //oval ist der 1. PK - Form ; gelb ist der 2. PK - Farbe?
28. Juni 2018 08:56
28. Juni 2018 09:13
Record.GET(112, oval, gelb); //112 ist der 1. PK - Teller_Nummer (der ja dann natürlich eindeutig ist) ;oval ist der 2. PK - Form ; gelb ist der 3. PK - Farbe
28. Juni 2018 09:18
28. Juni 2018 09:53
Danis hat geschrieben:Hi Patrick,
nicht ganz - der Primärschlüssel wird bei dir vermutlich nur die Nummer sein.
Ansonsten hättest du auch folgende Konstellationen die eindeutig wären (aber nicht wirklich sinnvoll)
- 1, oval, gelb
- 1, oval, grün
- 1, eckig, gelb
- 1, eckig, grün
- 2, oval, gelb
- und so weiter
Form und Farbe sind also keine Schlüsselwerte, sondern einfache Eigenschaften.
Record.GET (112, gelb, oval); //das würde also entweder alle Datensätze mit der Nummer 112 oder alle Datensätze mit der Form Oval oder alle Datensätze mit der Farbe gelb aussuchen?
Record.GET (112);
Danis hat geschrieben:Um alle gelben und ovalen Teller zu finden, würdest du mit SETRANGE arbeiten können, und dann in einer Schleife alle gefundenen Datensätze durchlaufen.
Record.SETRANGE (112, oval, gelb); //das würde also DEN 3. Datensatz (den wir haben wollen) mit der Nummer 112 UND der Form Oval UND der Farbe gelb aussuchen?
29. Juni 2018 09:58
Record.GET (112, gelb, oval); //das würde also entweder alle Datensätze mit der Nummer 112 oder alle Datensätze mit der Form Oval oder alle Datensätze mit der Farbe gelb aussuchen?
Record.SETRANGE (112, oval, gelb); //das würde also DEN 3. Datensatz (den wir haben wollen) mit der Nummer 112 UND der Form Oval UND der Farbe gelb aussuchen?
Record.SETRANGE(Form,'oval');
Record.SETRANGE(Farbe,'gelb');
IF Record.FINDSET THEN
REPEAT
MESSAGE('%1',Record."Nr.");
UNTIL Record.NEXT = 0;
29. Juni 2018 12:33
AVS hat geschrieben:Jeder Datensatz hat genau einen Primärschlüssel. Dieser wiederum kann aus einem oder aber auch mehreren Feldern bestehen.
)[*]Reicht eure Lizenz nicht aus, dann öffnet in der Anwendung eine Form, die eure Tabelle anzeigt und klickt Ansicht -> Sortierung. Auch hier ist der oberste Eintrag der Primärschlüssel. Stellt NAV auf Englisch um, wenn ihr die englische Bezeichnung der Felder sehen wollt.
- Code:
Record.GET (112, gelb, oval); //das würde also entweder alle Datensätze mit der Nummer 112 oder alle Datensätze mit der Form Oval oder alle Datensätze mit der Farbe gelb aussuchen?
Nein, der Befehl würde nur funktionieren, wenn alles 3 Felder zusammen den Primärschlüssel bilden und dir dann genau den einen Datensatz mit der Nr. 112, der Farbe "gelb" und der Form "oval" liefern.
- Code:
Record.SETRANGE (112, oval, gelb); //das würde also DEN 3. Datensatz (den wir haben wollen) mit der Nummer 112 UND der Form Oval UND der Farbe gelb aussuchen?
Wenn die Nr. der Primärschlüssel ist und du diese kennst, ergibt ein SETRANGE hier wenig Sinn. Dann kannst du den Datensatz mit Record.GET(112) lesen.
Willst du hingegen herausfinden welche Teller alle gelb und oval sind, musst du wie folgt vorgehen.
- Code:
Record.SETRANGE(Form,'oval');
Record.SETRANGE(Farbe,'gelb');
IF Record.FINDSET THEN
REPEAT
MESSAGE('%1',Record."Nr.");
UNTIL Record.NEXT = 0;
29. Juni 2018 13:42
16. Januar 2019 15:26
16. Januar 2019 15:49
17. Januar 2019 09:34
derPat18 hat geschrieben:... was FIND macht
GET liefert ja einen spezifischen Datensatz anhand des PK
FIND Findet Daten/Datensatz und speichert sie erstmal in einer temporären Variable?
Und das mit SETFILTER wurder mir auch nicht ganz klar...
IF MSDynamicsUser.GET('derPat18') THEN
Message ("das ist ein gültiger Zugriff auf primary key der Tabelle MSDynamicsUser");
ELSE
Message ("Zugriff ins Nirvana wurde durch IF THEN Konstrukt verhindert, User derPat18 existiert nicht")
MSDynamicsUser.SETRANGE(Geschlecht,"männlich"); //erster Filter
MSDynamicsUser.SETRANGE(Haare,"schwarz"); //zweiter Filter
MSDynamicsUser.SETRANGE(Alter,"18"); //dritter Filter
MSDynamicsUser.SETCURRENTKEY( hier die gewünschte Sortierung gem. NAV eintragen, d.h. Feldreihenfolge );
//Achtung: wenn nach SETRANGE eine Schleife kommen sollen, dann NIE Tabelle.FINDFIRST nutzen, sondern Tabelle.FINDSET. Tabelle.FINDFIRST bzw. Tabelle.FINDLAST nur benutzen, wenn du ohne Schleife auf den vorgefilterten und vorsortierten Block an Datensätzen exakt auf den ersten oder letzten zugreifen willst:
IF MSDynamicsUser.FINDSET THEN
REPEAT
i := i + 1; //i wurde unter local variables als int Variable definiert
Message ('%1',"User namens :" '%2', "gefunden", 'i', 'UserID'); //UserID ist primary Key von MSDynamicsUser, und %1, %2 bitte bei navision24 gucken, ob ich das korrekt gesetzt habe
UNTIL MSDynamicsUser.NEXT(+1) = 0 //das +1 wird weggelassen, da die default iteration in NAV von oben nach unten geht.
SELECT UserID, UserName
FROM dbo.MSDynamicsDB.MSDynamicsUser
WHERE Geschlecht = 'männlich' AND Haare = 'schwarz' AND Alter = '18' // weiss nimmer, ob ' ' oder " " oder gar keine, muss man ausprobieren
17. Januar 2019 13:37
17. Januar 2019 14:28