Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Hedwig14 am 08.10.08 - 16:34:39

Titel: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 08.10.08 - 16:34:39
Hallo,

ich habe in mehreren Dokumenten eine ReplicaID einer bestehenden Datenbank.
Anhand dieser ReplicaID möchte ich den Pfad und den Titel der Datenbank auslesen.

mit

OpenDatabaseByReplicaID

und

OpenByReplicaID

bin ich bislang gescheitert. hat jemand noch eine andere Idee
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Driri am 08.10.08 - 16:56:06
Der Trick besteht darin, das NotesDatabase-Objekt vorher mit New zu deklarieren.

Also so in etwa :

Zitat
Dim db As New NotesDatabase("","")
Call db.OpenByReplicaID("Server", "ReplicaID")
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Axel am 08.10.08 - 19:11:10
bin ich bislang gescheitert. hat jemand noch eine andere Idee

Vielleicht, aber nur wenn du uns verrätst wo du gescheitert bist. ´


Axel
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 09.10.08 - 09:15:52

Ich erhalte diese Fehlermeldung:

Variant does not contain an object

Das ist mein Code:

Sub Click(Source As Button)
   
   Dim s As New NotesSession
   Dim directory As NotesDbDirectory
   Dim db As New NotesDatabase("","")
   Dim repID As String
   Dim server As String
   
   Dim CGdb As NotesDatabase
   Dim CGview As NotesView   
   Dim CGdoc As NotesDocument
   
   Set CGdb = s.CurrentDatabase
   Set CGview = CGdb.GetView("0. Corporate Desktop(s) Categorized")
   Set CGdoc = CG.view.getfirstdocument
   
   While Not(doc Is Nothing)
      If CGdoc.form = "f_database_icon" Then
         repID = CGdoc.t_db_replica_id(0)
         server = CGdoc.disp_nam_db_server(0)
         'Set directory = s.GetDbDirectory(server)
         
         Call db.OpenByReplicaID(server , repID)
         Print db.Title, , db.FilePath
         
      End If
      Set CGdoc = CG.view.getnextdocument(CGdoc)      
   Wend
   
End Sub
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Glombi am 09.10.08 - 09:17:25
Statt
Set CGdoc = CG.view.getfirstdocument
muss es
Set CGdoc = CGview.getfirstdocument
heissen

und statt
Set CGdoc = CG.view.getnextdocument(CGdoc)     
eben
Set CGdoc = CGview.getnextdocument(CGdoc)     


Tipp: Wenn Du den Debugger nutzt, siehst Du gleich, wo der Fehler ist.



Andreas
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: m3 am 09.10.08 - 09:19:22
Zitat
Set CGdoc = CG.view.getfirstdocument
   
   While Not(doc Is Nothing)
Da passt was nicht zam.

Option Declare einschalten und ev. noch einen LS-Kurs besuchen?
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 09.10.08 - 15:30:18
.... da waren wieder die berühmten Tomaten auf den Augen !

DANKE !

Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 14.10.08 - 12:13:51
Ich habe doch noch eine Frage:

Mit
Call db.OpenByReplicaID(server , eval)
wird die Datenbank versucht zu öffnen. das ist nicht mein Ziel.

Ich will die DB nicht öffnen sondern nur die Eigenschaften auslesen.
Mein Ziel ist es anhand der Rep ID die Eigenschaften der DB auszulesen.

Gibr es ggf eine Alternative zu "Call db.OpenByReplicaID"

Hier mein Script.
Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim directory As NotesDbDirectory
   Dim db As New NotesDatabase("","")
   Dim repID As String
   Dim server As String
   Dim datei As String
   Dim eval, alterString, neuerString As String
   
   Dim CGdb As NotesDatabase
   Dim CGview As NotesView   
   Dim CGdoc As NotesDocument
   
   Set CGdb = s.CurrentDatabase
   Set CGview = CGdb.GetView("0. Corporate Desktop(s) Categorized")
   Set CGdoc = CGview.getfirstdocument
   alterString = ":"
   neuerString = ""
   
   While Not(CGdoc Is Nothing)
      
      If CGdoc.form(0) = "f_database_icon" And CGdoc.k_db_type(0) = "spec" Then
         server = CGdoc. t_db_server(0)   
         repID = CGdoc.t_db_replica_id(0)
         eval = Replace(repID, ":", "")
         
         Call db.OpenByReplicaID(server , eval)
         Print db.Title
         
      End If
      Set CGdoc = CGview.getnextdocument(CGdoc)      
   Wend   
End Sub
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: DAU-in am 14.10.08 - 12:17:40
in der Hilfe:

A database must be open in order to access all its properties and methods.

grüsse

Dau-in
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 14.10.08 - 12:26:03

So erhalte ich aber die Meldung:

This Datbase object is already open as (Servername)

Wie kann ich das umgehen ?
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Glombi am 14.10.08 - 12:52:47
Kann es sein, dass die gleiche Datenbank mehrfach in  CGdoc  vorkommt?

Falls ja, kannst Du Dir bspw. den letzten Wert für die Repl ID merken:


Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim directory As NotesDbDirectory
   Dim db As New NotesDatabase("","")
   Dim repID As String
Dim repID_alt As String
   Dim server As String
   Dim datei As String
   Dim eval, alterString, neuerString As String
   
   Dim CGdb As NotesDatabase
   Dim CGview As NotesView   
   Dim CGdoc As NotesDocument
   
   Set CGdb = s.CurrentDatabase
   Set CGview = CGdb.GetView("0. Corporate Desktop(s) Categorized")
   Set CGdoc = CGview.getfirstdocument
   alterString = ":"
   neuerString = ""
   repID_alt = ""
   While Not(CGdoc Is Nothing)
     
      If CGdoc.form(0) = "f_database_icon" And CGdoc.k_db_type(0) = "spec" Then
         server = CGdoc. t_db_server(0)   
         repID = CGdoc.t_db_replica_id(0)
         eval = Replace(repID, ":", "")
repID = eval(0)
if repID_alt <> repID then         
         Call db.OpenByReplicaID(server , repID)
end if
         Print db.Title
repID_alt = repID
         
      End If
      Set CGdoc = CGview.getnextdocument(CGdoc)     
   Wend   
End Sub




Tipp:
Dim eval, alterString, neuerString As String
macht man nicht, sonderm
Dim eval as variant
dim alterString as string, neuerString As String



Andreas
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 14.10.08 - 13:22:19
hallo Andreas,
vielen Dank für Deinen Hinweis. Die Idee ist nicht schlecht.
Leider bleibt der Fehler bestehen: This database object is already open .....
(Sie ist auch durch definitiv User im Gebarauch)

Dim s As New NotesSession
   Dim directory As NotesDbDirectory
   Dim db As New NotesDatabase("","")
   Dim repID As String
   Dim server As String
   Dim datei As String
   Dim eval As String
   Dim alterString As String, neuerString As String, repID_alt  As String
   
   Dim CGdb As NotesDatabase
   Dim CGview As NotesView   
   Dim CGdoc As NotesDocument
   
   Set CGdb = s.CurrentDatabase
   Set CGview = CGdb.GetView("0. Corporate Desktop(s) Categorized")
   Set CGdoc = CGview.getfirstdocument
   alterString = ":"
   neuerString = ""
   repID_alt = ""
   
   While Not(CGdoc Is Nothing)
      
      If CGdoc.form(0) = "f_database_icon" And CGdoc.k_db_type(0) = "spec" Then
         server = CGdoc. t_db_server(0)   
         repID = CGdoc.t_db_replica_id(0)
         
         If server = "%INI%ICODEX_CD_SPK_APPLSERVER" Then
            server = "S276LN22/SPKHolstein/DE"
         End If
         
         eval = Replace(repID, ":", "")
         repID = eval
         
         If repID_alt <> repID Then         
            Call db.OpenByReplicaID(server , repID)
         End If
         Print db.Title
         repID_alt = repID
         
      'Textdatei erstellen
         Datei = "d:\cg.txt"
         Open datei For Append Access Write As #1
         Print #1, Cstr(db.Title) & " " & repID
         Close #1
         
      End If
      Set CGdoc = CGview.getnextdocument(CGdoc)      
   Wend   


Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: m3 am 14.10.08 - 13:45:40
OpenByReplicaID liefert sogar einen Rückgabewert - wie wärs wenn Du den abfängst und entsprechend reagierst, anstatt diesen mit "Call" einfach zu ignorieren?
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: koehlerbv am 14.10.08 - 13:53:34
Eine weitere Ignoranz ist dies:

Code
         If server = "%INI%ICODEX_CD_SPK_APPLSERVER" Then
            server = "S276LN22/SPKHolstein/DE"

Und wenn nicht? Das wird dann ein unkontrollierbarer Zustand.

Bernhard
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 14.10.08 - 14:09:08
so habe ich es schon probiert, es kommt leider die selbe meldung:


   If db.OpenByReplicaID( server , repID ) Then
    Print db.Title
   End If
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: koehlerbv am 14.10.08 - 14:15:24
Und welche Werte stehen in server und replID vor der Verwendung von OpenByReplicaID?
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 15.10.08 - 10:42:33
Die DB Eigenschaften werden mir angezeigt. Der Fehler kommt erst danach.
Alsob ich die DB erst wieder schließen muss damit die nächste DB aus dem folgenden Dok ausgelesen werden kann. Hat jemand eine Idee wie ich das machen kann ?

   While Not(CGdoc Is Nothing)
      
      If CGdoc.form(0) = "f_database_icon" And CGdoc.k_db_type(0) = "spec" Then
         server = CGdoc. t_db_server(0)   
         repID = CGdoc.t_db_replica_id(0)
                     
         eval = Replace(repID, ":", "")
         repID = eval
         
         If db.OpenByReplicaID( server , repID ) Then
            Msgbox          db.Title   
            Msgbox          db.filepath
            Msgbox          db.server

         End If
         
      End If
      
      Set CGdoc = CGview.getnextdocument(CGdoc)      
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 15.10.08 - 10:49:41

könnte ich

Delete linkDb

hierfür verwenden ? oder was macht notes dann ?
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: DAU-in am 15.10.08 - 12:08:39
wenn du ein
set db = nothing
am Ende der Schleife setzt, was macht er dann?
Titel: Re: "Set db" anhand der ReplicaID
Beitrag von: Hedwig14 am 16.10.08 - 11:06:15
Ich habe jetzt

  Dim db As New NotesDatabase("","")

am Anfang der Schleife eingestellt. Jetzt klappt es !

Vielen Dank an alle !

 :love: :love: :love: :love: :love: :love: :love: :love: :love: