Autor Thema: Mit Agent auf andere DB zugreifen  (Gelesen 16540 mal)

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Mit Agent auf andere DB zugreifen
« am: 06.08.12 - 13:10:51 »
Hallo zusammen,
also ich muss über eine bestehende Notes-DB auf eine andere Notes-DB zugreifen und dort ein Feld auslesen. Gegoogled habe ich das schon, leider nichts gefunden. Vielleicht habe ich aber auch einfach nur die falschen Keywords gesucht. Was benötige ich von der anderen DB um auf Dokumente dieser (lesend) zugreifen zu können?
Also genau geht´s um ein Excel-Sheet, welches auf DB1 liegt. In diesem Excel-Sheet gibt es eine Zelle, die über die Data Validation eine Liste zeigt. Dessen Source wiederum beruht auf den Daten eines Feldes eines Dokuments aus DB2. Jetzt wollte ich einen Agent schreiben, der diese Liste immer aktuell hält (täglich oder wöchentlich ausgeführt wird). Der Agent soll also folgendes machen:
- Verbindung mit dem Server, auf dem die DB2 liegt
- Verbindung mit der DB2
- via Identifier ein bestimmtes Dokument suche
- aus diesem Dokument ein Feld auslesen (und temporär speichern)
- Excel-Dokument, das auf DB1 liegt (auf dem auch der Agent läuft) öffnen
- bestimmten Bereich mit den ausgelesenen Daten aus DB2 füllen
Ich hoffe das ist verständlich, falls nicht, bitte nachfragen. Über Rat-/Vorschläge wäre ich sehr dankbar! :)
« Letzte Änderung: 06.08.12 - 13:13:04 von yannick »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #1 am: 06.08.12 - 13:21:25 »
Schau Dir mal die Notes-Hilfe zu den Klassen NotesDatabase, NotesView und NotesDocument an, ich denke, dort findest Du den größten Teil dessen, was Du brauchst. Um das Ergebnis nachher in Excel zu tranpsortieren, suchst Du hier im Forum unter OLE, da sind auch jede Menge Beispiele vorhanden.

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Mit Agent auf andere DB zugreifen
« Antwort #2 am: 06.08.12 - 13:21:50 »
Passiert das ganze im Frontend (vom User initiiert) oder im Backend (via periodischen Server-Agent) ?

Bei letzterem muss der Server der DB1 im Serverdokument des Servers der DB2 als "Trusted Server" eingetragen werden.
Da stolpern viele drüber ...

Mit der Admin-Hilfe findest du den Punkt, wo die Trusted Server zu finden sind  ;)
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #3 am: 06.08.12 - 13:23:45 »
Hallo,

@Peter
Bitte nicht vergessen, dass der Server auf dem der Agent rennt, als 'Trusted Server' (Vertrauenswuerdige Server) im Serverdokument des zweiten Servers (register Security / Sicherheit) eingetragen sein muss.

Ansonsten rennt der Agent nicht.


Andreas

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #4 am: 06.08.12 - 14:01:48 »
Eine Alternative wäre, von der DB2 eine Replik auf dem Server zu stellen, auf dem der Agent läuft, falls das die Struktur im Haus zulässt (sofern denn die DB2 tatsächlich auf einem anderen Server liegt). Für Excel gelten auch noch Einschränkungen. Wenn der Agent auf dem Server laufen soll, muss dort Excel installiert sein, falls hier nicht die ODBC-Methode funktioniert, die pram neulich skiziziert hat, und der Agent muss ausreichend Rechte zugewiesen bekommen haben.

An dem ganzen Konstrukt sind also noch einige Wenns und Abers.

Vielleicht könnte man in Excel direkt auf Notes zugreifen, oder die ganze Exceltabelle durch Notes ersetzen, um sich da das Leben etwas einfacher und durchgängiger zu machen, aber das ja war nicht die Frage ...

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Re: Mit Agent auf andere DB zugreifen
« Antwort #5 am: 06.08.12 - 14:41:44 »
Wunderbar! Vielen dank für die schnellen Antworten. Jetzt habe ich die Daten ausgelesen. Das Format ist ein Variant als Array. Von Java/C++ bin ich es jetzt gewohnt über die size() das Array durchzugehen. Aber diese Methode gibt es anscheinend in LS nicht. Wie kann ich denn jetzt dieses Variant Eintrag für Eintrag durchgehen und auslesen? Jeder Eintrag im Variant kommt dann in eine Zelle im Excel-Sheet.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #6 am: 06.08.12 - 14:45:25 »
Forall-Schleife oder eine Schleife For Laufvariable = 0 To Ubound (Array)

Bernhard

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Re: Mit Agent auf andere DB zugreifen
« Antwort #7 am: 06.08.12 - 15:00:29 »
Die Ubound-Funktion war mir bisher nicht bekannt, danke!
Also das Excel-Sheet ist als Attachment einer Form in der DB hinterlegt. Ich habe schon nach einem Identifier o.ä. gesucht über den ich auf das Dokument direkt zugreifen könnte, habe aber leider nichts derartiges gefunden. Bisher habe ich nur ein Excel Sheet vom PC geöffnet, das geht ja in etwa so:
Code
	Dim Excel As Variant
	Dim xlWorkbook As Variant
	Dim xlSheet As Variant
	Dim xlCells As Variant
	Dim xlFilename As String

	Set Excel = CreateObject("Excel.Application")

	Excel.Workbooks.Open xlFilename
	Set xlWorkbook = Excel.ActiveWorkbook
	Set xlSheet = xlWorkbook.ActiveSheet
	Set xlCells = xlSheet.Cells
Nur jetzt habe ich ja kein Filepath mehr, wie komme ich denn an das Attachment dieser Form ran? Mir wäre jetzt als erstes eingefallen die Form zu öffnen, dann würde ich ja über embeddedObjects auf die Attachments zugreifen können. Da der Agent aber im Hintergrund laufen sollte, darf sich kein neues Fenster öffnen..

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #8 am: 06.08.12 - 15:10:27 »
Kennst Du jetzt das Dokument in dem sich das Excel-File befindet oder nicht?

Wenn Ja -> Zugriff auf das Dokument - mit EmbeddedObjects das Attachement einstellen -> extrahieren -> auf Excel-File zugreifen.


Andreas

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Re: Mit Agent auf andere DB zugreifen
« Antwort #9 am: 06.08.12 - 15:20:08 »
Das Attachment befindet sich in einer Form, die "nur" eine Funktion als Dialog hat. Man klickt in einer View auf einen Button, die Form wird geöffnet in der sich das Excel-Sheet als Attachment befindet. Wie kann ich jetzt auf diese Form zugreifen ohne sie gleich sichtbar zu öffnen?

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #10 am: 06.08.12 - 15:28:03 »
Im 'Code' des Buttons kannst Du doch sehen, wie die Form heisst.

Wenn sich dies in einer Ansicht befindet, kannst Du mit NotesView.GetDocumentByKey() Dir das betreffende Dokument holen.


Andreas

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Re: Mit Agent auf andere DB zugreifen
« Antwort #11 am: 06.08.12 - 15:57:26 »
Also ich habe jetzt folgendes gemacht:
Code
Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim doc As NotesDocument
	
	Dim Excel As Variant
	
	Set db = session.currentDatabase()
	Set doc = db.Createdocument()
	doc.Form = "file.path.dialog"
	Set Excel = CreateObject("Excel.Application")

	Set Excel = doc.Getattachment("ExcelSheet.xls")	
	Excel.Visible = False
Allerdings bekomme ich beim letzten Befehl immer den Fehler mein Variant würde kein Object containen. Wahrscheinlich habe ich auch einfach falsch gedacht wie ich an das Excel Dokument ran komme?

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #12 am: 06.08.12 - 16:12:14 »
Wo in der Form befindet sich denn das Excel-File?
(In der Form selber oder in einem Feld)?


Andreas

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Re: Mit Agent auf andere DB zugreifen
« Antwort #13 am: 06.08.12 - 16:14:16 »
Es befindet sich in der Form selbst. Im Designer wurde es einfach nur erstellt mit create->attachment.

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Mit Agent auf andere DB zugreifen
« Antwort #14 am: 06.08.12 - 16:46:55 »
Dann hast du ganz schlechte Karten, das Attachment direkt in der Maske wird NICHT mitgespeichert im Dokument.

Damit steht es dir auch programmtechnisch NICHT zur Verfügung ([EDIT]: Einschränkung: es geht schon, ist aber sehr schwierig ... Maske im LotusScript holen, dann das Gestaltungselemtent als NotesDocument laden, $File extrahieren etc.).

Mach doch lieber ein Richtext-Feld für den Anhang in deine Konfiguration rein.
Das wird mitgespeichert und steht dir auch zur Verfügung im Backend.
« Letzte Änderung: 06.08.12 - 16:50:03 von ghostmw »
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #15 am: 06.08.12 - 16:52:18 »
Du musst sauber zwischen Form und Dokument trennen. Das eine hat mit dem anderen nichts zu tun.

Set doc = db.Createdocument()
doc.Form = "file.path.dialog"

Nach diesemScript hast Du ein neues Dokument in der Datenbank db, das ein Item mit dem Namen "Form" hat und dessen Inhalt "file.path.dialog" lautet. Nicht mehr und nicht weniger.

Deshalb kracht Dir Set Excel = doc.Getattachment("ExcelSheet.xls"), denn doc hat kein Attachment. Woher auch?

Hast Du die Exceldatei in die Form gehängt, um später darauf zuzugreifen? Dann baue eine Maske (Form) mit einem Richtextfeld, erzeuge mit dieser Maske ein Dokument und häng dort die Exceldatei rein. In Deinem späteren Ablauf greifst Du dann auf das Dokument zu, das Du mit der Maske erstellt hast und in dem Du die Exceldatei abgelegt hast.

Sicherlich kann man auch über eine Maske eine Exceldatei hinterlegen, aber dann musst Du auf das Gestaltungsdokument der Maske zugreifen (also auf die Form als Dokument), und nicht auf ein im Backend frisch erstelltes Dokument, dessen Form-Item zufällig den gleichen Namen hat, wie die Maske, die Du eigentlich haben möchtest. Dieser Weg ist aber eher ungewöhnlich. Was passiert, wenn sich die Exceldatei ändert? Dann muss die in der Form geändert werden, dazu benötigt man Designerrechte, ausgelagert in ein Dokument kommst Du mit Autorenrechten (bei entsprechender Autorensteuerung), auf jeden Fall aber mit Editorrechten zurecht. Es ist dann eine Datenänderung und keine Gestaltungsänderung.

Das ist sinngemäß das gleiche, wie ghostmw auch geschrieben hat, ich speichere es trotzdem, weil es mich schon ein paar Minuten gekostet hat ...

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Re: Mit Agent auf andere DB zugreifen
« Antwort #16 am: 07.08.12 - 09:55:41 »
Erstmal danke für die Antworten. Auch wenn es "sinngemäß" das gleiche war, hat mir dein Post nochmal weitergeholfen, Peter.
Also ich habe jetzt eine einfache Form mit einem RT-Item erstellt. Die Form habe ich dann geöffnet und in Notes über Import meine Excel-Datei eingefügt und das Dokument abgespeichert. Habe mir dann grad eine View gemacht, in der nur dieses Dokument  zu sehen ist um die NoteID über die Properties herauszufinden. Diese ist doch die letzte Reihe unter Documents-ID (nur ohne NT), oder bin ich da falsch? Dann habe ich versucht über db.getDocumentByID auf dieses Dokument zuzugreifen. Nur jetzt weiß ich nicht genau wie ich die Datei aus dem RT-Feld in mein Variant im Agent bekomme. Hier ist was ich soweit habe und wo es hängt:
Code
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim doc As NotesDocument
	Dim Excel As Variant
	
	Set db = session.currentDatabase()
	Set doc = db.Createdocument()
	Set Excel = CreateObject("Excel.Application")
	Set doc = db.Getdocumentbyid("000036AE") 	
Ist das bisher soweit richtig? Jetzt hätte ich mit doc.getEmbeddedObjects weitergemacht, aber dann bekomme ich immer einen Fehler...

An dieser Stelle danke ich noch einmal rechtherzlich für die tolle Hilfe in diesem Forum!
« Letzte Änderung: 07.08.12 - 10:06:09 von yannick »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #17 am: 07.08.12 - 10:10:51 »
Ich würde nicht über die NoteID auf das Dokument zugreifen. Wird das Dokument gelöscht und neu erstellt, hat es eine andere NoteID, m.W. hat es das sogar schon in einer anderen Replik.

Erstell Dir eine Ansicht, in der das Dokument angezeigt wird. In der ersten sortierten Spalte gibst Du einen festen Wet aus, z.B. "Einstellungen". Mit Set doc = view.GetDocumentByKey ("Einstellungen", True) kannst Du dann das Dokument direkt ansprechen, ohne eine ID fest verdrahten zu müssen.

Du schreibst, dass Du die Datei importiert hast. Ich hätte sie angehängt, meintest Du das?

Die Datei hängt am RichtextItem, schau Dir in der Hilfe die Klasse NotesRichtextItem an, aus dem Item holst Du aus den EmbeddedObjects die Datei und legst sie temporär auf der Festplatte ab (ExtractFile, vermutlich in NotesEmbeddedObject, müsste ich auch nachsehen). In der Hilfe gibt es bestimmt ein Beispielscript.

Falls Du am Ende des Prozesses (ok, da bist Du noch lange nicht) die Datei wieder löschen willst, lautet der Befehl dazu Kill.

Offline yannick

  • Junior Mitglied
  • **
  • Beiträge: 94
Re: Mit Agent auf andere DB zugreifen
« Antwort #18 am: 07.08.12 - 10:48:06 »
Erstell Dir eine Ansicht, in der das Dokument angezeigt wird. In der ersten sortierten Spalte gibst Du einen festen Wet aus, z.B. "Einstellungen". Mit Set doc = view.GetDocumentByKey ("Einstellungen", True) kannst Du dann das Dokument direkt ansprechen, ohne eine ID fest verdrahten zu müssen.

Die Datei hängt am RichtextItem, schau Dir in der Hilfe die Klasse NotesRichtextItem an, aus dem Item holst Du aus den EmbeddedObjects die Datei und legst sie temporär auf der Festplatte ab (ExtractFile, vermutlich in NotesEmbeddedObject, müsste ich auch nachsehen). In der Hilfe gibt es bestimmt ein Beispielscript.
Okay, ich habe jetzt aus meiner View (in der immer nur dieses eine Dokument angezeigt wird) das "erste" Dokument rausgeholt, aus dem Dokument dann das RT-Item, und daraus wiederum das Object. Anschließend in C:\temp gespeichert.
Dazu jetzt meine nächste Frage. Es war eigentlich geplant, dass der Vorgang automatisch auf dem Server läuft, sprich der Agent täglich oder wöchentlich automatisch ausgeführt wird. Kann ich dann trotzdem auf dem Server die Excel-Datei temporär speichern? Bisher habe ich das jetzt nur auf meiner lokal kopierten Test-DB getestet...

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mit Agent auf andere DB zugreifen
« Antwort #19 am: 07.08.12 - 10:50:21 »
ja, machen wir automatisch mit mindestens 1000 Mails pro Nacht (Dateien temporär zu speichern, allerdings kein Excel).

Hast Du Excel auf dem Server installiert?

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz