eine Nachfrage die hin und wieder aufkommt ist wie man in einem Schrank einen gesamten Ordner inkl. aller Register und alle Dokumente kopieren / duplizieren kann.
In der Dokumentation (s. Ordner und Register verwalten) steht auch beschrieben das z.B. beim Kopieren von Register inkl. Dokumente die Dokumente nicht kopiert sondern nur einen weiteren Standort erhalten.
Habt ihr so eine Anforderung auch schon mal gehabt und wie habt ihr das gelöst bzw. wie könnte man das am besten lösen?
Hallo @Stephan, wenn ich die Frage richtig verstehe, könnte man Dein Anliegen mit einem einzigen Server-API-Befehl lösen.
DMS.XMLCopy kennt eine Option COPYCASCADING, das Server-API-Handbuch sagt dazu:
Werden Register oder Ordner kopiert, so kann mit der Option ‚COPYCASCADING‘ bestimmt werden, ob alle enthaltenen Objekte kaskadierend mit kopiert werden sollen.
Wird ein Dokument kopiert, so kann es als neues Dokument kopiert werden oder am neuen Standort kann ein Verweis des ursprünglichen Dokumentes entstehen. Das Dokument besitzt dann zwei Standorte, es existiert dann jedoch lediglich ein Indexdatensatz. Um das Dokument so zu verlinken, ist die Joboption ‚LINKDOCUMENT‘ anzugeben. Für eine solche Verweiskopie müssen sich der Quell- und der Zielstandort unterscheiden. Diese Option gilt auch für alle Dokumente, die durch die Angabe
der Option ‚COPYCASCADING‘ kopiert werden.
Das könnte man also in einem Dashlet, einer externen Anwendung oder einem ähnlichen Hilfstool verhältnismässig einfach aufrufen und damit hoffentlich diese Anforderung umsetzen.
Für eine ähnliche Anforderung setze ich mich gerade ebenfalls mit dem Thema auseinander.
Ein Nachteil von DMS.XMLCopy scheint zu sein, dass sich die Indexdaten der Kopie nicht anpassen lassen, z.B. um der Ordnerkopie einen etwas anderen Namen zu geben, damit das Original und die Kopie leichter unterschieden werden können.
Der Job scheint auch die Id der Kopie nicht zurückzugeben. Sonst hätte man anhand der Id dem Ordner z.B. nachträglich einen anderen Namen geben können. Auch ist es so nicht möglich, die Kopie direkt nach der Erzeugung im Client zu öffnen.
Für uns war der Job damit nicht verwendbar. Denn er passt nicht zum Ablauf: Wir haben die ASV dahingehend erweitert, dass sich beim Anlegen eines Ordners ein Musterordner auswählen lässt. Aus diesem Musterordner werden dann automatisch die Register übernommen. Für die neue Anforderung sollte es möglich sein, auch die Dokumente übernehmen zu können. Das ganze läuft derzeit im AfterSave-Event des Ordnertyps. Das bedeutet aber: Es gibt bereits einen neuen, leeren Ordner, der mit den Registern und Dokumenten des Musterordners gefüllt werden soll. Insofern brauchten wir keine Kopie des Ordners, sondern nur der enthaltenen Objekte.
Ich habe dann einen alternativen Ansatz probiert: Register und Dokumente der Quellakte ermitteln und dann mit DMS.XMLCopy in die Zielakte zu kopieren. Leider scheint der Job immer nur ein Objekt kopieren zu können. Zumindest bin ich beim Versuch, mehrere Dokumente oder Register per XML zu übergeben, nicht erfolgreich gewesen. Und da die Zeit etwas drängte, konnte ich mich damit nicht weiter beschäftigen. Als ich beim Kopieren eines Registers dann die Option COPYCASCADING aktivieren wollte, hing das ganze System und musste neugestartet werden. Ob das tatsächlich an dem Job lag oder andere Gründe hatte, kann ich nicht sagen. Aber ich habe danach dann erstmal davon Abstand genommen.
Im Endeffekt habe ich die Anforderung nun auf die wahrscheinlich ineffizienteste Art und Weise umgesetzt: Mittels StartDocRequest und StartRegRequest aus der Client-API werden die Dokumente und Register auf oberster Ebene ermittelt und dann mit CopyObject kopiert. Nachdem die Register kopiert sind, werden deren Dokumente auf dem gleichen Weg ermittelt und kopiert. Das dauert zwar bei einer Testakte (16 Register, 28 Dokumente) etwa 1 Minute, aber funktioniert. An die User werde ich das so nicht freigeben. Daher habe ich die Lösung erstmal in ein eigenständiges Tool verpackt. Dort kann man per Quickfinder Quell- und Zielakte auswählen und dann über einen Button „Inhalte kopieren“ den Kopiervorgang starten; vorausgesetzt die Zielakte ist leer. Für den konkreten Fall war das aber erstmal in Ordnung. Von ideal bin ich mit der Lösung aber noch ganz weit entfernt.
Wäre es ein Ansatz, die Struktur der Vorlage per xml.GetResultList im HOL Modus und <ChildObjects child_schema="ALL" export_depth="99"/> als hierarchische Struktur zu exportieren, und anhand der Ergebnis-XML dann rekursiv die Daten am neuen Standort per dms.XMLImport (in dem Fall könnte man dann vielleicht auch passend auf bestehende Daten reagieren) anzulegen?
Im Schritt des XMLImport könnte man dann gegebenenfalls auch Metadaten anpassen und würde die entstehenden Objekt-IDs erhalten.
Der Ansatz ist aber sicherlich nicht der einfachste
Den Ansatz finde ich aber nicht so schlecht, insb. das zu entkoppeln. Läuft das in einem Server- oder Client-Event oder ganz separat? Was wir ja viel machen, ist, eine Fundstelle mit dem Auftrag anzulegen (oder ähnlich) und dann extern abarbeiten zu lassen. Das hat auch den Vorteil, dass man, wie bisher nötig, nicht mit VBS arbeiten musste und neuerdings nicht mit rein synchronem JS.