Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Bille am 21.09.04 - 11:54:37
-
Hallo zusammen!
Bei folgendem Sachverhalt komm ich irgendwie nicht ganz klar:
Ein Dokument wird vom Erfasser abgespeichert. Der Sachbearbeiter soll dieses Dokument nicht mehr verändern können. Allerdings soll er den Status auf "bearbeitet" setzen, damit ersichtlich ist, dass das Dokument schon von jemanden bearbeitet wird.
Also hab ich eine Aktion mit folgendem Code erstellt:
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
doc.Status = "3) in Bearbeitung"
doc.Status2 = "durch " + s.CommonUserName
Call doc.Save(True,False)
Ich bräuchte nun also noch ein "uidoc.refresh()", damit der Sachbearbeiter auch gleich den aktualisierten Status sieht.
Allerdings steht uidoc.refresh nur im EDIT-MODUS zur Verfügung.
Das uidoc zu schliessen und erneut zu öffnen, halte ich auch nicht gerade für gelungen.
Kann ich das Problem irgendwie anders lösen?
Gruß
Bille
-
Hallo Bille,
wie wär's mit Formelsprache?
FIELD Status := "3) in Bearbeitung";
FIELD Status2 := "durch "+@Username
@Command([ViewRefreshFields]);
Setzte ich so auch ein (z.B. in "Kunde wünscht") ;)
Gruß aus dem sonnigen Lahr
Armin
-
Hi Armin,
entweder stell ich mich total doof an, oder das mit der Formelsprache funktioniert auch nur, wenn man im Bearbeitungsmodus ist.
Sonst krieg ich die Meldung "Kann Befehl nicht ausführen"....
Grüße
Bille
-
Hi,
versuch's doch mal so:
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
uidoc.EditMode = True 'Dokument in Editmodus
doc.Status = "3) in Bearbeitung"
doc.Status2 = "durch " + s.CommonUserName
Call uidoc.Refresh
Call uidoc.Save
uidoc.EditMode = False 'Dokument in Lesemodus
Axel
-
Was bedeutet eigentlich das:
Der Sachbearbeiter soll dieses Dokument nicht mehr verändern können.
Autorenfelder ? Oder was ?
Wenn nicht, warum kann dann das Doc nicht im EditMode geöffnet werden ?
Alle Refreshs funktionieren nur im EditMode ...
Bernhard
-
Hallo Bille,
sorry, habe dein Posting nicht aufmerksam genug gelesen :)
Wie Bernhard schon angedeutet hat, musst du uns erst mal erklären, auf welche Art du verhinderst, dass ein Sachbearbeiter in den Editmodus wechselt (durch Autorenfelder oder QueryModeChange...)!
Erst dann kann man sich überlegen, wie man das löst.
Axels Lösung kann nur funktionieren, wenn der Editmodus NICHT gesperrt wird. Das willst du aber nicht, oder?
Gruß
Armin
-
Alle Refreshs funktionieren nur im EditMode ...
Nachtrag zu meinem und Armins Postings: Das gilt für LS und für @functions.
Wenn wir dann mehr wissen - auch hier schliesse ich mich Armins Postings an (danke, Armin) - dann können wir auch eine Lösung finden.
Bernhard
-
Den Zugriff möchte ich über QueryModeChange einschränken.
If Source.Document.Status(0) = "2) weitergeleitet" Then
Messagebox "Eine Bearbeitung des Auftrages ist nicht möglich!!!", 48, "FEHLER"
Continue = False
End If
Da aber beide Refresh-Varianten nur im Edit-Modus funktionieren, muss ich wohl doch das Dokument schließen und neu anzeigen lassen.
Oder könnt Ihr mir noch einen anderen Tipp geben.
Danke schon vorab!
-
Hi,
so ganz komme ich da nicht mit. Du "verbietest" das Editieren wenn das Dok den Status weitergeleitet hat, aber gleichzeitig soll der Status wieder auf in Bearbeitung gesetzt werden können. Was denn nu? Soll denn Status nur der ändern können, der es weitergeleitet bekommen hat ?
Axel
-
Hi Axel,
sorry, irgendwie hab ich Schwierigkeiten genau zu erklären, was ich will. (Ich gelobe Besserung...)
Also:
Der Auftrag wird vom Verkäufer erfasst und an den Sachbearbeiter weitergeleitet. Danach darf der Auftrag nicht mehr geändert werden.
Der Sachbearbeiter sollte aber die Möglichkeit haben, den Status zu ändern, damit ersichtlich ist, dass dieser Auftrag bereits bearbeitet wird.
Hab ich hier bereits einen Gedankenfehler drin, wenn ich zuerst sage "Auftrag darf nicht bearbeitet werden" und anschließend möchte, daß der SB doch den Status ändern soll?
Mittels Aktion kann ich das Doc ändern, ist kein Problem, eben nur mit der Anzeige hab ich ein Problem ...
Bille
PS: Der Code im QueryModeChange wird noch um die weiteren Stati ergänzt, die das Dokument im Laufe der Zeit annehmen kann.
-
Du brauchst auch noch Code im PostOpen, sonst kann man direkt aus der Ansicht das Dokument im EditMode öffnen (Strg-B zum Beispiel).
Um das Schliessen und wieder Öffnen wirst Du leider nicht umhinkommen ...
Bernhard
-
Ja, den Code für das PostOpen hab ich schon.
Aber Danke für den Hinweis.
Als Neuling ist man wirklich für jeden Tipp froh!
Danke an alle!
Bille
-
Hallo Bille,
was hälst du davon, die Statusänderung in einer ANSICHTSaktion durchzuführen?
Du könntest 2 Ansichtsaktionen erstellen
1. "Öffnen und Auftrag bearbeiten"
Hier wird der Status automat. geändert und das Dokument im Lesemodus geöffnet --> Sachbearbeiter sieht Status "in Bearbeitung"
2. "Öffnen OHNE Bearbeitung"
Hier wird das Auftragsdokument lediglich geöffnet, der Status wird NICHT geändert!
Die Sachbearbeiter müssten halt angewiesen / gezwungen werden, die Dokumente über die entspr. Aktionsbuttons zu öffnen ;)
Gruß
Armin
-
Hi,
das halte ich zu fehlerträchtig (Fehlerquelle Mensch).
Ich hab folgende Idee.
In der Aktion, in der der Status geändert werden soll, wird eine INI-Variable gesetzt, dann das Dokument geändert und anschliessend die INI-Variable wieder gelöscht.
Im PostOpen- und QueryModeChange-Event wird dann abgefragt, ist die INI-Variable gesetzt, dann lässt man die Änderung zu. Ist die Variable nicht vorhanden, dann greift die Prüfung des Status-Feldes und ein Editieren zuzulassen oder nicht.
Wie gesagt, ist nur 'ne Idee. Ob's funktioniert und welche Seiteneffekte die Lösung hat kann ich im Moment nicht sagen.
Axel
-
Armin, Axel: Beides sind gangbare Wege. Bille sollte darüber nachdenken.
Armins Vorschlag: Es kann (!) gut sein, dass Sybille genau das vermeiden will, weil in der Ansicht nicht alle Infos stehen und daher auch mal das falsche Dokument auf "in Bearbeitung" gesetzt wird.
Axel's Vorschlag: INI-Variablen setzen, selbige wieder löschen (wegen "Ordnung und Sauberkeit im Schlachthof") - ich weiss nicht. Ein NotesUIDocument.Close und ein erneutes Öffnen sollten nicht komplizierter sein ...
Sybille: Es ist leider so, dass der ganze FrontEnd-bezogene Trödel nur funktioniert, wenn das ebendort geöffnete Dokument auch im EditMode ist. Immerhin vollziehen ja die FrontEnd-Methoden auch das nach, was genauso im Client passieren würde bzw. passieren kann.
Eine Auswahl an Lösungsmöglichkeiten hast Du jetzt auf jeden Fall ;)
Bernhard
-
Hallo zusammen!
Da der Sachbearbeiter eine Mail mit DocLink erhält, befindet er sich bereits im jeweiligen Dokument.
Deswegen ist die Lösung über die Ansichtsänderung für mich nicht relevant.
Ich hab mich jetzt für das Schließen und erneute Öffnen entschieden.
Vielen Dank für Eure Tipps!
Bille
-
Hallo zusammen,
ich bin neu hier.
Ich habe das gleiche Problem mit dem Code im QueryModeChange gelöst:
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
Dim Sperre As String
Sperre = source.FieldGetText("Sperre")
If Sperre = "ja" Then
Success = Messagebox ("Das Dokument ist historisch, ausgebucht oder archiviert und kann nicht mehr bearbeitet werden!",0+64,"Fehler!")
Continue = False
Else
Continue = True
End If
End Sub
Aber die Thematik mit dem PostOpen steht noch, d.h. die Dokumente sind bearbeitbar, wenn ich sie über Strg-B aus der Ansicht heraus öffne.
Wie kann der Code, den ich im PostOpen brauche aussehen, wenn ich die Bearbeitungsmöglichkeit zum Beispiel vom Feld Sperre="ja" abhängig machen muss.
Leider bin ich in Script nicht so firm.
Michael
Du brauchst auch noch Code im PostOpen, sonst kann man direkt aus der Ansicht das Dokument im EditMode öffnen (Strg-B zum Beispiel).
Um das Schliessen und wieder Öffnen wirst Du leider nicht umhinkommen ...
Bernhard
-
Zunächst mal musst Du im QMC noch ein If EditMode = False vor das Continue = False setzen.
Im PostOpen musst Du auf Deine Bedingung prüfen und auf Source.EditMode = True:
If Source.EditMode = True And Source.Document.Sperre (0) = "Ja" then
Source.EditMode = False
Das triggert dann wiederum das QMC-Event, wo dann Dein Code zuschlägt.
HTH,
Bernhard
-
Hallo Bernhard,
danke Dir, das war's.
special thanks
Michael
-
Gern geschehen - und herzlich willkommen im Forum !
Bernhard
-
Hallo Bernhard,
ich nochmal :-) - ich habe jetzt im PostOpen den u.a. String drin und bekomme bei einem neuen Dokument den Fehler "Document Command is not available". Lösche ich den PostOpen, kommt auch der Fehler nicht mehr.
Sub Postopen(Source As Notesuidocument)
'Verhindert die Editierung aus der Ansicht heraus mit Strg+B
If (Source.EditMode = True) Then
Source.EditMode = False
End If
End Sub
Viele Grüße
Michael
-
Hi,
versuch's mal so:
Sub Postopen(Source As Notesuidocument)
'Verhindert die Editierung aus der Ansicht heraus mit Strg+B
If (Source.EditMode = True) And Not(Source.IsNewDoc) Then
Source.EditMode = False
End If
End Sub
Axel
-
Hi Axel,
danke Dir, 's funzt jetzt ;D
Gruß
Michael
-
Hallo beisammen,
ich möchte mein o. a. Script
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
Dim Sperre As String
Sperre = source.FieldGetText("Sperre")
If Sperre = "ja" Then
Success = Messagebox ("Das Dokument ist historisch, ausgebucht oder archiviert und kann nicht mehr bearbeitet werden!",0+64,"Fehler!")
Continue = False
Else
Continue = True
End If
End Sub
noch erweitern und zusätzlich verhindern, dass Antwortdokumente editiert werden können.
Grundsätzliche Bedingung soll sein, dass Dokumente, die im Feld Sperre den Wert "ja" haben nicht editiert werden können. Das Feld Sperre wird über bestimmte Dokument-Stati automatisch bei Statusänderung gesetzt.
Daneben sollen alle Antwortdokumente von nicht-gesperrten Dokumenten ebenfalls nicht bearbeitet werden können.
Erste Möglichkeit, so dachte ich, wäre, das Feld Sperre in der Antwort in dem Moment auf "ja" zu setzen, wenn das Dokument zur Antwort wird. Ich hab's leider nicht hinbekommen.
Eine zweite Möglichkeit wäre doch wohl, 'doc.IsResponse' in das o. a. Script einzubauen. Ich habs so versucht:
If Sperre = "ja" Or doc.IsResponse Then
Hat auch nicht funktioniert - bekomme Fehler.
Leider bin ich (noch) krasser Script-Laie und auf die eine oder andere Hilfestellung angewiesen. Wäre super, wenn ich die hier bekäme.
Vielen Dank im Voraus!!!
Michael
-
Hallo Michael,
vermutlich hast du noch kein Objekt für doc erzeugt. Versuche es doc bitte einmal mit diesem Code:
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
Dim Sperre As String
Dim doc as NotesDocument
Set doc = source.Document
Sperre = source.FieldGetText("Sperre")
If Sperre = "ja" Or doc.IsResponse Then
Success = Messagebox ("Das Dokument ist historisch, ausgebucht oder archiviert und kann nicht mehr bearbeitet werden!",0+64,"Fehler!")
Continue = False
Else
Continue = True
End If
End Sub
Gruß Sascha
-
Hi Sascha,
danke, jetzt klappt's. War ja doch ganz einfach - ich sach ja: Script-Laie.
Danke u. schönes Wochenende!
Michael
-
Hallo Michael,
gern geschehen und ebenfalls ein schönes Wochenende. ;)
Sascha