Autor Thema: Dokument zum bearbeiten sperren -> Erweitert  (Gelesen 3058 mal)

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Dokument zum bearbeiten sperren -> Erweitert
« am: 11.09.03 - 22:18:02 »
Hi,

bisher wurde ja immer gepostet, das ganze im Querymodechange abzufangen, also z.B.
Zitat
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
   feld$ = source.FieldGetText("Status")
   If feld$ ="Ich bin der Status" Then  
      Msgbox "Finger weg.",0,"Iss nicht!"
      continue = False  
   Exit Sub  
   End If
End Sub

Bekanntes Problem:
Wenn Dok aus Ansicht in Bearbeitungsmodus geöffnet wird (also CTRL+B, bzw. englischer Client CTRL+E - oder Rechtsclick und Edit), dann klappt das nicht.

Daher der Tipp, den ich halbfertig in der Designerhilfe grad gefunden habe:

Das ins Queryopen:
Zitat
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
   If mode = 1 Then Continue = False
End Sub

Na ja, vielleicht auch noch ne Msgbox rein, damit der User Bescheid weiss.

Und Vorsicht beim Öffnen der Maske per Script z.B. über
Set uidoc = uiws.editDocument(True, newdoc)   

Dann muss ein False gesetzt werden statt True und danach die Zeile
uidoc.EditMode = True

hth,
TMC


Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Axel Janssen temp

  • Gast
Re:Dokument zum bearbeiten sperren -> Erweitert
« Antwort #1 am: 16.09.03 - 09:58:35 »

Code
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
   If mode = 1 Then Continue = False
End Sub

Verhinderst du damit nicht das Editieren von jedem Dokument dieser Maske, also nicht nur die, welche im Feld "Status" einen bestimmten Wert haben.

Ich glaube im QueryOpen hast du das Problem, dass du keine Feldwerte abfragen kannst.

Klassische Lösung - wie auch hier des öfteren gepostet - ist zusätzlich zum code in querymodechange, code in postopen, so nach der Art :

Code
if doc.getItemValue("status")(0) = "wertx") then
  if (Source.editmode = true) then
       Msgbox "verbohten"
       continue = false
        Exit sub
   end if 
end if

Wir hatten letztens eine längere Debatte, wo die Fraktion "man-löst-solche-Dinge-mit-Autorenfeldern" gute Argumente hatten. Einziger Nachteil ist, daß Autoren-Felder nur für Autoren gelten.

Richtig sicher ist das nämlich nicht, Sicherheit an die Maske zu binden (diese Lösung) und nicht ans Dokument (Autrenfelder). Die Maske kann nämlich vom Dokument entkoppelt werden: Dokument mit einer anderen Maske öffnen (oder so ähnlich).

Axel          

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Dokument zum bearbeiten sperren -> Erweitert
« Antwort #2 am: 16.09.03 - 22:00:52 »
Hi Axel,

Du hast natürlich Recht, meine Lösung hilft so wie sie ist bei den meisten Fragestellungen nicht weiter.

Eine Anmerkung noch zu Deiner Postopenformel:

Sollte da nicht statt "continue = false" ein "Call uidoc.close" rein?

Denn so wie ich Postopen verstehe ist ja das Doc bereits offen....


cu,
TMC
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:Dokument zum bearbeiten sperren -> Erweitert
« Antwort #3 am: 19.09.03 - 12:25:30 »
Stimmt. Da gibt es überhaupt kein "Continue"-Objekt im Postopen.

Noch eleganter als deine Lösung ist wohl:
Code
if doc.getItemValue("status")(0) = "wertx") then
  if (Source.editmode = true) then
      Msgbox "Rumkritzeln in Feldern verboten. Dokument wird im  Lesemodus geöffnet."
      Source.editmode = false
        Exit sub
  end if
end if

Source.editmode = false setzt das Dokument automatisch in den Lesemodus.  
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Dokument zum bearbeiten sperren -> Erweitert
« Antwort #4 am: 25.10.03 - 21:18:10 »
Zitat
Noch eleganter als deine Lösung ist wohl:
Code:
if doc.getItemValue("status")(0) = "wertx") then
  if (Source.editmode = true) then
      Msgbox "Rumkritzeln in Feldern verboten. Dokument wird im  Lesemodus geöffnet."
      Source.editmode = false
        Exit sub
  end if
end if
 

Elegant ja, allerdings greift die Lösung nicht wenn gleichzeitig im Postopen und Querymodechange ein Script steht das das "In Bearbeitung" - Öffnen verbietet.

Was u.a. letztendlich geht ist folgendes:

Postopen
Code
Sub Postopen(Source As Notesuidocument)
   
   field$ = source.FieldGetText("Status") 
   If field$ ="IchBinStatus" Then  
      If (Source.editmode = True) Then
         Msgbox "Changes not allowed.", 16, "Error"
         Call source.close
         Continue = False
         Exit Sub
      End If
   End If
End Sub
(man beachte dabei das call source.close - es bleibt sonst das Dok geöffnet im Edit-Modus).

Querymodechange
Der Vollständigkeit halber nochmal ein Beispiel für's Querymodechange:
Code
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
   field$ = source.FieldGetText("Status") 
   If field$ ="IchBinStatus" Then  
      Msgbox "Changes not allowed." , 16, "Error"
      continue = False  
      Exit Sub
   End If
End Sub

TMC


Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Dokument zum bearbeiten sperren -> Erweitert
« Antwort #5 am: 25.10.03 - 21:39:25 »
Kleiner Tipp:
Einfach mal 'ne leere DB machen mit 'ne Maske und 'ner Ansicht.
In der Maske Events wie folgt belegen:
- MsgBox "<Eventname>" (damit man sieht, was gerade passiert)
- In PostOpen: Wenn Bedingung "Nicht editierbar!" erfüllt und EditMode = True, dann Source.EditMode = False -> Damit wird jetzt QueryModeChange angesprungen !
- In QueryModeChange jetzt entsprechend reagieren: Bedingung erfüllt -> Warnmeldung, EditMode = False -> Continue = False

Es kommt hier wirklich auf die Abfolge PostOpen -> QueryModeChange an bzw. auf den separaten Ansprung von QueryModeChange (PostOpen mit EditMode = True bedeutet Strg-B auf Dok in Ansicht).
QueryOpen spielt im ganzen Prozess keine Rolle.

HTH,
Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz