Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: nyen am 05.06.06 - 21:03:31
-
Hallo zusammen,
Bitte Hilfe, ich komme mit meinem Agent nicht weiter, der die PDF-Dateien in die Datenbank importiert und aktualsieren soll. Der Importvorgang funktioniert soweit gut, allerdings können die Berechtingungen auf die Dokumente nicht gesetzt werden, da die Dokumente jedes Mal gelöscht werden.
Mein Problem: Wie kann ich meinen Agenten beibringen, dass er die Anhänge nur aktualisiert (ohne Dokumente zu löschen).
Kann mir da jemand helfen?
Wäre Super.
Grüße
Nyen
Hier ist mein Code:
Dim s As New NotesSession
Dim db As notesdatabase
Dim doc As NotesDocument
Dim view As NotesView
Dim vc As NotesViewEntryCollection
Dim fileName As String
Dim rtitem As NotesRichTextItem
Dim collection As NotesDocumentCollection
Dim searchFormula As String
Set db=s.CurrentDataBase
Set view = db.GetView("Alle Dokumente")
Set vc = view.AllEntries
pathName$="D:\Test\"
If pathName$ = "" Then
Msgbox"Pfad oder Dateien nicht vorhanden"
End If
filename$ =Dir$(pathName$+"*.pdf",0)
Do While fileName$<>""
A = filename$ + "#" + typ$
searchFormula = |Dateiname = "| + A +|"|
Set collection = db.Search(searchFormula$, Nothing,0)
Call collection.RemoveAll(True)
' RemoveAttachments = True
fileName$=Dir$()
Loop 'Messagebox("ende erste Schleife")
filename$ =Dir$(pathName$+"*.pdf",0)
Do While fileName$<>""
Set doc =db.CreateDocument
Print fileName$
doc.Form="Main Topic"
Set rtitem =New NotesRichTextItem(doc, "Body")
Set notesembeddedobject = rtitem.EmbedObject(EMBED_ATTACHMENT,"",pathName$+fileName$)
Call doc.ComputeWithForm(False, False)
Call doc.Save(True, True)
fileName$=Dir$()
Loop
Call doc.ComputeWithForm(False, False)
Call doc.Save(True, True)
fileName$=Dir$()
-
Das Verfahren finde ich etwas "schräg". Warum löschst Du denn überhaupt die Dokumente, anstatt aus den gefundenen Dokumenten nur die Attachments, um sie dann erneut anzuhängen? Mit NotesEmbeddedObject.Remove ist das doch kein Problem.
Auch das Problem mit den "nicht zu setzenden Berechtigungen" erschliesst sich aus Deinem Posting nicht wirklich.
Sag' mal genaueres zu Deinem Problem.
Bernhard
-
Hallo,
joo, das ist eben mein Problem, nämlich die gefundenen Dokumente nur die Attachments erneut anzuhängen. Ich habe es bisjetzt nicht hinbekommen.
Mit NotesEmbeddedObject.Remove kann ich die Anhänge wahrschienlich löschen, ich möchte aber die gefundene Dokumente dann erneut anhängen.
Wie geht es weiter?
Danke
Nyen
-
Hallo,
Es klappt einfach nicht. Mit folgendem Code werden die Anhänge gelöscht, jedoch nicht die gefundene nicht erneut angehängt.
Wo liegt der Feher ?
Kann jemand mir bitte helfen, es ist drigend !!!!
Danke
Nyen
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim strFilename As String
Const strPath = "D:\Temp\"
Set db = session.CurrentDatabase
Set collection = db.AllDocuments
Set doc = collection.GetFirstDocument()
While Not(doc Is Nothing)
If doc.HasEmbedded Then
Call detachFiles( doc )
End If
Set doc = collection.GetNextDocument(doc)
Wend
End Sub
Sub detachFiles( doc As NotesDocument )
Dim rtitem As Variant
Set rtitem = doc.GetFirstItem( "Body" )
Forall o In rtitem.EmbeddedObjects
If o.Type = EMBED_ATTACHMENT Then
strFilename = strPath & o.Source
'Call o.ExtractFile(strFilename & o.Source )
Call o.Remove
Call doc.Save( True, True )
End If
End Forall
'Anhängen der Datei
Set rtitem = doc.GetFirstItem( "Body" )
Set object = rtitem.EmbedObject( EMBED_ATTACHMENT, "", strFilename)
End Sub
-
So auf die Schnelle: Zuunterst im Sub "detachFiles" müsste nochmal ein "doc.Save" hin.
-
Hat es leider nichts gebracht !
-
In deiner Routine detachFiles fehlt mir so einiges, vor allem an Deklarationen.
Versuch das Ganze mal so:
Sub detachFiles( doc As NotesDocument )
Dim rtitem As NotesRichtextItem
Dim object As NotesEmbeddedObject
Dim strFilename As String
Const strPath = "D:\Temp\"
Set rtitem = doc.GetFirstItem( "Body" )
Forall o In rtitem.EmbeddedObjects
If o.Type = EMBED_ATTACHMENT Then
strFilename = strPath & o.Source
'Call o.ExtractFile(strFilename & o.Source )
Call o.Remove
End If
End Forall
'Anhängen der Datei
Set object = rtitem.EmbedObject( EMBED_ATTACHMENT, "", strFilename)
Call doc.Save( True, True )
End Sub
Noch ein Tipp am Rande: Trage überall, wo du Script verwendest in den (Options) - Abschnitt Option Declare ein. Dann kann dir das mit den vergessenen Deklaration zumindest nicht mehr passieren.
Axel
-
Danke Axel,
jetzt funktioniert es soweit, allerdings sollen neue Dokumente (Anhänge) auch erstellt werden. Wie kann man am Einfachsten hinkriegen, wenn neue dazu kommen.
Für einen schnellen Tip wäre super.
Gruß
Nyen
-
Was heisst wenn neue dazukommen?
Weitere Dokumente kannst du mit
Set object = rtitem.EmbedObject( EMBED_ATTACHMENT, "", strFilename)
anhängen
Axel
-
Mit diesem Code werden nur in Dokumenten gefundene Anhänge aktualisiert (Anhänge erstetzt). Da neue Dateien in Pfad C:\Temp hinzukommen, können noch nicht importiert´werden.
Er soll neue Dokumente erstellen, wenn er z. B.im Pfad C:\Temp neue Dateien findet, die in der NotesDB noch nicht existieren.
Nyen
-
Heisst das, dass alles was in c:\temp an Dateien vorhanden ist in die DB aufgenommen werden muss, oder nur bestimmte?
Wenn alle, dann kannst du mit dem Dir-Befehl durch das Verzeichnis loopen und für jede Datei ein neues Dokument anlegen und die Datei anhängen.
In der Desinger-Hilfe findest du die entsprechenden Infos.
Axel
-
Ich hatte ja schon mal erwähnt: Das bisherige Verfahren ist "schräg". Und wir können hier für Dich und Deine Firma nicht die Architektur und das Handwerk für eine Applikation bieten.
Tip: Das db.Search ist in diese mFall kontraproduktiv. Arbeite mit einer entsprechenden View und einem NotesView.GetDocumentByKey. Wird das Dokument an Hand des PDF-Filenames gefunden: Attachment entfernen und neu anhängen (wie bisher). Wenn nicht, dann neues Dokument erstellen und das betreffende Attachment anhängen.
Mehr mag ich nicht mehr dazu sagen.
Bernhard
-
Um auf dein 1. Posting mal einzugehen: Warum setzt Du die Berechtigungen nicht von via Agent?
-
Wenn ich wüßte wie, dann würde ich mir diesen Aufwand sparen.
Also, ich kenne bisjetzt keinen Agenten, der die Berechtigungen täglich aktualisiert. Hast du einen Lösungsansatz? Wäre natürleich eine Alternative!
Gruß
Nyen
-
Ich nehme jetzt einfach mal an, dass die Berechtigungen auf Leser/Autorenfelder basiert. Diese kannst Du ja via Script abfüllen/erstellen (auf richtigen Typ achten) z.B. mit
set lesefeld = new Item(notesdoc,"Lesefeld","Leser/TEST",READERS)
oder mit
set autorenfeld = new Item(notesdoc,"Autorenfeld","Autor/Test",AUTHORS)
-
Das klingt gut, aber um dies zu realisieren müßte ich zuerst für jeden Wert meines Schlüsselfeldes eine Role definieren, um Dokumente zu beschränken, wie z. B. @If Feld= Wert; meine Role, bzw. eine Role zu meheren Werte zuweisen, oder?
Dann müße ich über 100 Rolen definieren, ich weß nicht, ob das geht?
Gruß
Nyen
-
Ich verstehe jetzt Bahnhof ... Wie werden denn bisher Berechtigungen vergeben? Und warum sollte das nun auf einmal anders werden?
Bernhard
-
Dann müße ich über 100 Rolen definieren, ich weß nicht, ob das geht?
Das geht nicht. Es sind max. 75 Rollen in der ACL möglich.
Axel
-
Ich glaube, dass Bernhard die Problematik noch nicht verstanden hat. Bisher konnten die Berechtigungen nicht auf Dokumentenebene vergeben werden, sondern nur in der ACL Lesen. Da die Dokumente täglich aktualisert und neu angelegt werden, habe ich hier ein Problem mit Berechtigung für bestimmte Dokumente zu vergeben.
Ich werde doch mit einer View und einem NotesView.GetDocumentByKeyNyen versuchen.
Nyen
-
Nein, ich habe das noch immer nicht verstanden, da Du über Dein Berechtigungskonzept keine Aussage getroffen hast (oder ich habe es überlesen).
Ob Dukumente aktualisiert oder neu angelegt werden, hat doch mit dem Berechtigungskonzept nichts zu tun oder mit NotesView.GetDocumentByKey.
Und wenn Du bisher schon ein Berechtigungskonzept hattest, kann dass doch auch in die neuen Routinen einfliessen.
Ich verstehe es also immer noch nicht.
Bernhard
-
Also, wenn Dukumente aktualisiert oder neu angelegt werden, hat wohl mit Berechtigungskonzept zutun. Genau liegt hier das Problem, weil eben die Berechtigungen mit Dokumente gelöscht werden.
Daher suche einen Lösungsansatz, um die Berechtigungen auf Dokumenteneben zu vergeben. Warum ist das schwer zu verstehen?
Nyen
-
Daher suche einen Lösungsansatz, um die Berechtigungen auf Dokumenteneben zu vergeben. Warum ist das schwer zu verstehen?
Weil Du uns nicht erklärst, wie Dein Berechtigungskonzept überhaupt aussieht. Das Technische wurde Dir bereits gesagt. Jetzt kommst Du mit 100 Rollen. Wie sollten wir dazu etwas sagen können? Ausserdem ist das eigentlich ein gänzlich eigenes Thema.
Bernhard
-
Also so langsam verstehe ich aber auch nur noch Bahnhof.
Du redest hier dauernd von einem Berechtigungskonzept. Dann erklär uns doch mal dein Konzept.
Ich fasse mal zusammen, so wie ich es verstehe:
Du hast eine Datenbank mit x Dokumenten. In diesen Dokumenten gibt es pdf-Anhänge. Diese werden/sollen von Zeit zu Zeit aktualisiert werden und dieses soll automatisiert passieren.
Da die Dokumente nur von bestimmten Personen gelesen/editiert werden dürfen, gibt es wahrscheinlich Leser- und Autorenfelder. In diesen Feldern stehen die einzelnen Personen drin.
Liege ich soweit richtig?
Axel
-
Ja, aber die Dokumente sollen von bestimmten Personen nur gelesen gelesen werden. Da bisjetzt alle Personen lesen dürften, sind noch nicht Leser- und Autorenfelder vorhanden.
Es sind ca. 200 Personen, die verschieden Dokumente lesen sollten.
Nyen
-
Und wie sieht nun dein Berechtigungskonzept aus? Das hast du immer noch nicht eindeutig dargelegt.
Du willst mir/uns doch nicht weissmachen, dass du die User einzeln in die noch zu erstellenden Leserfeld einfügen willst. Oder doch? Aber dann viel spaß bei der Pflege.
Und was das Dokumentenaktualisieren angeht, kannst du doch z.B. den Agenten mit einer ID signieren, der die entsprechenden Rechte auf alle Dokumente hat.
Axel
-
nur mal nebenbei bemerkt:
Von der eigentliche Geschichte sind wir inzwischen Meilenweit entfernt.
An den Fragesteller: Bitte splitte das ganze doch mal in 2 Threads.
Punkt 1:
Wie aktualisiere ich Attachments, OHNE dabei das ganze Dokument zu löschen
Ist dieser Punkt erledigt, dann ist Punkt 2 in meinen Augen schon fast obsolet.
Falls nicht, dann mach noch einen weiteren Thread auf:
Punkt 2:
Ich möchte dieses / jenes Berechtigungskonzept implementieren (automatisieren !?):
Hier habe ich dieses / jenes KONKRETE Problem....
Und jetzt würde ich sagen: macht diesen Thread zu und lasst uns in den Themenbezogenen NEUEN Threads weitermachen: So führt das ganze hier nirgends hin...
Tode
-
OK, in Ordnung.
Die Frage jetzt , wie kann ich die Berechtigungen mit Hilfe eines Agenten automatisieren, am Besten mit Hilfe einer Tabelle, aus der der Agent die Berechtigungenkriterien (welcher Benutzer auf welches Dokuemnet zugreifen soll) ausliest. Damit könnte ich evtl. mein Problem lösen.
Hier noch mal mein Konzept (kurzgefaßt):
Finde das Dokument auf dem File Server
Finde den Schlüssel des Dokumentes
Suche in der Datenbank nach dem einduetigem Feld
Wenn das Feld existiert,
ersetze Anhang (dann hätte ich statische Dokumenet)
Entferne die Löschmarkierung
Wenn das Feld unbekannt ist, erstelle neues Dokument
Speichere Wert im Feld
Erstelle Anhang
Generiere Leserfelder (Berechtigungen für neue Dokumente automatisieren)
Für Administrator
Für "Rolle"
Speichere das Dokument
Lösche alle zum Löschen markierten Dokumente
Nyen