aVogt
Returning Creator

Datensatz (incl. Freigabestand) über Arbeitsablauf löschen

Jump to solution

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

1 Solution

Accepted Solutions
kubczak
Crownpeak employee

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;

    }

View solution in original post

12 Replies
feddersen
Community Manager

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.

0 Kudos

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).

0 Kudos
gockel
Crownpeak employee

//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"} );

0 Kudos
aVogt
Returning Creator

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

0 Kudos
gockel
Crownpeak employee

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?

0 Kudos
aVogt
Returning Creator

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)

0 Kudos
gockel
Crownpeak employee

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.

0 Kudos
aVogt
Returning Creator

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

0 Kudos
kubczak
Crownpeak employee

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;

    }