Autor Thema: neue Dokumente erstellen  (Gelesen 11859 mal)

Offline tooot

  • Frischling
  • *
  • Beiträge: 20
neue Dokumente erstellen
« 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!

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: neue Dokumente erstellen
« Antwort #1 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
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline tooot

  • Frischling
  • *
  • Beiträge: 20
Re: neue Dokumente erstellen
« Antwort #2 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
« Letzte Änderung: 25.08.09 - 15:51:38 von tooot »

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: neue Dokumente erstellen
« Antwort #3 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
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: neue Dokumente erstellen
« Antwort #4 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.

Offline guesswho

  • Senior Mitglied
  • ****
  • Beiträge: 291
Re: neue Dokumente erstellen
« Antwort #5 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
5 Server 9.x auf W2K3/W2K8
ca. 550 Clients: 9.x auf Win7
Notes Traveler
iQ.Suite
BCC Charon 4
panagenda Marvel Client
BES 10/12 und viele Blackberrys
paar iPad und iPhones
Teamstudio

samWare

  • Gast
Re: neue Dokumente erstellen
« Antwort #6 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
« Letzte Änderung: 26.08.09 - 09:14:35 von samWare »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: neue Dokumente erstellen
« Antwort #7 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

Offline tooot

  • Frischling
  • *
  • Beiträge: 20
Re: neue Dokumente erstellen
« Antwort #8 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)



« Letzte Änderung: 26.08.09 - 12:57:31 von tooot »

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
Re: neue Dokumente erstellen
« Antwort #9 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)


Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

samWare

  • Gast
Re: neue Dokumente erstellen
« Antwort #10 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:
« Letzte Änderung: 26.08.09 - 16:36:41 von samWare »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: neue Dokumente erstellen
« Antwort #11 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
« Letzte Änderung: 26.08.09 - 16:55:46 von koehlerbv »

samWare

  • Gast
Re: neue Dokumente erstellen
« Antwort #12 am: 26.08.09 - 16:53:06 »
@Bernhard: Wie ließt du dann Werte aus Feldern aus?  :-:

PS: war doch garnicht bös gemeint ;)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: neue Dokumente erstellen
« Antwort #13 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

Offline tooot

  • Frischling
  • *
  • Beiträge: 20
Re: neue Dokumente erstellen
« Antwort #14 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

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: neue Dokumente erstellen
« Antwort #15 am: 26.08.09 - 19:17:48 »
Wenn du genau beschreibst was du machen willst, bekommst du sicher noch mehr hilfe

Chris
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline tooot

  • Frischling
  • *
  • Beiträge: 20
Re: neue Dokumente erstellen
« Antwort #16 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: neue Dokumente erstellen
« Antwort #17 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

samWare

  • Gast
Re: neue Dokumente erstellen
« Antwort #18 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)

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: neue Dokumente erstellen
« Antwort #19 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.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz