Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: cash am 05.10.07 - 13:57:18

Titel: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 05.10.07 - 13:57:18
Hallo,

ich versuche gerade eine Workflow-Datenbank zu erstellen wo mit Anwortdokuemten gearbeitet wird.

Ich habe hier im Forum folgenden Code gefunden:

Sub Querysave(Source As Notesuidocument, Continue As Variant)
   
'------------------------------------------------------------------------------------------------------------------   
'Zweck: Feldwerte werden beim Speichern in alle Antwort-Dokumente übernommen   
'------------------------------------------------------------------------------------------------------------------   
'   Dim session As New NotesSession
'   Dim db As NotesDatabase
'   Dim dc As NotesDocumentCollection
'   Dim doc As NotesDocument
'   Set db = session.CurrentDatabase
   
'   If Source.IsNewDoc Then Exit Sub 'Wenn UIDoc neu ist dann verlasse Script
   
'   Set doc = Source.Document 'UIDoc zu Backend-doc
   
   
   'alle Antwortdocs des Backend-Docs werden in die Collection aufgenommen
'   Set dc = doc.Responses
   
   'Setze alle Felder der Collection, gespeichert wird automatisch   
'   Call dc.StampAll( "leser_response" , doc.leser_response(0) )
   
End Sub

Der im Quersave der Hauptdokumentes ist und die Änderungen die im Feld leser_response gemacht werden in allen Antwortdokumenten schreibt.

Leider bringt der Code einen Fehler, da der User der durch einen Button z. B. einen neuen Leser in das Feld einfügt kein Autorenrecht auf die Antwortdokumente hat. In der Regel hat keiner mehr Autorenrechte (bis auf die mit der Rolle Admin für den Notfall ;-))
das Feld leser_response regelt aber wer die Antwortdokumente lesen darf und das kann je nach Workflowverlauf ein anderer sein.

Wie kann ich mein Problem lösen?

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: Axel am 05.10.07 - 15:24:57
Was mir da spontan einfällt wäre, dass du das Füllen der Leserfelder über einen Agenten regelst, der mit der Admin-ID bzw. Server-ID signiert ist.

Axel
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 05.10.07 - 16:02:39
oh man das ich auf einen agenten nicht selber gekommen bin...

Werde es mal testen... Vielen Dank

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: pete_bla am 05.10.07 - 16:20:53
Hi,

ja das liegt eben im System, wer nicht autor / leser ist darf auch keine änderungen an den Lesern / Autoren machen.

Als Alternative könntest Du mit Gruppen arbeiten für die "Grobe Einschränkung" auf die Dokumente
und das Autorenrecht individuell auf Abschnitte einschränken (Zugriffsgesteuerte Abschnitte - zugriff berechnet)

Ich verwende die gerne für Workflow-Konzepte.

Gruss Pete(r)
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 08.10.07 - 13:22:41
Wie kann ich denn ein Autorenrecht individuell auf einen Abschnitte einschränken?

Dann würde ich einen Abschnitt erstellen nur mit dem Statusfeld (immer versteckt) und dort Autor jeder!?

Oder sieht dann auch wieder jeder das Dokument?

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: pete_bla am 08.10.07 - 15:18:07
Hi,

"Erstellen"\"Abschnitt"\"Kontrollierter Zugriff"
"Create"\"Section"\"Controlled Access"

Relevant dabei ist der Typ (2.Eigenschaftsreiter)
"Berechnet zur Anzeige"


Schau Dir mal "Zugriffskontrollierte Abschnitte" / "controlled-access section" an (hier im Forum oder in der Desinger Hilfe).

Aber für Leseinschänkungen sind sie leider nicht wirksam.

Gruss Pete(r).
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 09.10.07 - 10:49:29
Habe mir das mit den Abschnitten mal angeschaut. Für die Datenbank ist es wohl eher nichts aber evtl für andere die ich mal erstelle...

Also bleibt mir nur der Weg über Agenten....

den Script einfach im Agenten zu kopieren klappt leider nicht "Variant does not Contain an Object"

Nur leider verstehe ich LS nicht und kann so auch selber nichts machen. Kann mir evtl. einer helfen?

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: pete_bla am 09.10.07 - 14:02:08
Hi,

den Script einfach im Agenten zu kopieren klappt leider nicht "Variant does not Contain an Object"

liegt daran, dass du auf das "Source" = NotesUIdocument = "Dokument das dem User Offen da liegt", worauf das UI hindeutet, zugreifen willst:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
...
'   If Source.IsNewDoc Then Exit Sub 'Wenn UIDoc neu ist dann verlasse Script
   
'   Set doc = Source.Document 'UIDoc zu Backend-doc   
End Sub
Ausserdem wird das "Source As NotesUIdocument" im QuerySave automatisch übergeben, du müsstes es aber noch initieren mit z.B. "NotesUIWorkspace.Currentdocument"

Es wird aber auch scheitern, wenn du den Agenten vom User aus starten willst, da dann der Agent im Namen des Users läuft und es auch nicht darf.

Du benötigst also einen Agenten, der die Aktualisierung vom Server (mit dessen Berechtigung) aus macht, z.B. ein "Zeitgesteuerter"/"scheduled"- Agenten, der wiederum wissen muss, welche Dokumente du "ändern" willst.

Hierbei kannst Du aber nicht über das UI-Dokument arbeiten,
sondern nur im Hintergrund auf das NotesDocument. (in deinem code das 'doc')
(OK hier gibts auch Ausnahmen, aber die sind hier irrelevant.)

z.B. kannst Du so vorgehen:
alle "Hauptdokument" die geändert wurde (-> Änderungszeit oder Flag) einsammeln,
und von denen dann die Unterdokumente zu aktualisieren.

Ich kann Dir gerade nicht alles verraten, aber hierzu noch ein paar Stichworte:
NotesView
getDocumentsByKey()
NotesDocumentCollection
getFirstDocument() / getNextDocument(Doc)

Such mal hier im Forum oder schau dazu in die Desinger-Hilfe

Gruss, Pete(r)
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 17.10.07 - 12:48:56
so nach langer Zeit komme ich mal wieder zu meinen Problem...

Ich habe jetzt einiges abgeändert. Da ich aber keinen Plan vom Script habe fehlt mir noch was:

Derzeitiger Script:

Sub Initialize
   
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument
   
   
   Set db = session.CurrentDatabase
   Set view = db.GetView("Alles")
   ' hier muß noch das Parent.Doc gesetzt werden
     ' Set parent = alle Dokumente die geändert werden
   
   While Not (parent Is Nothing)
      Set respdoc = db.GetDocumentByUNID(parent.ParentDocumentUNID)
      If parent.HasItem("leser_response") Then      
         respdoc.leser_response = parent.leser_response            
         Call respdoc.Save(True, True, True)
      End If
      
      ' hier wieder das Parent.Doc ziehen
          ' Set parent = nächstes Doc was sich verändert hat
   Wend
   
   
   
   
   
   
End Sub


Den würde ich per Agenten vom Server signiert ausführen lassen...
Ich habe 2 Kommentare eingefügt wo ich nicht weiter weiß. Kann mir da bitte jemand auf die Sprünge helfen? Und mach gucken ob das überhaupt so funktionieren könnte?
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: Driri am 17.10.07 - 13:06:09
Ich würde das vermutlich folgendermaßen realisieren :

1) Button mit Script versehen, daß das Dokument speichert und dann den benötigten Agent aufruft. Beim Aufruf übergibt man die ID des Dokumentes (also des Parents) an den Agent.

Das sieht in etwas so aus, Deklarationen und so habe ich weggelassen :

Zitat
Set agent = db.GetAgent("<Name des Agents>")
Call agent.RunOnServer(doc.NoteID)

2) Im Agent liest Du dann die übergebene ID aus und holst Dir damit das Parentdokument.

Zitat
Set agent = session.CurrentAgent
Set parent = db.GetDocumentByID(agent.ParameterDocID)

Eine Schleife kannst Du dir dann im Agent sparen, denn der Agent arbeitet immer nur auf das aktuell vom User geänderte Dokument.
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 17.10.07 - 15:15:28
die idee finde ich zwar gut... funktioniert nur leider nicht in meinen Fall denn das Parent Dok im spezielen das Feld Response_Leser wird z. B. gefüllt wenn ein Mitarbeiter ein Antwortdokument als erledigt kennzeichnet (im Queryclose wird dann das Feld im Hauptdokument geändert).

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: Axel am 17.10.07 - 15:18:26
Dann rufst du den Agent eben aus dem QueryClose-Event auf anstatt ihn über einen Button zu starten.


Axel
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 18.10.07 - 12:59:08
so ich habe jetzt den Script wie folgt geändert:

Sub Initialize
   
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument
   
   
   Set db = session.CurrentDatabase
   Set view = db.GetView("Alles")
   Set agent = session.CurrentAgent
   Set parent = db.GetDocumentByID(agent.ParameterDocID)
   
   Set respdoc = db.GetDocumentByUNID(parent.ParentDocumentUNID)
   If parent.HasItem("leser_response") Then      
      respdoc.leser_response = parent.leser_response            
      Call respdoc.Save(True, True, True)
   End If
   
   
End Sub

Wenn ich Testhalber den Agent aus dem Menü aufrufe kommt Invalid Note id

Da es ein komplexter Workflow ist ist es sehr mühselig jedesmal zig Stationen zu durchlaufen bis man dann sieht ob das ganze im Querclose laufen würde...

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: Axel am 18.10.07 - 13:11:09
Der Hase liegt hier im Pfeffer:

  Set respdoc = db.GetDocumentByUNID(parent.ParentDocumentUNID)
   If parent.HasItem("leser_response") Then     
      respdoc.leser_response = parent.leser_response           
      Call respdoc.Save(True, True, True)
   End If

Das Parent-Dokument hat keine ParentDocumentID. Wenn du auf die Antworten zugreifen willst musst du das über parentdoc.Responses machen. Damit bekommst du eine Collection mit allen Antworten, die es zu dem Dokument gibt, zurück. Damit kannst du dann weiterarbeiten.


Axel
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 18.10.07 - 17:31:38
ok hier mein neuer Script: Fehlermeldung: Object variable not set

   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim dc As NotesDocumentCollection
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument
   
   
   Set db = session.CurrentDatabase
   Set view = db.GetView("Alles")
'ich bin im Querclose eines Antwortdokumentes und das hat die Doc-ID vom Hauptdokument   
   Set parent = db.GetDocumentByID(respdoc.ParentDocumentUNID)
   
      Set dc = parent.Responses
   
   Call dc.StampAll( "leser_response" , parent.leser_response(0) )


Gruß Thomas

(wenn ich das schaffe kaufe ich mir mal Bücher über Script)
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: pete_bla am 18.10.07 - 17:48:59
Hi,

zu "Fehlermeldung: Object variable not set" fällt mir zuerst ein:
für Fehler immer gut:  Thema: Best Practices: Error Handling in Lotus Script (http://atnotes.de/index.php?board=3%3baction=display%3bthreadid=11980%3bstart=14)
 (zumindest fürs Entwickeln mit Ausgabe) wie  z.B.:
Code
Sub blablabla
  on error goto hell
  ' ----------------
  ' dein code hier
  ' ----------------

  exit sub ' function 'oderwasauchimmer
hell:
  print {error #} & Cstr(err()) & { } & error() & { in line } & { } &  Cstr(erl())
  exit sub ' function 'oderwasauchimmer
End sub ' function 'oderwasauchimmer
 
ausserdem muss das
Code
Set parent = db.GetDocumentByID(respdoc.ParentDocumentUNID)
so lauten:
Code
Set parent = db.GetDocumentByUNid(respdoc.ParentDocumentUNID)
verwechsle NoteID (NotesDocument.NoteID) und
UNID (@DocumentUniqueID / NotesDocument.UniversalID) nicht!
und ich denk dass es bei
Code
Set dc = parent.Responses
oder dem call dc.stampall knallt.

darum zuvor noch eine Abfrage ob du überhaupt eine NotesDocumentCollection hast
Code
if dc.count > 0 then
    Call dc.StampAll( "leser_response" , parent.leser_response(0) )
end if
(wobei eine da sein muss, da du ja aus einem Antwortdokument kommst - ist dennoch besser!)

Grüsse, Pete(r)
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 19.10.07 - 10:07:22
jetzt kommt die Fehlermeldung:

error #91 Objectveriable not set in line 18

und line 18 wäre dann genau die geänderte Zeile:

Set parent = db.GetDocumentByUNid(respdoc.ParentDocumentUNID)

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: koehlerbv am 19.10.07 - 10:46:05
Und wo instantiierst Du respdoc? Damit muss ja 'Object variable not set' kommen.

Wenn ich das richtig verstehe, bist Du im QueryClose eines Antwortdokuments? Dann müsste die Zeile lauten:
Set parent = db.GetDocumentByUNid(Source.Document.ParentDocumentUNID)

Bernhard
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 19.10.07 - 11:36:38
ja mit der Zeile funktioniert es dann im queryclose...

aber ich muß das ja als scipt laufen lassen und im queryclos muß der Script ausgeführt werden...

Im Script habe ich nun die folgenden Zeile

Set parent = db.GetDocumentByUNidSource.Document.ParentDocumentUNID)

gegen diese beiden ausgetauscht:

Set agent = session.CurrentAgent
Set parent = db.GetDocumentByID(agent.ParameterDocID)
   


Es kommt folgende Fehlermeldung:

Notes error: Im Hintergrund ausgeführter oder eingebeteter Agent verwendet einen nicht unterstützen Auslöser und Suchtyp

Gruß

Thomas


Im Querclose steht jetzt:

Sub Queryclose(Source As Notesuidocument, Continue As Variant)
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim agent As NotesAgent
   
   Set db = session.CurrentDatabase
   Set doc = db.GetDocumentByUNid(Source.Document.ParentDocumentUNID)
   Set agent = db.GetAgent("Agent_Leser")
   
   Call agent.RunOnServer(doc.NoteID)
   
   
End Sub






So sieht jeztt der Script aus:

Sub Initialize
   
   On Error Goto hell
   
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection
   Dim agent As NotesAgent
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument
   
   Set db = session.CurrentDatabase
   
   Set agent = session.CurrentAgent
   Set parent = db.GetDocumentByID(agent.ParameterDocID)
   'Set parent = db.GetDocumentByUNid(Source.Document.ParentDocumentUNID) ´wenn der Script im Queryclose ist
   
   Set dc = parent.Responses
   
   If dc.count > 0 Then
      Call dc.StampAll( "leser_response" , parent.leser_response )
   End If
   
   
   Exit Sub
hell:
   Print {error #} & Cstr(Err()) & { } & Error() & { in line } & { } &  Cstr(Erl())
   Exit Sub
   
End Sub
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 23.10.07 - 08:43:20
habe nun noch mehr probiert aber komme einfach nicht weiter?

Was will mir die Fehlermeldung sagen? Bzw. wo könnte jetzt noch der Fehler liegen?

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DerAndre am 23.10.07 - 08:54:42
Was ist bei dem Agenten als Ziel eigestellt?

Dort sollte "Keines" stehen.
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 23.10.07 - 09:40:25
super... das war nicht eingestellt. Nachdem ich das gemacht habe funktioniert es.

Vielen Dank

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 14.11.07 - 13:01:16
noch 2 Fragen in diesen Zusammenhang.

Im Querclose übergebe ich dem Agenten durch

Call agent.RunOnServer(doc.NoteID)

einen Paramter. Kannich auch 2 verschiedene Notes id übertrgane?

Mein Problem ist: Ich habe nun ein Antwortdokuemnt welches Ausnahmsweise die Werte an das Hauptdokument übergeben muß. Auf das Hauptdokument haben die Leute die dieses Antwortdokument erstellen keine Zugriff.

Es sollen so Felder wie Status und Bearbeitungszeit usw. übergeben werden.

Oder reicht mir die eine ID. Die übergebene ID ist die ID des Hauptdokumentes die steht ja auch in $REf vom Antwortdokument aber wie hole ich dann die ID des Antwortdokumentes?

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: Axel am 14.11.07 - 13:08:26
Im Querclose übergebe ich dem Agenten durch

Call agent.RunOnServer(doc.NoteID)

einen Paramter. Kannich auch 2 verschiedene Notes id übertrgane?

Nein.

Oder reicht mir die eine ID. Die übergebene ID ist die ID des Hauptdokumentes die steht ja auch in $REf vom Antwortdokument aber wie hole ich dann die ID des Antwortdokumentes?

Du holst dir über die ID des Hauptdokumentes Zugriff auf das Hauptdokument und erhälst dann über doc.Responses eine Collection mit den Antwortdokumenten zurück.

Andere Alternative: du übergibst die ID des Antwortdokumentes und ermittelst über  parentUnid$ = notesDocument.ParentDocumentUNID die ID des Hauptdokumentes.

Axel
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 14.11.07 - 14:13:12
ok. Habe dann Variante 2 gewählt.

Dim respdoc As NotesDocument
   Dim parent As NotesDocument
   
   Set respdoc = db.GetDocumentByID(agent.ParameterDocID)
   Set parent = notesDocument.ParentDocumentUNID

jetzt muß ich ja noch z. B. das Feld "Status" von respdoc holen und in parent reinschreiben.

Stampall funktioniert hier ja nicht...

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: Axel am 14.11.07 - 14:16:46
So einfach geht's dann doch wieder nicht.

Les' dir mal die Hilfe zu notesdocument.ParentDocumentUNID durch und schau dir deinen Code dann nochmal genau an. Dann wirst du erkennen, dass das so nicht funktionieren kann.

Wo hast du z.B. die Variable notesdocument deklariert und initialisiert. Außerdem passt der Typ von parent nicht zum Typ des Rückgabewertes von ParentDocumentUNID. Da steckt der Rückgabetyp ja schon im Namen der Funktion.


Axel
 
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 15.11.07 - 11:50:26
so sieht jetzt der anfang des Scripts aus:

Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection
   Dim agent As NotesAgent
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument
   
   Set db = session.CurrentDatabase
   
   Set agent = session.CurrentAgent
   Set respdoc = db.GetDocumentByID(agent.ParameterDocID)
   Set parent = db.GetDocumentByID(respdoc.ParentDocumentUNID)

Somit sollte ich beide ID´s haben oder?

Wie kriege ich dann das Feld Status von respdoc nach parent?

Gruß

Thomas Schmidt
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: koehlerbv am 15.11.07 - 11:58:52
parent.Status = respdoc (0)
Call parent.Save (True, False, True)

Bernhard
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DerAndre am 15.11.07 - 12:02:24
Du meintest doch bestimmt

parent.Status = respdoc.Status (0)

Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: koehlerbv am 15.11.07 - 12:07:35
Danke! Da habe ich schneller gedacht als geschrieben.

Bernhard
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DerAndre am 15.11.07 - 12:13:21
Ich würde eher sagen, Du hast so schnell geschrieben, daß die Tastatur die Buchstaben nicht mehr übertragen hat.  :)
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: koehlerbv am 15.11.07 - 12:22:34
Stimmt - war ein keyboard buffer overflow  ;D
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 15.11.07 - 13:17:48
Vielen Dank. Funktioniert nur leiderr nicht!?

Der Agent läuft an aber was dann passiert weiß ich nicht. Gibt es eine Möglichkeit das der Agent eine Messagebox ausgibt wo dann z. B. die beiden ID drin stehen?

Denn ich vermute dann mal hier den Fehler...

Gruß

Thomas Schmidt
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DerAndre am 15.11.07 - 13:21:55
Machst Du print und schaust in die log.nsf

Noch besser wäre ein Errorhandle.

Und Agenten die auf dem Server laufen können keine Userinteraktion
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 15.11.07 - 14:20:10
error handle ist drin... da er aber nicht dorthin springt scheint der Code schonmal zu laufen....

und mit print habe ich es versucht aber in der log.nsf nichts gefunden...

Sollte ich denn Agenten die durch einen Code im Querryclos ausgeführt werden auch in der log sehen?

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DerAndre am 15.11.07 - 14:24:47
was liefert runonserver zurück?
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 15.11.07 - 14:41:06
Set agent = db.GetAgent("AgentAnonym")
   
   If agent.RunOnServer(doc.NoteID) = 0 Then
      Messagebox "Agent ran",, "Success"
   Else
      Messagebox "Agent did not run",, "Failure"
   End If   

liefert brav "Agent ran" zurück...

Gruß

Thomsas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 16.11.07 - 14:45:55
testhalberr habe ich den Agenten direkt im Queryclose eingefügt

dabei kommt jetzt:

Error #91 Object Variable not set in line 20

Line 20:    parent.Status = respdoc.Status

Langsam macht mir das Entwicklen keinen Spaß mehr :-:


Fast Kompletter Code:

   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim agent As NotesAgent
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument
   Set db = session.CurrentDatabase
   Set agent = session.CurrentAgent
   ' Set respdoc = db.GetDocumentByID(agent.ParameterDocID) ' wenn über Agent ausgeführt
   
   
   'Set respdoc = db.GetDocumentByUNid(Source.Document.UniversalID)

   Set parent = db.GetDocumentByID(Source.Document.ParentDocumentUNID)
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DAU-in am 16.11.07 - 14:49:31
wo setzt du respdoc?

grüsse

dau-in
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 16.11.07 - 14:57:58
Guter Einwand  ???

Wie sieht es mit

   Set respdoc = db.GetDocumentByUNid(Source.Document.UniversalID)

Der Fehler bliebe in diesen Fall identisch

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DAU-in am 16.11.07 - 14:58:39
hast du 'Option declare' nicht eingeschaltet/gesetzt?
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DAU-in am 16.11.07 - 15:03:42
Guter Einwand  ???

Wie sieht es mit

   Set respdoc = db.GetDocumentByUNid(Source.Document.UniversalID)

Der Fehler bliebe in diesen Fall identisch

Thomas

äääää

dieses Posting verstehe ich nicht.

aber bei:
parent.Status = respdoc.Status
brauchst du ein parent und ein respdoc, und in deinem Codeschnipsel wird das respdoc nirgends gesetzt (du hast 2 auskommentierte Zuweisungen auf das respdoc da drin, aber keine 'aktive' Zuweisung).

grüsse

Dau-in
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 16.11.07 - 15:05:15
Nein das habe ich nicht gesetzt.

In der Hilfe steht:

Option Declare
Dim y As Integer
y% = 10            ' No error
x = 20             ' Compiler error (x has not been declared)

Ich gehe also davon aus das ich es auch nicht setzten darf... odeR?


Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DAU-in am 16.11.07 - 15:14:18
Du darfst nicht nur, sondern du solltest es auch tun.

und zwar schleunigst.

und dann solltest du für dein programmers pain die Farbe für Kommentare anders setzen als die für Programmcode, das erspart dir viel Ärger.

Das Beispiel in der Hilfe besagt , dass du den Code erst abspeichern kannst, wenn du nicht nur y, sondern auch x deklariert hast.


Edith: wobei er in deinem Fall nicht gemeckert hätte, da du das ja deklariert hattest, sorry.
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 16.11.07 - 15:35:55
ah wieder was gelernt aber obwohl ich jetzt unter Options Option Declare hingeschrieben habe kann ich die Maske abspeichern und der Fehler bleibt gleich...

Warum?

Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DAU-in am 16.11.07 - 15:44:34
Hast du das respdoc denn jetzt gesetzt?????
sprich steht da irgendwo respDoc =  ....
ohne ein Kommentarzeichen?


was sagt denn dein Debugger exakt an der Stelle
Set respdoc = db.GetDocumentByUNid(Source.Document.UniversalID)
????


Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 16.11.07 - 16:16:55
an der Stelle sagt er nichts...

bzw. nachdem ich den ScriptDEbugger gestartet habe und ich mittels "Schritt ausführen" eine Zeile nach der anderen anspringe folgt nach

Set respdoc = db.GetDocumentByUNid(Source.Document.UniversalID)

einfach parent.Status = respdoc.Status

und dann geht er nicht auf exit sub sondern auf dem errorhandler....

Im Script Debugger im Reiter Variable sehe ich

unter UniversalID die aktuelle ID und unter PARENT.DocumentUnit auch die Passende ID

Ich vestehe es einfach nicht...

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DAU-in am 16.11.07 - 16:20:32
und das respdoc ist auch befüllt?
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 16.11.07 - 16:32:08
ja es ist befüllt....

was leer ist ist parent!?

Wieso das? In der gleichen Datenbank an anderer Stelle funktioniert das!

Unter Document bei ParentDocumentUnid steht auch eine ID drin....

Muß ich das noch verstehen?
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 16.11.07 - 16:46:07
ich verstehe die welt nicht mehr....

habe die Zeile

Set parent = db.GetDocumentByID(Source.Document.ParentDocumentUNID)

gelöscht und von dem funktionierenden Agenten kopiert...

Fazit: auch Parent wird befüllt... und er springt nicht mehr zum errorhanlder sondenr läuft ordentlich durch...

Super! Jetzt mach ich Feierabend. Vielen Vielen Dank

Heute habe ich wirklich etwas gelernt...

Gruß

Thomas
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: DAU-in am 16.11.07 - 16:48:10
wenn die ID verkehrt ist .....


Set parent = db.GetDocumentByID(Source.Document.ParentDocumentUNID)

wie definierst du die ParentDocumentUNID .
wenn das ein Item ist, muss noch (0) dahinter.
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: koehlerbv am 16.11.07 - 17:40:56
Heute habe ich wirklich etwas gelernt...

Thomas, das wage ich zu bezweifeln. Du weisst nicht, was Du gemacht hast, und Du weisst nicht, warum es jetzt "funktioniert" (wie auch immer).
Wir wissen es auch nicht, da wir Deinen aktuellen Code nicht kennen (und wo er ausgeführt wird).
Die Beteiligung der alten Hasen wurde hier immer geringer, da keiner mehr richtig durchsieht und auch keine Zeit dafür da ist, da jedes Mal nochmal nachzuhaken oder aus Bruchstücken etwas zu rekonstruieren.

Es sieht also noch nicht gut aus, um mit dem jetzigen Zustand kannst Du Dich nicht zufrieden geben.

Bernhard
Titel: Re: Antwortdokumente und Leser und Autorenfelder
Beitrag von: cash am 20.11.07 - 12:22:10
hier jetzt nochmal mein Endstand:

Aufgabe: Script soll Felder aus dem Antwortdokument in das Hauptdokument schreiben. Unabhängig davon ob der User im Autorenfeld steht oder nicht.

Um meine Fehler besser zu finden habe ich den Script erstmal im Querclose reingeschrieben (somit konnte ich über den Debugger sehen welche Variablen richtig gefüllt werden und welche nicht)
Der User steht im Antwort- und Hauptdokument im Feld Autoren.

On Error Goto errorHandler
   
   Dim db As NotesDatabase
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument   
   Dim Session As New NotesSession
   
   Set db = session.CurrentDatabase
   Set respdoc = db.GetDocumentByUNid(Source.Document.UniversalID) 
   Set parent = db.GetDocumentByUNid(Source.Document.ParentDocumentUNID)
   
   parent.Status                   = respdoc.Status
   parent.Sachgebiet                   = respdoc.Sachgegiet
   parent.Vorschlag                   = respdoc.Vorschlag
   
   Call parent.Save (True, False, True)
      
   Exit Sub
errorHandler:
   Print {error #} & Cstr(Err()) & { } & Error() & { in line } & { } &  Cstr(Erl())
   Exit Sub    


Das funktioniert mit der oben geschriebenen Einschränkung User muß im Autorenfeld stehen. Wenn er kein Autor ist geht der Code im errorHandler und schreibt unten Sinngemäß "Nicht genug Rechte! So mache ich es nicht"

Das Ziel war das der Script auch funktioniert wenn der User keine Autorenrechte auf das Hauptdokument hat.
Also muß der Code per serversignierten Agenten ausgeführt werden.

Im Queryclose des Antwortdokumentes steht:

   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim agent As NotesAgent
   
   Set db = session.CurrentDatabase
   Set doc = Source.Document
   Set agent = db.GetAgent("AgentAnonym")

   Call agent.RunOnServer(doc.NoteID)



Im Agenten steht:

On Error Goto errorHandler
   
   Dim db As NotesDatabase
   Dim agent As NotesAgent
   Dim respdoc As NotesDocument
   Dim parent As NotesDocument   
   Dim Session As New NotesSession
   
   Set db = session.CurrentDatabase
                Set agent = session.CurrentAgent
   Set respdoc = db.GetDocumentByID(agent.ParameterDocID)
   Set parent = db.GetDocumentByUNID(respdoc.ParentDocumentUNID)
      
   parent.Status                   = respdoc.Status
   parent.Sachgebiet                   = respdoc.Sachgegiet
   parent.Vorschlag                   = respdoc.Vorschlag
   
   Call parent.Save (True, False, True)
      
   Exit Sub
errorHandler:
   Print {error #} & Cstr(Err()) & { } & Error() & { in line } & { } &  Cstr(Erl())
   Exit Sub    


Somit funktioniert der Script wie er soll ohne das der User Autoren-Rechte auf das Hauptdokument hat.

Gruß und vielen Dank an allen die mir hierbei geholfen haben...

Thomas