Autor Thema: Neue Doks mit Hilfe der Anzahl von Mehrfachwerten erstellen, Werte übernehmen  (Gelesen 4905 mal)

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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
« Letzte Änderung: 23.05.05 - 19:06:38 von tokio_city »

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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

Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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.  ;)

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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



Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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.

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
 
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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?

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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?

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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?

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Irgend welche UI Elemente im Agenten? Auch wenn sie nur in der Deklaration sind und nicht wirklich angesprochen werden?

Irgendwelche Fehlermeldungen im Log?
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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!

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
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?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
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

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
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.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline tokio_city

  • Frischling
  • *
  • Beiträge: 26
  • Geschlecht: Männlich
Ok, ich setze das Dokument auf erledigt, sobald die Funktion wieder zur Verfügung steht und wünsche euch einen schönen Abend!

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz