Search the FirstSpirit Knowledge Base
Hallo,
ich habe vor einen Datensatz über einen Arbeitsablauf zu löschen. Dabei soll auch der Freigabestand (wir verwenden die Freigabe) der Datensatz endgültig gelöscht werden.
Der Arbeitsablauf wird bei dem zu Löschenden Datensatz über "Arbeitsablauf -> ..." (rechte Maustaste) gestartet.
...
ContentWorkflowable WF = (ContentWorkflowable) context.getWorkflowable();
Entity ent = WF.getEntity();
...
Session sess = schema.getSession();
sess.delete(ent);
sess.commit();
//freigabestand löschen
Session relsess = schema.getSession(true);
Entity relEnt = sess.find(tableName , new Object[] {"98752"} );
....
Die "relEnt" liefert mir "null".
Hängt das damit zusammen, dass das Löschen über einen Arbeitsablauf vorgenommen wird und der Freigabestand erst mit dem Ende des Arbeitsablaufes zur Verfügung steht?
Ich habe auch versucht vor dem
schema.getSession(true);
ein
schema.refresh();
aufzurufen. Ohne Erfolg.
Wenn ich das erste Löschen und das Löschen des Freigabestandes hintereinander in einem Script ausführe, klappt dass ohne Probleme.
Kann ich das Löschen des Freigabestandes in dem Arbeitsablauf irgendwie realisieren, oder muss das Löschen nach Ablauf des Scriptes passieren (über einen Auftrag, oder ...)?
Danke für Hinweise
Andreas
Hallo,
entities im current und release Stand können prinzipiell wir folgt gelöscht werden (Modulcode). Wichtig sind die Rollback Aufrufe, um nicht mit dem Datenbestand im Cache aneinander zu geraten.
Viele Grüße,
Christian Kubczak
public boolean deleteEntity(Entity e, Content2 c) {
boolean result = false;
Schema s = c.getTemplate().getSchema();
if(s.getIncomingReferences(e).length == 0 || admin) {
try {
c.lock(e);
Dataset eDS = c.getDataset(e);
eDS.delete();
eDS.save();
} catch (LockException le) {
Logging.logError("Lockexception: ",le,LOGGER);
le.printStackTrace();
} finally {
try {
c.unlock(e);
c.setLock(true);
c.save();
c.setLock(false);
e.getSession().commit();
} catch (LockException le) {
le.printStackTrace();
} catch (ElementDeletedException e1) {
e1.printStackTrace();
}
}
e.getSession().rollback(); //VOODOO
Session releaseSession = c.getTemplate().getSchema().getSession(true); //delete page entity (release state)
releaseSession.rollback(); //no VOODOO // reset timestamp to now - read actual data
Entity eRelease = releaseSession.find(e.getKeyValue());
try {
c.lock(eRelease);
Dataset eDS = c.getDataset(eRelease);
eDS.delete();
eDS.save();
} catch (LockException le) {
Logging.logError("Lockexception: ",le,LOGGER);
le.printStackTrace();
} finally {
try {
c.unlock(eRelease);
releaseSession.commit();
} catch (LockException le) {
le.printStackTrace();
}
releaseSession.rollback(); //VOODOO
}
result = true;
} else {
Logging.logError("Incoming references found", LOGGER);
}
if(!result) {
Logging.logError("Could not delete entity", LOGGER);
} else {
Logging.logInfo("Deletion of entity successful", LOGGER);
}
return result;
}
Ich bin nicht ganz sicher, ob ich das Problem richtig verstanden habe. Ist der Datensatz denn schon im Freigabestand vorhanden, wenn sie den Lösch-Arbeitsablauf starten oder nicht? Falls nicht, können/brauchen Sie den Datensatz nicht aus dem Freigabestand löschen.
Es handelt sich um einen freigegebenen Datensatz, der sowohl unter dem Reiter "aktuelle Datensätze" als auch "Freigegebene Datensätze" sichtbar ist (ohne "irgendwelche farbige Markierungen (Arbeitsablaufstadien).
Der Arbeitsabluaf wird wie gesagt über rechte Maustaste gestartet. Danach soll der Datensatz "komplet verschwinden (also unter keinem der Reiter "aktuelle Datensätze" bzw. "Freigegebene Datensätze"zu finden sein).
//freigabestand löschen
Session relsess = schema.getSession(true);
Entity relEnt = sess.find(tableName , new Object[] {"98752"} );
An dieser Stelle sollte auch auf der "relsess" gesucht werden und nicht auf der "current" session.
Entity relEnt = relsess.find(tableName , new Object[] {"98752"} );
Hallo,
das stimmt, habe einen etwas zu alten Code gepostet (hatte es auch schon mitbekommen). Sorry
Ich habe nun etwas gefunden, da ich es nachstellen kann:
Da ich das Löschen testen wollte, habe ich einen neuen Datensatz angelegt und freigegeben.
Danach habe ich den Datensatz versucht zu löschen, wie gesagt ohne Erfolg (ohne die Datenquelle zu wechseln, oder die Ansicht zu aktualisieren).
Nun habe ich durch probieren herausgefunden, dass ich den Datensatz löschen kann, wenn ich die Ansicht im Reiter "Freigegebene Datensätze" aktualisiere.
Wenn ich nicht aktualisiere (oder nur die Ansicht "aktuelle Datensätze"), bekomme ich bei "relsess.find(...)" immer "null zurück.
Könnte es sein, dass das "schema.release()" in einem Arbeitsablauf nicht richtig funktioniert?
Wenn ich das Löschen des DS in einem Script vornehme (mit einer festen ID), funktioniert es!
FS: 4.2.223.40456
Anbei das Arbeitsablauf-Script
Könnte es sein, dass das "schema.release()" in einem Arbeitsablauf nicht richtig funktioniert?
Den Zusammenhang verstehe ich nicht.
In ihrem Skript wird überhaupt kein "schema.release()" verwendet. Wofür auch?
wenn ich ehrlich bin ... keine Ahnung. Ich habe das nur mit verwendet, da es in einem Script steht, bei dem datensätze gelöscht werden (und dieses wurde bei Projekteinführung von e-Spirit erstellt)
Bitte mal genau lesen. Sie verwenden es gar NICHT. In ihrem Skript steht es NICHT.
Was meinen sie dann für eine Methode? "schema.release()" ja offensichtlich NICHT.
Verdammt, ich brauch Urlaub :smileycry:
Ich meine
schema.refresh();
Soory, für meinen fehler
In dem Script (also nicht Arbeitsablauf) funktioniert das auch ohne "schema.refresh();" (habe es grad getestet.
Das Problem ist also, dass ich in dem Arbeitsablaufscript nicht die "Freigegebene Datensätze" Entity bekomme, wie es in dem Script (nicht Arbeitsablauf) funktioniert
Hallo,
entities im current und release Stand können prinzipiell wir folgt gelöscht werden (Modulcode). Wichtig sind die Rollback Aufrufe, um nicht mit dem Datenbestand im Cache aneinander zu geraten.
Viele Grüße,
Christian Kubczak
public boolean deleteEntity(Entity e, Content2 c) {
boolean result = false;
Schema s = c.getTemplate().getSchema();
if(s.getIncomingReferences(e).length == 0 || admin) {
try {
c.lock(e);
Dataset eDS = c.getDataset(e);
eDS.delete();
eDS.save();
} catch (LockException le) {
Logging.logError("Lockexception: ",le,LOGGER);
le.printStackTrace();
} finally {
try {
c.unlock(e);
c.setLock(true);
c.save();
c.setLock(false);
e.getSession().commit();
} catch (LockException le) {
le.printStackTrace();
} catch (ElementDeletedException e1) {
e1.printStackTrace();
}
}
e.getSession().rollback(); //VOODOO
Session releaseSession = c.getTemplate().getSchema().getSession(true); //delete page entity (release state)
releaseSession.rollback(); //no VOODOO // reset timestamp to now - read actual data
Entity eRelease = releaseSession.find(e.getKeyValue());
try {
c.lock(eRelease);
Dataset eDS = c.getDataset(eRelease);
eDS.delete();
eDS.save();
} catch (LockException le) {
Logging.logError("Lockexception: ",le,LOGGER);
le.printStackTrace();
} finally {
try {
c.unlock(eRelease);
releaseSession.commit();
} catch (LockException le) {
le.printStackTrace();
}
releaseSession.rollback(); //VOODOO
}
result = true;
} else {
Logging.logError("Incoming references found", LOGGER);
}
if(!result) {
Logging.logError("Could not delete entity", LOGGER);
} else {
Logging.logInfo("Deletion of entity successful", LOGGER);
}
return result;
}