seegers
Returning Observer

Variabeln im GenerateTask setzen und persistieren

Jump to solution

Servus zusammen,

um mir ein paar Pflegeaufgaben über verschiedene Projekte hin einfacher zu machen, würde ich gerne über ein Script mir die GenerateTasks aus den diversen ScheduleEntrys holen und dort Variabeln setzen.

Nach einem ausgeführten setVariable("key, "value")​ kann ich über einem anschließenden getVariables()​ auch meine gesetzte Variable sehen. Wenn ich mir den Auftrag dann jedoch im Server Manager ansehe, dann ist hier die gesetzte Variable wohl nicht persistiert worden.

Auch ein lock, save, unlock auf dem darüber liegendem ScheduleEntry hat nicht geholfen.

Was übersehe ich, bzw. wie kann ich über ein Skript Variabeln in Generierungsaufträgen nachhaltig verankern?

Viele Grüße,

René

0 Kudos
1 Solution

Accepted Solutions
seegers
Returning Observer

Ich habe die Lösung nun gefunden. Die Methoden auf dem ScheduleEntry-Objekt müssen außerhalb der For-Schleife mit ScheduleTasks aufgerufen werden. Ich vermute, dass hier irgendwie ein unterschiedlicher Scope vorliegt.

se.lock();

for(ScheduleTask t:se.getTasks()){

     ...

}

se.save();

se.unlock();



View solution in original post

0 Kudos
6 Replies
felix_reinhold
Returning Responder

Hallo René,

habe mal schnell einen Auftrag mit einem Generierungstask angelegt und folgendes eben schnell in die bsh gehauen und bei mir wurden die Variablen angezeigt:

as = context.requestSpecialist(de.espirit.firstspirit.access.ServicesBroker.TYPE).getService(de.espirit.firstspirit.access.AdminService.class);

prj = e.getProject();

se = as.getScheduleStorage().getScheduleEntry(prj, "debug");

gt = se.getTasks().get(0);

se.lock();

gt.setVariable("testVariable","testValue");

se.save();

se.unlock();

Sieht dein Code auch in etwa so aus?

Gruß

Felix

0 Kudos

Hier ist mein Code zum Vergleich, ich lasse es als Skript laufen

AdminService as = context.getConnection().getService(AdminService.class);

ScheduleStorage sst = as.getScheduleStorage();

for(Long pid:project_ids){

    Project p = as.getProject(pid);

    for(ScheduleEntry se:sst.getScheduleEntries(p)){

      for(ScheduleTask t:se.getTasks()){

        if(t instanceof GenerateTask && "generate".equals(t.getName())){

          for(v:t.getVariables()){  //log var status to console 'before'

            context.logInfo(" - " + v.getKey() + " : " + v.getValue());

          }

          se.lock();

          t.setVariable("dv_tracking","false");

          se.save();

          se.unlock();

          for(v:t.getVariables()){  //log var status to console 'after', neue Var 'dv_tracking' wird in der Konsole angezeigt, aber nicht in der Ansicht des Server Manager

            context.logInfo(" - " + v.getKey() + " : " + v.getValue());

          }

        }

      }

    }

}

0 Kudos

Hallo René,

dein Code funktioniert bei mir. Könnte also ein Bug in deiner FS-Version sein.

Am besten mal ein Ticket beim Helpdesk aufmachen.

Gruß

Felix

0 Kudos

Ich sperre und speichere immer noch das Projekt, wenn "se.isProjectSchedule()" true liefert. Ich weiß nicht, ob ich das schonmal ohne probiert hatte, jedenfalls funktioniert es so:

if (entry.isProjectSchedule()) {

entry.getProject().lock();

}

entry.lock();

.....

entry.save();

entry.unlock();

if (entry.isProjectSchedule()) {

  entry.getProject().save();

  entry.getProject().unlock();

}

Gruß, Heiko

0 Kudos
seegers
Returning Observer

felix.reinhold​: Dein Skript läuft auch bei mir in der BSH, und da unsere Ansätze ja im Prinzip gleich sind, vermute ich nicht einen Bug in der Version

hbarthel​: Danke für die Idee, macht jedoch keinen Unterschied bei meinem Problem

0 Kudos
seegers
Returning Observer

Ich habe die Lösung nun gefunden. Die Methoden auf dem ScheduleEntry-Objekt müssen außerhalb der For-Schleife mit ScheduleTasks aufgerufen werden. Ich vermute, dass hier irgendwie ein unterschiedlicher Scope vorliegt.

se.lock();

for(ScheduleTask t:se.getTasks()){

     ...

}

se.save();

se.unlock();



0 Kudos