Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: gapee am 14.01.04 - 08:59:30

Titel: Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 08:59:30
Tach auch.

Innerhalb der Form habe ich unter 'Globals' ein Objekt vom Typ NotesDocument gedimt. Dieses Dokument wird im 'QueryOpen-Event' zum Leben erweckt. Der Vollständigkeit halber muss ich noch hinzufügen, dass dieses Dokument aus einer anderen als der aktuellen Datenbank befruchtet wird.
So.
in einem anderen Event, dem 'PostOpen-Event' versuche ich auf dieses bis zum diesem Zeitpunkt von 'Nothing' verschiedene Dokument zuzugreifen. Aber, und das ist das Problem, es ist tot, d.h Nothing.

Kann mir jemand sagen, was da abgeht? Hängt das vielleicht damit zusammen, das dieses Dokument aus einer anderen DB geladen wird? Warum verliert es beim Event-Wechsel die Referenz?
Aber warum sollte ich dann überhaupt noch ein Objekt global definieren?

Vielen Dank für Eure Mühe im voraus.......


Gruss Gapee




Bitte helft mir Obi-Wan Kenobi, Ihr seid meine letze Hoffnung
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Glombi am 14.01.04 - 09:10:48
Bin zwar nicht Obi-Wan, versuche es aber trotzdem  ;D

Lass mal den Debugger laufen und prüfe, ob das Objekt tatsächlich im QueryOpen gesetzt wurde.

Falls ja, kann es sein, dass im PostOpen nochmal ein Dim... mit dem gleichen Namen gemacht wird?

Andreas
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 09:30:13
TACH!

Danke erst mal für Deinen Beitrag.
Also ich habe nochmal nachgeschaut:

1. Mit dem Debugger ist in der Tat ein Dokument im 'QueryOpen-Event' gesetzt worden und

2. Eine erneute Deklaration im 'PostOpen-Event' findet nicht statt.

Das ist doch alles sehr sehr merkwürdig.
Hast Du vielleicht eine andere Idee? Bin über jeden Denkansatz dankbar

Gruss
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Glombi am 14.01.04 - 09:44:40
Im Debugger steht das dann unter Globals, ok?
Wenn Du dort das Objekt des NotesDocument erweiterst, kannst Du bspw. auf die Items dort zugreifen?
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 09:56:13
Ja genau. Ist alles da...
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Glombi am 14.01.04 - 09:59:58
Poste mal den Code für QueryOpen und PostOpen. Es sieht ja alles ok aus.
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 10:15:50
OK. Also dann:

Globals (NotesForm):

Public WFDbProfile As NotesDocument
Public SetupDbProfile As NotesDocument


QueryOpen-Event:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
   
   Const cSetupProfileView = "DBPROFILEHIDDEN"
   
   Dim Session As New NotesSession
   
   Dim SetupDb As NotesDatabase
   Dim SetupProfileView As NotesView
   
   Dim cSetupServer As String
   Dim cSetupFilename As String
   Dim cMessage As String
   
   ' grab workflow-database profile document
   Set WFDbProfile = GetDBProfileDocument Hieran nicht stören.Alles bestens
   
   If( Source.IsNewDoc ) Then
      
      If( Not WFDbProfile Is Nothing ) Then
         
         cSetupServer = WFDbProfile.SetupDbServer(0)
         cSetupFilename = WFDbProfile.SetupDbFilename(0)
         
         Set SetupDb = Session.GetDatabase( cSetupServer, cSetupFilename, False )
         If( Not SetupDb Is Nothing ) Then
            
            Set SetupProfileView = SetupDb.GetView( cSetupProfileView )
            Set SetupDbProfile = SetupProfileView.GetFirstDocument         ' hier ist es da
            If( Not SetupDbProfile Is Nothing ) Then
                              continue = True
            Else
               
               cMessage = |Das Profil-Dokument für die Invoice-Master Setup-Datenbank ist nicht vorhanden.
Bitte verständigen Sie den System-Administrator|
               
               Messagebox cMessage, 64, "Datenbank-Fehler"
               continue = False
            End If
         Else
            
            cMessage = |Die Invoice-Master Setup-Datenbank konnte nicht erreicht werden.
               Bitte kontaktieren Sie den System-Administrator|
            
            Messagebox cMessage, 64, "Datenbank-Fehler"
            continue = False
         End If
      Else   
         ' don't allow to create a new user profile (let admin create a db profile first)         
         
         cMessage = |Wegen eines fehlenden Datenbank-Profil-Dokumentes können Sie
            leider zur Zeit kein Benutzer-Profil anlegen.
Bitte kontaktieren Sie den System-Administrator|
         
         Messagebox cMessage, 48, "Datenbank-Setup-Fehler"
         
         Continue = False
      End If
   End If
   
End Sub

Und schliesslich das
PostOpen-Event:
Sub Postopen(Source As Notesuidocument)

stop
   If( Not SetupDbProfile Is Nothing ) Then   ' und hier nicht mehr
      
      With Source.Document
         ' grab some settings from setup database's profile document
         
         .System = SetupDbProfile .System(0)
         .SystemGUID = SetupDbProfile .SystemGUID(0)
         .SeratioAdress = SetupDbProfile .SeratioAdress(0)
         .SeratioPort = SetupDbProfile .SeratioPort(0)
         .ArchiveAdress = SetupDbProfile .ArchiveAdress(0)
         .ArchivePort = SetupDbProfile .ArchivePort(0)
         
         Call .Save(True, True)
      End With
   End If

End Sub

Hoffentlich hilft's
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Semeaphoros am 14.01.04 - 10:24:04
Mag sein, dass er das Public im Global nicht so gerne hat, weiss ich aber nicht wirklich.

Andere frage: hast Du in Deinem Code jeweils Option Declare (oder Option Explicit) gesetzt? Vielleicht gibt das ja an, was ihm Bauchweh macht.
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Glombi am 14.01.04 - 10:24:30
Sieht alles gut aus, bis auf

1)
If( Source.IsNewDoc ) Then...

D.h. das SetupDbProfile wird nur bei neuen Dokumenten gesetzt.

2) Es handelt sich nicht wirklich um ein Profildokument, oder? Denn dann kann man es nicht so
Set SetupDbProfile = SetupProfileView.GetFirstDocument        
setzen.


Kannst Du mal zweckes Tests folgendes machen:
If( Not SetupDbProfile Is Nothing ) Then
msgbox SetupDbProfile.System(0)
                              continue = True


Dann müsste ja was ausgegeben werden.

Andreas
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 10:41:25
Zu 1) Es soll auch nur dann etwas gesetzt werden, wenn Source.IsNewDoc = true. Das ist in Ordnung so

Zu 2) Ich verwende nicht so gerne 'echte' Profil-Dokumente.
Klar, die Anweisung Set SetupDbProfile = SetupProfileView.GetFirstDocument verwirrt in diesem Zusammenhang etwas, aber auch das ist in Ordnung.

Und der Codevorschlag von Dir produziert mir innerhalb des 'QueryOpen'-Events produziert die richtige Ausgabe.

Ich kann mir das einfach nicht erklären, warum im 'PostOpen'-Event einfach nichts mehr da ist.
Könnte es möglicherweise sein, dass die Dok-Referenz verschwindet, weil es aus einer anderen Datenbank kommt?
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Glombi am 14.01.04 - 10:47:59
Könnte es möglicherweise sein, dass die Dok-Referenz verschwindet, weil es aus einer anderen Datenbank kommt?
Eigentlich nicht. Versuche mal, das "Public" in den Globals durch "Dim" zu ersetzen.

Wenn das auch nicht geht, nimm das mal aus den Globals raus und deklariere es mit Dim unter (Declarations).

Ansonsten bin ich genauso ratlos wie Du  ???

Andreas
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 11:01:03
Alles ausprobiert.
Leider ist das Ergebnis kein anderes.

Auf jeden Fall bedanke ich mich bei Dir, für Deine zahlreichen Beiträge.

Gruss
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: animate am 14.01.04 - 11:03:13
ich glaube, das hängt damit zusammen, dass du das SetupDoc-Objekt aus ner "fremden" DB holst.
nach dem QueryOpen wird das SetupDB-Objekt zerstört und damit wird dem SetupDoc-Objekt irgendwie die Existenzgrundlage entrissen und es wird auch zerstört.
Was du mal versuchen könntest, ist die SetupDB auch Global zu deklarieren.
Vielleicht sogar das NotesSession-Objekt
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Semeaphoros am 14.01.04 - 11:03:45
Das mit dem Dim statt Public hab ich ja auch schon angetönt - ohne Reaktion. Ebenso hab ich auf meine Frage, ob

Option Declare

gesetzt ist, keine Angaben bekommen. Wie sieht das denn aus?
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: animate am 14.01.04 - 11:11:27
alternativ könntest du dir ne eigene Klasse basteln.
Davon ein Objekt erzeugen und da im QueryOpen die Werte aus dem Profildok lesen und dein eigenes Objekt als global deklarieren
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 11:49:47
Das mit dem Dim statt Public hab ich ja auch schon angetönt - ohne Reaktion. Ebenso hab ich auf meine Frage, ob

Option Declare

gesetzt ist, keine Angaben bekommen. Wie sieht das denn aus?

Danke. Hab ich alles schon versucht, bisher ohne Erfolg.

Was aber auch kein Erfolg gebracht hat, war das Setzen der SetupDb ins 'global-scope' der Form. Anscheinend hat Notes tatsächlich ein Problem damit datenbankfremde Dokumente ohne Referenz auf die referenzierte DB zu erhalten, wenn ein Event-Wechsel vollzogen wird
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: animate am 14.01.04 - 11:54:00
nicht nur beim Eventwechsel. Du kannst das z.B. auch nicht als Funktionsparameter übergeben (ich glaube jedenfalls, mich an sowas erinnern zu können).
Also sobald du aus dem Scope, wo du das Teil instanziiert hast rauskommst, is es wech.
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Semeaphoros am 14.01.04 - 11:54:04
In was für einem Global hast Du das denn sonst gesetzt gehabt? Wenn das Formularweit gelten soll (sprich bei verschiedenen Events), dann gehört das doch ins Form-Globals?
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: animate am 14.01.04 - 11:56:01
>In was für einem Global hast Du das denn sonst gesetzt gehabt? Wenn das Formularweit gelten soll (sprich bei verschiedenen Events), dann gehört das doch ins Form-Globals?

gapee hatte nur das Document-Objekt global deklariert, das war das Problem. Er/Sie muss zusätzlich das DB-Objekt global deklarieren
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: Semeaphoros am 14.01.04 - 11:57:56
Ach so, ja klar, jetzt verstehe ich. Danke.
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 12:01:41
alternativ könntest du dir ne eigene Klasse basteln.
Davon ein Objekt erzeugen und da im QueryOpen die Werte aus dem Profildok lesen und dein eigenes Objekt als global deklarieren

Ich habe mir eine andere Strategie für die Lösung meines Problems überlegt. Und zwar speichere ich mir die gewüschten Daten in String-Variaben und im 'PostOpen-Event' schreibe ich sie in mein Dokument.

Eine eigene Klasse zu basteln ist aber an und für sich eine gute Idee, würde aber den Rahmen meiner Anwendung sprengen, zumal Notes eigentlich die Methodik der globalen Variablen unterstützt bzw. unterstützen sollte. Das heisst, dass ein Workaround denkbar wäre, allerdings am Notes-Mechanismus vorbeigeht.

Ich werde mein Problem und alle mit diesem Thread in Zusammenhang stehenden Beiträge bei IBM's Notes Portal absetzen. Denn vermutlich haben wir schlicht und ergreifend einen globalen BUG gefunden.

Gruss
Gapee
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: ata am 14.01.04 - 12:04:32
... ich würde in deinem Fall mit einem Profildokument arbeiten. Das kannst du von überall aus sehr schnell initialisieren - sogar mit Frormeln verwenden...

Was spricht dagegen?

ata
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: animate am 14.01.04 - 12:05:21
war natürlich Quatsch, was ich geschrieben habe. ich dachte das setzen der DB in die Globals hat Erfolg gebracht - hat es aber nicht.
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: ata am 14.01.04 - 12:08:59
... ich hatte das auch schon probiert, bin aber nicht zum Zuge gekommen. Im Forum müsste es dazu auch schon Beiträge geben. Daher löse ich das mit Profildokumenten...

ata
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 12:11:51
>gapee hatte nur das Document-Objekt global deklariert, das war das Problem. Er/Sie muss zusätzlich das DB-Objekt global deklarieren

Nein. Wie weiter oben geschildert geht das leider auch nicht.

Die Sache mit der eigenen gebastelten Klasse ist an und für sich eine gute Idee, würde aber den zeitlichen Rahmen meiner Applikation sprengen.
Ich denke, ich werde dieses Problem und alle mit diesem Thread in Zusammenhang stehenden Beiträge bei IBM's Notes-Portal veröffentlichen. Vielleicht, und das nehme ich stark an, haben wir hier und heute einen BUG gefunden. Denn das Konzept der globalen Objekte wird von Notes eigentlich unterstützt bzw. sollte vollständig unterstützt werden. Selbst ein Dokument aus einer 'fremden' DB hat eine DokID und damit die Referenz die es braucht um zu existiern.

Für die Lösung meines Problems habe ich mir einfach im 'QueryOpen-Event' die benötigten Daten aus dem Profil-Dokument zwischengespeichert und im 'PostOpen-Event' auf mein Dokument zurückgeschrieben.

Gruss
Gapee
Titel: Re:Globales NotesDocument Objekt???
Beitrag von: gapee am 14.01.04 - 12:17:10
Sorry, ich sehe gerade das ich zweimal denselben Kram gepostet habe.
Beim ersten Posting hatte ich den Eindruck, er wäre nicht gespeichert.

MEA CULPA