Domino 9 und frühere Versionen > ND7: Entwicklung

Dialoglistenauswahl zur Laufzeit ändern

<< < (3/5) > >>

Demian:
Hallo ihr beiden,

@LN4ever:
Berechtigter Einwand. Ich sehe, ich muss noch viel lernen.  :)

Habe es jetzt mit deinem Beispiel probiert. Meine Funktion zum Listefüllen sieht jetzt folgendermaßen aus:

Sub Postopen(Source As Notesuidocument)   
   If ListeGefüllt = False Then Call Listefüllen(source)         
End Sub

Function ListeFüllen(source As NotesUIDocument)
   If source.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()   
      
      Set db = s.CurrentDatabase
      Set view = db.GetView("Personal - " & source.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            
      
      For i = 1 To view.AllEntries.count
         Set doc = source.Document
         Set feld = doc.GetFirstItem("ArrPersNr")         
         Call feld.AppendToTextList(arr(i))
      Next i
      
      ListeGefüllt = True
   End If
End Function

Den Parameter musste ich angeben, weil er auf dem Weg von Postopen zu Listefüllen den editmode auf false setzt, wenn ich in der Funktion Source neu deklariere und mit set source = work.currentdocument "fülle"  ??? CurrentDocument ist doch zu dem Zeitpunkt eigentlich im Bearbeitsungsmodus, oder nicht?

@Bernhard:
Wie müsste ich das Feld denn im Backend füllen? Mit doc.ArrPersNr = arr gehts nicht, da kommt die Fehlermeldung : "Arrays of arrays are not supported"!!!

Was meinst du mit: "Eine saubere Dokumentation der gesamten Dokumentation nimmt Dir das eh nicht ab"?? Mit Dokumentieren hab ichs nicht so...

Gruß
Demian

koehlerbv:

--- Zitat von: Demian am 09.08.06 - 21:04:08 ---Wie müsste ich das Feld denn im Backend füllen? Mit doc.ArrPersNr = arr gehts nicht, da kommt die Fehlermeldung: "Arrays of arrays are not supported"!!!

--- Ende Zitat ---

Ich habe keine Ahnung, wie dein Code da wirklich aussah. Wenn Du ein eindimensionales Array einem Item zuweist, dann funktioniert das auch. "Array of arrays" lässt aber auf ganz anderes schliessen. Ohne Deinen Code kann daher hier niemand was sagen.


--- Zitat von: Demian am 09.08.06 - 21:04:08 ---Was meinst du mit: "Eine saubere Dokumentation der gesamten Dokumentation nimmt Dir das eh nicht ab"?? Mit Dokumentieren hab ichs nicht so  :)
--- Ende Zitat ---

Das ist ganz schlecht. Damit tut man nicht nur seinen Kollegen keinen Gefallen, sondern auch denen, die vielleicht irgendwann später mal mit den Ergüssen ihrer Vorgänger klarkommen müssen. Der vielleicht wichtigste Aspekt ist aber: In einem Vierteljahr siehst Du ohne eine gewisse Doku in Deinem Code selber nicht mehr durch.
Ich erlebe das gerade wieder in voller Palette live: Aktuelle oder bereits gegangene Kollegen haben irgendwas "zusammengeschmiert", und das Aufräumen / Reparieren von nicht funktionierenden Algorithmen kostet nun richtig Geld - nur, weil die "genialen" Programmierer nicht artikulieren konnten, was sie mit ihrem Mist (teilweise) überhaupt bezwecken wollten. Und dass das nun Geld kostet, will auch keiner einsehen ...

Lass also bitte den Smiley hinter "Mit dokumentieren hab ich's nicht so" weg - unsereins kann darüber wirklich nicht lachen (auch, wenn den Nicht-Doku-Schreibern schon längst gekündigt wurde).

Bernhard

Demian:
Hallo Bernhard,

hatte das mit der Doku nicht auf mein Script bezogen. Das dokumentier ich größtenteils schon. Außer Sachen, von denen ich denke, dass sie sowieso klar sind. Beziehungsweise in der Testphase dokumentier ich auch nicht. Erst wenn ich der Meinung bin, der Code steht. Ich dachte du meinst eine Doku über die Datenbank als solche und Ihre Funktionen, also eine Anleitung.

Da bin ich besser drin, jemandem was zu zeigen, als da seitenweise irgendwas runterzutippen.

Also, nimm mir das mit dem Smiley bitte nicht übel.

Mein Code steht in meinem letzten Beitrag (function Listefüllen). An für sich handelt es sich doch um ein eindimenionales Array (redim preserve arr(i)).

Gruß
Demian







LN4ever:
Ich würde keine Umlaute in Modul- und Variablennamen verwenden.

Und: die gleiche Abfrage muß auch in das QueryModeChange rein (dort vermutlich nur andersherum, weil der Modus übergeben wird, in dem du beim Aufruf bist - sprich: beim Wechsel von READ auf EDIT im Dokument ist EDITMODE noch FALSE. Schau es dir im Debugger an, wie es reagiert.

Du startest mit deinen FOR-Schleifen immer bei 1. Normalerweise startet Notes aber bei Arrays mit der Indexzählung bei 0.

Das Befüllen des Arrays geht übrigens deutlich schneller, wenn du es nicht permanent nachdimensionierst. Wenn du es also mit

docanzahl=view.Allentries.count
If count >0 Then
  Dim arr(docanzahl-1)
  For i=0 To docanzahl-1
    ...
  Next
Else
  Dim arr(0)
  arr(0)=""
End If

machst, sparst du Zeit. Das ist noch marginal, aber spürbar Zeit sparen kannst du, wenn du das Set doc=source.document und das SET FELD in der zweiten FOR-Schleife vor die Schleife setzst.

Und eigentlich brauchst du diese Schleife gar nicht, weil du das ganze item mit einem REPLACEITEMVALUE oder aber mit

SET FELD = New Notesitem(doc,"ArrPersNr",arr)
FELD.SaveToDisk=False

befüllenn kannst. Wenn du dich für die letzte Variante entscheidest, muß sichergestellt sein, daß das Feld ARRPERSNR nicht existiert (sonst bekommst du doppelte gleichnamige Felder (sehr unschön mit GetFirstitem - igittigitt)) - und da sind wir bei der Diskussion um das Feld in der Maske. Ich würde nicht das Feld in die Maske aufnehmen, sondern einen Kommentar in die Maske schreiben, der die Erzeugung via Script beschreibt.

Gruß

Norbert

Thomas Schulte:
Abgesehen von allem was Norbert und Bernhard schon gesagt haben ist die Struktur deines Codes auch noch ziemlich uneben. Das Befüllen des Feldes kann man eleganter und nur mit einer Schleife machen.


--- Code: ---Function ListeFuellen(source As NotesUIDocument)
If source.EditMode = True Then
Dim s As New NotesSession
Dim db As Notesdatabase
Dim view As NotesView
Dim Doc As NotesDocument
Dim KeyDoc As NotesDocument
Dim Feld As NotesItem
Dim arr() as string

Set db = s.CurrentDatabase
Set view = db.GetView("Personal - " & source.FieldGetText("Bereich"))
Set keydoc = view.GetFirstDocument
set doc = source.document

Set feld = new notesitem(doc,"ArrPersNr")

                redim arr(viewAllEntries.count) as string
For i = 1 To view.AllEntries.Count
arr(i)= Keydoc.GetItemtext("PersNr")
Set keydoc = view.GetNextDocument(keydoc)
Next i

                feld = doc.replaceitemvalue("ArrPersNr";arr)

ListeGefüllt = True
End If
End Function

--- Ende Code ---

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln