Domino 9 und frühere Versionen > ND8: Entwicklung

PostOpen "SwitchForm" - Autorenfelder (items)

<< < (2/3) > >>

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