Domino 9 und frühere Versionen > ND7: Entwicklung
Dialoglistenauswahl zur Laufzeit ändern
Demian:
Moin, moin,
also lässt sich die Auswahlliste der Felder nicht direkt per Script erstellen wie mit
for i = 1 to 10
Combobox1.additem "Test " & i
next i
in Office, wenn ich das richtig sehe. :'( :'(
Also, ich bin jetzt folgendermaßen vorgegangen:
Ich habe im Designer ein unsichtbares Feld erstellt namens "ArrPersNr" erstellt. Dieses Feld fülle ich aus dem Postopen der Maske heraus mit folgendem Code:
Sub Postopen(Source As Notesuidocument)
If source.EditMode = True Then
Dim work As New NotesUIWorkspace
Dim s As New NotesSession
Dim db As Notesdatabase
Dim view As NotesView
Dim Doc As NotesDocument
Dim Feld As NotesItem
Dim arr()
Set db = s.CurrentDatabase
Set view = db.GetView("Personal - " & source.FieldGetText("Bereich")) 'Vorgabe Bereich = "Gewerbliche"
Set doc = view.GetFirstDocument
For i = 1 To view.AllEntries.Count
Redim Preserve arr(i)
arr(i) = doc.GetItemValue("PersNr")
Set doc = view.GetNextDocument(doc)
Next i
For i = 1 To view.AllEntries.count
Set doc = source.Document
Set feld = doc.GetFirstItem("ArrPersNr")
Call feld.AppendToTextList(arr(i))
Next i
End If
End Sub
Meine Dialogliste übernimmt automatisch diese Werte. Für das wechseln des Bereiches habe ich eine Aktion mit folgendem Inhalt hinterlegt:
Sub Click(Source As Button)
Dim work As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = work.CurrentDocument
If uidoc.EditMode = True Then
Dim s As New NotesSession
Dim db As Notesdatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim Feld As NotesItem
Dim arr()
'Feldwerte ändern
Set doc = uidoc.Document
If uidoc.FieldGetText("Bereich") = "Angestellte" Then
Call doc.ReplaceItemValue("Bereich","Gewerbliche")
Else
Call doc.ReplaceItemValue("Bereich","Angestellte")
End If
Call doc.ReplaceItemValue("PersNr","")
Call doc.ReplaceItemValue("Name","")
Call doc.ReplaceItemValue("Abteilung","")
Call doc.ReplaceItemValue("KstStelle","")
'Auswahlliste ändern
Set db = s.CurrentDatabase
Set view = db.GetView("Personal - " & uidoc.FieldGetText("Bereich"))
Set doc = view.GetFirstDocument
For i = 1 To view.AllEntries.Count
Redim Preserve arr(i)
arr(i) = doc.GetItemValue("PersNr")
Set doc = view.GetNextDocument(doc)
Next i
Set doc = uidoc.Document
Call doc.ReplaceItemValue("ArrPersNr","")
For i = 1 To view.AllEntries.count
Set feld = doc.GetFirstItem("ArrPersNr")
Call feld.AppendToTextList(arr(i))
Next i
End If
Call uidoc.Refresh
End Sub
Auch wenns etwas umständlich ist, aber es klappt einwandfrei. :)
Vielen Dank euch beiden.
Gruß
Demian
koehlerbv:
Du hast das schon richtig erkannt mit dem Unterschied zu VB / VBA ;) Das Datenmodell ist bei Notes nun ja auch ein anderes.
Eine Anmerkung noch: Das Feld ArrPersNr hättest Du nicht als Feld in der Maske erstellen brauchen - es reicht vollkommen, wenn dies im Backend (im Dokument) vorhanden ist - ob es das in der Maske gibt oder nicht oder in China ein Sack Reis umfällt, ist vollkommen egal.
Bernhard
Demian:
Hallo Bernhard,
ich weiß, ich weiß.
Aber so weiß ich wenigstens immer was wo hingehört. Wenn ich mir das Ganze in 3 Jahren nochmal ansehe, brauch ich wahrscheinlich sonst erst mal nen Augenblick bis ich wieder weiß, wo die Werte herkommen. :)
Das mit dem Datenmodell ist wohl wahr, man muss ja auch um einiges mehr deklarieren.
Aber irgendwie klappts immer ;D
Gruß
Demian
koehlerbv:
Na, mit den Deklarationen hat das aber nix zu tun ;) Ausserdem: Was nützt Dir ein Frontend-Element wie ein Feld (was im Frontend überhaupt nicht gebraucht wird), wenn Du nachvollziehen willst, wo die Inhalte herkommen? In der Formel des Feldes steht doch eh der Feldname selber, Du siehst also nur den puren Selbstbezug, aber nicht die Verbindung zu Deinem Code.
Abgesehen davon - auch wenn dies nur marginal ist: Du verlierst mit sowas Performance und irgendwie auch die Übersicht. Eine saubere Dokumentation der gesamten Dokumentation nimmt Dir das eh nicht ab :)
Bernhard
LN4ever:
Ich glaube, daß es noch einen Denkfehler im Modell gibt. Du füllst das Feld im Postopen mit den Personalnummern, wenn das Dokument im EDIT-Mode geöffnet wird. Was passiert, wenn jemand das Dokument im Lesemodus öffnet und dann auf EDIT geht ? Nix - steht nix drin - woher auch ?
Wie kann man das umgehen, ohne doppelt zu codieren ?
In den Globals der Maske definierst du eine Variable
Dim ListeGefuellt As Variant
Im Initialize der Globals setzst du diese Variable auf False
Im Postopen und im QueryModeChange prüfst du dann, ob die Variable auf TRUE steht, sonst machst du ein CALL LISTEFUELLEN
Und in der Sub LISTEFUELLEN befüllst du dein Feld und setzst die Variable LISTEGEFUELLT auf TRUE.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln