Formular wechseln mit LotusScript

  • Hallo an alle!


    Ich habe da mal wieder ein Problem mit LotusScript:
    Ich möchte einfach nur das Formular wechseln, mit den das aktuelle Dokument angezeigt wird. Dies benötige ich in LotusScript und ich habe bisher beim besten Willen einfach keine entsprechende Methode gefunden. (Sowas sollte doch in Dokument oder Workspace vorhanden sein???) Genau an dieser Stelle hat IBM auch leider die Language cross-reference vergessen.


    Ich bräuchte also die LS-Umsetzung für:


    @Command( [ViewSwitchForm]; "Ansehen" )


    Grüße
    George

  • Sorry, aber mit LotusScript komme ich irgendwie noch gar nicht gut klar. Was ich da verzapft habe will einfach nicht funktionieren.


    Meine winzige Routine sieht folgendermaßen aus:


    Sub Postsave(Source As Notesuidocument)
    Dim doc As NotesDocument
    Set doc = Source.Document
    doc.Form="Ansehen"
    Call doc.ComputeWithForm( False, False )
    End Sub


    /edit
    Es gibt keine Fehlermeldung, aber auch keine Reaktion.
    Was habe ich falsch gemacht?


    Grüße
    George

  • Hallo


    Du machst das im Postsave (nach dem Speichern)
    -> die Änderungen werden also nicht übernommen.


    Lösung -> Querysave


    Um die Anzeige direkt umzuswitchen musst du das Dokument im Frontend refreshen
    -> Also schliessen und wieder ins Frontend holen.


    Grüße


    Greenhouse

  • Mit Script funktionierts nur im Edit-Modus, wenn anschließend gespeichert wird ändert sich die gesamte Maske und das gespeicherte Dokument hat alle alten und neuen Maskenfelder. Ich bin mir nicht sicher ob das so gewünscht war, ich denk fast der Topicstarter wünscht nur das Ansehen mit anderer Maske. Aber das soll er selbst sagen =)

  • George: In welchem Zusammenhang möchtest du die Maske wechseln? (z.B. Wenn bestimmte User auf das Dokument zugreifen, wenn aus einer bestimmten Ansicht auf das Dokument zugegriffen wird, zum drucken ....)


    Je mehr Infos du rausrückst um so qualifizierter sind die Antworten.

    Bye
    Torsten


    IBM Advanced Certified System Administrator - Lotus Notes and Domino 8.5

  • Hallo!


    Vielen Dank für Eure Antworten und entschuldigt bitte, daß ich jetzt erst antworten kann!


    Greenhouse: Ich denke das beim Querysave reinzuschreiben wäre möglich, da steht schon etwas LS, die Datenfeld-Inhalte werden überprüft, darunter sollte es möglich sein. Ich wollte zwar nach dem Speichern die Ansicht wechseln, weil der Wechsel unnötig ist, falls das Dokument beim Schließen gespeichert wird, aber es sollte wohl keinen Unterschied machen.
    Das mit dem Schließen und wieder ins Frontend holen... müßte mal sehen, ob ich das hinbekomme.


    CarstenH:
    1. Das Dokument ist im Edit-Modus
    2. Das Wechseln nach dem Speichern wäre ideal. Ich habe eine Maske zum Anlegen und eine zum Ansehen des Dokuments, daher soll nach dem Speichern die Maske umgeschaltet werden.
    3. Das mit dem Maskenfeldern ist fraglich, ich wollte das Dokument mit der ersten Maske erstellen und speichern. Die zweite Maske ist zum Ansehen und Bearbeiten gedacht. Falls der Benutzer also nicht beim Schließen, sondern so speichert, sollte er das Dokument hinterher mit der Ansichtsmaske sehen.


    TorstenM:
    Der Zusammenhang ist folgender:
    Ich habe eine Maske zum Erstellen des Dokuments und eine zum Ansehen und späteren Bearbeiten. Die Frage, die über die Maske entscheidet, ist nur, ob das Dokument bereits angelegt ist. Da dies nach dem Speichern der Fall ist, möchte ich dann die Maske wechseln.


    Grüße
    George

  • Hallo!


    Weil ich das Dokument mit der ersten Maske speichern muß, nachdem es erstellt wurde, ist es leider nicht möglich das Umschalten der Ansicht beim Querysave zu erledigen. Mein Code sieht nach euren Tipps jetzt folgendermaßen aus:


    Sub Postsave(Source As Notesuidocument)
    Dim ws As New NotesUIWorkspace
    Dim doc As NotesDocument
    Set doc = Source.Document
    Source.Close
    doc.Form="Ansehen"
    Call ws.EditDocument( False, doc )
    End Sub


    Daraus ergibt sich folgendes Problem:


    Egal ob das Dokument geschlossen und gespeichert werden soll, es schließt sich natürlich nicht. - Steht ja da auch im Quelltext:
    "Call ws.EditDocument( ... )"
    Also Dokument öffnen...


    Kann ich das irgendwie abändern, so daß das Dokument beim Schließen und Speichern auch geschlossen wird?


    Ist es so schwierig das zu realisieren oder doch ganz einfach... :-?


    Grüße
    George

  • Das in den querysave-event


    Wobei "M2" der Masjenname der "Lesemaske " ist, meinetwegen die gleichen Felder - anzahl maessig...nur halt alle berechnet, so kann nix veraendert werden

  • dnotes


    Danke für die schnelle Antwort!


    Leider tritt bei Deiner Version allerdings aber genau das gleiche Problem wie bei meiner Version auf:
    Wenn man das Dokument beim Schließen speichert, wird es eben nicht geschlossen.


    Grüße
    George

  • Danke für Deine schnelle Hilfe!


    Das funktioniert gut.
    Allerdings wird das Dokument nun - so steht es ja auch im Code - immer geschlossen, wenn es gespeichert wird.


    Ich will ja nicht aufdringlich werden... aber noch schöner wäre es, wenn man flexibel reagieren könnte:


    Beim Speichern:
    Speichern und Formular wechseln


    Beim Schließen und dabei Speichern:
    Speichern und Dokument schließen


    ist das vielleicht auch möglich?


    Ich habe Versuche angestellt, über das CurrentDucument abzufragen ob es ein geöffnetes Dokument gibt, aber erfolglos, ich glaube das ist wohl auch der falsche Weg.


    Grüße
    George

  • Zitat

    Ich habe eine Maske zum Erstellen des Dokuments und eine zum Ansehen und späteren Bearbeiten. Die Frage, die über die Maske entscheidet, ist nur, ob das Dokument bereits angelegt ist. Da dies nach dem Speichern der Fall ist, möchte ich dann die Maske wechseln.


    Wenn das alles ist frage ich mich ernsthaft wozu hier die ganzen Handstände mit dem Script nötig sind.


    Du hast also 2 Masken. Ich nenne Sie mal M1 fürs Erstellen und M2 fürs spätere Ansehen/Bearbeiten. Dann brauchst du nichts weiter zu tun als der Maske M1 den Alias der zweiten Maske, nämlich M2 zu geben. Zusätzlich mußt du nur darauf achten daß die Maske M2 in der alphabetischen Reihenfolge vor M1 auftaucht damit sie später zuerst gefunden wird. Also z.B.


    Maske "Erstellen" bekommt als Namen incl. Alias:
    Erstellen | M1 | M2
    Maske "Ansicht/Bearbeiten" bekommt als Namen incl. Alias:
    Ansicht | M2


    In meinem Beispiel fängt der Name der Ansichtsmaske mit "A" an, steht also alphabetisch vor der Erstellen-Maske. Nun nur noch kosmetische Sachen wie z.B. das Ausblenden der Maske M2 aus dem Erstellen-Menü usw.


    Alles komplett ohne Script und andere UI-Tricks. Wenn man jetzt ein Dokument mit M1 erstellt wird es nach dem Speichern immer mit M2 angezeigt oder auch bearbeitet. Das schließen und Öffnen kann man wenns unbedingt sein muß natürlich auch wie schon gehabt über Script machen, z.B. über eine Aktion "Save" in der Maske M1. Dazu würde ich normalerweise Formelsprache nehmen, da man damit z.B. mit PostedCommand den Modus in Ansicht wechseln kann. Script geht auch nur muß man hier aufpassen, da mit dem Wechsel der Maske im UI auch das Script mit in der Abarbeitung gekillt wird (Rekursion -> NSD is running). Um das zu verhindern kann z.B. die Schaltfläche "Save" statt direkt zu speichern und neu zu öffnen das über einen Agenten machen, das sähe in der Schaltfläche dann in etwa so aus:


    Code
    Sub Click(Source As Button)	Dim s As New NotesSession	Dim db As NotesDatabase	Dim agent As NotesAgent	Set db = s.CurrentDatabase	Set agent = db.GetAgent("(Reopen)")	Call agent.RunEnd Sub


    Der Agent "(Reopen)" sähe dann z.B. so aus (Auswahl aus der Agentenliste, Ziel: keines):


    Wie gesagt, das funktioniert auch alles ohne die Scripte. Wenns geht würde ich auf solche Tricks immer verzichten. Das sichert die Funktionsfähigkeit auch in unerwarteten Situationen (z.B. wenn das Dokument über eine Verknüpfung statt aus einer View geöffnet wurde oder der Nutzer nur beschränkte Rechte hat.

  • Danke für die ausführliche Antwort! :)


    Vielleicht habe ich es nicht gut formuliert, aber die Handstände, die mir selber ganz schön auf den Keks gehen, sollen zu folgenden dienen:


    Wenn das Dokument gespeichert wird soll folgendes geschehen:
    Dokument speichern und Ansicht wechseln


    Wenn das Dokument geschlossen und hierbei gespeichert wird folgendes:
    Dokument speichern und schließen


    Die Alias-Version von Dir öffnet das Dokument mit der zweiten Maske, wenn es abermals geöffnet wird, wechselt die Maske beim Speichern aber nicht, oder müßte ich da noch eine Option in der DB aktivieren, damit dies geschieht?


    Um alleine die Maske fürs Wieder-Öffnen zu setzen, reicht ein Feld namens 'Form' in der ersten Maske, welches als Wert den Namen der zweiten Maske enthält.


    Dann habe ich da noch eine Frage zu der Möglichkeit mit dem Script:
    Meinst Du einen eigenen Save-Button, oder kann man das Notes-Smarticon mit eigenem Code belegen? - Wenn letzteres, erklär mir bitte, wie genau!


    Grüße
    George

  • Zum besseren Verständnis:


    Du schreibst:
    Wenn das Dokument gespeichert wird soll folgendes geschehen:
    Dokument speichern und Ansicht wechseln


    Ich nehme an, daß das heißt: nach dem Erstellen, also wenn das Dokument ERSTMALS gespeichert wird, soll die Ansicht gewechselt werden und bei allen späteren Dokumentöffnungen soll eine andere Maske verwendet werden und die Ansicht nicht gewechselt werden.


    Der Teil des Ansicht wechselns muß also in die Erstellmaske rein. Du darfst den Fall ja durchaus bedenken, daß der Anwender das neu erstellte Dokument nicht abspeichert. Soll er dann auch die Ansicht wechseln ? Vermutlich nein.


    Bis zum QueryClose-Event hast du die Variable IsNewDoc. Wenn du in die Globals der Erstellmaske zwei Variablen aufnimmst (WURDEGESPEICHERT - die setzst du im QUERYSAVE auf True und eine ISTNEUESDOKUMENT - die setzst du in einem der Abschnitte, die IsNewDoc haben auf den Wert IsNewDoc), dann kannst du dies in den späten Events (QueryClose oder PostSave) noch auswerten und ggf. das Wechseln der Ansicht veranlassen.


    Das mit dem ISTNEUESDOKUMENT ist nur notwendig, wenn der einzige Unterschied zwischen den beiden Masken die gewünschte Aktion des Ansichtswechsels nach dem erstmaligen Speichern ist.


    Wenn es noch mehr Unterschiede zwischen den Masken von Erstellung und späterer Wiederbearbeitung gibt, die sich nicht durch eingezogene berechnete Teilmasken @If(@IsNewdoc;"TeilmaskeErstellen";"TeilmaskeAnzeigen") lösen lassen, rate ich dringend zu Carstens Lösung.


    Du kannst ein Dokument erstellen, @Command([Compose];"Maskenname oder -Alias") mit einem beliebigen Alias der Maske. Beim Abspeichern wird immer der LETZTE Alias in das Feld FORM geschrieben.


    Beim Wiederaufrufen eines Dokuments wird die ERSTE Maske verwendet, die den in FORM gespeicherten Wert als Maskennamen oder Alias enthält (deshalb der Hinweis von Carsten auf die alphabetische Sortierung der Maskennamen).


    Wenn es geht, nimm nicht zu viele Masken für die gleichen Dinge. Die beiden Masken müssen immer parallel gepflegt werden. In vielen Fällen werden Anwendungen nach einigen Jahren unbrauchbar, weil die Summe der mikroskopisch kleinen Unterschiede von zwei Masken, die für dieselbe Aktion benötigt werden, zu groß geworden ist.

  • Hallo LN4ever!


    Vielen Dank für Deine Antwort!


    Zu Deinen Verständnis-Fragen:
    Ja, Du hast alles so verstanden, wie ich es meinte.
    Und beim Schließen oder Schließen und dabei Speichern reicht es, wenn das Dokument geschlossen bzw. gespeichert und geschlossen wird.


    Zu Queryclose und Maske wechseln:
    Das sollte klappen, wenn ich mir im Queryclose eine Variable setze, um festzustellen, ob das Dokument geschlossen werden soll. Auf die könnte ich ja dann im Postsave zurückgreifen und davon abhängig die Ansicht wechseln oder einfach gar nichts tun, falls das Dokument geschlossen werden soll.


    Das Problem mit dem Maske wechseln in LS ist nämlich, daß ich das Dokument hierfür neu ins Frontend holen muß. Daher ist es dann immer offen, egal ob man es schließen wollte oder nicht.
    Oder die Alternative: Es wird beim Speichern immer geschlossen.
    Aber die Idee sich das zu merken ist echt super! :) - Warum bin ich da nur nicht drauf gekommen? :-?


    Zu vielen Masken:
    Momentan sind es zwei Masken und ich weiß nicht ob ich sie mit @If( @IsNewDoc ) und HideWhen-Formeln zusammenfügen könnte.
    Ich denke, es ist IMMER möglich, mehrere Masken zu vereinen, aber ich habe hier berechtigte Zweifel, ob ich das hinbekomme.


    Grüße
    George

  • Anstatt mit zwei Masken zu arbeiten könntest du ja auch mit zwei Teilmasken arbeiten und die über eine Formel in der Form @If(@IsNewDoc;"SubForm1";"SubForm2") arbeiten.


    Dann könntest du dir den ganzen Aufwand mit den zwei Masken sparen und das auch nur an denen Stellen machen wo sie sich wirklich unterscheiden.

  • Das ist ein guter Vorschlag, damit könnte ich auf jeden Fall den Design-Teil erschlagen. Allerdings gibt dann noch die Unterschiede in den Scripts bzw. Formeln, die teils eine Menge Arbeit gemacht haben. Die müßte ich dann auch alle zusammenfügen...
    Und ich bin noch nicht so Fit mit Domino, wie Du sicher schon gemerkt hast... :)


    Grüße
    George

  • Erstell dir ein Feld indem die Bedingunge zur Anzeige berechnet wird.
    Auf dieses kannst du dann jeweils zugreifen.


    Einen Teil der Scripte, je nachdem in welchen Events du sie hast, kannst du ja auch in die Teilmasken einfügen, also wiederrum getrennt.