Autor Thema: PostOpen "SwitchForm" - Autorenfelder (items)  (Gelesen 4743 mal)

Offline Frank_B

  • Senior Mitglied
  • ****
  • Beiträge: 275
  • Geschlecht: Männlich
PostOpen "SwitchForm" - Autorenfelder (items)
« am: 19.08.15 - 14:46:07 »
Hallo,

ich habe mir eine Funktion geschrieben, welche mir aus einem Dokument gezielt alle Autorenfelder herauszieht.
Ich verwende dies, um das Dokument in einer anderen Datenbank zu archivieren. Dabei werden alle Autorenfelder in Leserfelder um"typisiert".

Die Kopie mache ich mit "...copyallitems...", die felder mit "item.IsReaders = true"...

Das klappt auch alles ganz gut.

Probleme machen mir nun solche Dokumente, welche im "postopen" die Formel "....switchform..." enthalten, da dadurch eine andere FORM für das Dokument verwendet wird.

In den Eigenschaften des Dokuments zeigt er mir ja immer die aktuelle Form (bspw. form="memo") und nicht die geswitchte und in Verwendung befindliche Form (bspw.: form="memo_alt") an.

Habt ihr Tipps, denn ich möchte sicherstellen, das pro Dokument alle autorenfelder entdeckt und in leserfelder um"typisiert" werden?

Danke schonmal
Gruß Frank

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #1 am: 19.08.15 - 15:14:46 »
Moin
Einfach über die Items des Notesdokuments loopen.
Code
ForAll itm In doc.Items
	If itm.isauthors Then
		itm.isauthors=False
		itm.isreaders = true
	End if
End forall
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Frank_B

  • Senior Mitglied
  • ****
  • Beiträge: 275
  • Geschlecht: Männlich
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #2 am: 19.08.15 - 16:14:10 »
@umi

das mache ich ja so schon.

allerdings macht der mir ja bspw ein neues Dokument mit der Form "memo".
wenn dieses dokument im "postopen" allerdings nen switch enthält auf eine andere form (bspw. "memo_alt", dann wird doch das neue Dokument als "memo" angelegt, mir jedoch als "memo_alt" angezeigt.

ich komme also an die eigentliche verwendete Maske per Lotusscript nicht wirklich ran.
Ich kann doch per script nicht im postopen eine "switchform"Abfrage abfangen.

Was ich meine ist, dass ich die autorenfelder in der geswitchten Form ("memo_alt") erreichen und auf Leserfelder ändern muss.

« Letzte Änderung: 19.08.15 - 16:15:42 von Frank_B »
Gruß Frank

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #3 am: 19.08.15 - 16:25:47 »
Achso.

Das wird jetzt ein bisschen komplexer.

Ich nehme mal an das Problem existiert im Archiv.
Was sind den die Rechte im Archiv des Benutzers? Wenn die Benutzer im Archiv nur noch Lese Rechte haben würden?
Oder im Archiv das SwitchForm anpassen (Autorenfelder raus)
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #4 am: 19.08.15 - 16:53:08 »
Die Felder (bzw. Items), die im Dokument gespeichert sind, haben doch nichts mit der Maske zu tun. Also Du änderst Items in einem Dokument, dazu musst Du nicht wissen, welche Maske dieses Dokument erzeugt hat. Hat das Archiv die gleiche Gestaltung, wie die Originaldatenbank, ist auch der gleiche Switch im PostOpen, und beim Öffnen wird auf die gleiche Maske gewechselt. Der Lese- bzw. Autorenzugriff wird ja auch nicht durch die Maske gerechnet, sondern durch die Leser- und Autoren-Items im Dokument. Wenn Du das Item "Form" eines Dokumentes löschst, es also keinen Bezug mehr zu einerMaske hat, unterliegt es immer noch der gleichen Zugriffssteuerung, was zeigt, dass die Maske dazu überhaupt nicht benötigt wird.

Vielleicht verstehe ich aber auch Dein Problem falsch ...

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #5 am: 19.08.15 - 18:30:22 »
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

Offline Frank_B

  • Senior Mitglied
  • ****
  • Beiträge: 275
  • Geschlecht: Männlich
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #6 am: 31.08.15 - 14:08:36 »
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 ?
Gruß Frank

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #7 am: 31.08.15 - 14:36:08 »
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.
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Frank_B

  • Senior Mitglied
  • ****
  • Beiträge: 275
  • Geschlecht: Männlich
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #8 am: 31.08.15 - 14:38:13 »
@Tode

Danke mal, ich dacht mir sowas schon, dass es zu oft "im Kreis" geht.

Ich schau's mir an.
Gruß Frank

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #9 am: 31.08.15 - 14:38:40 »
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
« Letzte Änderung: 31.08.15 - 14:44:53 von Peter Klett »

Offline Frank_B

  • Senior Mitglied
  • ****
  • Beiträge: 275
  • Geschlecht: Männlich
Re: PostOpen "SwitchForm" - Autorenfelder (items)
« Antwort #10 am: 31.08.15 - 15:27:49 »
das von Urs hatte ich auch vorhin nochmals gelesen.

Danke.

Eure Tipps inspirieren :)
Gruß Frank

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz