Autor Thema: Wo befinde ich mich  (Gelesen 3558 mal)

Offline MartinN

  • Frischling
  • *
  • Beiträge: 10
Wo befinde ich mich
« am: 25.05.09 - 16:10:31 »
Hallo,
ich habe die Aufgabe einen Agenten zu schreiben. Dieser Agent soll über Buttons in der Menüleiste zu starten sein. Das ist soweit erst einmal kein Problem für mich.
Nun soll dieser Agent aber auch ermitteln können, ob ich mich in einer (anderen) Datenbank z.B. meiner Maildb befinde und ob ich dort in einer Ansicht bin oder ein Dokument geöffnet habe.
Hat jemand da einen Ansatz für mich?

Danke im Voraus!

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Wo befinde ich mich
« Antwort #1 am: 25.05.09 - 17:29:43 »
Komplett OT: Um 16:10 warst du an deiner Tastatur.
Sorry, konnte ich mir jetzt nicht verkneifen bei dem Titel.

mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline pete_bla

  • Senior Mitglied
  • ****
  • Beiträge: 455
  • Geschlecht: Männlich
  • dot net gitz net!
Re: Wo befinde ich mich
« Antwort #2 am: 25.05.09 - 19:06:50 »
Hi,

@Servername
@DbTitle
@DBName

@cetera....

Gruss, Pete(r)
pete(r)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Wo befinde ich mich
« Antwort #3 am: 25.05.09 - 19:28:47 »
Martin, Deine Anfrage ist zu diffus:
- In der Menüleiste gibt es keine Buttons. Meinst Du SmartIcons?
- Welche Programmiersprache kommt in Frage?
- Wie ist der gesamte Kontext?
- Musst Du ermitteln, welches (Notes-)Fenster beim Click auf den "Button" (or whatever) gerade im Fokus ist? Oder ggf. sogar, welche noch geöffnet sind?

Mehr Input, mehr Output. Und: Willkommen im AtNotes-Forum!

Bernhard

Offline MartinN

  • Frischling
  • *
  • Beiträge: 10
Re: Wo befinde ich mich
« Antwort #4 am: 26.05.09 - 08:35:27 »
Danke für die Antworten.
Die ganze Thematik ist zu komplex um sie hier detailiert zu beschreiben.
Dennoch hier eine Kurzfassung. In einer speziellen DB ist ein Agent abgelegt. Dieser Agent wird über Smarticons in einer Symbolleiste gestartet. Nun soll der Agent zunächst herausfinden in welcher DB der Anwender gerade ist. Dies ist kein Problem. Schwieriger wird mit dem nächsten Schritt. Er soll dann unterscheiden ob sich der Anwender in einer Ansicht oder in einem Dokument befindet. Danach folgen dann Aktionen, wie z.B. neues Dokument anlegen oder etwas in das Dokument einfügen etc. Der Agent wird in Lotus Script erstellt.
In welcher DB man sich befindet ist einfach zu finden. Dazu setzt die Funktion des Smarticons eine Umgebungsvariable, die mit dem Rückgabewert der Funktionen @DBTitle gesetzt wird.
Schwieriger finde ich das Problem zu ermitteln ob ich mich in einer Ansicht befinde oder in einem Dokument. Denn zunächst befindet man sich ja in einer Ansicht und die Funktion @ViewTitle gibt in jedem Fall einen Wert zurück. Ebenfalls liefert die Funktion @DocumentUniqueID zumindestens die Id des Dokumentes zurück, das in der Ansicht gerade den Rahmen hat. (Nein noch kein Haken dran und nicht geöffnet). Genau hier ist mein Problem. Wie unterscheide ich nun, ob ich mich bereits im Dokument oder noch in der Ansicht befinde?

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: Wo befinde ich mich
« Antwort #5 am: 26.05.09 - 08:54:24 »
Dokumente haben ein FORM item, views nicht ...
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline MartinN

  • Frischling
  • *
  • Beiträge: 10
Re: Wo befinde ich mich
« Antwort #6 am: 26.05.09 - 09:06:13 »
Danke eknori,
aber vielleicht sehe ich gerade den Wald vor lauter Bäumen nicht.
Das ich die Ansicht habe, ist klar. Eine Dokumenten-Id für ein Dokument wird ebenfalls geliefert, obwohl das Dokument u.U. noch gar nicht geöffnet wurde. Daher ist mir jetzt nicht klar, was Du mir sagen möchtest....

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Wo befinde ich mich
« Antwort #7 am: 26.05.09 - 09:09:30 »
Da Du mit LS arbeitest, bietet Dir der NotesUIWorkspace doch alles, was Du benötigst: CurrentDatabase, CurrentView und CurrentDocument.
Wenn sich beispielsweise mit CurrentDocument kein Dokument instantiieren lässt, ist schon mal klar, dass aktuell kein geöffnetes Dokument im Vordergrund ist.

Bernhard

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Wo befinde ich mich
« Antwort #8 am: 26.05.09 - 11:26:36 »
Rein interessehalber, wie startest du den Agent in der anderen DB aus dem Smarticon

ich tippe auf:
- UNID in die Notes.Ini specihern
- DB öffnen
- Agent starten
- DB schließen

Ich stand mal vor einem ähnlichen Problem und ging zuerst auch so vor.
Das Problem ist, dass currentXXX dann immer auf Dinge in der geöffneten DB gezeigt hat und ich mir nicht alle möglichen Sachen in der Notes.ini abspeichern wollte (bzw. mit Formelsprache nicht konnte)

Ich hab das dann so gelöst, dass ich den Agentcode in eine Maske verlagert habe. Die Maske wird dann über Compose geöffnet. Vorteil hierbei ist, dass ich direkt die DB angeben kann. Im "initialize" der Maske kannst du dann über workspace.currentXXX auf die entsprechenden Elemente zugreifen. Somit brauch ich auch nichts in die notes.ini speichern.
In einer Ansicht ist ws.currentDocument z.B. "nothing" in einer Maske gesetzt.

Im QueryOpen steht entweder ein "continue = false" oder im Postopen ein "Source.close" dass die Maske nie aufgeht.
(letzteres ist u.U. erforderlich, wenn man Befehle ausführen möchte, die im initialize nicht erlaubt sind, z.B. ein ws.editDocument)

Gruß
Roland

Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline MartinN

  • Frischling
  • *
  • Beiträge: 10
Re: Wo befinde ich mich
« Antwort #9 am: 26.05.09 - 14:59:19 »
Danke für die Antworten!
@Pram ja so in dieser Art und Weise muß ich das machen. Es geht hier z.B. um Attachement und Mails die in einer speziellen Software abgelegt sind. Der Anwender kann dann z.B. auswählen welches Attachement in ein anderes Dokument übernommen werden soll. Die Software legt dann in einem genau definierten Verzeichnis das gewünschte Attachement ab.
Der Agent soll nun dieses Attachement entweder in ein neues Dokument (das klappt!) oder aber in ein vorhandenes Dokument bzw. ein vom Anwender gerade erstelltes Dokument einhängen.
Nun handelt es sich bei den Ziel-Dbs um Maildatenbanken in einer größeren Firma. Man möchte dort nicht, das die Mail-Templates für diesen Zweck verändert werden und zum anderen sollen auch nicht alle Anwender diese Funktionen erhalten. Daher muß der Agent in einer separaten DB abgelegt werden. Dort soll er dann gerufen werden, die Zieldb ermitteln und wie beschrieben handeln und anschließend dem Anwender das bearbeitete Dokument zur weiteren Bearbeitung übergeben.
Wie gesagt mein Problem an dieser Stelle ist, das ich dort nicht exakt herausfinden kann ob ich mich dann in einer Ansicht oder in einem Dokument befinde. Den Namen der aktuellen Ansicht bekomme ich geliefert. Und auch eine Dokumenten-Id. Letzteres eben auch, wenn gar kein Dokument geöffnet ist oder in der Ansicht keines per Haken ausgewählt wurde.
Stehe ich andererseits in einem Dokument, erhalte ich auch bei ws.CurrentDocument kein Dokument übergeben.
Da werde ich wohl noch etwas suchen müssen, bis eine Lösung vorhanden ist...

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Wo befinde ich mich
« Antwort #10 am: 26.05.09 - 15:29:31 »
ja hört sich sehr ähnlich nach meinem Problem an  ;D (und auch die Hürden die du umschiffen musst, hatte ich)

ich hab nochmal im Code nachgesehen, wie ich das gemacht habe:

Im Smarticon steht bei mir:
@Command([Compose];"server!!pfad\zur\db.nsf";"smarticon.form")
(diese Maske ist NICHT in der MailDB)

in der "smarticon.form" steht dann:

Public currDB       As NotesDatabase
Public currView    As NotesUIView
Public currDoc    As NotesUIDocument

Sub Initialize
   On Error Resume Next
   Dim currWS   As New NotesUIWorkspace
   Set currDB   =  currWS.CurrentDatabase.Database   
   Set currView   =  currWS.CurrentView
   Set currDoc   =  currWS.CurrentDocument   
   On Error Goto 0
   Call run(currDB, currView, currDoc)
End Sub

Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
   continue=False
End Sub

Ist ein Doc geöffnet so ist currDB und currDoc gesetzt. Bist du hingegen in einer Ansicht ist zusätzlich noch currView gesetzt. (Am Workspace ist nur currDB gesetz)
Wichtig ist dabei, dass man sich currentXXX bereits im Initialize holt.
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline MartinN

  • Frischling
  • *
  • Beiträge: 10
Re: Wo befinde ich mich
« Antwort #11 am: 27.05.09 - 11:26:46 »
Danke für den Tipp, werde mal sehen ob ich das so hinbekommen.
Dennoch bleiben Fragen?


Im Smarticon steht bei mir:
@Command([Compose];"server!!pfad\zur\db.nsf";"smarticon.form")
(diese Maske ist NICHT in der MailDB)


Wo denn dann? In der DB wo der Agent liegt? Wieso benötige ich eine Maske?

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Wo befinde ich mich
« Antwort #12 am: 27.05.09 - 11:57:15 »
Also, um einen Agent aus dem Smarticon heraus zu starten ist mir (nur) folgender Weg bekannt.

Code
@SetEnvironment( "currentDocumentRef"; @Implode(@DbName;"!!")+"#"+@Text(@DocumentUniqueID) );
@Command([FileOpenDatabase];"server":"roland\\sandbox.nsf");
@Command([FileCloseWindow]);
@Command([RunAgent];"MyAgent")

Das Problem ist hier
a) dass ich in die notes.ini rein schreiben muss
b) die Datenbank öffnen muss (ein Parameter für RunAgent a la "server!!database\MyAgent" gibt es meines Wissens nicht
-> im Agent kann ich über LS nicht mehr auf die gerade geöffnete DB zugreifen, es muss vorher alles in der Ini abgespeichert werden

Mache ich hingegen ein
Code
@Command([Compose];"server!!roland\\sandbox.nsf";"MyForm")
so kann ich
a) direkt den Verweis zur DB angeben (ich muss die DB nicht Öffnen/schließen wie oben)
b) im Initialize der Form über LS auf die gerade geöffnete DB (welches in deinem Fall die MailDB ist) zugreifen

Du benötigst eine Maske (in der DB in der der Agent liegt) da du diese direkt per Compose öffnen kannst. In das initialze der Maske packst du deinen Agentcode (die Maske ersetzt praktisch den Agent)

Ich geb zu, dass dies ggf. eine etwas "unorthodoxe" Methode ist, aber ich hab leider keine andere Möglichkeit gefunden, um dieses Problem zu lösen.

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline MartinN

  • Frischling
  • *
  • Beiträge: 10
Re: Wo befinde ich mich
« Antwort #13 am: 28.05.09 - 12:20:02 »
Danke für die Antworten!
Werde ich mal testen.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz