Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: TomLudwig am 18.10.04 - 12:36:53
-
Hallo zusammen,
ich habe mir einen Beispielcode runter geladen aus der Sandbox. Leider steig ich nicht so ganz durch. Der Agent wird über einen Button im WEB aufgerufen.
Die entstehende HTML Seite wird in der Funktion BuildForm erstellt.
Kann mir jemand allgemein erklären was da gemacht wird??? Danke...
Dim windowTitle As String
Dim DB As NotesDatabase
Dim agentName As String
Dim Session As New NotesSession
Dim nabDB As NotesDatabase
Dim View As NotesView, ViewDoc As NotesDocument
Dim Doc As NotesDocument, noteName As NotesName
Dim nabName As String
Dim nabView As String
windowTitle = "Titel"
agentNames = Evaluate({@explode("} & Session.currentAgent.Name & {"; "|")} )
agentName = Trim(agentNames( Ubound(agentNames) ))
nabName = "names.nsf"
nabView = "($People)"
Set DB = Session.CurrentDatabase
Set Doc = Session.DocumentContext
If Doc Is Nothing Then
' For testing only.
Set Doc = DB.CreateDocument
doc.query_string = "OpenAgent&data"
End If
If Instr( Lcase(Doc.Query_String(0)), "&data") Then
' read the view and product a comma separated file
Print "Content-Type: text/plain" ' needed to make this a plain file
'Open the NAB
Set nabDB = Session.GetDatabase( DB.Server, nabName)
Set View = nabDB.GetView( nabView )
' Output the header
Print "Name,lastName,returnValue"
Set ViewDoc = View.GetFirstDocument
While Not ViewDoc Is Nothing
Set noteName = New NotesName( ViewDoc.Fullname(0) )
Print noteName.common & "," & Ucase(ViewDoc.Lastname(0)) & "," & ViewDoc.Fullname(0)
Set ViewDoc = View.GetNextDocument( ViewDoc )
Wend
Else
Call BuildForm
End If
-
Also, wenn Du das aus dem Sandkasten hast, dann gibt es da bestimmt auch eine Beschreibung, was das Ding tut, wäre gut gewesen, wenn Du das mitgeliefert hättest.
Ansonsten, da werden die Namen aus dem lokalen Adressbuch ausgelesen und dargestellt (oder sollen wenigstens), soweit ich das verstehe
-
Sorry,
genau das soll das Teil machen. Aber ich kapier den Ablauf nicht.
Der DocumentContext gibt mir das aktuelle Dokument zurück.
Somit ist die erste IF-Abfrage sinnlos. Oder nicht?
Im IF-Fall der zweiten Abfrage werden die Namen irgendwo (wo auch immer) hingeschrieben. Aber nicht angezeigt.
Erst im Else-Fall wird das HTML-Dok erzeugt. Aber dennoch werden beim ersten Auffruf (IF-Fall) die Namen angezeigt.
-
DocumentContext gibt nicht das aktuelle Doc zurück, sondern eine temporäre Kopie davon und das auch nur in einer Web-Anwendung. Darüber hinaus findet man in dem Document auch die CGI-Variablen.
Will man das Ding ohne Web testen, macht die erste If-Anfrage Sinn, denn so lässt sich die Sache imitieren, das ist auch der Sinn des Kommentares dabei.
Print geht in diesem Falle an den Browser raus, damit werden die Namen rausgeschrieben. Ich denke, Du solltest mal in der Designer-Hilfe nachlesen, wie die Agenten wirken, wenn sie im Web eingesetzt sind, das sind Basics hier.
-
Der Vollständigkeit halber:
Der Code befindet sich in dem Sandbox-Teil aus diesem Thread:
http://www.atnotes.de/index.php?topic=18865.0
doc muss das Dokument sein, in dem der Button für den Names Picker hinterlegt ist. Dort wird per Javascript der Agent aufgerufen.
Andreas
-
Ja genau, Glombi stimmt.
Ja gut, dann greift der else-Fall der zweiten IF-Abfrage nur wenn ich den Agenten im WEB starte. Aber woher holt er sich dann die Namen? Die werden ja nur im IF-Fall ausgelesen.
In der Funktion Build Form steht folgender Eintrag. Woher kommt die Datasource? Das sind nämlich die Namen im Else-Fall...
Print |<table id="pickListTable" datasrc="#dsoPersonByLastName" style="height: 100%; width: 100%" cellspacing="0" datapagesize="15">|
Print | <tbody>|
Print | <TR>|
Print | <td bgcolor=white><a datafld="returnValue" onclick="returnName(this.href);"><span datafld="Name"></span></a></td>|
Print | </tr>|
Print | </tbody>|
Print |</table>|
-
Umgekehrt, das zweite If greift in jedem Falle, wenn auch das erste If greift, denn dort wird ja genau der String, nach dem gesucht wird, ins Doc und ins Feld geschrieben. Im Web-Fall greift das zweite If nur, wenn im Agentenaufruf der Parameter entsprechend gesetzt ist.
-
Der Agent wird mit folgendem JavaScript Code aufgerufen:
sReturnName = window.showModalDialog("addressbook?OpenAgent", null, sDialogOptions);
Von daher kann ich jetzt sagen, das nur der Else-Fall der zweiten IF-Abfrage greift.
Aber wo kommen dann meine Daten her? Aus der Datasrc dsoPersonByLastName ???
-
Stimmt, mit dem Aufruf kommt er in den Else-Zweig. Und dort holt er sich die Daten offenbar mit
datasrc="#dsoPersonByLastName"
Und da kann ich Dir leider nicht weiterhelfen, ohne zu suchen :(
-
Hier die Lösung für alle dies interessiert ;)
Print |<object id="dsoPersonByLastName" classid="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">|
Print | <param name="DataURL" value="| & agentName & |?OpenAgent&data">|
Print | <param name="UseHeader" value="true">|
Print |</object>|
Das ist der Teil in dem das Objekt dsoPersonByLastName erstellt wird. Mit der ZielURL wird der Agent noch einmal gestartet mit den Parametern, sodass die Namen aus dem Adressbuch ausgelesen werden.
Danke für eure Mithilfe beim Finden der Lösung !!!
-
Habs vermutet, dass da noch ein Objekt aufgebaut wird ....
-
Ich finde das schon ziemlich bemerkenswerten bis seltsamen code.
Das sind MS-Windows Script Components.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/leteleobject.asp
Microsoft® Windows® Script Components provide you with an easy way to create COM components using scripting languages such as Microsoft® Visual Basic® Scripting Edition (VBScript) and Microsoft® JScript®. Use script components as COM components in applications such as Microsoft® Internet Information Services (IIS), Microsoft® Windows® Script Host, and any other application that can support COM components.
Hast du das mal mit Mozilla/Netscape ausprobiert? Glaub nicht dass das funktioniert.
Das ist jedenfalls ein callback auf den Server während die Webseite aufgebaut wird.
Hab ich in LoNo Programmierung so noch nicht gesehen.
Gruß Axel
-
Stimmt, Axel, das steht aber auch schon im entsprechenden Artikel auf LDD:
This version supports ONLY IE 4+ as it uses the data binding extensions that IE has.
-
Ja, ich habs schon gelesen...
Aber wie kann man so was anders realisieren, sodass es auch in Netscape usw. läuft?
-
Genau gleich, nur anders ...... :)
Man baut gleich beim ersten Aufruf die gesamte Seite auf, gibt etwas mehr Code, aber ist machbar. Oder man gibt die Daten in einen View und zeigt diesen View in einem Formular als embedded View an, mit der Auswahl wird es dann allerdings ein wenig trickreich, bei Mehrfachauswahlen. Jedenfalls führen da mehrere Wege ans Ziel.
-
Ich kann die Einträge zwar in ein Feld schreiben und dort dann einen auswählen.
Aber wie bekomme ich dann wieder meinen Rückgabewert? Der hängt ja vom ausgeählten Namen ab.
Wenn ich alles in ein Array schreibe hab ich das Problem, das Namen doppelt vorkommen können.
Und eine eindeutige Nr. hat man ja in Notes leider nicht...
-
Na ja, den Rückgabewert kann man sich ja schon in ein Feld schreiben lassen, oder mit JavaScript zusammensammeln. Wenn Du über eindeutige Nummern arbeiten willst, dann muss die DocumentUNID zu Hilfe genommen werden. Und wenn man das ganze über ein Form mit eingebettetem (sogenanntem schlafenden) Vieh löst, dann lässt sich das bei Betätigung von Submit über WebQuerySave wieder abfangen, oder man ruft über einen Link einen weiteren Agenten auf. Viele Wege führen nach Rom ....
-
Naja, bis ich nach Rom komme wirds wahrscheinlich noch ein wenig dauern. Ich probier mal ein paar Sachen aus. Wird schon werden :P
Danke noch mal an alle die mir so genial weiter geholfen haben. thx.