Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: tokio_city am 04.05.05 - 18:58:18
-
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
-
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
-
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. ;)
-
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.
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
-
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.
-
Hi,
überprüf mal, ob oDoc überhaupt gesetzt ist.
Auszug aus der Designer-Hilfe:
For an agent run from a browser with @Command[ToolsRunMacro], the in-memory document is the current document. In the case of WebQueryOpen, this is the document before Domino converts it to HTML and sends it to the browser; in the case of WebQuerySave, this is the document before Domino saves it. ...
Beachte das Fettgedruckte, eventuell liegt hier der Knackpunkt. Viele Funktionen laufen nur sauber, wenn das Dokument bereits min. einmal gespeichert wurde.
Axel
-
Hi Axel,
erstmal vielen Dank für Deinen unermüdlichen Einsatz mir weiterzuhelfen. Bist ein guter, ein sehr guter... , gut jetzt ;)
1. Variante:
Ich habe das dahingehend getestet, dass ich das aktuelle Web-Dokument mehrmals gespeichert habe, bevor ich es geschlossen habe. Der Agent wird wieder gestartet, aber die eigentliche Funktion, also das Anlegen neuer Doks, wird nicht korrekt ausgeführt.
2. Variante:
Dann habe ich testhalber das Ziel geändert, auf alle geänderten und neuen Dokumente und eine Ansicht zur Auswahl definiert. Wieder erkennt der Agent das Dokument -> Im Protokoll steht, dass das entsprechende Dokument gefunden und verarbeitet wurde. Leider wird auch in diesem Fall - trotz mehrmaligen speichern - kein neues Dok erstellt. -> Mit dem Befehl "Set oDoc = oSession.DocumentContext" werden tatsächlich keine Variablen definiert. Der Befehl "Set oDoc = oDc.GetFirstDocument" definiert dagegen die Variablen. Wenn ich nun den Agent im Designer händisch starte, werden auch die entsprechende Dokumente erstellt, übers Web funktioniert das allerdings nicht, obwohl die definierte Ansicht Dokumente zur Verarbeitung enthält.
Wirst Du daraus schlau? Und kennst Du eine Möglichkeit, eine Art Web Debug Lotus Script auszuführen, um mal nachzuvollziehen, was hier script- und serverseitig tatsächlich abläuft?
-
Hi,
danke für die Blumen, aber ich glaube jetzt muß ich leider passen.
Die Web-Programmierung ist (noch) nicht so mein Ding. Ich habe bisher nur DBs für Notes-Clients erstellt.
Axel
-
Hallo Axel,
trotzdem danke. Ich werde das nochmal überdenken und ein paar weitere Tests durchspielen.
Ansonsten habe ich oben - so glaube ich - einen kleinen Denkfehler drin, denn über den Befehl "Set oDoc = oSession.DocumentContext" sollten schon die Variablen definiert werden, da hier Bezug auf das aktuell, geöffnete Dokument / die aktuelle Session vorgenommen wird. Wenn ich den Agent händisch starte, können ja keine Variablen definiert werden, da ja auch kein Dok geöffnet ist -> das nur nur am Rande...
Zu meiner Frage: Ist Dir denn ein Lotus Script Web Debugger bekannt?
-
Hi,
ein Web-Debugger ist mir nicht bekannt. Aber wie gesagt, ich bin nicht der Web-Profi. Will heißen, das es da durchaus was geben könnte.
Axel
-
Hi Axel,
mir ist beim Testen etwas seltsames aufgefallen, was ich so auch noch nie hatte:
Erstmal habe ich das Starten des Agents über das Web wieder entfernt und den Agent so eingestellt, das er periodisch auf dem Server läuft. Dabei beziehe ich mich auf eine Ansicht, in der die neuen Doks zur Verarbeitung angezeigt werden. Gesagt, getan, der Agent startet, erkennt die Doks, erstellt aber nicht die Dokumente. Wenn ich nun im Designer den Agent manuell starte, dann läuft wieder alles Bestens. Der Agent ist mit meiner Signatur gespeichert und von daher verstehe ich nicht, warum der Agent nicht auch periodisch läuft. Die einzige Ungereimtheit ist, dass der Domino-Server noch mit einer 5-er Version läuft (5.0.12), ich aber mit einem 6.5.3 Client programmiere. Im Script werden übrigens keine Designelement der Version 6 verwendet und andere Agents, die auf Fomelsprache basieren, laufen in der DB auch problemlos.
Hast Du eine Idee?
-
Irgend welche UI Elemente im Agenten? Auch wenn sie nur in der Deklaration sind und nicht wirklich angesprochen werden?
Irgendwelche Fehlermeldungen im Log?
-
Mein Held!
Ja, ich hatte doch tatsächlich noch einen verwaisten NotesUIWorkspace-Eintrag im Script, den ich nicht verwendet habe. Nachdem ich den rausgelöscht habe, funktionierte sowohl die periodische Einstellung (aktuelles Dok wird über "Set oDoc = oDc.GetFirstDocument" deklariert), als auch das Starten des Agents über das Web (aktuelles Dok wird über "Set oDoc = oSession.DocumentContext" ausgewählt).
Der Abend ist gerettet, vielen Dank nochmal!
-
Noch ein Frage am Rande, da ich ja neu bin bzw. Frischling ;)
Wie ist denn das Standard-Prozedere: Soll ich den Eintrag im Forum belassen oder den Case löschen, um das Forum nicht unnötig voll zu stopfen?
-
Unbedingt lassen (Du kannst sowieso nicht den gesamten Thread löschen) - hiervon sollen ja auch später noch Fragesteller zehren können.
Entscheidend war m.E. der Punkt, als Du über das Problem mit dem scheduled agent geschrieben hast - das schrie dann ja regelrecht nach UI-Methoden.
Bernhard
-
Genau, unbedingt lassen, diese Lösungserarbeitung ist eine wertvolle Quelle für spätere "Frischlinge" ;)
Du kannst den Thread allerdings quasi als "erledigt" markieren, schau mal in den Forumsregeln (Button oben im Browser-Fenster) im Punkt 3.5.
Ja, Bernhard hat Recht, mit den Hinweisen des Scheduled auf R5 schrie es geradezu nach einem UI-Element und das war ja offenbar der Stolperstein.
-
Ok, ich setze das Dokument auf erledigt, sobald die Funktion wieder zur Verfügung steht und wünsche euch einen schönen Abend!
-
Hi,
freut mich, dass dir doch so schnell geholfen wurde.
Der "Erledigt" - Button steht zwar noch nicht zur Verfügung, aber bitte setze den Thread doch bitte auf "Abgeschlossen", und zwar in dem du deinen ersten Beitrag, die Fragestellung, mit dem "Daumen-Hoch" - Symbol kennzeichnest. Siehe dazu den Hinweis zu Punkt 3.5 in den Foren-Regeln.
Danke.
Axel