Ich hab das jetzt mal nachgebaut:
Bei mir funktioniert folgendes (in der Ansicht habe ich @Text (@NoteID) als erste sortierte Spalte):
Sub Initialize
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
doc.Feldx = "irgendwas"
Dim db As NotesDatabase
Set db = doc.ParentDatabase
Dim view As NotesView
Set view = db.GetView ("noteid")
Dim iddoc As NotesDocument
Dim id As String
id = "NT" & Right ("00000000" & doc.NoteID, 8)
Set iddoc = view.GetDocumentByKey (id)
Msgbox iddoc.Feldx (0)
End Sub
Msgbox gibt korrekterweise nichts aus.
Dagegen
Sub Initialize
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
doc.Feldx = "irgendwas"
Dim db As NotesDatabase
Set db = doc.ParentDatabase
Dim iddoc As NotesDocument
Set iddoc = db.GetDocumentByID (doc.NoteID)
msgbox iddoc.Feldx (0)
End Sub
geht es nicht mit db.GetDocumentByID, da dann das Dokument im Speicher verwendet wird (hatte mir das gedacht, musste ich aber erst überprüfen). Hier wird also "irgendwas" ausgegeben.
Beim Evaluate bekommst Du die NoteID so zurück, wie sie in der Ansicht steht. Bei doc.NoteID musst Du ein "NT" und den Rest 8-stellig mit führenden Nullen aufbauen. Da wäre mir das Evaluate lieber, falls sich da mal was ändert, ist aber sicher Geschmacksache.
db.GetDocumentByID bringt Dich aber auf keinen Fall weiter.
@Peter Klett
Wenn man auf das NotesSession Objekt verzichtet und die db einfach über db.Open(Server, Pfad) öffnet, dann kann man auch GetDocumentById verwenden.
Private Sub showEingabe(Byval db3name As String, Byval db3server As String, Byval NoteId3 As String)
Dim session3 As New NotesSession
Dim doc3 As NotesDocument
Dim db3 As New NotesDatabase( "", "" )
' Set db3 = session3.GetDatabase(db3server, db3name)
Call db3.Open( db3server, db3name )
Set doc3 = db3.GetDocumentByID(noteId3)
If doc3 Is Nothing Then
Print "doc3 is nothing"
Else
Print Str$(Now()) & " doc3.eingabe = " & doc3.eingabe(0)
End If
End Sub
- Ich habe diese Sub in einer Maske eingebunden.
- ich gebe in das Feld "eingabe" etwas ein (z.B. "1") und speichere, danach rufe ich die Sub auf --> "1"
- das Dokument verbleibt weiter im Edit-Mode
- ich gebe in das Feld "eingabe" etwas anderes ein (z.B. "2") ohne zu speichern und rufe die Sub auf --> immer noch "1"
Benutze ich stattdessen "Set db3 = session3.GetDatabase(db3server, db3name)" (oben auskommentiert), dann tritt der von Dir beschriebene Effekt ein, daß über das im Client nur einmal verwendete NotesSession Objekt das in-memory Dokument verwendet wird. Folgerichtig wird dann der nicht gespeicherte Wert "2" angezeigt.
Ich bin immer noch der Meinung, daß es auch ohne Ansicht geht und direkt die DocumentId verwendet werden kann. Wie sich das ganze performancetechnisch verhält, müßte man noch gucken. Mir fehlt im Moment auch die Zeit auszutesten, wie weit man db3 in die Globals schieben kann. Wenn das geht, dann sollte die Sub sehr schnell sein.
Gruß,
Th.
P.S. @cococo69 Entschuldige, Deine Frage in dem Thread war eine andere und es geht Dir eigentlich um die GetDocumentByKey Fehler - vielleicht kommt aber trotz des "Hijacking" etwas Gutes für Dich bei dieser Diskussion heraus. ;)
Mit einem Evaluate geht auch so etwas in der Maske (gleiches Scenario wie oben):
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim unid As String
Dim res As Variant
Set uidoc = ws.CurrentDocument
unid = uidoc.Document.UniversalID
res = Evaluate (|@GetDocField("| & unid & |"; "eingabe")|)
Print Str$(Now()) & " eingabe = " & res(0)
End Sub
D.h. mit @GetDocField kann man sich - sofern man in der gleichen DB arbeitet - das DB.Open sparen. Es wird auch hier der Inhalt des NotesItems aus dem Backend angezeigt.
Schönen Feierabend wünsch' ich.
Eine (evtl übertriebene) Anmerkung meinerseits:
Bei Codestücken wie diesen läuten bei mir immer die Alarmglocken:
res = Evaluate (|@GetDocField("| & unid & |"; "eingabe")|)
Durch sowas baut man sich nämlich sehr oft (hier zwar nicht) eine Sicherheitslücke.
Wenn UNID aus einem Feld kommen würde, kann Code injiziert werden.
Deshalb sollte man, wenn möglich, immer eine konstante Formel verwenden und für die Parameterübergabe ein Dokument verwenden.
Besser wäre:
res = Evaluate (|@GetDocField(@DocumentUniqueID; "eingabe")|, uidoc.document)
(evtl muss um @DocumentUniqueID noch ein @Text() rum)
Hat weiterhin den Vorteil, dass die Formel schon bei der Compilezeit überprüft wird.
Gruß
Roland
Update:
Das Öffnen der DB darf nicht im Initialize erfolgen.
Maximal geht's bis:
Public db_global As NotesDatabase
Public isOpen_db_global As Integer
Public session_global As NotesSession
Public doc_global As NotesDocument
Sub Initialize
Set session_global = New NotesSession
Set db_global = New NotesDatabase( "", "" )
isOpen_db_global = False
' *** hier NICHT!!!!! Call openDb_global (session_global.CurrentDatabase.Server, session_global.CurrentDatabase.FilePath)
End Sub
mit
Private Sub openDb_global (Byval server As String, Byval filepath As String)
If Not isOpen_db_global Then
isOpen_db_global = db_global.Open( server, filePath )
End If
End Sub
und
Private Sub showEingabe_global(Byval myNoteId As String)
Set doc_global = db_global.GetDocumentByID(myNoteId)
If doc_global Is Nothing Then
Print "doc_global is nothing"
Else
Print Str$(Now()) & " doc_global.eingabe = " & doc_global.eingabe(0)
End If
End Sub
Der Aufruf erfolgt dann jeweils über:
Call openDb_global (session_global.CurrentDatabase.Server, session_global.CurrentDatabase.FilePath)
Call showEingabe_global(NoteId)
Wenn Performance keine Rolle spielt, braucht man diese Handstände nicht zu machen.
Wenn doch: das eine "If Not isOpen_db_global" wird zu verschmerzen sein bzw. muß man wohl in Kauf nehmen.
Schönen (rutschfreien) Dienstag wünsch' ich.
@pram
Naja, ich war mehr darauf aus, daß man sich eine LS function bauen könnte
Function getDocField(Byval unid As String, Byval itemname As String) As Variant
getDocField = Evaluate (|@GetDocField("| & unid & |"; "| & itemname & |")|)
End Function
und diese benutzt, um den "Backend"-Wert eines Items zu ermitteln aus einem beliebigen Dokument der aktuellen DB, von dem man die UNID kennt. Diese liefert jedoch nicht ein NotesDocument Objekt zurück wie GetDocumentById oder GetDocumentByUnid. Vielleicht trotzdem ganz nützlich. ;)
@cococo69
Freut mich, daß wir Dir beim Lösen Deines Problems helfen konnten.
Th.