Domino 9 und frühere Versionen > ND6: Entwicklung

Neue Doks mit Hilfe der Anzahl von Mehrfachwerten erstellen, Werte übernehmen

(1/4) > >>

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