Autor Thema: Dokumentenlink in ein bereits geöffnetes Dokument einer anderen DB zurückschreib  (Gelesen 2833 mal)

Offline RunRevilo

  • Junior Mitglied
  • **
  • Beiträge: 51
  • Geschlecht: Männlich
Hallo,

überlege nun schon eine ganze Weile und habe auch hier im Forum schon gesucht, aber irgendwie noch nicht den richtigen Ansatz gefunden.
Folgende Problemstellung:
Wir benutzen eine nicht von uns erstellte Anwendung für Kundenkontakte, wo wir gewissen Anpassungen auch selber machen können. Grob gesagt besteht die Anwendung aus 2 Datenbanken. In der DB A werden die Kundenkontakte verwaltet und eine DB D, dient zur Ablage von diversen Dokumenten/Dateien (z.B. eingescannte Dokumente oder Worddateien usw.) zu einem Kunden.

Ich möchte nun folgendes realisieren.
Der User befindet sich in der DB A und dort hat er das Dokument K geöffnet. Über eine Schaltfläche gelangt er in die DB D, wo sich ein Dokument U öffnet, in welchem er in einem RichtTextFeld eine Datei einfügt/anhängt. Nun möchte ich, dass wenn der User das Dokument U schließt, ein Dokumentenlink auf dieses Dokument in ein Feld des Dokumentes K in der DB A zurückgeschrieben wird.

Mir ist nicht klar, wie ich von Dokument U (was in dem Moment das currentDocument ist) wo sich der User befindet, das zur gleichen Zeit auch geöffnete ( in einem anderen Fenster) Dokument K ansprechen kann.

Hätte mir nämlich was in dieser Art vorgestellt. Ich erstelle den Dokumentenlink und Kopier den in das enstprechende Feld des Dokumentes K. Doch wie spreche ich das bereits bestehende und geöffnete Dokument K aus dem Dokument U an?

Dim itmLink As New NotesRichTextItem(docK,"linkD")  ' Richtext Feld erstellen
itmLink.AppendText("Link zum Dokument  --> ") 
Call itmLink.AppendDocLink(docSource.Document,"Maßnahme") 'um Dokumentenlink zur erstellen
itmLink.Update



Hoffe ich habe das Problem halbwegs verständlich rüber bringen können.

Oliver
Grüße aus dem schönen Südtirol
Oliver C

Es gibt keine dummen Fragen, sondern nur dumme Antworten

Laufen ist der ideale Ausgleich zu jeglicher Arbeit, denn beim Laufen muss man nicht Denken.

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Wenn Du im QueryOpen der Maske von Dokument U auf NotesUIWorkspace.CurrentDocument zugreifst, dann ist das noch das zuvor geöffnete Dokument. Schreib Dir das in eine Globale Variable, dann kannst Du im QueryClose darauf zugreifen, und Dein Voodoo machen. Achtung: Richtext- Stunts werden in Dokument K erst nach Schliessen und erneutem Öffnen sichtbar.

Ich würde allerdings hier mit einem Feld "DokU_unid" arbeiten und einer Schaltfläche oder einem Hotspot (die ja wie ein Doclink aussehen kann), die per LotusScript das DokU holt und per ws.EditDocument öffnet. Richtextfelder sind schlecht zu warten, und mit der UNID in einem Feld kannst Du auch Lookups in DokU machen ala "Wer verlinkt alles auf mich", und dann diese wieder als Doklink in DokU anzeigen. Ausserdem ist eine Suche "wo sind verwaiste DokLinks" oder ein "Copy & Paste" unter Beibehaltung des Links machbar, was mit Richtextfeldern ziemlich schwierig ist.
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline RunRevilo

  • Junior Mitglied
  • **
  • Beiträge: 51
  • Geschlecht: Männlich
Hallo Tode,

danke für den Hinweis mit dem QueryOpen und danke für den Vorschlag mit dem Feld "DokU_unid".
Dieser klingt doch vernünftiger. Werde versuchen diesen um zu setzen.

Oliver
Grüße aus dem schönen Südtirol
Oliver C

Es gibt keine dummen Fragen, sondern nur dumme Antworten

Laufen ist der ideale Ausgleich zu jeglicher Arbeit, denn beim Laufen muss man nicht Denken.

Offline RunRevilo

  • Junior Mitglied
  • **
  • Beiträge: 51
  • Geschlecht: Männlich
Hallo,

steh gerade ein wenig auf der Leitung.

Wenn ich im queropen vom Dokument U auf das Dokument K zugreifen will mit:

Set docK = ws.CurrentDocument

bekomme ich die Fehlermeldung "Variant does not contain an object".
Wo muss ich eigentlich den NotesUiWorkspace initalisieren. In den globeln Berich der Maske für Dokument U?


Das Dokument U wir durch folgenden Code einer Schaltfläche aufgerufen, eigentlich neu erstellt und im Edit-Modus geöffnet.

Code
Dim docU As NotesDocument
Set docU = New NotesDocument(dbDoc)
With docU 
    .Form="DokumentenAblage"
    .Ndg=docSource.FieldGetText("Ndg")
   .Name=docSource.FieldGetText("Name")
   .Vorname=docSource.FieldGetText("Vorname")
   Dim uidoc As NotesUIDocument
   Set uidoc= ws.EditDocument(True,docU)
End With

Könnte sein dass durch die Zeile Set uidoc=ws.EditDocument(true,docU) der Code im Queryopen von Dokument U (docU) gar nicht funktionieren kann, da dort ws.currentdocument nicht mehr auf docK zeigt sondern bereits auf docU?

Oliver
Grüße aus dem schönen Südtirol
Oliver C

Es gibt keine dummen Fragen, sondern nur dumme Antworten

Laufen ist der ideale Ausgleich zu jeglicher Arbeit, denn beim Laufen muss man nicht Denken.

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Du musst natürlich ws im Queryopen neu definieren. Das sind zwei völlig voneinenader getrennte Adressbereiche, die keinerlei Variablen "sharen" (leider)... Das neue Dokument läuft in einem völlig eigenen LotusScript- Thread, der von Deinem aufrufenden Script nix mitbekommt...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Im QueryOpen ist ja noch gar kein Dokument offen - QueryOpen ist ja das Vorspiel dazu.
Der Zugriff auf das Dokument gelingt Dir im QueryOpen über den Parameter Source. Aber es ist unbedingt zu beachten, daß Dir in diesem Moment bei weitem noch alle Eigenschaften des Objekts zu Verfügung stehen.

Bernhard

Offline RunRevilo

  • Junior Mitglied
  • **
  • Beiträge: 51
  • Geschlecht: Männlich
Hallo,

ich habe leider immer noch Probleme mit dem Zugriff auf das aufrufende Dokument.
Vielleicht übersehe ich einfach was, deshalb versuche ich noch mal die Situation dar zu stellen.

Mitarbeiter befindet sich in der Datenbank Kunden im Dokument Kontakt.
Dort ruft er über eine Schaltfläche folgenden Code auf:

Code
Sub Click(Source As Button)
	Dim s As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Set db = s.CurrentDatabase
	
	Dim doc As NotesUIDocument
	Set doc =ws.Currentdocument 
	Dim servername As String
	servername="xxxxxxxx"
	Dim docProfil As notesdocument
	Set docProfil = db.GetProfileDocument("ProfilEinstellungen")
	Dim dbname As String
	Dim item As notesitem
	Set item = docProfil.GetFirstItem("Pfad")
	dbname= Cstr(item.Values(0))
	Call doc.Save
' die Datenabnk wo die Dokumente abgelegt werden wird geöffnet
        Dim dbDoc As New notesdatabase (servername,dbname)
' neues Ablage Dokument wird erstellt, Daten übergeben und im Edit Modus geöffnet	
	Dim docAblage As NotesDocument
	Set docAblage = New NotesDocument(dbDoc)
	With docAblage 
		.Form="DokumentenAblage"
		.Ndg=doc.FieldGetText("Ndg")
		.Name=doc.FieldGetText("Name")
		.Vorname=doc.FieldGetText("Vorname")
		.Hofname=doc.FieldGetText("Hofname")
		.Geburtsdatum=doc.FieldGetText("Geburtsdatum")
		.Kundenbetreuer=doc.FieldGetText("Kundenbetreuer")
		.Filiale=doc.FieldGetText("Filiale")
		Dim uidoc As NotesUIDocument
		Set uidoc= ws.EditDocument(True,docAblage)
	End With
Exit Sub
   

Dadurch öffnet sich in einem neuen Fenster das Dokument DocAblage, welches sich in der Datenbank Dokumente befindet, im Bearbeiten Modus
In der Maske DocAblage habe ich folgenden Code.

Unter (Globals) DokumentenAblage - Declarations
Dim docK as NotesUiDocument

und im Queryopen der Masket DokumentenAblage
Code
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
	Dim workspace As New NotesUIWorkspace
	Set docK=workspace.currentdocument
'nur um zu sehen ob ich auf docK Zugriff habe
	Msgbox  "docK " + docK.fieldgettext("form")
End Sub
und genau hier bekomme ich die Fehlermeldung "Variant does not contain an object"

Wenn ich die Meldung bestätige befinde ich mich dann im neu angelegten Dokument DocAblage im Bearbeitungsmodus, was ja gewünscht wäre.

Aber ich bekomme keinen Zugriff mehr auf das noch offene Dokument Kontakt in der andernen Datenbank Kunden, in welchem ich ja dann die UNID des Dokuments DocAblage zurück schreiben möchte.

Wo mache ich was falsch?
Schon mal Danke für die Tips

Oliver
Grüße aus dem schönen Südtirol
Oliver C

Es gibt keine dummen Fragen, sondern nur dumme Antworten

Laufen ist der ideale Ausgleich zu jeglicher Arbeit, denn beim Laufen muss man nicht Denken.

Offline DerVissi

  • Frischling
  • *
  • Beiträge: 37
  • Geschlecht: Männlich
Hallo Oliver,

sorry meine erste Meldung war falsch

Du brauchst zuerst noch das NotesUiDocument
und dann kannst du darüber das NotesDocument holen.

Gruß
Andreas
« Letzte Änderung: 25.09.14 - 10:40:00 von DerVissi »

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Probier mal, den Code statt im QueryOpen ins z.B. Initialize zu schieben, ich bin vorgestern darüber gestolpert, dass sich da wohl mit 9.0.1 was geändert hat, und man u.U. im QueryOpen den Zugriff auf das "öffnende" Dokument nicht mehr hat... Hat mich Stunden gekostet, rauszufinden, warum Code, den ich schon seit Jahren verwende, plötzlich nicht mehr tut...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline RunRevilo

  • Junior Mitglied
  • **
  • Beiträge: 51
  • Geschlecht: Männlich
Vielen Dank,

der entscheidende Tip war den Code ins Initialize zu schieben und schon klappte es perfekt.

@Tode bin dir ein Bier schuldig (evtl. beim Entwicklercamp 2015)

Oliver
Grüße aus dem schönen Südtirol
Oliver C

Es gibt keine dummen Fragen, sondern nur dumme Antworten

Laufen ist der ideale Ausgleich zu jeglicher Arbeit, denn beim Laufen muss man nicht Denken.

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Mal sehen... Wir werden wahrscheinlich würfeln, ob Bernhard oder ich zum Entwicklercamp gehen... Wenn Bernhard geht, dann kannst Du ihm "stellvertretend" das Bier bezahlen... *g*
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz