Domino 9 und frühere Versionen > ND8: Entwicklung
PostOpen "SwitchForm" - Autorenfelder (items)
koehlerbv:
Die Maske und ihre Felder (aus denen dann VIELLEICHT Items werden) ist hier oft sowieso ein Irrweg - in kaum einer meiner / unserer Anwendungen sind gerade die zugriffsrelevanten Leser- und Autoren-Items in einer Maske enthalten, sondern werden im Backend erzeugt / verwaltet und bestenfalls als cfd im Frontend angezeigt (vulgo: Das sind dann Textfelder).
Wirklich helfen tut Dir also eh nur das NotesDocument mit seinen Items.
Bernhard
Frank_B:
Interessante gedanken von euch.
Vielleicht muss ich meine Funktion die ich mir dazu gemacht habe nochmals überdenken.
Die Funktion zieht mir per "GetForm" die Form aus meinem gewünschten Dokument.
Dann im zweiten Schritt nehme ich die Felder (items) so in ein item auf.
Hier meine Funktion, welche auf die Form des Dokuments geht.
Function Arch_Get_RW_fields (f_doc) As Variant
On Error GoTo fehler
Dim fsession As New NotesSession
Dim fdb As NotesDatabase
Dim fdoc As NotesDocument
Dim fForm As NotesForm
Dim fFormFields As NotesItem 'Alle Felder der Form
Dim fFormFieldsAuthorsSearch As NotesItem 'Autorenfelder der Form suchen
Dim fFormFieldsAuthors As NotesItem 'Autorenfelder der Form an Funktion
Set fdb = fsession.CurrentDatabase
Set fdoc = fdb.Createdocument 'temp doc für items
Set fForm = fdb.GetForm(f_doc.form(0))
Set fformFields = fdoc.replaceitemvalue("Felder_Alle","")
Set fFormFieldsAuthors = fdoc.replaceitemvalue("Felder_Authors","")
ForAll Field In fForm.fields
Call fFormFields.Appendtotextlist(Field) 'Alle Felder der Form des docs
End ForAll
Call f_doc.Copyallitems(fdoc) 'läd alle Felder ins temp doc
ForAll n In fFormFields.Values
If f_doc.hasitem(n) Then
Set fformFieldsAuthorsSearch = f_doc.getfirstitem(n)
If fFormFieldsAuthorsSearch.IsAuthors = True Then
Call fFormFieldsAuthors.Appendtotextlist(n) 'Autorenfelder sammeln
End If
End If
End ForAll
Arch_Get_RW_fields = fFormFieldsAuthors.Values
Exit Function
fehler:
Print "Fehler in der Funktion 'Arch_Get_RW_fields' in Zeile '" &erl &"'"
End Function
...ich habe gelesen, dass man nur so alle items abgreifen kann und dessen Typ (bspw. AUTHOR) korrekt feststellen kann.
Denk ich um zuviele Kurven ?
Tode:
Viel zu kompliziert.. Der Umweg über die Form- Fields ist -wie bereits oben geschildert- nicht nur unnötig sondern auch gefährlich.
Auch das erstellen eines "container- dokuments" um Deine Werte zu sammeln ist totaler overkill.
Die Funktion sieht in der Minimalform so aus (kann noch performance- optimiert werden, weil Redim nicht optimal ist, aber sollte kaum relevant sein):
--- Code: ---Function Arch_Get_RW_fields (f_doc) As Variant
Dim tmpArr() as String
Dim i as Integer
Forall item in doc.Items
if item.isAuthers = True Then
redim preserve tmpArr(i)
tmpArr(i) = item.Name
i = i + 1
End If
End Forall
Arch_Get_RW_fields = tmpArr
End function
Der Code ist nur so "runtergeschrieben" und enthält sicherlich Tipp- Fehler. Ausserdem fehlt natürlich ein error- handling ohne das ich keine Zeile Code schreiben würde...
Aber die Idee sollte klar sein.
--- Ende Code ---
Frank_B:
@Tode
Danke mal, ich dacht mir sowas schon, dass es zu oft "im Kreis" geht.
Ich schau's mir an.
Peter Klett:
Ja, Du denkst um zu viele Kurven.
Vergiss die Maske. Die Maske hat technisch mit dem Dokument überhaupt nichts zu tun. Ein kleines Beispiel:
Du hast eine Maske mit einem Autorenfeld "Autor1". Mit dieser Maske wird ein Dokument in der Datenbank erzeugt. Danach änderst Du in der Maske den Feldnamen des Autorenfeldes in "Autor2". Schau in die Felderliste des vorher erstellten Dokuments (ohne es zu öffnen), dann findest Du dort immer noch das Item "Autor1", aber nicht das "Autor2".
Nun öffnest Du das Dokument im Bearbeitenmodus und speicherst es wieder ab. Die Felderliste wird dann "Autor1" und "Autor2" ausweisen. Das ist auch völlig korrekt, denn keine Maske löscht Items in einem Dokument, nur weil es das entsprechende Feld nicht in der Maske gibt.
Du kannst auch Items per Agent oder anderen Routinen im Dokument erstellen, ohne dass es jemals dazu in einer Maske ein Feld gegeben hätte. Und Du kannst auch noch weitergehen und Dokumente erzeugen, die kein Item "Form" haben. Diese Dokumente sind natürlich real vorhanden, Du kannst Sie nur nicht öffnen, da Notes nicht weiß. mit welcher Maske (ich ignoriere bewußt die Möglichkeiten von Vorgabemasken usw.).
Das ist für mich das Geniale an Notes, dass man einfach Daten in Dokumente schreiben kann, ohne diese vorher irgendwo definiert zu haben. Versuche das mal mit SQL.
Langer Rede kurzer Sinn: Gehe direkt über die Items in den Dokumenten, die Du verarbeiten willst (Forall item In doc.Items) und prüfe anhand der Items, welche Eigenschaft die haben. Wie die Eigenschaften heißen, findest Du in der Hilfe zu NotesItem. Nur die Items steuern das Verhalten des Dokuments, nicht die Definitionen in der Maske.
(EDIT: Hat Tode sinngemäß auch so geschrieben, wollte den langen Text aber nicht einfach in die Tonne schieben)
Im Übrigen hat Urs Dir in der ersten Antwort genau das Script geschrieben, das Du benötigst
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln