Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: iukhdh am 28.02.07 - 14:50:11

Titel: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 28.02.07 - 14:50:11
Hallo Forum,

kann ich, auf eine bestimmte Ansicht bezogen, das Löschen von Dokumenten mit der ENTF-Taste unterbinden? Ich möchte dass das Löschen über einen Aktionbutton erfolgt, mit dem ich dann noch diverse andere Funktionen auslösen kann.

Danke für Eure Unterstützung
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 28.02.07 - 14:52:47
Das Löschen triggert das QueryDocumentDelete-Event des DatabaseScripts. Hierüber kannst Du Dein Problem lösen.

Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 28.02.07 - 15:37:25
Hmm,

ich gebs ja gerne zu, ich bin (noch) nicht so der Script Held. Wenn ich in die Hilfe und mein schlaues Buch schau, dann ist mir leider nicht klar wie das funktionieren könnte.

Wenn ich die Hilfe richtig verstehe, kann ich mit QueryDocumentDelete das Löschen des Dokumentes verhindern. Was ich ja nicht grundsätzlich will, sondern nur dann, wenn der Befehl über die ENTF Taste kommt. Aber wie kann ich das abfragen?

 ???

Thomas
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 28.02.07 - 15:39:31
Du willst den Juhser doch dazu zwingen, einen Buhtong zu drücken. Und dieser Button setzt dann eben auch ein bestimmtes Merkmal ins Dokument. Das fragst Du im QueryDocumentDelete-Event ab. Isses nicht da, war der User gar nicht artig und darf auch nicht löschen.

Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 28.02.07 - 15:48:22
???

 :)

 :D

 :knuddel:

Thomas

Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 28.02.07 - 15:54:00
So eine "Bildgeschichte" hatten wir hier - glaube ich - noch nicht. Sehr schön, sehr nett  :)

Im QueryDocumentDelete solltest Du noch den Fall des pösen Purschen berücksichtigen, der in einer Ansicht Strg-A - Entf - F9 - ENTER drückt. Wie man auch mit einer Löschanforderung für mehr als ein Dokument umgeht, findest Du hier im Forum, wenn Du nach dem Event-Namen suchst.

Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 28.02.07 - 16:06:16
Wegen der netten Bildergeschichte schicke ich mal ein Stück Beispielcode hinterher  ;)

Code
Sub Querydocumentdelete (Source As Notesuidatabase, Continue As Variant)
	
	'Signed entries can't be deleted !
	Dim collMarked As NotesDocumentCollection
	Dim docToDelete As NotesDocument
	
	Set CollMarked = Source.Documents
	Set docToDelete = collMarked.GetFirstDocument
	
	While Not (docToDelete Is Nothing)
		If docToDelete.Status (0) = STATUS_SIGNED Then
			Messagebox "Sie dürfen keine freigegebenen Zeiten löschen !"
			Continue = False
			Exit Sub
		End If
		Set docToDelete = collMarked.GetNextDocument (docToDelete)
	Wend
	
End Sub

HTH,
Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 28.02.07 - 23:22:43
Oh, Danke, das probiere ich morgen gleich mal aus, bin heute nachmittag garnicht mehr dazugekommen dank anderer Geschäfte.

Wenn das so ist, dann muss ich mir natürlich weitere Bildergeschichten ausdenken

 ;)

Thomas
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 02.03.07 - 11:28:44
Erstmal Danke für den Codevorschlag, die Unterbindung des Löschens mit der ENTF Taste klappt.

Dafür scheitere ich mit meinen Anfängerkenntnissen an der weiteren Umsetzung.

Die gewünschten Dokumente sollen nun über einen Button gelöscht werden, indem ich, wie vorgeschlagen, im Dokument ein Merkmal setze, und über dieses Merkmal im QuerDocumentDelet entscheide ob gelöscht werden darf.

In Formelsprache klappts so einigermassen, aber ich will mich ja mit Script beschäftigen. Und da hänge ich an folgendem Problem:

Wie bekomme ich aus einer NotesDocumentCollection die MARKIERTEN Dokumente übergeben? Ich finde immer nur eine Lösung um ALLE Dokumente zu übergeben.

Letzlich möchte ich in einer Ansicht ein paar Dokumente auswählen und in denen einen Marker in ein Feld setzen.


Vielen Dank für Eure Unterstützung


Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: eknori am 02.03.07 - 11:32:31
Die Property unprocessedDocuments der NotesDatabase Klasse ist dein Freund

Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 02.03.07 - 11:43:42
Na da kann ich ja lange nach "selected" suchen ... auf unprocessed muss man auch erst mal kommen  :P

Aber wenn ich das recht verstehe, dann packe ich meinen Code in einen Agenten, bei dem ich von vornherein "markierte Dokumente" auswähle, und diesen Agenten rufe ich über meine Aktion auf.

Innerhalb des Codes nach markierten Dokumenten abzufragen scheint dann nicht zu gehen, oder?

Kommt mir ein wenig "hinderschervier" vor, wie man hier sagt!

 ;)
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 03.03.07 - 00:46:13
Du kannst das auch in eine Ansichtsaktion packen. A-Bär: Im Gegensatz zu einem wie von Dir beschriebenen Agenten bleiben nach Ablauf des Codes dann die Markierungen erhalten, was bei schussligen Usern (und das könnte uns auch passieren!) die Markierungen gesetzt ... Ich setze bei sowas i.d.R. einen Agent ein, den ich aus einer Ansichtsaktion starte.

HTH,
Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 05.03.07 - 16:48:25
Hallo Leute,

ich habe Bernhards Vorschlag wie folgt abgeändert und in eine Aktions Agenten gepackt

Dim session As New NotesSession
   Dim db As Notesdatabase
   Dim collMarked As NotesDocumentCollection
   Dim docToChange As NotesDocument
   
   Set db=session.CurrentDatabase
   Set collMarked = db.UnprocessedDocuments
   
   Set docToChange = collMarked.GetFirstDocument
   
   While Not (docToChange Is Nothing)
      docToChange.Maske = "x"
      Call docToChange.Save (False,True)
      Call docToChange.Remove( True )
      Set docToChange = collMarked.GetNextDocument (docToChange)
   Wend

Wenn ich den Agenten ausführe, wird das Dokument zwar gelöscht, aber es kommt folgende Meldung: Function requires a valid ADT argument.

Das sagt mir nun ja mal garnix, kann mir bitte jemand sagen was Notes mir da sagen will?

Vielen Dank
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 05.03.07 - 16:52:03
ADT error besagt: Du hast Notes gerade das benötigte Dokument unter'm Arsch weggezogen:
GetNextDocument (docToChange)
docChange ist ja gerade von uns gegangen ...

Du musst vor dem Löschen bereits das NextDocument holen.

Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: Axel am 05.03.07 - 18:19:33
Das Ganze müsste so in etwa aussehen (ungetestet):

Dim session As New NotesSession
Dim db As Notesdatabase
Dim collMarked As NotesDocumentCollection
Dim docToChange As NotesDocument
Dim docTemp As NotesDoicument
   
Set db=session.CurrentDatabase
Set collMarked = db.UnprocessedDocuments
   
Set docToChange = collMarked.GetFirstDocument
   
While Not (docToChange Is Nothing)
  Set docTemp = collMarked.GetNextDocument (docToChange)
  docToChange.Maske = "x"
  Call docToChange.Save (False,True)
  Call docToChange.Remove( True )
  Set docToChange = docTemp
Wend


Axel
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 05.03.07 - 18:25:35
Ich stelle erst jetzt gerade zwei Dinge in Thomas' Code fest:

Code
  docToChange.Maske = "x"
  Call docToChange.Save (False,True)
Das ist gaga, da ja gleich das Dokument entfernt wird.

Und da sind wir beim Punkt: Das Löschen soll im Backend passieren - und da greift das QueryDocumentDelete nun gar nicht. Das beisst sich also mit dem Ausgangspunkt des Threads.

Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 05.03.07 - 23:17:30
Ach Gottchen,

verstehe ich das richtig, dann brauche ich die Aktion mit dem "X" nur, damit die Kollegen im Frontend nicht mit "ENTF" löschen können, und in meinem Aktionsbutton lösche ich, ohne Rücksicht auf das "x" im Backend einfach das Dokument? Ich glaub ich mach jetzt auch mal Backend, schlaf ne Runde und morgen probier ich das an der Frontend im Geschäft mal aus.

 :)

Werd ich doch noch hinkriegen !!!
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 05.03.07 - 23:33:36
Jetzt verstehe ich aber gar nichts mehr ... Was für Aktionen willst Du denn überhaupt ausführen? Bisher wissen wir nur, dass Du etwas von Aktionen in dem Dokument schreibst, was Du gleich danach sowieso löschst (was ja Tüttelkram wäre ...).

Sag mal bitte genaueres ... Ich kenne solche Acts eigentlich hauptsächlich in Verbindung mit dem "Eigentlich-nicht-löschen-sondern nur-unsichtbar-machen".

Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 06.03.07 - 07:18:14
Also nochmal.
Du hast mir ja das mit dem Querydocumentdelete vorgeschlagen. Damit verhindere ich, dass mir die Allgemeinheit mit ENTF bestimmte Dokumente löscht. Es handelt sich um Dokumente in einem Veranstaltungskalender, die vor dem Löschen noch bei der Zeitung manuell aus einem anderen Kalender entfernt werden müssen.

Daher erlaube ich nur das Löschen über einen Aktionsbutton (in der Ansicht), in dem a) die Dokumente gelöscht werden, und b) vorab noch eine Info an eine zentrale Stelle geht, die die Sache mit der Zeitung klärt.

Also: Alle Dokumente sind so markiert, dass sie erst dann gelöscht werden können, wenn ein "x" im entsprechenden Feld steht.

Und das wollte ich im Grunde so lösen, dass über den Aktionsbutton die ausgewählten Dokumente mit dem "x" versehen werden und dann der Löschauftrag erfolgt. Ich habe es so verstanden, dass DANN wieder Querydocumentdelete aufgerufen wird und die Löschung verhindern würde, wenn nicht das "x" am richtigen Ort steht.

Wenn ich dich aber nun richtig verstanden habe, dann wird durch den Löschauftrag im Backend Documentdelete garnicht mehr angesprochen, womit ich mir die Sache mit dem "x" sparen könnte, und einfach so lösche. Was ja noch einfacher wäre.
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: LN4ever am 06.03.07 - 09:23:44
Alle Events werden nur im UserInterface-Kontext ausgeführt, d.h. es muß jemand vor der Maschine sitzen und - mit Taste und Maus bewaffnet - etwas tun. Alles, was im Backend passiert, tangiert diese Dinge nicht.

Das ist extrem wichtig zu wissen. Wenn ich sehe, was manche Kollegen an inhaltlicher Logik in ihren Masken in ein Queryopen und POSTOPEN und sonstwohin programmieren - und dann mit einem COMPUTEWITHFORM an anderer Stelle gleich wieder umgehen, dann kann man ahnen, warum so viele Inkonsistenzen entstehen.

Löschen kannst du Dokumente auf mehrere Arten. Die Bekannteste ist die, aus einer Ansicht heraus kein Dokument zu markieren und das aktuelle Dokument mit der ENTF-Taste zu beglücken. Du kannst auch mehrere Dokumente markieren (Haken setzen), dich auf ein anderes Dokument stellen und dann die ENTF-Taste drücken. Jetzt wird nicht das aktuelle Dokument, sondern es werden die selektierten Dokumente in den Orkus gejagt. Spitzenreiter für das unerklärliche Verschwinden und damit beliebteste Methode der Löschung eines Dokuments ist und bleibt das Drücken der ENTF-Taste innerhalb eines Dokuments im Lesemodus (während der Anwender denkt, er sei im Edit-Modus - und damit er das nicht unterscheiden kann, programmieren die Jungprogrammierer so gern ihre Masken mit den Feldern im Betriebssystem-Stil). Eigentlich möchte er einen Buchstaben löschen, löscht aber das ganze Dokument und steht im nächsten Dokument. Verwirrung kommt auf. Auf Verwirrung reagiert der Anwender mit Angst. Angst löst den Fluchtimpuls aus, der Fluchtimpuls hat eine eigens dafür vorgeshene Taste, die ESCAPE-Taste. Damit verläßt der Anwender die Datenbank. Je nach Einstellung der wiederherstellbaren Löschungen wird ohne oder mit Nachfrage gelöscht.

Da es diese verschiedenen Stellen gibt, an denen du eine Dokumentlöschung initiieren kannst, ist das zugehörige Event im Datenbankscript (und nicht bei den Masken oder Views) zugeordnet. Die einfachste Methode, die Löschung durch die ENTF-Taste auszuschalten, ist die, dort einfach nur den klassischen Einzeiler CONTINUE=FALSE reinzuschreiben. Das bedeutet für deine Datenbank nichts anderes, als daß du für diese Anwendung dem Anwender die ENTF-Taste wegnimmst.

Aktionsschaltflächen können im Backend sehr wohl Löschungen durchführen (der Unterschied zum Frontend ist nämlich, daß sie die Löschung nicht "initiieren" - wie es das Drücken der ENTF-Taste ist, sondern direkt durchführen. Und da greifen die Events natürlich nicht).

Deine Befehlsfolge
Call doc.Save
Call doc.Remove
hat schon den etwas pedantischen Zug des "bei uns werden nur plausigeprüfte Daten in die Tonne getreten" - und das kann sogar negative Auswirkungen haben. Wenn in einem Notes-Cluster der Clusterreplikationstask mit mehreren Threads läuft, kann der eine Thread die Dokumentänderung (vor der Löschung) replizieren, während der andere Thread das Dokument zu löschen versucht. Und dann bleibt dir ggf. eine "ewige Leiche" stehen.

Gruß

Norbert
Titel: Ich krieg die Krise
Beitrag von: iukhdh am 06.03.07 - 15:22:08
Also so langsam zweifel ich wirklich an mir. Ich habe den Code  nun so abgeändert, weil ich ja auf die Sache mit dem "x" verzichten kann und im Backend die markierten Dokumente lösche:

        Dim session As New NotesSession
   Dim db As Notesdatabase
   Dim collMarked As NotesDocumentCollection
   Dim docToChange As NotesDocument
   Dim docTemp As NotesDocument
   Set db=session.CurrentDatabase
   
   Set collMarked = db.UnprocessedDocuments
   Set docToChange = collMarked.GetFirstDocument
   
   While Not (docToChange Is Nothing)
      Set docTemp = collMarked.GetNextDocument (docToChange)
      Call docToChange.Remove( True)
      Set docToChange = docTemp
   Wend


Ich markiere in meiner Ansicht die zu löschenden Dokumente - klicke auf den Aktionsknopf mit dem obigen Agenten - Die Dokumente werden gelöscht. Juchhei.

Aber :

Das funktioniert ein, zwei mal, dann plötzlich nicht mehr. Was mir aufgefallen ist: Ich habe ein Dokument in der DB einfach mit STRG-C und STRG-V mehrmals kopiert um das Löschen zu testen. Nachdem ich den Löschagenten habe laufen lassen, wollte ich mit STRG wieder das letzte, übrige Dokument kopieren, doch dann kam eine Meldung, dass dieses schon gelöscht wäre. Wenn ich aus der Ansicht raus und wieder rein gehe, dann klappts wieder. Wenn die Fehlermeldung kommt, kann ich  noch kurz erkennen dass im Hintergrund eine Meldung aufgeht, in der angemeckert wird, dass xy Dokumente in die Zwischenablage kopiert werden müssen.

Ich hab mir gedacht, vielleicht muss man einfach die Ansicht aktualisieren, aber daran scheint es nicht zu liegen.

Ich bin so langsam am Ende ... kann das denn sooo schwer sein mit dem Script?
 :-[
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: Fedaykin am 06.03.07 - 17:00:51
Hi

Hilft Dir zwar nicht gross weiter, aber konnte in der Test-DB die ich gemacht habe keinen Fehler feststellen. Klappt vorzüglich. Sogar die etwas waghalsigen Aktionen mit gelöschten Dokumente einfügen aus Zwischenablage. Verwende übrigens (7.02) also vielleicht sollte mal jemand mit alter Version versuchen ob Dein Problem reproduzierbar ist.

Gruss
Remo
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 07.03.07 - 15:29:25
Tja, ich  hab nun nochmal ein wenig rumprobiert. Was mir aufgefallen ist, dass die Dokumente nach dem Löschen mal automatisch aus der Ansicht verschwanden, dann mal wieder drinblieben und erst nach F9 verschwanden. Das habe ich nun mit einem Viewrefresh in den Griff bekommen.

Was mich aber immer noch stört ist die Tatsache, dass nach dem Löschen der Dokumente das Kopieren eines vorhandenen Dokuments in der gleichen Ansicht mit der Bemerkung "Das Dokument wurde gelöscht" quittiert wird. Erst wenn ich  aus der Ansicht rausgehe und wieder reingehe funktioniert das wieder.

Nun gut, es kommt wahrscheinlich nicht oft vor, dass jemand nach dem Löschen dann noch ein Dokument kopiert, aber irgendwie sagt mir mein Laienhafter Scriptverstand, dass da wohl  irgendwie noch was fehlt. Muss nach dem Code noch irgendwie ein abschliessender Befehl kommen, oder was soll diese Reaktion?

Ich habs jetzt halt mal mit einem Viewrebuild behoben, bin mir aber nicht sicher ob das die "richtige" elegante Lösung ist.

Was meinen die Profis?
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 07.03.07 - 15:35:51
Deinem Code fehlt da nichts mehr. Ansichtsindexinformationen werden gecached. Und dann kommst Du mit einem Dokument, dass ja eine UNID wie eines der gerade gelöschten Dokumente hat ... Da ist das Notes beleidigt und denkst, Du willst es verklapsen.

Bernhard

PS: In der Praxis wird sowas ja eher seltener vorkommen  ;D
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 07.03.07 - 15:54:56
Bist du sicher dass ein kopiertes Dokument die gleiche UNID hat?
Wenn es sich um die ID handelt, die man in den Dokumenteigenschaften beim Propellerhütchen ablesen kann, dann ist die aber bei jedem Dokument eine andere, auch bei den kopierten. Und das o.g. Verhalten kommt auch beim Löschen von nicht kopierten Dokumenten. Mit dem Viewrebuild ist es aber unterbunden.
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: koehlerbv am 07.03.07 - 16:10:55
War Dummfug, was ich geschrieben habe. Das Dokument bekommt eine neue UNID. Mea culpa.

Bernhard
Titel: Re: Löschen mit ENTF unterbinden
Beitrag von: iukhdh am 07.03.07 - 16:33:37
Passt schon, das muntert mich auf wenn ich auch mal was weiss
 :)

Aber ich kanns mir einfach nicht verkneifen zu deiner vorhergehenden Antwort ...

Zitat
Mit der Einstellung wirst Du irgendwann furchtbar auf die Nase fallen. Merke: Was schiefgehen kann, geht auch schief. Irgendwann ...

 :knuddel: