[Gelöst] Codeunit periodisch ausführen

10. November 2010 16:38

Hallo zusammen,

wir haben eine Codeunit programmiert die Daten aus einem externen Tool in eine Tabelle einfügt. Wie können wir diese nun periodisch und automatisiert (wie eine geplanter Task) ausführen lassen?

Vielen Dank für die Auskunft,
Johannes
Zuletzt geändert von basstscho am 10. November 2010 19:06, insgesamt 1-mal geändert.

Re: Codeunit periodisch ausführen

10. November 2010 16:44

Ihr könntet die Projektwarteschlange nutzen, sofern bei euch lizensiert. Die Projektwarteschlange erfordert den NAS.

Re: Codeunit periodisch ausführen

10. November 2010 16:47

Natalie hat geschrieben:Ihr könntet die Projektwarteschlange nutzen, sofern bei euch lizensiert. Die Projektwarteschlange erfordert den NAS.


Alternativ könnt ihr aber auch ohne Projektwarteschlange nur mit dem NAS das automatisieren.

Re: Codeunit periodisch ausführen

10. November 2010 17:04

holger1076 hat geschrieben:Alternativ könnt ihr aber auch ohne Projektwarteschlange nur mit dem NAS das automatisieren.

Die Projektwarteschlange haben wir nicht lizenziert. Ich weiß aber, dass bei uns zwei NAS-Dienste laufen (jeweils anderer Benutzer). Ich weiß auch wie ich einen weiteren NAS-Dienst einrichte (was ich dann auf unserem Testserver machen würde) - allerdings weiß ich nicht, wie ich dann von diesem NAS-Dienst eine bestimmte Codeunit ausführen lassen kann - bei dieser Anleitung komme ich mit Schritt 10 nicht weiter. Wäre klasse, wenn das jemand Anfängerfreundlich erläutern könnte :)

Vielen Dank für eure Unterstützung,
Johannes

Re: Codeunit periodisch ausführen

10. November 2010 17:17

basstscho hat geschrieben:- allerdings weiß ich nicht, wie ich dann von diesem NAS-Dienst eine bestimmte Codeunit ausführen lassen kann - bei dieser Anleitung komme ich mit Schritt 10 nicht weiter.

Dann warst du doch schon weit gekommen.
Also, der NAS-Dienst wird ja mit einem sog. Startup-Parameter befüllt. Dieser sorgt dafür, dass bei der Anmeldung des NAS-Benutzers in der NAV-DB der NAS-Benutzer weiß, was er tun soll.

Dieser Parameter kann aus einem Wort bestehen oder durch mehreren kommagetrennten, die von der Codeunit 1, Funktion NASHandler aufgesplittet und ausgewertet werden.
Beispiel: Enthält dein NAS-Startup-Parameter ein "JOBQUEUE,TASK2,TASK3", so müssen diese in der Funktin NASHandler enthalten sein:
Code:
CASE Parameter OF
...
  'JOBQUEUE': CODEUNIT.RUN(...); // JOBQUEUE ist übrigens die Projektwarteschlange
  'TASK2': CODEUNIT.RUN(...);
 'TASK3': WasAuchImmer;
END;


Somit hast du schon die Stellen, an die du dich einhängen musst.

Re: Codeunit periodisch ausführen

10. November 2010 17:42

Hallo Natalie,

vielen Dank für die Hilfe - das war der springende Punkt! Jetzt muss ich meine CodeUnit nurnoch mit dem autNavisionTimer versehen und schon sollte alles so laufen wie gewünscht - bei Gelegenheit werde ich das ganze mal ausprobieren...

Beste Grüße,
Johannes

Re: Codeunit periodisch ausführen

10. November 2010 17:46

Tipp: Wenn dein periodischer Aufruf stabil sein soll, dann brauchst du eine zwei Codeunits:
Die erste ist SingleInstance = Yes und enthält den Timer. Diese Codeunit ruft dann deine eigentlich auszuführende Codeunit im Timer-Ereignis auf:
Code:
IF NOT CODEUNIT.RUN(...) THEN BEGIN
  // z.B. MESSAGE, die dann im Anwendungsprotokoll landen wird
END;

Andernfalls würde der NAS bei einem Fehler innerhalb deiner eigentlich Codeunit sonst abstürzen.

Re: Codeunit periodisch ausführen

10. November 2010 18:27

Hallo Natalie,

es sieht schon nicht schlecht aus! Der Aufruf der Codeunit mittels NAS funktioniert wunderbar - leider zickt der Timer noch. Hier mal ne ganz einfache Codeunit die die aktuelle Uhrzeit in ne Datei ausgibt.
Code:
OnRun()
CREATE(autNavisionTimer);
autNavisionTimer.Interval(10000); // this will trigger every 10 seconds
autNavisionTimer.Enabled(TRUE);

autNavisionTimer::Timer(Milliseconds : Integer)
DateiErstellt_l := FALSE;
   Dateiname_l := 'D:\NASTEST\nastest.txt';

  IF EXISTS(Dateiname_l) THEN
                   ERASE(Dateiname_l);
   CLEAR(Datei_l);

   Datei_l.TEXTMODE(TRUE);
           IF NOT DateiErstellt_l THEN BEGIN
               IF EXISTS(Dateiname_l+'.TMP') THEN
                  ERASE(Dateiname_l+'.TMP');
               DateiErstellt_l := Datei_l.CREATE(Dateiname_l+'.TMP')
            END;
         Datei_l.WRITE(TIME);

 IF DateiErstellt_l THEN
      Datei_l.CLOSE;
      RENAME(Dateiname_l+'.TMP',Dateiname_l);
  COMMIT;


Leider wird so die Uhrzeit nicht ausgegeben. Wenn ich den Code aus dem autNavisionTimer() direkt in die onRun() packe (und natürlich die autNavisionTimer-Zeilen auskommentiere) funktioniert die Ausgabe (aber natürlich nur 1x). Da der NAS-User noch immer connected ist vermute ich mal einen Fehler in meinem Timer?!

Vielen Dank,
beste Grüße,
Johannes

PS: Aus meiner Anleitung von oben:
If there is an error in this code, the NAS will NOT crash. The timer-function of the global variable will restart the function as if no error has happened.

Dann kann ich mir das mit der zweiten Codeunit wohl sparen

Re: Codeunit periodisch ausführen

10. November 2010 18:47

Hallo zusammen,

ich habe den Fehler gefunden:
Code:
SingleInstance=Yes

war auf no (glatt überlesen).

Jetzt klappt alles perfekt - vielen Dank für eure Hilfe!

Grüße Johannes