Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: aoibhneach am 06.08.07 - 12:03:07

Titel: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 06.08.07 - 12:03:07
Hallo!

Folgende Situation

Bisher: Funktionalität ausschließlich im Notes Client

Es wurden Dokumente erzeugt, in denen ein RichText-Feld formatierten Text zu einer beliebigen Anzahl identisch strukturierter Abschnitte enthielt. Diese Dokumente wurden durch Agenten erzeugt.

Um dieselben Inhalte auch im Web ebenso formatiert anzeigen zu können, fügte ich ein HTML-Feld ein. Dieses enthält HTML-Code. Das Befüllen dieses Feldes erfolgt im gleichen Durchgang auch durch den Agenten.

Der Agent wird durch einen Gliederungseintrag gestartet.
@Command([ToolsRunMacro]; "AgentName")

Das Abspeichern des angezeigten Dokuments erfolgt nach Anzeige über Aktionsbutton.

Neu:

Funktionalität im Web-Browser gefordert:

Der Agent soll nun auch über eine möglichst identische Bedienung im Web-Browser gestartet werden.

Ich habe dies über die Zeilen:

@Command([Compose]; "maskenname");
@Command([FileSave]);
@Command([ToolsRunMacro]; "AgentName")

versucht.

Der Agent, so es scheint, kann das Dokument mittels
 doc = agent.DocumentContext
aber nur ansprechen, wenn ich ihn über einen Button aus dem Dokument heraus starte.

Einen solchen Button anzuzeigen wiederum verbietet sich doch durch die Existenz des HTML-Feldes, oder?

Ich habe deshalb auch versucht, einen Button durch einen "link" innerhalb des HTML-Feldes zu ersetzen. aber dies ist dann ja kein Notes-Element und folglich kann die DocumentContext-Eigenschaft auch nicht verwendet werden.

Danke im Voraus für Ihren Rat!

Nils.


Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: Driri am 06.08.07 - 12:06:17
So ganz verstanden habe ich es nicht, aber wenn Du beim Speichern einen Agent ausführen willst, dann schau Dir mal das Event WebQuerySave an. Genau dort würde man für den Webzugriff so einen Agenten ausführen lassen.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 06.08.07 - 12:17:36
Hallo Ingo!

Danke für die prompte Antwort!!

Ja, ich habe befürchtet, dass ich das "Problem" zu umständlich beschreibe.

Vielleicht so:

Die Datenbank wird im Browser angezeigt.
Ich möchte dann aus der Gliederung heraus einen Agenten starten, der ein Dokument befüllt, und es danach sofort anzeigt.

Vielleicht sehe ich wirklich den sprichwörtlichen Wald vor lauter Bäumen nicht?!!

Grüße,

Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: flaite am 06.08.07 - 12:29:27
session.DocumentContext ?
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 06.08.07 - 13:32:57
Hallo Axel!

Ja, daran dachte ich auch. Zunächst hatte ich mich vertippt "doc.NotesId" statt "doc.NoteId".
Jetzt kann ich den Agenten über einen HTML-link zwar starten, das Abfragen der Eigenschaft session.DocumentContext ergibt keinen Fehler mehr, aber für die NoteId erscheint im ServerLog eine 0.

Eine Notes-Schaltfläche wird im Web als zum Dokument gehörig erkannt. Starte ich den Agenten darüber, ist die Eigenschaft DocumentContext verfügbar. Beim HTML-Link dagegen nicht.
Das wird wohl die Ursache sein. Gibt's denn nicht doch noch einen "Trick" ?

Danke für die Hilfe,

Grüße, Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 06.08.07 - 14:33:19
So ganz verstanden habe ich es nicht, aber wenn Du beim Speichern einen Agent ausführen willst, dann schau Dir mal das Event WebQuerySave an. Genau dort würde man für den Webzugriff so einen Agenten ausführen lassen.

Hallo Ingo!

Ich erzeuge ein Dokument über "@Command([Compose]; "Name")
Da ich den Agenten schon starten möchte, wenn das Dokument geöffnet wird, habe ich das WebQueryOpen-Event benutzt.
Der dann gestartete Agent bekommt aber über session.DocumentContext auch nur die NoteId = 0. Das Dokument ist ja noch nicht gespeichert.

Was mache ich falsch??

Grüße,

Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: flaite am 06.08.07 - 14:45:05
Wie rufst du denn den Agenten auf?
Du kannst ja an den Link die DocumentUniqueID anhängen (@DocumentUniqueID als Computed Text).
Und im Agenten kommst du dann mit der CGI-variable Query_String arbeiten.

Code
set doc = session.documentContext

strDocUnid = doc.Query_String(0)
' hier noch ein bischen StringHandling. 
set docRequest = dbCur.getDocumentByUNID(strDocUnid)

Nicht getestet. So die Richtung jedenfalls.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 07.08.07 - 09:01:49
Hallo Axel!

Zuletzt habe ich Ingo's Idee folgend ein WebQuery..-Event benutzt, aber das WebQueryOpen. Der Agent wird dann auch wunderbar gestartet. Aber in dessen Init()-Methode erhielt ich über Session.DocumentContext auch nur id = 0.

Denn das geöffnete Document, dass ja beim Agentstart noch nicht gespeichert ist, hat noch keine Id. Und mehr, als einen Agent zu starten, erlaubt WebQueryOpen nicht.

Ich schaue mir jetzt erst einmal Deinen Tip an!

Bisher vielen Dank!

Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 07.08.07 - 12:59:10
Lösung gefunden:

Neues Dokument wird aus Gliederung mit @Command(Compose];"Maskenname) angelegt.

Der Agent zum Holen von Daten wird über @Command([ToolsRunMacro];"Agent")  aus einer Notes-Schaltfläche (im Dokument angezeigt) gestartet. Dadurch kann nun auf dieses Dokument im Agenten über Session.DocumentContext zugegriffen werden.

Nach Agentlauf wird ein Flag gesetzt welches über eine Verbergen-Wenn-Formel die Agent auslösende Schaltfläche aus- und das HTML-Feld einbelndet.

Klappt prima!

Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 23.08.07 - 15:33:37
Hallo Axel, hallo Forum

Ich muß dieses Thema nochmals aufrufen, hierzu folgendes Zitat

Wie rufst du denn den Agenten auf?
Du kannst ja an den Link die DocumentUniqueID anhängen (@DocumentUniqueID als Computed Text).
Und im Agenten kommst du dann mit der CGI-variable Query_String arbeiten.

Code
set doc = session.documentContext

strDocUnid = doc.Query_String(0)
' hier noch ein bischen StringHandling. 
set docRequest = dbCur.getDocumentByUNID(strDocUnid)

Nicht getestet. So die Richtung jedenfalls.

Bedeutet das, dass ich den Agent über eine URL starte und darin den Inhalt des Computed Text-Feldes (@DocumentUniqueID) übergebe?

Ich gebe zu, das habe ich noch nicht verstanden.  :-\

Grüße, Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: pete_bla am 23.08.07 - 19:48:33
Hallo Nils,

Zuletzt habe ich Ingo's Idee folgend ein WebQuery..-Event benutzt, aber das WebQueryOpen. Der Agent wird dann auch wunderbar gestartet. Aber in dessen Init()-Methode erhielt ich über Session.DocumentContext auch nur id = 0.
Es stimmt hier schon dass die NoteID 0 ist,
aber das bedeutet noch lange nicht, dass Du das neue Webdokument (Session.DocumentContext ) nicht "weiterbearbeiten" kannst.

Als ich noch Web-DBs programmieren durfte, hab ich dies immer für allerlei automatisch generierte Übersichten / Navigatoren ect. verwendet.
Code
Dim S As New notessession
Dim Doc As Notesdocument

Set Doc = S.DocumentContext

Call doc.ReplaceItemValue("Text", "HalloWelt " & doc.NoteID  & " " & doc.UniversalID)

Dim rtitem As NotesRichTextItem
Set RTitem = doc.GetFirstItem("MeinHTML")
Call rtitem.AddNewline(1)
Call rtitem.AppendText("[<b>das war ich der wqopen um " & Cstr(Now()) & "</b><br>]")
der Trick dabei war das Richtext-Item "MeinHTML" Computed, ohne Vorgabwert zu machen, damit es in Formularen nicht auch noch als Eingabefeld angezeigt wird.
Du kannst auch einen doc.save einbauen, achte aber darauf, dass Du (wie oben beschrieben) dann das Feld bei jedem Aufruf im Web weiterschreibst.

Die UniversalID des Dokumentes erhälst Du bereits, auch wenn es noch nicht gespeichert ist.
Du kannst auch Daten aus deiner Datenbank zusammensammeln.
Hat bei mir immer wunderbar geklappt.

Dies:
Du kannst ja an den Link die DocumentUniqueID anhängen (@DocumentUniqueID als Computed Text).
Und im Agenten kommst du dann mit der CGI-variable Query_String arbeiten.

Code
set doc = session.documentContext

strDocUnid = doc.Query_String(0)
' hier noch ein bischen StringHandling. 
set docRequest = dbCur.getDocumentByUNID(strDocUnid)


sieht für mich als URL so aus:
Code
http://deinserver.de/deinedb.nsf/ansicht/[UNID Dokument1]?OpenDocument&Doc2=[UNID Dokument2]
mit der Variablen Query_String kannst du Dir (auch schon im WebQueryOpen) im Dokument1 den hinteren Teil abholen:
Doc2=[UNID Dokument2]
und dann anhand der DocumentUniqueID von Dokument2 dessen Daten laden.

Ich hoffe ich hab hier nicht noch mehr Verwirrung gestiftet  ;)

Grüsse, Pete(r)
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 24.08.07 - 07:50:57
Hallo Peter!

Großartig! Nein, die Verwirrung ist nicht über ihr Basislevel gestiegen .  ;)

Danke Dir schon mal im Voraus für Deine Antwort! - Ich versuche, es umzusetzen.
Eventuell frage ich nochmals nach.

Schönes Wochenende!

Grüße, Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 24.08.07 - 10:36:00
Hallo Forum, Hallo Peter!

Möglicherweise (Sicher) bin ich auf dem falschen Weg.  :-\

Ich möchte eigentlich nur aus einem gespeicherten und erneut geöffneten Dokument über einen link ein neues Dokument erzeugen und öffnen. Dieses soll dann ein Antwort-Dokument zum geöffneten werden.

Bisher kann ich aus einem gespeicherten Dokument einen Agent über einen link starten:

"<a href=\'http://" + SERVER_NAME + ":" + SERVER_PORT + "/" +
@GetProfileField("DBProfil"; "DBName"; Server) + "/"  + "test" +
"?OpenAgent\'" + Titel +  "</a>"

Kann ich direkt an "?OpenAgent" Parameter (z.B. mittels "&docid") hängen?
docid enthält dabei @DocumentUniqueId.

Oder ist dieser Weg umständlich oder unsinnig?

@pete_bla
Hallo Pete, falls Du's liest: Oder muß auch in diesem Fall so ein berechnetes Feld in der Maske enthalten sein???


Wie rufst du denn den Agenten auf?
Du kannst ja an den Link die DocumentUniqueID anhängen (@DocumentUniqueID als Computed Text).
Und im Agenten kommst du dann mit der CGI-variable Query_String arbeiten.

Code
set doc = session.documentContext

strDocUnid = doc.Query_String(0)
' hier noch ein bischen StringHandling. 
set docRequest = dbCur.getDocumentByUNID(strDocUnid)

Nicht getestet. So die Richtung jedenfalls.

Ich habe einen Computed Text mit Inhalt @DocumentUniqueId in die Maske eingefügt. Im Browser ist dieser text aber leer!

Was mache ich falsch????????

Grüße, Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: pete_bla am 24.08.07 - 19:13:04
Hallo Nils,

Möglicherweise (Sicher) bin ich auf dem falschen Weg.  :-\
vielleicht hab ich auch dein Anliegen noch nicht ganz verstanden...

Ich möchte eigentlich nur aus einem gespeicherten und erneut geöffneten Dokument über einen link ein neues Dokument erzeugen und öffnen. Dieses soll dann ein Antwort-Dokument zum geöffneten werden.
Das mit den Antwortdokumenten (Maskeneigenschaft, 1.Reiter) und/oder
einer Vererbung von Daten (Formeln übernehmen Werte aus gewähltem Dokument Maskeneigenschaft, 2.Reiter)
hat bei Dir ja das Problem, dass Du im Web die Daten von Richtextfeldern nicht mitbekommst  :-\
Sonst würde ein einfacher
Code
@Command([Compose];"Antwort")
aus dem Dokument reichen.

Bisher kann ich aus einem gespeicherten Dokument einen Agent über einen link starten:
"<a href=\'http://" + SERVER_NAME + ":" + SERVER_PORT + "/" +
@GetProfileField("DBProfil"; "DBName"; Server) + "/"  + "test" +
"?OpenAgent\'" + Titel +  "</a>"

Kann ich direkt an "?OpenAgent" Parameter (z.B. mittels "&docid") hängen?
docid enthält dabei @DocumentUniqueId.
das müsste (hab leider nurnoch einen 6.5er Server) im Web gehen,
auch hier erhälst Du dann zwar für session.documentcontext keine "noteID"
aber mit doc.Query_String(0) erhälst du den Rest nach dem ? der aufrufenden URL.
Daraus kannst Du Dir wieder über die UNID die Daten des referenzierten Dokuments holen.

Der Link wäre so (zusammenzusetzen):
Code
http://deinserver.de/deinedb.nsf/[Agent]?OpenAgent&Doc2=[UNID Dokument]
wobei du am besten @Text(@DocumentUniqueID) als UNID des Dokuments angibst.

im Agent kommen wird dann beim code von Axel an:
Code
set doc = session.documentContext

strDocUnid = doc.Query_String(0)
' hier noch ein bischen StringHandling. 
set docRequest = dbCur.getDocumentByUNID(strDocUnid)
wobei strDocUnid dann ersteinmal diesen Teil liefert:
Code
OpenAgent&Doc2=[UNID Dokument]

Viel Erfolg, Pete(r)

P.S.: wo pstoitst Du Di hoibe?
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 24.08.07 - 21:26:58
Hallo Peter!

Ich glaube, ich habe vor lauter Eifer alles zu kompliziert beschrieben.

Es geht mir nur darum:
Aus einem im Webbrowser angezeigten Dokument docA heraus ein neues docB zu öffnen, und dieses docB dann als Antwortdokument des ersteren docA zu speichern.


Sonst würde ein einfacher
Code
@Command([Compose];"Antwort")
aus dem Dokument reichen.

Wenn ich die Notes 5-Hilfe richtig verstehe, muss für das Erzeugen eines Antwortdokuments über @Command([Compose];"Maskenname") aber ein Dokument in einer Ansicht markiert sein.

Deswegen wollte ich einen Agent nutzen.

Starte ich einen Agent über einen Link (javascript oder Formeln), hat session.DocumentContext aber keinen Erfolg!
Ich erkläre mir das so: ein link scheint kein im Browser dargestelltes Notes-element der Maske zu sein, im Gegensatz zu einer Schaltfläche. Starte ich hierüber einen Agenten, kann ich Session.DocumentContext nutzen, und damit auch doc.Query_String(0)

Aber! dann kommt mein nächstes Problem: Ich hätte zwar Zugriff auf das künftige parent-Dokument "befände mich" aber im Lotus Script!
Wie könnte ich dann wieder ein neues Dokument (das Antwortdokument) im Webbrowser öffnen ?

Vielen Dank für die geduldigen Antworten und schönes Wochenende!

@Moderatoren! Ich hoffe, der Thread ist nicht zu lang  :-\

Grüße Nils
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: pete_bla am 25.08.07 - 01:18:53
Hallo Nils,

Hier gehts also um 2 Vorgehensweisen:

A. Dokument erbt Daten
Du sagst es hier doch selbst:
Es geht mir nur darum:
Aus einem im Webbrowser angezeigten Dokument docA heraus ein neues docB zu öffnen, und dieses docB dann als Antwortdokument des ersteren docA zu speichern.
wenn du den Link aus dem Dokument heraus hast
z.B. Action-Hotspot mit
Code
@Command([Compose];"Antwort")
und im "Antwortdokument" die Maskeneigenschaft "Formeln übernehmen Werte aus gewähltem Dokument"  (im 2.Reiter) aktiviert hast,
erzeugt Domino automatisch im Link eine "referenz".
Das "gewählte Dokument" aus dem übernommen werden, ist in diesem Fall das Dokument docA, in dem der Link ist.
(In einer Ansicht stehts Du in diesem moment ja nicht, aber im Dokument, was den selben Effekt hat, wurde wohl in der Help vergessen zu erwähen)

Um nun Daten zu vererben musst Du bei den Feldern (Maske DocB) die Feldnamen (des DocA) als Vorgabewert angeben, sonst kommt dort nichts an.
Hierbei können allerdings keine RT-Felder vererbt werden.
Der Link, der auf dem genannten Hospot liegt wird vom Domino-Server in etwa so erzeugt:
Code
http://deinserver.de/deinedb.nsf/[ansicht]/[UNID DocB]?ComposeDocument&ParentUNID=[UNID DocA]
das &ParentUNID=[UNID DocA] ist dabei das Relevante.

B. Dokument holt sich die Daten per Agent/bzw. Agent schreibt Daten ins Dokument
Die andere Variante mit dem Agenten hatte natürlich noch einen kleinen Haken:
Aber! dann kommt mein nächstes Problem: Ich hätte zwar Zugriff auf das künftige parent-Dokument "befände mich" aber im Lotus Script!
Wie könnte ich dann wieder ein neues Dokument (das Antwortdokument) im Webbrowser öffnen ?
Um aus dem Script/Agent in das Dokument zu kommen musst Du nur die URL des Dokuments ausgeben.
Im script sieht die Zeile ungefähr so aus:
Code
print {[http://deinserver.de/deinedb.nsf/ansicht/} & docB.UniversalID & {?OpenDocument]}
und Domino "öffnet" hierfür dein Dokument für den Browser.
(Ist mir gerade eingefallen, dass ich vergass dies zu erwähnen, darum kam ich zu so später Stunde nochmals zum Thema.)
Beim print ist noch relevant,
dass du zuvor keine prints im Agenten machst,
der print selbst mit der eckigen Klammer [ 
und mit "http://" (oder "https://") anfängt,


Allerdinst bevorzuge ich eher die Variante mit dem Agenten im WebQueryOpen des Dokuments,
der Zwischenschritt über den Aufruf des Agenten ist hier unnötig.

Also so:
1.)   DocA hat einen Link "Compose" DocB mit übergabe der "ParentID"
2b.) DocB "erbt Werte" aus dem aufrufend Dokument.
oder
2a.) DocB hat eine WebQueryOpen-Agenten, der die Daten (per Agent auch RT-Felder) von DocA über die ParentID abholt.

Viel Erfolg, Pete(r)


nur zur Vollsändigkeit noch:
Starte ich einen Agent über einen Link (javascript oder Formeln), hat session.DocumentContext aber keinen Erfolg!
Wie sind die Eigenschaften des Agenten?
normalerweise sind Web-Agenten "Agenten-Liste" und Dokumenten-Auswahl: "keine"

Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 25.08.07 - 12:54:36
Hallo Peter!

Vielen Dank für Deine Mühe! Ich berichte nächste Woche in diesem Text über Fortschritte!!!

Grüße, Nils.
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: koehlerbv am 25.08.07 - 13:07:10
@Moderatoren! Ich hoffe, der Thread ist nicht zu lang  :-\
Da mach Dir mal keine Sorgen, Nils. Bedeutsam ist lediglich, dass eine Lösung für Dein Problem gefunden wird. Und wenn das zwanzig Seiten dauert, dann tat das eben not.

Bernhard
Titel: Re: Agent-Zugriff auf Document im Web browser
Beitrag von: aoibhneach am 27.08.07 - 10:31:44
@pete_bla
Hallo Peter, Volltreffer!

wenn du den Link aus dem Dokument heraus hast
z.B. Action-Hotspot mit
Code
@Command([Compose];"Antwort")
und im "Antwortdokument" die Maskeneigenschaft "Formeln übernehmen Werte aus gewähltem Dokument"  (im 2.Reiter) aktiviert hast,
erzeugt Domino automatisch im Link eine "referenz".
Das "gewählte Dokument" aus dem übernommen werden, ist in diesem Fall das Dokument docA, in dem der Link ist.

Hab genau das soeben probiert und, um Erfolgsmeldung zu geben, antworte ich gleich.
Es ist doch schön, wie sich plötzlich (für einen Moment) die ganze Harmonie der Lotus Notes-Welt wieder vor mir ausbreitet  :)

Prima!!!!

Viele Grüße und eine schöne Woche!

Nils.  :D