Beiträge von Laura

    Die Anwendung ist vom 2003, damals hatten sie R5, seitdem wurde mehrmals an ihr geschraubt, also ist sie "wie gewachsen".


    Docs werden im Queryopen in einen Ordner geschoben.


    Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
    ' Bei jedem Öffnen eines Dokumentes wird geprüft, ob das Dokument sich im Ordner "InBearbeitung" befindet
    ' Ist dies der Fall wird das Öffnen mit der u.a. Fehlermeldung abgebrochen.
    ' Beim Verlassen des Dokument wird über den QueryClose das Dokument wieder aus dem Ordner entfernt


    Dim ns As New notessession
    Dim ndb As notesdatabase
    Dim nview As notesview
    Set ndb = ns.currentdatabase
    Set nview = ndb.getview("InBearbeitung")
    Dim ndoc As notesdocument
    Dim nviewdoc As notesdocument
    Set ndoc = source.document
    If (source.InPreviewPane) Then Exit Sub
    Set nviewdoc = nview.GetDocumentByKey(ndoc.UNID(0))
    If nviewdoc Is Nothing Then
    Call ndoc.putinFolder("InBearbeitung")
    Else
    Msgbox(" Das Dokument ist gerade in Bearbeitung! " + Chr(13)+Chr(13)+ " (Aber Sie können es im Dokumentvorschau ansehen...)" , 16, "Vorgang in Bearbeitung")
    continue =False
    End If
    End Sub


    Sub Queryclose(Source As Notesuidocument, Continue As Variant)
    ' Erklärung siehe QueryOpen


    Dim ndoc As NotesDocument
    Set ndoc = source.document
    If (source.InPreviewPane) Then Exit Sub
    Call ndoc.removeFromFolder("InBearbeitung")


    End Sub


    Die Lösung funktioniert übrigens sehr zuverlässig.
    Nachts läuft ein Agent, der alle evtl. hängengebliebenen Docs aus dem Ordner rauswirft.


    Habe eine Funktion geschrieben, die im Ordner nachschaut, ob das Doc da drin ist.
    Am Anfang vom Superagent ein If mit dieser Funktion eingefügt. Wenn Doc im Ordner - nicht weiter machen, zählen, Msgbox.

    In der Aktion ist nur die Formel @Command([ToolsRunMacro];"(Agentname)").


    (Agentname): drin ist ein elendlanger Spagetthiscript. Ein Superagent für alle Fälle sozusagen...

    Grob gesagt muesset der Agent, wenn aus der Ansicht heraus gestartet wird wissen, ist das Dokument welches ich bearbeiten soll an irgendeinem Rechner von irgendeinem Benutzer
    bereits zum Bearbeiten geoeffnet. Wenn Ja, dann darf ich es eben nicht bearbeiten, sondern muss es ueberbspringen.

    :o) Das habe ich bereits gelöst, die geöffneten Docs werden übersprungen, gezählt, Medlung an Bearbeiter.


    Aber auch aus der Maske gestartet, überspringt der Agent das geöffnete Dokument und bringt die nette Meldung, dass er das Doc leider nicht bearbeiten durfte...


    Habe gehofft, man kann dem Agenten irgendwie mitteilen: "Achtung! Nur aus der Ansicht gestartet, überspringst du die geöffneten Docs."


    Ich sehe schon, es führt kein Weg daran vorbei, ich muss separate Aktion/Agent für jede Maske schreiben.
    Es sind 8 masken mit je 12 Aktionen...


    Danke dir trotzdem.

    Hallo Andreas,


    Agent, der aus der Ansicht gestartet ist, läuft auf den ausgewählten Dokumenten. Er soll schon was tun, aber nur bei den Docs, die nicht im Frontend geöffnet sind.
    Ist kein Problem, die kann ich ausschließen.


    Das Problem ist, dasgleiche Agent kann auch aus der Maske gestartet werden, dann muss er natürlich dieses eine im Frontend geöffnete Doc bearbeiten.


    Ich könnte natürlich die Agenten trennen (1 für Ansichten, 1 für Masken), möchte aber nicht die ganze Anwendung umschreiben...


    Andere Ideen?..

    Hallo zusammen,


    ich habe da was "geerbt" und muss die Fehler beheben... ?(
    Kurz zum Problem: es gibt eine gemeinsame Aktion, die einen LS Agent startet, der dann eine Document Collection bearbeitet, die aus unprocessed docs besteht.
    Den Knopf kann man in mehreren Ansichten und in mehreren Masken anklicken.
    Was passiert in der Praxis? Ein User bearbeitet ein Dokument im Frontend, der Andere markiert dasgleiche Dokument in der Ansicht und setzt auch ein paar Felder...
    Und dann meckern beide, dass es zu Überschneidungen gekommen ist.


    Kann man mit den LS irgendwie rauskriegen, ob der Agent aus einer Maske oder aus einer Ansicht gestartet wurde?
    Ziel: wenn er aus der Maske gestartet ist, soll das im Frontend geöffnete Dokument bearbeitet werden, wenn aus der Ansicht - nicht.


    Habe leider nichts hier im Forum gefunden.
    Danke für eure Antworten!


    Gruß aus Mainz


    Laura

    Das nenn' ich Dienstleistung. ;o) Hoffe, deine Anwender wissen es zu schätzen...


    Habe mir deinen Code rauskopiert, für alle Fälle.


    EC 2012: ja, ich will! :o) ...ob ich's auch darf, entscheidet sich in den nächsten Tagen.


    Die Hoffnung stirbt zuletzt...



    Edith schreibt: wird hier der Status automatisch wieder auf "offen" gesetzt, wenn man eine Antwort schreibt? OOOPS...

    Hallo Axel,


    was bedeutet hier


    eine vorhandene Symboldatei


    ?


    Hast du die .jpg(s) in deine Datenbank importiert?


    Ich habe es in einer von meinen Ansicht ausprobiert, mit einer sehr kleinen .gif Datei funktioniert alles wie gewünscht.


    Na ja, nicht ganz, sogar diese mikrigkleine gif wird nicht vollständig und verzerrt dargestellt...


    Hat das einen tieferen Sinn, dass du statt normaler Twisties eine Bildressource anzeigen möchtest?

    ...hmmm, was hältst du von dieser Idee:


    1. Im Exiting vom DeinFeld deren Item.Text abfragen.


    Wenn nicht Datatype Numbers (4*5 ist's nicht) wieder zurück ins DeinFeld springen mit


    uidoc.GoToField ("DeinFeld")





    2. Dein WIN-API Code ausführen, jetzt sollte ja 20 drin stehen


    3. uidoc.GoToField ("irgendeinFeld")


    Reine Theorie, es könnte als "Du kommst hier nicht raus" ausgehen...

    Hallo Dirk,


    weiß nicht, ob ich richtig verstanden habe, was du erreichen möchtest...


    Sub Exiting(Source As Field)
    Dim ws As New NotesUIWorkspace
    Dim doc As notesdocument
    Dim uidoc As NotesUIDocument


    Set uidoc = ws.CurrentDocument
    Set doc=uidoc.Document
    doc.DeinFeld = (5+6*4)/9


    End Sub


    ...ich vermute aber, 5 und 6 und 4 und 9 sind keine Werte, die in anderen Feldern stehen?




    Allerdings ist der Fokus im Exiting-Event schon nicht mehr auf dem Feld, d.h. es scheint kein passendes Event dafür zu geben.


    Fokus könnte man wieder dahin setzen (Achtung, Gefahr einer endlosen Schleife!):


    uidoc.GoToField ("DeinFeld")
    uidoc.SelectAll 'optional

    taurec
    Woher ich das weiß? Aus eigener Erfahrung.


    OK, ich weiß es nicht, aber ich vermute es stark,
    weil maiki82 mit seinem Script erreichen möchte, dass sein uidoc nur für bestimmte User bearbeitbar sein soll.


    Also vermute ich auch, dass er in seiner Maske bei den Eigenschaften den "Bearbeitungsmodus automatisch aktivieren" NICHT angeklickt hat
    und denkt, dass der User erst im Dokument irgendwo doppelklicken muss um in Bearbeitungsmodus zu wechseln.


    Und ich vermute, dass er nicht wusste, dass ein fortgeschrittener User sein Script mit STRG+B leicht umgehen kann.


    Alle diese Fehler habe ich selbst – als Anfängerin - vor 9 Jahren gemacht, auf die Nase gefallen, was daraus gelernt.


    Bist du mit meiner Antwort zufrieden?


    Und du, maiki82?

    If (Not source.editMode And sStatus = "freigegeben" And Not Freigeber="User XY/voba-grevenbrueck") Then


    Ähmm, beim Querymodechange – Event ist dein uidoc sowieso noch im Read-Modus,
    wozu dann Not source.editMode ?


    Wo und wie wird Freigeber definiert?


    Wenn in der Liste drei Personen sind und du vergleichst den Namen des aktuellen Users (nehme ich an) mit dieser Liste (sozusagen 1 = 3),
    dann ist Not Freigeber="User XY/voba-grevenbrueck") immer true.


    Fazit: Dein If liefert ab sStatus = "freigegeben" z.Z. IMMER true, also ist auch continue immer false.



    Andere Lösungen (s. Vorschläge von RockWilder und ascabg) finde ich übrigens besser.

    Hallo lotusfee,


    nachdem ich mit dem berechneten Abschnitt auf die Nase gefallen bin,
    (s. http://www.dominoforum.de/modu…p?topic_id=20648&forum=47)
    werde ich wahrscheinlich zu meiner Standard-Lösung mit berechneten Teilmasken zurück kehren.


    Die Anforderung ist die gleiche wie bei dir:
    nachdem der User sein Dokument abgeschickt hat (sprich, Statusänderung),
    darf er bestimmte Felder nicht mehr bearbeiten.
    Der User behält die Autorenrechte, darf die unkritische Felder wie z.B. Kommentar weiterhin bearbeiten.


    Die Lösung: berechnete Teilmaske in die Maske einfügen.
    Formel: @If(Status = 1; Teilmaske_Edit; Teilmaske_Read)


    In der Teilmaske_Edit sind die Felder bearbeitbar,
    Teilmaske_Read hat lauter BerechneterText mit Feldnamen als Formel aus der Teilmaske_Edit.
    Oder wenn's schön sein muss (z.B. bei Optionsfelder oder Kontrollkästchen, berechnete Felder mit Feldnamen als Formel.


    Das funktioniert bombensicher.
    Ist zwar mühsam, weil man bei der Feldänderung zwei Teilmasken parallel pflegen muss, dafür gibt es keine komischen Effekte wie in dem o.g. Beitrag.


    Viele Grüße


    Laura

    Hallo zusammen,


    ich habe in einer Maske einen berechneten Abschnitt mit der Formel


    @If(Status="Neu";"[Rolle1]":"[ Rolle2]":"[ Rolle3]";"Nobody")


    Dieser Abschnitt beinhaltet bearbeitbare Felder.


    Nachdem sich der Wert im Feld Status von "Neu" in irgendeinen anderen Wert ändert, dürfen die Felder im Abschnitt nicht mehr bearbeitet werden.


    Ich habe das Phänomen, dass die o.g. Formel beim ersten Öffnen des Dokuments – nachdem es mit einem neuen Status gespeichert und geschlossen wurde – nicht greift.
    Erst beim 2. Öffnen sind die Felder für die Bearbeitung gesperrt.
    Oder wenn man vor dem Öffnen das Doc in der Ansicht mit @Command([ToolsRefreshSelectedDocs]) aktualisiert hat.


    Warum ist es so?
    Wie kann man erreichen, dass die Formel schon beim 1. Öffnen das tut was sie soll?


    Für eure Antworten – im Voraus vielen Dank.


    Gruß aus Mainz


    Laura

    Du kannst die Ansicht in einer Rahmengruppe anzeigen und unter der Ansicht - das aktuelle Dokument (im Vorschau) mit den ganzen Links.
    Diese Anzeigemaske für das aktuelle Dokument am besten so gestalten, dass alle Links ganz oben sind, dann braucht der User nicht zu scrollen.