Domino 9 und frühere Versionen > ND7: Entwicklung

Dialoglistenauswahl zur Laufzeit ändern

<< < (2/5) > >>

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