Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: tooot am 25.08.09 - 15:28:19

Titel: neue Dokumente erstellen
Beitrag von: tooot am 25.08.09 - 15:28:19
Hallo,

ich möchte gerne einen Agenten schreiben der läuft wenn ein Dokument (Form1) erstellt oder geändert wird. Er soll ein neues Dokument erstellen (Form2). Ich habe keine Erfahrung mit LotusScript...

habe hier etwas versucht:

Sub Initialize
   Dim ws As New NotesUIWorkspace
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim doc As NotesDocument
   Dim newdoc As NotesDocument
   
   Set db = session.CurrentDatabase
   Set view = db.GetView("View1")
   
   Set newdoc = New NotesDocument(db)
   newdoc.Form = "Form2" 
      
      newdoc.Feld2 = doc.FeldA
      newdoc.Feld3 = doc.FeldB
      newdoc.Feld4 = doc.FeldC
      newdoc.Feld5 = doc.FeldD
      
      
      Call newdoc.Save(True,True)
End Sub



ich komm nicht so recht weiter. Könntet Ihr mir bitte helfen?

Vielen Dank!
Titel: Re: neue Dokumente erstellen
Beitrag von: Klafu am 25.08.09 - 15:38:29
Bei was kommst du denn nicht genau weiter ?
Hast du schonmal in die Hilfe geguckt, bzw. die Forensuche verwendet ?

Kleines Beispiel aus der Designer hilfe:

Zitat
This script creates a new document in the current database, sets its Form and Body items, and saves it. If a user opens the document in the user interface, Notes uses the Status form to display it (if a form by that name exists in the current database).
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set doc = New NotesDocument ( db )
doc.Form = "Status"
doc.Body = "Client meeting postponed."
Call doc.Save( True, True )


Chris
Titel: Re: neue Dokumente erstellen
Beitrag von: tooot am 25.08.09 - 15:49:01
Danke für die schnelle Antwort. Ich habe aber im Forum und in der Designer Hilfe gesucht. Habe auch einiges gefunden und viel versucht aber irgendwie bin ich über die fehler Meldung "object variable not set" nicht hinaus gekommen :-/...

Vielen Dank

Christoph
Titel: Re: neue Dokumente erstellen
Beitrag von: Klafu am 25.08.09 - 15:53:57
Ich tippe mal auf

      newdoc.Feld2 = doc.FeldA
      newdoc.Feld3 = doc.FeldB
      newdoc.Feld4 = doc.FeldC
      newdoc.Feld5 = doc.FeldD
      
was ist denn 'doc.FeldA' ?
Wo kommen die Daten her ?

Chris
Titel: Re: neue Dokumente erstellen
Beitrag von: koehlerbv am 25.08.09 - 15:57:56
1. Fragen konkret formulieren
2. Bei Fehlermeldungen aus LotusScript den Debugger anwerfen und die Zeile markieren, in der der Fehler auftritt - keiner hat hier einen besonderen Bock, selber zu suchen.

Dies sind Minimalanforderungen an solche Posts, und dann wird Dir auch viel schneller geholfen, Christoph!

Bernhard

PS: Chris hat natürlich die korrekte Stelle mit dem inkorrektem Codeteil genannt.
Titel: Re: neue Dokumente erstellen
Beitrag von: guesswho am 25.08.09 - 18:24:17
Christoph,

du hast das doc zwar deklariert, aber nicht gesetzt....

Vermute mal, du willst das aus der View holen, dann hol dir das doc vor "set newdoc = ..." mit z.B. set doc = view.GetDocumentByKey("dein Schlüsselwort") oder auf andere Art.

doc.FeldA kannst du erst greifen, wenn doc auf ein Dokument verweist.

Die View muss dazu sortiert sein.

Jo
Titel: Re: neue Dokumente erstellen
Beitrag von: samWare am 26.08.09 - 08:49:38
Wenn du was aus nem Feld auslesen willst muss das so aussehen: "doc.FeldA(0)" <- erster Wert

In deinem Beispiel also so:

newdoc.Feld1 = doc.FeldA(0)

Zudem musst du dir das "doc" ja erstmal holen bevor du es verwenden kannst  ;) Jo hat schon einige Methoden aufgezeigt. Vllt. kann man dir ja ein wenig helfen:

"Agent behandelt Doc wenn es erstellt oder verändert wurde"... um das Ziel zu erreichen, könntest du beispielsweise in die Form die behandelt werden soll, ein "Status"-Feld setzen. Wenn du es bearbeitest bzw. erstellst setzt du ein Flag rein (z.B: den Wert 1). Jetzt baust du eine Ansicht die nur Dokumente mit deiner Form (Form="deineForm") und dem Feld (Status=1) anzeigt. Die initialisierst du dann im Agenten und durchläufst die Dokumente (Schau dir dazu mal was zum Thema "DocumentCollection" bzw. "EntryCollection" an). Wenn dein Agent im jeweiligen Dokument das getan hat was er tun muss, setzt du das Flag auf 0 (Sodass das Dokument nicht mehr in deiner Ansicht auftaucht). Und das machst du dann quasi mit allen Dokumenten in der Ansicht.

Vllt. machst du es ja auch die Tour. Ist auf jeden Fall eine der leichtesten und besten Lösungen. Wenn du weitere Hilfe brauchst helf ich dir gerne..

mfg Sam
Titel: Re: neue Dokumente erstellen
Beitrag von: koehlerbv am 26.08.09 - 10:39:50
Wenn du was aus nem Feld auslesen willst muss das so aussehen: "doc.FeldA(0)" <- erster Wert

In deinem Beispiel also so:

newdoc.Feld1 = doc.FeldA(0)

Sam, der Zugriff nur auf das erste Element des Items ist nicht nur unnötig, sondern kann sogar falsch sein (wenn FeldA Mehrfachwerte enthält).
Und ob man wirklich einen Agent braucht oder ein Dokument wieder aus einer Ansicht herausfischen muss, warten wir erst einmal ab - bis Christoph sich hier mit mehr Infos wieder meldet.

Bernhard
Titel: Re: neue Dokumente erstellen
Beitrag von: tooot am 26.08.09 - 12:07:51
Hallo,

erstmal noch vielen Dank für die schnellen Antworten. Das ist echt klasse hier. Ich habe versucht die Tipps umzusetzen. Also erst erstes habe ich ein Feld in meiner ersten Form erzeugt das true anzeigt wenn ein bestimmtes Feld sich geändert hat.

Danach habe ich eine passende View erstellt und die erste Spalte (mit dem Feld) "Categorized". Dies funktioniert auch gut. Die View zeigt jetzt alle meine Dokumente der jeweiligen Form an, kategorisiert mit true und false.

So jetzt zu meinen eigntl. Problem. Ich möchte jetzt einen Agenten der mir neue Dokumente mit einer anderen Form erstellt wenn die jetzigen Dokumente "true" sind.

Sub Initialize
   
   Dim ws As New NotesUIWorkspace
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim doc As NotesDocument
   Dim newdoc As NotesDocument
      
   Set db = session.CurrentDatabase
   
   Set view = db.GetView("Neue_View")
   Set doc = view.GetDocumentByKey("Feld_Flag")
   
   Set newdoc = New NotesDocument(db)
   newdoc.Form = "Form2"
   
   Do Until LastCodeChange="false"
      
                newdoc.Feld2 = doc.FeldA(0)
                newdoc.Feld3 = doc.FeldB(0)
                newdoc.Feld4 = doc.FeldC(0)
                newdoc.Feld5 = doc.FeldD(0)
      Call newdoc.Save(True,True)
      Set doc=view.getnextdocument(doc)
   Loop
   
End Sub


Die Felder enthalten keine Mehrfachwerte.

@Sam zu DocumentCollection habe ich in der Hilfe nur Java sachen gefunden?


Ja leider funktioniert der Agent immer noch nicht der Fehler bleibt der selbe:object variable not set in der Zeile: newdoc.Feld2 = doc.FeldA(0)



Titel: Re: neue Dokumente erstellen
Beitrag von: dirk_2909 am 26.08.09 - 14:41:21
Hallo

Ich würde folgendermaßen vorgehen:

- im Queryopen eine Variable auf false setzen (Bsp.: DocIsModified)
- Dort weitere Werte des docs merken (damit man sie später vergleichen kann)
- im QueryClose (o.ä) prüfen, ob sich was geändert hat
- wenn ja, dann neues doc erzeugen- Bsp:

Code
…
if Not DocIsModified Then Exit Sub
'if the doc is new or modified
Dim doc as NotesDocument
Dim s as New NotesSession
dim db as NotesDatabase
dim newdoc as NotesDocument

set doc = Source.Document
set db = s.CurrentDatabase
set newdoc = db.CreateDocument
call newdoc.ReplaceItemValue( "Form", "<Formname>" )
call newdoc.ReplaceItemValue( "Feld1", doc.getItemValue( "FeldA" ) )
call newdoc.ReplaceItemValue( "Feld2", doc.getItemValue( "FeldB" ) )
…
Call newdoc.Save( true, true, true)
…

(ungetestet)


Titel: Re: neue Dokumente erstellen
Beitrag von: samWare am 26.08.09 - 16:31:56
Die einschlägigen Klassen lauten: "NotesViewEntryCollection" bzw. "NotesDocumentCollection". Einfach mal in der Hilfe die Klassen durchgucken :) Deine Vorgabe war ja ein Agent, muss das wirklich sein? Sowas lässt sich über die Events eig. viel einfacher lösen (bsp. QueryClose, wie das Dirk ja schon beschrieben hat). Wenn du über die Events gehst, müsstest du beim erstellen/öffnen des Dokuments alle Feldwerte einlesen. Ich würde das über die Globals machen. Einfach ein Array in das du alle Feldwerte einträgst.

Beispiel:

Dim array(0 to 2) As String

array(0) = doc.feld1(0)
array(1) = doc.feld2(0)
array(2) = doc.feld3(0)
...

Im QueryClose vergleichst du halt dann die Werte aus dem Array mit den aktuellen Feldwerten. Wenn sich dann was geändert hat, weißt du dass du dein Dokument oder sonstwas erstellen musst. Das kannst du dann auch gleich im Event machen. Ist gescheiter, da hat Dirk auf jeden recht. Jetzt wird mich Bernhard bestimmt wieder zersägen  ;D aber vllt hilfts dir ja ein wenig  :knuddel: :love:
Titel: Re: neue Dokumente erstellen
Beitrag von: koehlerbv am 26.08.09 - 16:40:12
@Dirk: Das mit dem Flag ist aber unnötig unter der Massgabe des Threaderstellers, dass neue und modifizierte Dokumente die Erstellung eines neuen Dokuments triggern sollen. Hierfür reicht ja im QueryClose (jo, ich würde das auch so machen) ein Vergleich mit
NotesUIDocument.ModifiedSinceSaved = True
bzw.
NotesUIDocument.IsNewDoc = True

@Sam:
Warum sollte ich Dich zersägen? Nur mit Deiner Kaprizierung immer auf das erste Element eines Arrays (und ein solches ist ein NotesItem) ist wenig vorausschauend. Heute ist noch ein skalarer Wert im Item abgelegt, und morgen wird es ein Array - und keiner denkt mehr an die Routine xy ...

Bernhard
Titel: Re: neue Dokumente erstellen
Beitrag von: samWare am 26.08.09 - 16:53:06
@Bernhard: Wie ließt du dann Werte aus Feldern aus?  :-:

PS: war doch garnicht bös gemeint ;)
Titel: Re: neue Dokumente erstellen
Beitrag von: koehlerbv am 26.08.09 - 17:00:13
Ich weiss doch, dass Du das nicht böse gemeint hast, Sam  ;)

Zu Deiner Frage, erläutert an Deinen beiden Beispielen:
newdoc.Feld1 = doc.FeldA

Und wenn man denn dazu überhaupt ein Array hernehmen will:
Dim array (0 to 2) As Variant

array (0) = doc.feld1
array (1) = doc.feld2
array (2) = doc.feld3
...

NotesItems (ausser RTIs) als skalare Werte zu verwursten, ist jedenfalls doof. Und das habe ich natürlich auch aus bitterer Erfahrung vor vielen Jahren lernen müssen  ;)

HTH,
Bernhard
Titel: Re: neue Dokumente erstellen
Beitrag von: tooot am 26.08.09 - 17:59:44
Hey,

also es muss nicht unbedingt ein Agent sein. Ich habe erst in der Formelsprache gesucht aber da habe ich nichts gefunden um ein neues Dokument zu erstellen. Da war meine nächste Idee ein Agent.

Das es sowas wie QueryClose gibt wusste ich als absoluter Notes Beginner nicht...

Vielen Dank für eure Antworten werde mich morgen da mal einlesen und versuchen es damit zu machen.


Christoph
Titel: Re: neue Dokumente erstellen
Beitrag von: Klafu am 26.08.09 - 19:17:48
Wenn du genau beschreibst was du machen willst, bekommst du sicher noch mehr hilfe

Chris
Titel: Re: neue Dokumente erstellen
Beitrag von: tooot am 26.08.09 - 21:01:58
Wenn du genau beschreibst was du machen willst, bekommst du sicher noch mehr hilfe

Chris

Also die ganz Idee dabei ist: Ich habe Dokumente, wenn sich in denen was ändert soll dies dokumentiert werden in eine History. Ich habe das so gelöst das ich in jeden Dokument eine embedded view habe die die jeweilige "History" im Dokument anzeigt. Funktioniert alles Prima. Das Problem ist nur das es ein paar Dokumente später sind. Und somit soll die History automatisiert erstellt werden...so das war meine Intention bei der ganzen Geschichte
Titel: Re: neue Dokumente erstellen
Beitrag von: koehlerbv am 26.08.09 - 23:12:07
Das Problem ist nur das es ein paar Dokumente später sind.

Wenn Du Dich nicht zu klareren Ansagen hinreissen lässt, bin ich bestimmt nicht der letzte, der hier nur noch müde abwinkt ... Und der zitierte Satz ist nun wahrlich nicht der einzige in diesem Thread, der bei den Hilfswilligen entweder Unverständnis auslöst oder schlicht unverständlich bleibt.

Ich kann Dir auch nur empfehlen, Dich zunächst mit den Grundlagen der Notes-Programmierung im Allgemeinen und von LotusScript im Speziellen zu beschäftigen, bevor Du solche Stunts angehst. Da Du beispielsweise noch gar nichts dazu geschrieben hast, wann für Dich ein Dokument "geändert" ist, könnte sich da bereits eine neue Hürde für Dich auftun.

Vulgo: Nimm Dir erstmal etwas einfacheres vor, und stelle vor allem klarere Fragen bzw. spezifiziere immer Dein Problem genauer.

Bernhard
Titel: Re: neue Dokumente erstellen
Beitrag von: samWare am 27.08.09 - 11:39:46
Für ne history dauernd neue Dokumente anlegen? Warum dass den? Du kannst doch einfach Felder mit Mehrfachwerten machen. Eins für das Datum, eins für den Änderungs-Author und eins für die Action. Du stellst die Felder so ein dass die mehrfachfelder untereindander gelistet werden. (Mehrfachwerte anzeigen mit neuer Zeile).

Du Appendest dann einfach immer ne neue Zeile dazu. Hier ein auszug aus der Hilfe:

Dim doc As NotesDocument
Dim item As NotesItem
' ...set value of doc...
Set item = doc.GetFirstItem( "Categories" )
Call item.AppendToTextList( "Shocks" )
Call doc.Save( False, True )

Vllt. ist das ja auch eine Lösung :) (also ich würde das so machen)
Titel: Re: neue Dokumente erstellen
Beitrag von: MadMetzger am 27.08.09 - 11:47:36
Kommt drauf an, was er protokollieren will. Bei der Lösung stößt du irgendwann unter Umständen an die 64k-Grenze. In solchen Fällen würde ich zur HistoryClass, die hier im Forum zu finden ist, greifen. Aber dazu sollte man LS schon beherrschen, wenn man so etwas verwenden will.
Titel: Re: neue Dokumente erstellen
Beitrag von: tooot am 03.09.09 - 15:43:08
Hey,

also ich habe es jetzt so gelöst:

1. habe ich eine View erstellt die mir nur die Dokumente mit den flag true anzeigt
2. habe ich den Agenten erstellt:


Sub Initialize
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Set db=session.CurrentDatabase
   Dim view As NotesView
   
   Dim doc As NotesDocument
   Dim newdoc As NotesDocument   
   
   Set view=db.GetView("View")
   
   Set doc = view.GetFirstDocument
   
   Do Until doc Is Nothing
      Set newdoc = New NotesDocument (db)
      newdoc.Form="Form"
      
      newdoc.Feld2 = doc.FeldA
                newdoc.Feld3 = doc.FeldB
                newdoc.Feld4 = doc.FeldC
                newdoc.Feld5 = doc.FeldD
      Call newdoc.Save(True,True)
      
      doc.feld="false"
      Call doc.Save(True,True)
      'wieder zum ersten Dokument da der Zeiger false das erste Dokument "weg nimmt"
      Set doc=view.GetFirstDocument
   Loop
   
End Sub


Nochmals vielen Dank für eure Hilfe

Christoph
Titel: Re: neue Dokumente erstellen
Beitrag von: TRO am 03.09.09 - 20:55:03
Für ne history dauernd neue Dokumente anlegen? Warum dass den? Du kannst doch einfach Felder mit Mehrfachwerten machen. Eins für das Datum, eins für den Änderungs-Author und eins für die Action.
...
Vllt. ist das ja auch eine Lösung :) (also ich würde das so machen)


Du rennst mit dieser Lösung aber m.E. mit großer Wahrscheinlichkeit in ein Replizierkonfliktproblem:
Maske ist auf "Mischen RepKonflikte" gesetzt (-> $ConflictAction = 1)
jetzt bearbeiten zwei Leute in jeweils einer Replik-Instanz das selbe Dokument, aber in unterschiedlichen Feldern. Ergebnis nach dem Replizieren (ohne Deine Historie): alles paletti, die Dokumente werden sauber gemerged.
Jetzt mit Deiner Historien-Variante: obwohl unterschiedliche Felder bearbeitet wurden ist doch in beiden Instanzen das/die Historien-Felder geändert ... und das knallt dann beim Replizieren!

Die einzig saubere Variante so etwas abzufangen ist wirklich mit separaten Historien-Dokumenten. Die können dann ja durch einen Nacht-Agenten (nur eine Instanz!) im Haupt-Dokument gesammelt werden.


Thomas
Titel: Re: neue Dokumente erstellen
Beitrag von: samWare am 04.09.09 - 08:58:08
Mal ne blöde Frage, aber sind Do Schleifen nicht dafür bekannt dass sie ihr Run-Statement am Ende tragen?

Bsp:

Do
...
...
...
Loop while true

-----------------------

Du hast hier eher die While Syntax angewandt. Sauberer wärs also folgendermaßen:

While (irgendwas=true)
...
...
...
Wend

-----------------------

Kann natürlich sein dass ich mich irre, ich bin mir aber ziemlich sicher ;)
Noch ne Sache: bist du sicher dass er den Document Index neu aufbaut? Müsstest du dazu nicht erst die View refreshen, oder geht dass auch so? :-: Sauberer wärs glaubich mit ner "NotesDocumentCollection" bzw. "NotesViewEntryCollection". Schaus dir doch mal an!

(Kann natürlich sein dass ich mich überall Irre, aber dann hätte ich wenigstens wieder was neues dazugelernt ;))
Titel: Re: neue Dokumente erstellen
Beitrag von: tooot am 04.09.09 - 09:06:27
Mal ne blöde Frage, aber sind Do Schleifen nicht dafür bekannt dass sie ihr Run-Statement am Ende tragen?
-----------------------

Noch ne Sache: bist du sicher dass er den Document Index neu aufbaut? Müsstest du dazu nicht erst die View refreshen, oder geht dass auch so? :-: Sauberer wärs glaubich mit ner "NotesDocumentCollection" bzw. "NotesViewEntryCollection". Schaus dir doch mal an!
(Kann natürlich sein dass ich mich überall Irre, aber dann hätte ich wenigstens wieder was neues dazugelernt ;))

Hey, also das mit der Do Schleife stand so in der Literatur...

Also die View wird automatisch aktualisiert... habe mich da auch gewundert mein erster Ansatz sah da auch anders aus^^...

Die NotesDocumentCollection usw. schau ich mir natürlich noch an...

Titel: Re: neue Dokumente erstellen
Beitrag von: samWare am 04.09.09 - 09:20:14
Hab auch eben noch in der LS-Hilfe nachgeschaut... Krank^^

Hier damit du verstehst warum ich das nicht verstanden habe: Die Do-While Schleife (http://de.wikipedia.org/wiki/Do-while-Schleife) (eig. überall das selbe)

Bitte nicht böse sein, ich habs nur gut gemeint  :knuddel: :love:
Titel: Re: neue Dokumente erstellen
Beitrag von: tooot am 04.09.09 - 10:40:44
Bitte nicht böse sein, ich habs nur gut gemeint  :knuddel: :love:

Bin ich nicht, bin ja über jeden Tipp/ über jede Hilfe dankbar...will ja was lernen... :)
Titel: Re: neue Dokumente erstellen
Beitrag von: DAU-in am 04.09.09 - 10:43:01
Ich finde es ungünstig, einen Agenten mit Dokumenten aus einer View zu bestücken und diese dann in jeder Schleife den Index neu aufzubauen. Die Admins hassen einen gerne für so etwas.

Da würde ich lieber eine NotesDocumentCollection erstellen, die durchgehen und am Ende mit Stampall die Items entfernen.
Titel: Re: neue Dokumente erstellen
Beitrag von: BigWim am 04.09.09 - 11:05:40
Zitat
Ich finde es ungünstig, einen Agenten mit Dokumenten aus einer View zu bestücken und diese dann in jeder Schleife den Index neu aufzubauen. Die Admins hassen einen gerne für so etwas
Kann ich nur bestätigen ...

Deshalb hatte ich mir Hilfsansichten gebaut. Diese waren eine 1:1 Kopie der Ansicht ohne Sortierung; aber das habe ich u. a. auch hier im Forum gelernt (Nochmals Danke!) (http://atnotes.de/index.php/topic,44547.msg286436.html#msg286436):

Aus der Designer-Hilfe zu NotesView, Eigenschaft AutoUpdate

Zitat
Read-write. Indicates whether a view is automatically refreshed by the currently running code when a navigation method touches an update (addition, deletion, or change) to the database that occurred after view creation or the last refresh.


Markus
Titel: Re: neue Dokumente erstellen
Beitrag von: DAU-in am 04.09.09 - 17:30:35
ich dachte mehr an:

Set notesDocumentCollection = notesDatabase.FTSearch( query$, maxdocs%, [ sortoptions% ], [ otheroptions% ] )

query$ = Selectionsformel deiner Ansicht

danach die Dokumente durchgehen mit getFirstDocument/getNextDocument

nach getaner Arbeit dann ein
Call notesDocumentCollection.StampAll( itemname, value )

Vorteil: du hältst keine View vorrätig, du baust keinen Index immer neu auf, du speicherst nicht jedes Dokument extra ab.

Fällt bi 3 Dokumenten nicht auf, bei 30.000 dann schon irgendwann.

Grüsse

Dau-in