Probleme mit LotusScript

  • Hallo Leute,


    ich habe mehrere Probleme. Ich möchte in einem Dokument einen Verweis auf ein anderes Dokument machen. Sollte sich in dem Feld der Name ändern sollte das auch automatisch passieren. Möchte das gerne über die DocID machen, weiß allerdings nicht wie.


    Dann möchte ich eine Maske plegeleichter machen. Dafür habe ich was von ner Profilmaske gehört. Wie mache ich das?!


    Bin Notesneuling. Bin völlig aufm Schlauch!

  • Zu Profilmasken: Hier können für eine DB zentrale Vorgaben/ Einstellungen gespeichert werden, die von anderen Masken (evtl. bei Feldberechnungen) leicht abgerufen werden können. Oder aber z.B. Vorgabewerte für Felder eingestellt werden, oder Mailadressen für eine automatische Benachrichtigung, oder oder oder ;)
    Du siehst, Profilmasken können viele Aufgabe erfüllen. Dazu empfehle ich auch das ausgiebige Studium der Designerhilfe, da steht noch vieles mehr drin.
    Was willst Du denn mit der Profilmaske eigentlich erreichen?


    Den anderen Teil hab ich nicht so ganz verstanden. Soll der Verweis auf eine Antwort gehen? Und welcher Name soll sich in welchem Feld automatisch ändern?

  • Also ich habe eine Maske mit Firmendaten und eine mit Personendaten. In der Maske mit den Personendaten ist die Möglichkeit gegeben eine Firma auszuwählen. Nun möchte ich sobald sich der Firmenname in den Firmendaten ändert alle Personendaten den neuen Firmennamen bekommen.

  • So, da bin ich wieder. Musste mich erstmal wieder hier einfinden, da der Name des Thread verändert wurde...


    Die Aufgabe wird dann wohl doch etwas größer bzw. umfangreicher. Ich könnte mir vorstellen, in dem Personendokument bei Auswahl der Firma die ID des Firmendokuments mit zu speichern. Dann einen Agenten schreiben, der bei Änderungen an Firmendokumenten losrennt. Dieser müsste alle Personendokumente durchsuchen, die diese ID des Firmendokuments gespeichert haben und dort die Feldwerte ändern.
    Dazu würde ich eine (versteckte) Ansicht machen die die Personendokumente beinhaltet, sortiert nach gespeicherter ID des Firmendok. Und per LS (view.GetalldocumentsbyKey) diese ändern.

  • Habe mal was in der Zeit ausprobiert und zwar folgendes: in PostSave


    Sub Postsave(Source As Notesuidocument)
    Dim db As New NotesDatabase("","")
    Dim collection As NotesDocumentCollection
    Dim doc As NotesDocument
    Dim dateTime As New NotesDateTime("12/01/04")
    Dim nextDateTime As NotesDateTime

    searchFormula$ = |Form = "Form1" & "Feld1" = "| & Source.FieldGetText( "FName" ) & |"|
    Set collection = db.Search(searchFormula$,dateTime,0)
    'documentcollection
    Call collection.Stampall("FName", Source.FieldGetText( "verstecktes Feld" ) )
    If ("FName"<>"verstecktes Feld") Then
    Call Source.FieldSetText( "verstecktes Feld","FName")
    End If
    End Sub

  • Das liest sich auch nicht schlecht. Sollte funktionieren.
    Dafür das Du, wie Du schreibst, absoluter Neuling bist, richtig Klasse!

  • Hast Du den Script schon mal bei eingeschaltetem Debugger laufen lassen? Dabei siehst Du zumindest, an welcher Stelle der Fehler auftritt

  • Zitat


    taurec schrieb:
    Du hast die Variable db zwar definiert und initialisiert, nur dabei keine gültige Datenbank angegeben.
    Dass solltest du noch machen dann ist auch der Fehler weg


    Das kommt davon, wenn man (ich) nicht richtig liest. Wer das kann ist halt immer klar im Vorteil! ;)


    Sorry, hätte ich eigentlich auch gleich sehen müssen


    taurec
    Ich verbeuge mich vor Deinen Adleraugen

  • Anstatt den Session dazu zu holen würde ich über folgende zeile den zuweisung machen.
    set DB = source.document.parentdatabase
    damti vermeidet mann den zuweisung vom Session, welches unter umständen später wieder zu problemen führen kann.

  • Du meinst damit jetzt das Dokument mit Personenangaben, oder?


    Hab mir Dein Script eben nochmal etwas genauer angesehen. Warum hast Du eigentlich nach dem "collection.Stampall" nochmal ein "Source.Fieldsettext" eingebaut? Und was steht in dem "verstecktes Feld"?

  • Genau das Dokument mit den Personenangaben.


    Habe noch ein wenig mehr geändert. Hier dann noch mal das Script:
    Sub Postsave(Source As Notesuidocument)
    Dim db As New NotesDatabase("","")
    Set db = source.document.parentdatabase
    Dim collection As NotesDocumentCollection
    Dim doc As NotesDocument
    Dim dateTime As New NotesDateTime("12/01/04")
    Dim nextDateTime As NotesDateTime

    searchFormula$ = |Form = "Personen" & Firma = "| & Source.FieldGetText( "versteckFirmenName" ) & |"|
    Set collection = db.Search(searchFormula$,dateTime,0)
    'documentcollection
    Call collection.Stampall("Firma", Source.FieldGetText( "FirmenName" ) )
    End Sub


    Das funktioniert soweit. Muss nur noch einen Weg finden wie ich das versteckte Feld synchronisiere. Das versteckteFeld verweist auf sich selbst!

  • Was steht denn in dem Feld "versteckFirmenName"?
    Der alte Firmenname? Und der soll dann nach der Änderung der Personendokumente mit dem neuen Firmenname überschrieben werde, wenn ich das richtig verstehe.
    Wenn dem so ist war Dein "Source.Fieldsettext" gar nicht so verkehrt.
    Wenn ich richtig liege mit meinem Verständnis Deines Problems, dann musst Du nur eine kleine Änderung vornehmen. Und zwar den gesamten Code vom "Postsave" in den "Querysave" zu übertragen und eben den "Source.Fieldsettext" mit anzufügen.
    So hab ich das eben probiert und es funktioniert
    ACHTUNG: Nach dem "fieldsettext" KEIN call source.save machen!!! Das bringt ihn etwas aus dem Tritt...

  • Zitat


    helmie schrieb:
    Was steht denn in dem Feld "versteckFirmenName"?
    Der alte Firmenname? Und der soll dann nach der Änderung der Personendokumente mit dem neuen Firmenname überschrieben werde, wenn ich das richtig verstehe.
    Wenn dem so ist war Dein "Source.Fieldsettext" gar nicht so verkehrt.


    Nicht ganz. Wenn sich die Firmendaten ändern dann sollen die Personendokumente mit dem geänderten Firmennamen überschrieben werden und das versteckFirmenName zeigt auf sich selbst. Und das klappt nicht. Der findet keine Collection, da im versteckFirmenName sofort der neue Name drin steht und da soll aber erst nachdem speichern der geänderte Wert drin stehen. Hoffe mal das ist jetzt verständlich genug.

  • Also, damit wir nicht eventuell aneinander vorbei reden will ich mal kurz darstellen was ich grade getestet habe:
    Maske "Person", enthält Feld "Person" und Feld "Firma". Letzteres wird aus einer Liste (@dbcolumn) ausgewählt.
    Maske "Firma", enthält Feld "Firma" und Feld "Firmaalt". Feld "Firma" ist bearbeitbar. Feld "Firmaalt" ist berechnet mit sich selbst als Feldwert. Bei der ERSTEN Speicherung des Firmendokuments wird der Inhalt des Feldes "Firma" in "Fimaalt" übernommen (@isnewdoc & @isdocbeeingsaved; Firma; Firmaalt).
    Maske "Firma": Im Event "Querysave" habe ich Dein Script eingefügt (mit meiner Ergänzung):


    Dim db As New NotesDatabase("","")
    Set db = source.document.parentdatabase
    Dim collection As NotesDocumentCollection
    Dim doc As NotesDocument
    Dim dateTime As New NotesDateTime("12/01/04")
    Dim nextDateTime As NotesDateTime

    searchFormula$ = |Form = "Personen" & Firma = "| & Source.FieldGetText( "Firmaalt" ) & |"|
    Set collection = db.Search(searchFormula$,dateTime,0)
    'documentcollection
    Call collection.Stampall("Firma", Source.FieldGetText( "Firma" ) )
    Call Source.Fieldsettext("Firmaalt", source.fieldgettext("Firma"))


    Danach habe ich ein paar Firmen ganz normal erstellt und ein paar Personen und denen eine Firma zugeordnet. Dann habe ich eine Firma geändert und geschaut was passiert. Und siehe da, alle Personendokumente waren mit dem neuen Firmenname überschrieben. Und im Feld "Firmaalt" in dem Firmendokument stand jetzt der (neue) Firmenname.