Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: yannick am 06.08.12 - 13:10:51

Titel: Mit Agent auf andere DB zugreifen
Beitrag von: yannick 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! :)
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett 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.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: ghostmw 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  ;)
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: ascabg 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
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett 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 ...
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick 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.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: koehlerbv am 06.08.12 - 14:45:25
Forall-Schleife oder eine Schleife For Laufvariable = 0 To Ubound (Array)

Bernhard
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick 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..
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: ascabg 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
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick 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?
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: ascabg 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
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick 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?
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: ascabg 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
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 06.08.12 - 16:14:16
Es befindet sich in der Form selbst. Im Designer wurde es einfach nur erstellt mit create->attachment.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: ghostmw 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.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett 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 ...
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick 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! (http://bilder.hifi-forum.de/medium/517662/tkqe4fh-smiley-two-thumbs-up_175028.gif)
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett 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.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick 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...
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett 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?
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 07.08.12 - 10:56:56
Darüber müsste ich mich jetzt noch informieren (Chef natürlich grad nicht da).

Falls nicht...Gibt es noch eine andere Möglichkeit das Excel-Sheet direkt auf dem Server zu bearbeiten? Das RT-Item sollte sich doch eigentlich auch bearbeiten lassen, oder?
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: koehlerbv am 07.08.12 - 10:58:40
Nein, da gibt es für Dich keine andere Möglichkeit - ohne Excel kommst Du an kein Excel-Objekt heran.

Bernhard
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 07.08.12 - 11:04:08
Natürlich kannst Du das RTItem bearbeiten. Da kannst Du zum Beispiel die Exceldatei lösen. Aber das ist nur eine Datei und zum Lösen der Datei verwendest Du Funktionen von Notes. Um die Exceldatei zu bearbeiten, verwendest Du Funktionen von Excel, die Du ohne Excel nicht hast. Wird dann auch spannend, wenn der Server unter Linux läuft.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 07.08.12 - 11:30:59
Verdammt. Dann werde ich mal nachfragen, bezweifel aber stark, dass Excel installiert ist.

Okay, angenommen Excel wäre vorhanden und die Bearbeitung auf der temporären Datei wäre fertig. Jetzt muss ich ja die Excel-Datei wieder in das RT-Feld bekommen. Also einfach gedacht müsste ich jetzt alles rückgängig machen. Also erst das Object setzen, dann das Object an das RTItem hängen und zum Schluss das alte RTItem durch das neue ersetzen im Dokument. Allerdings will das bei mir nicht so ganz klappen  :-\
Code
	Dim rtitemNew As NotesRichTextItem	
	Dim objNew As NotesEmbeddedObject
	Set rtitemNew = New NotesRichTextItem( doc, "Body" )
	Set objNew = rtitemNew.EmbedObject _
	( EMBED_ATTACHMENT, "", "c:\\temp\\text.xls")
Jetzt habe ich doch ein neues RTItem mit dem überarbeiteten Excel-Dokument als Embedded-Object oder?
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 07.08.12 - 11:47:10
Nein, Du hast jetzt zwei RTItems. Lösche vorher das alte

Call doc.RemoveItem ("Body")

Am Ende nicht vergessen, das Dokument zu speichern

Call doc.Save (True, True)
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 07.08.12 - 12:03:44
Okay, nach der Bearbeitung des Dokuments habe ich folgenden Code:
Code
	doc.Removeitem("template")	'altes Feld mit RT-Item
	Dim rtitemNew As NotesRichTextItem	
	Dim objNew As NotesEmbeddedObject
	Set rtitemNew = doc.Createrichtextitem("template") 'neues Feld mit RT-Item
	Set objNew = rtitemNew.EmbedObject _
	( EMBED_ATTACHMENT, "", "c:\\temp\\template.xls")
	
	Call doc.Save(true, false)
Das ganze funktioniert soweit auch. Jetzt wird, nachdem der Agent ausgeführt wurde, das RT-Item (also das Icon) nicht mehr als Excel-Icon angezeigt, sondern einfach ein graues Viereck...Öffnen kann ich es ganz normal.
Dann muss ich jetzt noch die eigentliche Form mit dem, in dem jetzt erstellten Dokument vorhandenem Excel-Sheet, verknüpfen. Also bisher hatte ich in einer Form einfach ein Excel-Sheet als Attachment. Dieses Excel-Sheet soll jetzt immer das neue Excel-Dokument als Quelle verwenden.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 07.08.12 - 12:15:08
Nun kommen wir doch langsam zu der Frage, was Du eigentlich vorhast.

Was passiert mit der Datei? In welchem Kontext wird die genutzt und wozu?
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: koehlerbv am 07.08.12 - 12:24:43
Was man jetzt schon sagen kann: Das gegenwärtige Konzept ist zu 100% untauglich und falsch.

Sowie ein richtiger Administrator den Domino unter seiner Kuratel hat, wird dort Excel nicht laufen.
Und Excel auf dem Domino ist für diesen Zweck sowieso unnötig: Du willst doch offensichtlich neue Dokumente erstellen lassen mit einem Excel-Sheet, das auf den aktuellsten Werten basiert.
Dann sollte man in das Setup-Dokument (wie nun schon erreicht) das Vorlage-Sheet packen (nicht aktuell gehalten). Beim Erstellen eines neuen Dokuments wird dieses *lokal* beim Anwender gelöst, dann läuft der Prozess der Zellenaktualisierung und *dann* wird das Sheet an das neue Notes-Dokument geklatscht.

HTH,
Bernhard

PS: FYI - beim Anhängen im Backend bekommst Du immer das graue Standardsymbol - völlig unabhängig von Excel oder irgendeiner anderern Anwendung, mit denen das Dateiformat im Frontend (Windows) verknüpft ist.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 07.08.12 - 12:55:41
So - nach einer kurzen Mittagspause bin ich auf den gleichen Schluss gekommen. Ich wollte nur erstmal den Ablauf Sheet extrahieren-bearbeiten-hochladen im Gesamten fertig haben. Dass das Konzept so nicht richtig ist, wurde mir auch relativ schnell klar. Wenn man neu ist in dieser Umgebung, weiß man nicht immer genau was wie möglich ist. Aber ich möchte mich gerne hineinarbeiten und dazu lernen.
Also wie ich es jetzt geplant habe: Man klickt auf den entsprechenden Button und gelangt zu der besagten Form. Dort kann man sich (wahrscheinlich einfach wieder über einen Button "download") das Sheet runterladen. Bei diesem Vorgang passiert dann genau das, was ihr mir in den letzten Post erklärt habt. Da der User sich das Sheet sowieso runterladen (also speichern) muss, kann man also das hinterlegte Sheet wie beschrieben auf dem PC des Users speichern und auch gleich dort aktualisieren.
Ist das jetzt vom Konzept besser?
Danke und Gruß
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 07.08.12 - 14:28:31
ja
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 07.08.12 - 16:02:09
Super, klappt wunderbar. Also nochmal vielen Dank an alle Helfer! Schön, dass hier auch einem Neuling weitergeholfen wird :)
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 15.08.12 - 09:38:37
Hallo zusammen,
da ich nicht noch einmal einen neuen Thread aufmachen wollte, und es auch gut hier rein passt schreibe ich es einfach hier. Zur Angelegenheit:
In unserer Datenbank werden nur Dokumente einer Form gespeichert (es ist quasi wie ein Formular). Dieses Formular hat mehrere sections. Unter bestimmten Umständen (die hier jetzt unwichtig sind) wird in einer anderen DB (DB2) ein Dokument, das über einen primary key eindeutig zu dem Dokument in unserer DB zugeordnet werden kann, erstellt. Im Moment müsste der User, der den Antrag in unserer DB stellt, am Ende das "Ergebnis" einmal in DB2 eintragen, und einmal in die entspr. section aus dem Formular unserer DB. Da der User aber i.d.R. seine Ergebnisse nur in DB2 einträgt wollten wir diese Felder mit unseren Feldern "synchronisieren".
Da ich, wie gesagt, noch relativ neu in Lotus Notes/Domino (ca. 2-3 Wochen) bin wollte ich euch meine Ideen dazu vorstellen. Der Grund ist, dass wir morgen ein Meeting darüber haben und wir quasi die Besitzer der anderen DB davon überzeugen müssen, dass diese Synchronisation nötig ist, und eben dementsprechend auch Möglichkeiten vorstellen müssen was wir uns bisher gedacht haben. Hier also meine Ideen:

1. Infos manuell über Button aus DB2 holen:
    Einen Button in unser Formular integrieren, der (nur) für dieses Dokument die section im Formular mit den Daten aus DB2 füllt.
    Voraussetzung: Jeder User unserer DB, der den Button betätigen kann (können nur bestimmte Rollen) bräuchte Lesezugriff
    auf DB2.
2. Infos periodisch über Agent aus DB2 holen:
    Einen Agent programmieren, der periodisch (z.B. wöchentlich) die sections aller Dokumente unserer DB mit den Daten aus den
    jeweiligen Dokumenten der DB2 füllt.
    Voraussetzung: Unsere DB bräuchte Lesezugriff auf DB2 und müsste dort als Trusted Server eingetragen sein.
3. Trigger in DB2
    Einen Agent in DB2 einbauen, der, sobald die entsprechenden Felder in DB2 gefüllt wurden,  diese an das entsprechende
    Dokument in unserer DB sendet.

Ich denke Nummer3 wäre am besten, wird aber wohl nicht umsetzbar sein, da dies Programmieraufwand für die Leute der DB2 bedeutet. Nummer2 wird wahrscheinlich wegfallen, da Nummer1 (meiner Meinung nach) wohl am einfachsten umzusetzen wäre.

Meine Fragen wären jetzt zum einen, ob es vielleicht noch andere Möglichkeiten gibt, die wir von unserer Seite her umsetzen können? Und zum anderen welche Voraussetzungen bestehen müssten, damit diese Möglichkeiten umsetzbar wären (Stichwort Access etc.)?

Ich hoffe das "Problem" ist einigermaßen rübergekommen, falls ihr sonst noch etwas wissen müsstet einfach nachfragen. Und schonmal vielen Dank!
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 15.08.12 - 10:04:08
Deine Frage ist schwierig zu beantworten, da das Umfeld völlig unklar ist. Im vorhergehenden Thread dreht sich alles um Excel, jetzt schreibst Du "Stichwort Access". Meinst Du damit MS Access oder den Zugriff auf die andere Datenbank?

Wenn die gewünschten Daten in der db2 in Notes gehalten sind (also Items in Dokumenten, keine Dateianhänge), würde ich in die Maske der db1 Felder "berechnet zur Anzeige" einbauen, die die Informationen aus der db2 beim Öffnen des Dokuments aktuell holen. Diese Informationen werden allerdings nicht im Dokument der db1 gespeichert. Zugriff auf db2 wäre wie bei Deiner Idee 1. Da folgt die nächste Unklarheit: Wozu werden die Informationen gebraucht? Nur zum Anschauen, wenn das Dokument geöffnet ist, oder soll damit auch im Hintergrund gerechnet werden und die Daten müssen in der db1 gespeichert sein?

Der Trigger in db2 hat einen Nachteil, wenn db1 aus irgendeinem Grund nicht verfügbar ist (Server läuft nicht, Zugriff fehlt o.ä.), erfolgt keine Übertragung der Änderung. Welches Event holt das später nach?

Ein periodischer Agent, der die Daten abgleicht, ist m.E. die beste Wahl, außer die Daten müssen realtime aktuell sein. Und dann ist da wieder die Unklarheit von oben: liegen die Daten in Excel, wird es mit dem periodischen Agenten schwierig (das hatten wir schon diskutiert).

EDIT: Bei "berechnet zur Anzeige" müssen natürlich alle Zugriff auf db2 haben, hatte überlesen, dass es nur ein bestimmter Kreis Benutzer sein soll. Wie häufig ändern sich die Daten? Wenn niemand auf den Button drückt, bleiben die alt.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 15.08.12 - 10:19:19
Okay, wie gesagt, die Fragen beantworte ich gern.

Also bei den "Daten" handelt es sich um ganz normale Textfelder (also hier geht´s nicht um Excel!). Die DB2 ist ebenfalls in Notes gehalten. Also ich meine den Zugriff auf die DB2. Diese Daten werden "leider" in der DB2 gebraucht, um auch mit ihnen zu rechnen. Sie müssen also in unserer DB gespeichert werden; sie werden z.B. auch in ein Excel-Sheet exportiert. Die Daten müssen daher auch nicht realtime aktuell sein. Es würde genügen zum einen den Button einzufügen, mit dem man "manuell" die Daten aktualisieren kann und zum anderen bevor die Daten in das Excel-Sheet exportiert werden einen Agent laufen zu lassen, der dies automatisch für alle Dokumente macht. Der Export in Excel wird manuell angestoßen, somit wäre das gleiche bei dem Agent, der die Dokumente vorher aktualisiert.

Was würden wir für diese Methode also benötigen?
- alle "Rollen", die den Button betätigen können brauchen Lesezugriff auf DB2
- programmatische Namen der Views und Felder, von denen wir die Daten ziehen wollen
- Servername und Filepath
Ist das alles was wir dafür benötigen?
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 15.08.12 - 10:24:11
ich meine ja, unter der Voraussetzung, dass die Benutzer überhaupt auf den Server der db2 zugreifen dürfen (was natürlich in "Lesezugriff auf db2" enthalten, aber eine ganz andere Baustelle ist)
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 15.08.12 - 10:27:32
Die Antwort bezieht sich natürlich nur auf das Verhältnis zur db2 (so habe ich die Frage verstanden). Innerhalb Eurer db muss natürlich derjenige, der alle Dokumente aktualisieren soll, diese auch bearbeiten dürfen.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: koehlerbv am 15.08.12 - 10:34:09
- alle "Rollen", die den Button betätigen können brauchen Lesezugriff auf DB2

Nur theoretisch. Du kannst auch den Agent auf dem / vom Server lassen. Das kannst Du auch über einen Button manuell triggern (NotesAgent.RunOnServer).

Okay, wie gesagt, die Fragen beantworte ich gern.

Das würde ich nicht machen: Nimm die ReplicaID. Im Konfig-Dokument der ausführenden DB baust Du für den lieben Admin einen Buhtong, mit dem er die gewünschte DB2 aufwählen kann und im Hintergrund speicherst Du deren ReplicaID.

HTH,
Bernhard
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: Peter Klett am 15.08.12 - 10:59:06
ReplicaID oder Dateiname ist auch wieder so eine Philosophiefrage. Definition in einem Konfigurationsdokument ist selbstverständlich, also niemals Server und Dateinamen oder IDs hart im Code verdrahten. Mir ist die Methode mit der ReplicaID zu wackelig und verwende deshalb lieber Server- und Dateiname, der ggf. aktualisiert werden muss (aber bei einer Reparatur einer Datenbank über eine Kopie muss die ReplikID aktualisiert werden, wir hatten schon beide Fälle). Bei ReplicaID bin ich mir nicht sicher, was passiert, wenn ich eine Kachel zuoberst auf dem Desktop habe, die auf einem anderen Server liegt, als das Programm eigentlich öffnen möchte. Ich meine, dass u.U. der Server vom Desktop gewinnt (zumindest, wenn der gewollte Server nicht erreichbar ist). Eventuell greife ich dann auf eine lokale Uralt-Replik zu und arbeite mit falschen Daten. Da ist mir ein kontrollierter Abbruch (Datenbank kann nicht geöffnet werden, Vorgang wird nicht durchgeführt) lieber.

Da Bernhard damit anscheinend keine schlechten Erfahrungen gemacht hat, scheint es so schlimm nicht zu sein, wie mir mein Bauch sagt, ich würde mich aber entschieden dagegen wehren, das als die einzig richtige Variante darzustellen.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: koehlerbv am 15.08.12 - 11:32:13
Nein, das ist natürlich kein Dogma. Du überlässt aber mit der Replica den Admins mehr Möglichkeiten als mit Server / Dateiname.
Welcher Server für das Suchen der ReplicaID verwendet wird, kannst Du programmatisch selbst bestimmen (was Yannick hier ja auch machen muss).

Bernhard
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: flaite am 15.08.12 - 11:58:43
Ich habs in überdurchnittlich sorgfältig entwickelten und/oder wirklich großen Domino-Anwendungen öfter mit Replica-ID gesehen. Ist natürlich kein Dogma.

Eine für Anwendungs-Betreuer (oft Admins) gut sichtbare und verständliche Fehlermeldung ist für die ja hoffentlich nicht wöchentlich auftretenden Server-Umzüge per Kopie ECHT WICHTIG und EINE TOTAL GUTE IDEE (Stichwort defensive coding).

Die Autoren des Java-Codes mit dem ich so arbeite, berücksichtigen olche checks ob Objekt wirklich da, in geschätzten 80% der Fälle nicht. Hat mich heute morgen wieder 90 Minuten Geisterbahn in code, den ich weder verstehen muss noch soll noch will gekostet.  
Das durchschnittliche Verhalten ist:
- in den ersten 6 Monaten nach der Uni übertrieben viele Objekte auf null zu checken, auch wenn die nie null sein können.
- ab 6 Monaten bis zum Einstellen der Entwicklertätigkeit auf null checks grundsätzlich zu verzichten.


Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 15.08.12 - 13:23:10
Okay, vielen Dank.
Ob wir überhaupt Zugriff auf diesen Server haben muss ich klären, denke aber schon.
Über die RunOnServer-Methode werde ich mich dann mal genau informieren, vielleicht ist das ja auch noch etwas für uns.
Also nochmal vielen Dank. Morgen ist das Meeting, danach werden wir (hoffentlich) wissen, ob wir diese Funktion einbauen (dürfen).
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 24.08.12 - 09:28:21
So, unser Vorhaben wurde genehmigt, wir können voraussichtlich nächste Woche anfangen zu testen. Ich habe jetzt ein Test-Script aufgesetzt und wollte vorher hier nochmal nachfragen, ob es da vielleicht noch Verbesserungsbedarf gibt, da das ganze wirklich wichtig ist und ich erst seit etwa 3 Wochen in LS entwickle.
Die Situation ist jetzt die, dass wir in unserem Dokument einen Doclink zum Dokument in der anderen DB haben aus dem wir Daten ziehen wollen. Also hier was ich bisher habe:
Code
	Dim ws As New NotesUIWorkspace
	Dim db As New NotesDatabase("db-server", "db-filepath")
	Dim docA As NotesDocument
	Dim docB As NotesDocument
	Dim rti As NotesRichTextItem
	Dim rtnav As NotesRichTextNavigator
	Dim rtlink As NotesRichTextDocLink
	Set docA = ws.Currentdocument.Document
	Set rti = docA.GetFirstItem("doclink")
	Set rtnav = rti.CreateNavigator
	If Not rtnav.FindFirstElement(RTELEM_TYPE_DOCLINK) Then
		MessageBox "No doclinks in doclink item",, "No doclinks"
		Exit Sub
	End If
	Set rtlink = rtnav.Getelement()
	Set docB = db.Getdocumentbyunid(rtlink.Docunid)
        If docB Is Nothing Then
		MessageBox "Document not found",, "No document"
		Exit Sub
	End If
	Call docA.Replaceitemvalue("fieldA", docB.Getitemvalue("field_A"))
	Call docA.Replaceitemvalue("fieldB", (docB.Getitemvalue("field_B") + docB.Getitemvalue("field_C"))*100)
        ...

Vielen Dank schonmal :)
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: klaussal am 24.08.12 - 09:31:23
Zitat
Set docB = db.Getdocumentbyunid(rtlink.Docunid)

Danach unbedingt (!!) eine Fehlerbehandlung einbauen, falls nix gefunden wird, etc pp
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: yannick am 24.08.12 - 09:32:15
Danach unbedingt (!!) eine Fehlerbehandlung einbauen, falls nix gefunden wird, etc pp
Genau das ist mir auch gerade noch aufgefallen. Schau bitte nochmal im Code oben, ich habe es editiert.
Danke dir.
Titel: Re: Mit Agent auf andere DB zugreifen
Beitrag von: umi am 24.08.12 - 11:24:33
Hi
Soweit ich mich erinnere gibt das getDocumentByUnid einen Error 4091 zurück, wenn die UNID nicht gefunden wurde.