[gelöst] "Projektwarteschlange" - Job Scheduler in

6. Juli 2007 12:39

Hallo zusammen,

ich habe in letzter Zeit ein bisschen mit der neuen "Projektwarteschlange" rumgespielt. Nach meinem Informationsstand muss man codeunits, welche vom Scheduler ausgeführt werden sollen, in den properties den Table 472 hinterlegen (Job Queue Entry).

Dann ist es aber nicht mehr möglich diese codeunits manuell zu starten. Ist ein Weg bekannt dies zu umgehen oder läuft es auf gesonderte Codeunits hinaus?
Zuletzt geändert von F11 am 9. Juli 2007 14:22, insgesamt 1-mal geändert.

6. Juli 2007 13:30

Die zu startenden Codeunits müssen im OnRun() Trigger die Tabelle "Job Queue Entry" erwarten, es muss also der Parameter TableNo der Codeunit auf diese Tabelle gesetzt werden. Z.B. um die gesetzten Parameter abzufragen oder ähnliches.

Ggf. kannst du dir behelfen, indem du eine allgemeingültige Codeunit mit Parameter TableNo erstellst und von dieser die gesetzten Parameter auswertest. Ein Parameter könnten dann z.B. Codeunit=50000 sein und deine Codeunit ermittelt daraus die zu startende CU50000. Somit könntest du vorhandene Jobs aus alten Datenbanken auch mit dem neuen Job Queue starten.

6. Juli 2007 13:57

Hallo,

danke erstmal für deine Antwort.

Die betroffenen Codeunits werden in manchen Teilen des Programms manuell über einen Button oder bestimmte Events gestartet. Dies können Sie nun nicht mehr, da ich die 472 in TableNo. eingetragen habe. Entweder kopiere ich diese Codeunits also alle auf eine neue Nummer und habe die CU einmal für die Job Queue (mit dem Eintrag TableNo.) und einmal zum programminternen Aufruf (ohne Eintrag TableNo.) oder ich muss da irgendwie drumrum programmieren.

Ich verstehe deine Antwort jetzt so:
Ich erstelle eine neue CU die ich anstatt der restlichen in den Scheduler eintrage und starten lasse. Diese CU ermittelt anhand der Einträge in der Job Queue die wirklich zu startende Objektnr. und startet diese.

Somit kann ich in den restlichen codeunits das TableNo. rauslassen und kann sie weiterhin in anderen Programmteilen starten?

6. Juli 2007 14:39

Ja, genau so war es gemeint.

Macht ja Sinn sowas in petto zu haben, deshalb hab ich grad mal was "gestrickt":

Code:
OBJECT Codeunit 50001 Job Queue Start
{
  OBJECT-PROPERTIES
  {
    Date=06.07.07;
    Time=14:28:37;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    TableNo=472;
    OnRun=VAR
            ObjectNoText@1140000 : Text[30];
            ObjectTypePos@1140002 : Integer;
            ObjectPos@1140001 : Integer;
            ObjectNo@1140003 : Integer;
          BEGIN
            // Position von Objekttyp und Objektnummer ermitteln
            ObjectTypePos := STRPOS("Parameter String", c_Codeunit);
            ObjectPos := ObjectTypePos + STRLEN(c_Codeunit);

            IF ObjectTypePos = 0 THEN BEGIN
              ObjectTypePos := STRPOS("Parameter String", c_Report);
              ObjectPos := ObjectTypePos + STRLEN(c_Report);
            END;

            IF ObjectTypePos = 0 THEN BEGIN
              CALCFIELDS("Object Name to Run");
              ERROR(c_ErrorParameterFormat, FIELDCAPTION("Parameter String"), "Parameter String",
                  "Object Type to Run", "Object Name to Run");
            END;

            ObjectNoText := COPYSTR("Parameter String", ObjectPos);

            IF DELCHR(ObjectNoText, '=', '1234567890') <> '' THEN BEGIN
              CALCFIELDS("Object Name to Run");
              ERROR(c_ErrorParameterFormat, FIELDCAPTION("Parameter String"), "Parameter String",
                  "Object Type to Run", "Object Name to Run");
            END;

            // Ermitteltes Objekt starten
            EVALUATE(ObjectNo, COPYSTR("Parameter String", ObjectPos));

            CASE COPYSTR("Parameter String", 1, 1) OF
              'C': CODEUNIT.RUN(ObjectNo);
              'R': REPORT.RUNMODAL(ObjectNo, FALSE);
            END;
          END;

  }
  CODE
  {
    VAR
      c_Codeunit@1140000 : TextConst 'ENU="Codeunit="';
      c_Report@1140002 : TextConst 'ENU="Report="';
      c_ErrorParameterFormat@1140001 : TextConst 'DEU=Der Parameter %2 für %1 für den Aufruf der %3 %4 ist nicht korrekt.;ENU=The parameter %2 for %1 for running %3 %4 is incorrect.';

    BEGIN
    END.
  }
}


Der Aufruf ist ganz einfach. Die Codeunit (hier 50001) wird ganz normal in die Projektwarteschlange eingetragen. Als "Parameterzeichenfolge" (was ein Wort) dann zum Beispiel "Codeunit=50002".
Die obige Codeunit ermittelt den zu startenden Objekttyp und die Nummer und startet das Objekt.

Ich hab das ganze allerdings nur im Trockendurchlauf ohne die Warteschlange selbst getestet. Feedback obs funktioniert wäre prima.

9. Juli 2007 14:21

Hi nochmal,

habe einen ähnlichen Lösungsweg gewählt (hebt bei mir jetzt nur auf Codeunits ab, aber das mit den Reports werde ich denke ich auch noch einbauen).

Code:

LtParameter := "Parameter String";

LiObjektTypPos := STRPOS(LtParameter, TgField001);
LiObjektNrPos := LiObjektTypPos + STRLEN(TgField001);
   
IF LiObjektTypPos = 0 THEN BEGIN
  ERROR(TgError001,LtParameter);
END;
 
LtObjektNr := COPYSTR(LtParameter, LiObjektNrPos);

IF NOT EVALUATE(LiObjektNr,LtObjektNr) THEN BEGIN
  ERROR(TgError001,LtParameter);
END;     

CODEUNIT.RUN(LiObjektNr);


Sollte so funktionieren!

Danke für den Denkanstoß :idea:

17. Juli 2007 13:13

schau doch auch mal unter www.orsyp.com

Die haben seit diesem Jahr eine professionelle Job-Scheduling Lösung für Navision im Portfolio! Damit dürften alle Probleme die unter Navision im Bereich der Job-Verarbeitung auftreten Vergangenheit sein.

9. August 2007 18:00

Hallo Zusammen,

Hätte bezüglich Tools auch noch was beizusteuern

Unter folgenden Link ein Beschrieb:

http://www.myerd.net/documents/myerd_job_scheduler.pdf

9. August 2007 18:41

Da die Produktwerbung innerhalb der Themen die letzten Tage hier ein wenig übertrieben wurde, bitten wir, keine weiteren unaufgeforderten Links zu Produkten zu platzieren!

Vielen Dank für euer Verständnis!


Gruß, Timo Lässer
Administrator
MSDynamics.de-Team
[hr]Für gezielte Produkt- und/oder Dienstleistungs-Werbung bieten wir hier innerhalb des Marktplatzes das Unterforum Gewerbliche Angebote an.
Dort können - gegen eine geringe Gebühr - die Produkte und Dienstleistungen frei beworben werden.