Domino 9 und frühere Versionen > ND6: Entwicklung
Neue Doks mit Hilfe der Anzahl von Mehrfachwerten erstellen, Werte übernehmen
tokio_city:
Hallo,
ich habe mich gerade wieder mit Lotus Script beschäftigt und bin noch unsicher beim Programmieren, sodass ich prompt auf mein erstes Problem gestoßen bin und hoffe hier nun auf Hilfe.
Folgende Funktion(en) brauche ich:
Meine Hauptmaske wird übers Web ausgefüllt. Dort existiert ein Namensfeld (Mehrfachwerte zugelassen). Im Notes-Backend-Bereich soll dann für jeden Namen ein separates Dokument erstellt werden. Zusätzlich soll der Name als Key fungieren, um neben den ursp. Werten noch weitere Werte aus einer anderen DB zu übernehmen. Die "Backend-Funktion" liegt zurzeit hinter einen Button, soll aber für die Zukunft automatisch im Hintergrund laufen.
Hier mein Script, wo auch die Probleme aufgelistet sind, die mit 'Achtung --- ...' markiert sind.
Sub SubCreateNewVersion
Dim oWs As New NotesUIWorkspace
Dim oSession As New NotesSession
Dim nam As NotesName
Dim oDb As NotesDatabase
Dim oDc As NotesDocumentCollection
Dim oDoc As NotesDocument
Dim oNewDoc As NotesDocument
Dim oUiDoc As NotesUiDocument
Dim iReturn As Integer
Dim cPromptText As String
Dim temp As String
'### DEKLARATION: ERROR HANDLING ###
On Error Goto ErrorText
'### BODY ###
Set oDb = oSession.CurrentDatabase
'--- Alle Markierten Dokumente
Set oDc = oDb.UnprocessedDocuments
If oDc.Count <> 1 Then
'--- es wurden mehrere Dokumente markiert
cPromptText = "Es wurden <" & oDc.Count & "> Dokumente markiert! Bitte nur ein Dokument zum Kopieren auswählen!"
Print cPromptText
iReturn = Messagebox( cPromptText , MB_OK + MB_ICONSTOP , TitelDialogBox & "Fehler: Kopieren eines Dokuments" )
Else
'--- aktuelles Dokument
Set oDoc = oDc.GetFirstDocument
'--- Erstellen eines Dokument mit der neuen Form temp1
Set oNewDoc = New NotesDocument( oDb )
oDoc.Form = "Temp1"
'ACHTUNG --- hier muss noch eine Routine eingebaut werden, die evaluiert, wieviel Namen im Feld ValuatedPerson (Mehrfachwerte) existieren und für jeden Namen ein eigenes Dokument erstellt, die Idee ist mit Forall und Ubound zu arbeiten, genaue Umsetzung noch unklar
'--- Kopieren der Inhalte der aktuellen Zielvorgabe
Call oDoc.CopyAllItems( oNewDoc, True )
'--- Felder der neuen Version modifizieren
temp=oDoc.GetItemValue( "ValuatedPerson" )
oNewDoc.Name1=temp
'ACHTUNG --- Hier soll der nunmehr einzelne Name/Wert aus dem Feld ValuatedPerson mit einer anderen DB verglichen werden, um entsprechende Werte in die aktuelle DB zu übernehmen. Da wo "Vorname Name" steht, muss der Einzelwert aus dem Feld ValuatedPerson rein (siehe unten, Evaluate...). Der Name kommt mit Vorname und Nachname an und soll im gekürzten kanonischen Format (ohne die Kennungen CN, OU, O, und C) verglichen werden. Das ganze wurde schonmal mit einer Formel umgesetzt, liefert im Script aber keinen Rückgabewert. Anstatt der Formel, habe ich über GetAllDocumentsByKey nachgedacht, aber auch hier liegt das Problem bei der Integration, Umsetzung.
oNewDoc.DBWert= Evaluate ({Wert1:=@Name([Canonicalize] ; "Vorname Name"+"/"); Wert2:=@Name([Abbreviate] ;Wert1); Endwert:=@DbLookup("":"NoCache";"C1256FF1:0024D1BC";"Scorecard";Wert2;4); @Name([CN]; Endwert)})
End If
Exit Sub
'### FEHLERBEHANDLUNG ###
ErrorText:
'--- Fehlermeldung mit Bildschirmausgabe
cPromptText = "Bei der internen Verarbeitung trat folgender Fehler auf: <" & Error() & ">"
Print "Verarbeitungsfehler: " & cPromptText
iReturn = Messagebox( cPromptText , MB_OK + MB_ICONSTOP , TitelDialogBox & "Verarbeitungsfehler" )
Resume EndofSub
EndofSub:
End Sub
Axel:
Hi,
das Anlegen der Dokumente könnte so aussehen:
...
'--- Estellen eines Dokument mit der neuen Form temp1
For idx = 0 to Ubound(ValuatedPerson)
Set oNewDoc = New NotesDocument( oDb )
oNewDoc.Form = "Temp1"
'--- Kopieren der Inhalte der aktuellen Zielvorgabe
Call oDoc.CopyAllItems( oNewDoc, True )
'--- Felder der neuen Version modifizieren
temp=oDoc.GetItemValue( "ValuatedPerson" )
oNewDoc.Name1=temp
Call oNewDoc.Save(True,False)
Next idx
...
Das mit Evalute funktioniert so nicht. Du kannst immer nur eine Anweisung in Evalute absetzen. Ich würde das Ganze mit Script realisieren.
Ein Ansatz wäre mit Methoden aus der NotesName-Klasse den Namen entsprechend aufzubereiten und dann mit GetAllDocumentByKey zu arbeiten.
Axel
tokio_city:
Hi Axel,
danke für die schnelle Rückmeldung. Also war ich mit den Befehlen schon auf dem richtigen Weg, aber manchmal liegt der Teufel im Detail begraben...
Bei der Evaluate Anweisung erhalte ich einen Rückgabewert, wenn ich den Vor- und Nachnamen direkt in die Formel eingebe, aber Feldinhalte wurden so nicht verarbeitet. Ich probiere es so wie von Dir vorgeschlagen. Im Zweifelsfall konsultiere ich die Notes Designer Hilfe oder poste mal wieder was. ;)
Axel:
--- Zitat von: tokio_city am 05.05.05 - 17:03:42 ---Bei der Evaluate Anweisung erhalte ich einen Rückgabewert, wenn ich den Vor- und Nachnamen direkt in die Formel eingebe, aber Feldinhalte wurden so nicht verarbeitet.
--- Ende Zitat ---
Hi,
dann fehlt der Bezug zum Dokument bei Evaluate gibt es einen zweiten Parameter. Dort übergibst du einen Verweis auf das Dokument.
z.B.
varResult = Evaluate("Formel", doc)
Dann sollte das auch mit den Feldinhalten klappen.
Axel
tokio_city:
Hallo,
ich habe das Skript jetzt soweit angepasst, dass die Änderungen im Notes Client laufen, wenn man ein Dokument auswählt und per Button das Script startet.
Nun möchte ich aber, dass nachdem ein Dokument über die Browserschnittstelle erstellt wurde, sofort ein Agent startet, der die entsprechenden Änderungen im Background vornimmt bzw. das Script durchlaufen lässt. Dazu habe ich einen Verweis in der Web-Maske im Bereich "WebQuerySave" auf den Agent erstellt. Der Agent ist folgendermaßen eingestellt: Auslösen: Durch Ereignis, Auswahl aus der Agentenliste, kein Ziel & als Web-Benutzer ausführen. Laut Agent-Protokoll startet das Script auch, das neue Dokument wird aber nicht erstellt. Ich vermute mal, dass das mit der Dokumentauswahl nicht richtig klappt. Hier nochmal der Auszug aus dem Skript Anfang:
Sub Initialize
Dim session As New NotesSession
Dim doc As notesdocument
Dim oWs As New NotesUIWorkspace
Dim oSession As New NotesSession
Dim oDb As NotesDatabase
Dim oDc As NotesDocumentCollection
Dim oDoc As NotesDocument
Dim oNewDoc As NotesDocument
Dim oUiDoc As NotesUiDocument
Dim varResult As Variant
Dim varReader1 As Variant
Dim varReader2 As Variant
'### BODY ###
Set oDb = oSession.CurrentDatabase
Set oDc = oDb.UnprocessedDocuments
'--- aktuelles Dokument
Set oDoc = oSession.DocumentContext
'--- Set oDoc = oDc.GetFirstDocument --> Mit dem Befehl läuft es im Notes Client, wenn man sich in einer Ansicht befindet und das Skript über einen Button aufruft.
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln