Hallo zusammen,
ich bin noch relativ neu in der Programmierung mit Notes.
Ich habe bisher in delphi auf einer oracle Datenbank programmiert.
Gibt es in Notes die Möglichkeit, den Datensatzzeiger einer View auszulesen?
Hintergrund:
Ich habe ein Formular mit einer Subform, in der Positionen eines Lieferscheines angezeigt werden.
Wenn ich einen Doppelklick auf den Datensatz mache, geht ein neues Formular zum Ändern der Daten auf.
Wenn ich den Datensatz aber nur markiere und über die Action D"Datensatz Ändern" gehe, geht zuerst ein Dialog auf, über den ich den Datensatz auswählen muss.
Sub Click(Source As Button)
Dim detail as NotesDocument
Dim view as NotesView
Dim view2 as NotesView
Dim sPos as String
Set view = db.GetView("(Lieferposition)")
Set view2 = db.GetView("(BestellPositionenByKey)")
sPOs = Inputbox("Welche Position bearbeiten?","Position bearbeiten", "1")
If sPos <> "" Then
Call View2.Refresh()
Set detail = view2.GetdocumentByKey(thisdoc.UniversalID+"- "+sPOs)
If detail Is Nothing Then
Messagebox("Position nicht vorhanden")
Exit sub
End if
OK = ws.Dialogbox("LieferPosEdit", True, True, False, False,
False,False, "Bestellposition bearbeiten", detail)
If OK then
Call detail.Save(True, True)
Call view.Refresh()
Call uiDoc.Refresh()
End if
End if
End sub
Vielleicht kann mir einer helfen.
Wenn ich auf das Ereignis Queryopendocument zugreifen will, welches bei einem Doppelklick ausgelöst wird, funktioniert das nicht.
Gruß 7Stein
Im Queryopendocument kann ich direkt auf den mit Doppelklick angewählten Datensatz zugreifen, und das würde ich gerne auch über die Click Routine hinbekommen.
Sub Queryopendocument(Source As Notesuiview, Contnue As Variant)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim view As NotesView
Set uidoc = ws.CurrentDocument
Set collection As Source.Documents
Set doc = collection.GetFirstDocument()
Set view = Source.View
If uidoc.EditMode Then
Ok = ws.DialogBox("LieferPosEdit", True, True, False, False, False, False, "Artikelposition bearbeiten", doc)
If OK then
Call doc.Save(True, True)
Call view.Refresh()
End if
End if
Continue = false
End Sub
Diese Funktion würde ich halt gerne für die embedded view aus der Hauptmaske aufrufen.
Aber das funktioniert irgendwie nicht.
So, das funktioniert soweit ja schonaml, das alle Dokumente in der View gezählt werden.
Aber die Dokumente, die da gezählt werden, gehören ja nicht alle zu einem Datensatz der Maske.
In der Maske wird eine Bestellung angezeigt und in der embedded view alle Positionen zu der Bestellung. Die Positionen zu der Bestellung werden aber erst später, also nach der Abfrage, welches Dokument bearbeitet werden soll, zusammengebastelt.
So verstehe ich das zumindestens.
Ich habe also ca 18000 Dokumente gezählt, und angezeigt werden nur 6. Wie kriege ich von den sechsen heraus, ob da vielleicht nur eins vorhanden ist??????????
sPos = Inputbox( "Welche Position bearbeiten?", "Position bearbeiten", "1" )
If spos <> "" Then
Call view2.Refresh()
Set detail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + sPos )
If detail Is Nothing Then
Messagebox( "Position nicht vorhanden." )
Exit Sub
End If
OK = ws.Dialogbox( "LieferPosEdit", True, True, False, False, False, False, "Bestellposition bearbeiten", detail )
und so wie unten beschrieben werden die Lieferpositionn ermittelt.
ParentUNID + "-" + @Text(Pos)
Schau Dir in der Designerhilfe die GetAllDocumentsByKey - Methode der NotesView-Klasse an.
Damit kannst Du alle Doks in eine NotesDocumentCollection setzen, die Deinen Kriterien entsprechen.
NotesDocumentCollection.Count gibt Dir dann die Anzahl wieder.
In Deinem Beispielcode machst Du schon sowas ähnliches:
Set detail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + sPos )
OK, die DB ist mittlerweile angekommen (auch wenn sie 'etwas' größer war) :)
Mittlerweile blicke ich auch was Du meinst dank der DB.
Um das ganze nochmal einzugrenzen:
Wenn in der embedded View nur 1 Dok ist, willst Du beim Klick auf den Button "Liefermenge Ändern" auch gleich das Dokument anzeigen lassen !?
Hier eine mögliche Umsetzung, kannste 1:1 in den Buhtong kopieren:
Sub Click(Source As Button)
Dim docDetail As NotesDocument
Dim viewForRefresh As NotesView
Dim view2 As NotesView
Dim strPos As String
Dim coll As NotesDocumentCollection
Dim vOK As Variant
Set viewForRefresh = db.GetView( "(LieferPositionen)" )
Set view2 = db.GetView( "(BestellPositionenByKey)")
Call view2.Refresh()
Set coll = view2.GetAllDocumentsByKey(thisDoc.UniversalID)
Select Case coll.Count
Case 0:
Msgbox "Keine Position vorhanden.", 48, db.title
Case 1:
Set docDetail = coll.GetFirstDocument
Case Else:
strPos = Inputbox$( "Welche Position bearbeiten?", "Position bearbeiten", "1" )
If strPos = "" Then Exit Sub
Set docDetail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + strPos )
If docDetail Is Nothing Then
Messagebox( "Position nicht vorhanden." )
Exit Sub
End If
End Select
vOK = ws.Dialogbox( "LieferPosEdit", True, True, False, False, False, False, "Bestellposition bearbeiten", docDetail )
If vOK = True Then
Call docDetail.Save( True, True )
Call viewForRefresh.Refresh()
Call uiDoc.Refresh()
End If
End Sub
Was mir hier noch nicht gefällt, dass zweimal ein GetDocByKey läuft, da Du die Docs eh schon in der Collection hättest. Soll aber auch nur ein Beispiel sein.
Matthias