Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich habe folgendes Problem: ich möchte ein Skript erstellen, das für jeden einzelnen im braunen Bereich angelegten Datensatz prüft, ob dieser Datensatz noch irgendwo verwendet wird.
Folgenden Ansatz habe ich bislang, der aber nicht zum Ziel zu führen scheint.
Auf die Weise bekomme ich lediglich diejenigen Verwendungen, bei denen ein einzelner Datensatz direkt irgendwo eingebunden wurde (z.B. über eine Combobox in einer Section).
Verwendungen über Fremdschlüsselbeziehungen, Einbindungen über Querys, über Contentprojektionen etc. hingegen bekomme ich nicht.
StoreElementAgent storeElementAgent = (StoreElementAgent) context.requestSpecialist(StoreElementAgent.TYPE);
ContentStoreRoot contentStoreRoot = (ContentStoreRoot) storeElementAgent.loadStoreElement("root", IDProvider.UidType.CONTENTSTORE, true);
Listable<StoreElement> children1 = contentStoreRoot.getChildren();
for(StoreElement sec: children1){
if(se.getElementType().equals("Content2")){
Content2 content2 = (Content2)se;
List<Dataset> datasets = content2.getDatasets();
for(Dataset dataset: datasets){
overallNumberDatasets++;
ReferenceEntry[] incomingReferences = dataset.getIncomingReferences();
if(incomingReferences.length == 0){
numberUnusedDatasets++;
}
}
Hat jemand eine Idee, wie ich zu einer echten Aussage über die Verwendung eines Datensatzes kommen kann?
Wäre für jede Hilfe dankbar.
Viele Grüße
Chris
Hi Chris,
probier es mal mit dataset.hasIncomingReferences(), das funktioniert bei mir ganz gut.
Gruß
Peter
Hallo Peter,
danke für die Antwort. Mir scheint allerdings, dataset.hasIncomingReferences() liefert auch nur sowas wie (dataset.getIncomingReferences().length > 0) zurück, d.h. hier bekomme ich auch nicht alle Verwendungen?
Viele Grüße
Chris
Hallo Chris,
das Problem, dass Du hast ist, dass die von dir gesuchten Verwendungen nicht im Referenzgraph gespeichert werden, also über diesen auch nicht entsprechend angefragt werden können.
Fremdschlüsselbeziehungen werden in der Datenbank hinterlegt. Um entsprechende Referenzen zu finden, musst Du somit diesen Fremdschlüsselbeziehungen folgen.
Das geht im ersten Schritt von dem Datensatz aus, sofern diese nicht falsch herum gerichtet sind [und es eine Tabellenvorlage mit einer Eingabekomponente gibt, die diese visualisiert]
Auch Queries machen nichts anderes, als entsprechende Datenbankanfragen zu definieren. Auch diese müssten entsprechend nachgebaut werden, um die Datensätze zu finden. Jedes Query ist einer Tabelle (EntityType) zugeordnet. Du brauchst also nur die zu berücksichtigen, die auf die aktuelle Tabelle zeigen.
Contentprojektionen sind im Prinzip nichts anderes als die Queries selber. Mit der Besonderheit, dass die Ergebnismenge eingeschränkt werden kann (über die Datensätze pro Seite und die Zahl der Seiten). Die ContentProjektionsseiten haben alle einen Absatz, der auf einer Tabellenvorlage beruht, die wiederum einer Tabelle zugeordnet ist.
Bleiben noch die contentSelect Funktionen. Diese haben eine Referenz auf das Schema, nicht aber auf die verwendete Tabelle. Hier habe ich keinen sinnvollen Tipp parat, wie man herausfindet, ob ein Datensatz über eine contentSelect Funktion ausgegeben wird oder nicht
Suchen in der Datenbank per Skript:
Über eine Datenquelle (content2) das Schema holen und darüber eine Session (<content2>.getSchema().getSession())
Mit der Session ein select erzeugen (session.createSelect("..."))
Dieses entsprechend füllen mit den benötigten Statements und dann über die Session ausführen.
Zurück bekommt man eine Liste mit Entities, für die die entsprechenden Einschränkungen zutreffen.
Viele Grüße
Holger
Hallo Holger,
alles klar, danke für deine Antwort. Das ist alles in allem ja doch deutlich komplizierter als ich gehofft hatte... :smileylaugh:
Mal sehen, wie wir damit dann verfahren.
Viele Grüße
Chris
Hallo,
kannst du noch mal das angestrebte Ziel aus fachlicher Sicht beschreiben?
Bezüglich Content-Projektionen und Content-Selects verstehe ich nämlich nicht, was du erreichen willst.
Beide Abfrage-Möglichkeiten zeichnen sich ja dadurch aus,das neue Datensätze dort automatisch auftauchen, ohne explizit hinzugefügt zu werden. Daher verstehe ich nicht, wieso man für die Löschentscheidung eines Datensatzes testen muss, ob er in einer Abfrage auftaucht. In meinen Augen sollte man den Datensatz unabhängig davon löschen.
Der andere Teil der Frage "ist ein Datensatz Teil einer Fremdschlüsselbeziehung" ist genau so gelagert.
In beiden Fällen kann man einen Datensatz löschen und er verschwindet automatisch an diesen "verwendenden" Stellen.
D.h. es kann in meinen Augen nur eine fachliche und keine technische Logik sein, die bestimmt, wann ein Datensatz gelöscht werden können soll. Also außer der technischen "! hasIncomingReferences()" Bedingung.
Liebe Grüße
Peter