[Gelöst]"Rückgabewert sollte für Funktion verwendet werden"

12. Januar 2012 21:07

ClassicClient

Hallo

habe folgenden Code, der die Datensätze eines Records Rec.Ums, den ich vorher über Globals per Subtype mit einer Tabelle verknüpft habe, zählen soll (wird über eine Action aufgerufen):

Code:
count:=0;
 IF RecUms.FINDFIRST THEN
 REPEAT
  count:= count+1;
  UNTIL RecUms.NEXT <= 0;
  MESSAGE ('Anzahl Datensaetze zu : %1',count);

 RecUms.RESET;


eine Funktion habe ich nicht definiert, braucht man doch eigentlich auch nicht oder?

(geklärt) Eine zweite Frage ist: Wie ruft man Codeunits auf? Habe obigen Code als Codeunit DsCU gespeichert und versucht per Codeunit::DsCU aufzurufen, dann kriege ich Syntaxfehler? Sorry für diese Anfängerfragen.

Gruß!

edit: ok man ruft Codeunits also nicht über das Symbol Menü auf sondern mit Codeunit.RUN
Jetzt funktioniert der Code auch per Codeunit. Aber er funkt nicht wenn ich ihn direkt in die Action reinschreibe.
Zuletzt geändert von Kiwikaki am 13. Januar 2012 01:49, insgesamt 1-mal geändert.

Re: "Rückgabewert sollte für Funktion verwendet werden"

12. Januar 2012 21:32

Willkommen bei uns!

Warum das Rad neu erfinden? [GELÖST] Anzahl der Datensätze
Du kannst dir auch in Zukunft Arbeit sparen, indem du zuerst im Forum suchst ;-)

Kiwikaki hat geschrieben:Jetzt funktioniert der Code auch per Codeunit. Aber er funkt nicht wenn ich ihn direkt in die Action reinschreibe.
Action? Doch RTC statt CC? Könntest du vielleicht genauer beschreiben, was du da codiert hast?

Re: "Rückgabewert sollte für Funktion verwendet werden"

12. Januar 2012 21:52

Hi
habe das Forum nach Rückgabewert Funktion durchsucht, nichts gefunden. Dann habe ich nur wenige Zeilen unter meinem Thread den von dir erwähnten entdeckt. Dort wird aber auch keine Lösung beschrieben, nur auf eine Seite verwiesen bei der die count-Abfrage dort auch nicht über eine Schleife gelöst wird, was der Sinn der vom Prof gestellten Aufgabe ist.

Die Codeunit sieht so aus:

Code:
count:=0;
 IF RecUms.FIND('-') THEN
 REPEAT
  count:= count+1;
  UNTIL RecUms.NEXT <= 0;
  MESSAGE ('Anzahl Datensätze in Adventumsatz: %1',count);

 RecUms.RESET;


Sie funktioniert auch, wenn aufgerufen. Wenn ich aber denselben Code über Page->Actions->CAL Code in die entsprechende Action eintrage, kommt der Fehler mit dem Rückgabewert, im ClCl, wenn ich das ganze kompilieren will.

Re: "Rückgabewert sollte für Funktion verwendet werden"

12. Januar 2012 21:55

Aber diese Funktion brauchst du doch gar nicht... siehe mein Link.

Re: "Rückgabewert sollte für Funktion verwendet werden"

12. Januar 2012 23:29

Kiwikaki hat geschrieben:
Die Codeunit sieht so aus:

Code:
count:=0;
 IF RecUms.FIND('-') THEN
 REPEAT
  count:= count+1;
  UNTIL RecUms.NEXT <= 0;
  MESSAGE ('Anzahl Datensätze in Adventumsatz: %1',count);

 RecUms.RESET;


Sie funktioniert auch, wenn aufgerufen. Wenn ich aber denselben Code über Page->Actions->CAL Code in die entsprechende Action eintrage, kommt der Fehler mit dem Rückgabewert, im ClCl, wenn ich das ganze kompilieren will.

Auf der Page funktioniert es deswegen nicht, weil NAV "count"als Funktion auf dem Rec ausführt.Am Besten du benennst die Variable um.

Re: "Rückgabewert sollte für Funktion verwendet werden"

12. Januar 2012 23:30

Kiwikaki hat geschrieben:Sie funktioniert auch, wenn aufgerufen. Wenn ich aber denselben Code über Page->Actions->CAL Code in die entsprechende Action eintrage, kommt der Fehler mit dem Rückgabewert, im ClCl, wenn ich das ganze kompilieren will.

In einer Form/Page befindest du dich (üblicherweise) im Scope des SourceTables der Form. Somit wird dort COUNT, was in NAV ein Schlüsselwort ist (siehe C/Side-Hilfe), als Record.Count interpretiert. Daher die Fehlermeldung in der Form. In der Codeunit ist anscheinend keine Tabelle weit und breit, deswegen wird dort COUNT als die Variable mit dem Namen Count akzeptiert.

Als eine "Lösung" kannst du Count als lokale Variable definieren (falls das bei einer Action geht - kann's grad nicht testen) - das wäre dann wieder höherwertiger als der SourceTable. Generell ist es jedoch unschön, Variablen wie Schlüsselwörter zu benennen, weil dabei gerne mal das herauskommt, was dir nun passiert ist. Nenne die Variable also anders (MyCount, Counter, ....), und dann läuft es.

Re: "Rückgabewert sollte für Funktion verwendet werden"

12. Januar 2012 23:56

Danke für die Antworten, es ist mir nun klar geworden!
Gelöst.

Re: [Gelöst]"Rückgabewert sollte für Funktion verwendet werd

13. Januar 2012 09:21

Als Ergänzung, weil ich glaube, dass dir nicht klar geworden ist was Natalie dir sagen wollte. Du kannst deine immerhin sieben Codezeilen auf eine zusammenschrumpfen.

Code:
MESSAGE('Anzahl Datensätze in Adventumsatz: %1',RecUms.COUNT);


Falls du mit der Variablen RecUms danach noch weiterarbeitest, muss das RESET natürlich eventuell trotzdem noch hin.

EDIT: Und natürlich ist der COUNT-Befehl auch schneller, als FIND- und NEXT-Befehle in einer Schleife.

Re: "Rückgabewert sollte für Funktion verwendet werden"

15. Januar 2012 13:21

Kiwikaki hat geschrieben:Hi
Dort wird aber auch keine Lösung beschrieben, nur auf eine Seite verwiesen bei der die count-Abfrage dort auch nicht über eine Schleife gelöst wird, was der Sinn der vom Prof gestellten Aufgabe ist.


Es ging dem Prof um das Üben von Coding in NAV. Und da ich sowieso wenig Erfahrung mit Coding habe, war es natürlich eine willkommene Übung. Daher wollte ich es gerade nicht mit einer einzeiligen count Abfrage machen.

Re: "Rückgabewert sollte für Funktion verwendet werden"

15. Januar 2012 13:33

Kiwikaki hat geschrieben:Es ging dem Prof um das Üben von Coding in NAV. Und da ich sowieso wenig Erfahrung mit Coding habe, war es natürlich eine willkommene Übung. Daher wollte ich es gerade nicht mit einer einzeiligen count Abfrage machen.
Diese Info wäre ganz zu Anfang praktisch gewesen :-)