Autor Thema: Löschen mit ENTF unterbinden  (Gelesen 8986 mal)

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Löschen mit ENTF unterbinden
« 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
« Letzte Änderung: 08.03.07 - 10:03:14 von iukhdh »
Thomas von der IuK

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #1 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

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #2 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
Thomas von der IuK

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #3 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
« Letzte Änderung: 28.02.07 - 15:51:12 von koehlerbv »

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #4 am: 28.02.07 - 15:48:22 »
???

 :)

 :D

 :knuddel:

Thomas

Thomas von der IuK

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #5 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #6 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

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #7 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
Thomas von der IuK

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #8 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


Thomas von der IuK

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #9 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
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #10 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!

 ;)
Thomas von der IuK

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #11 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

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #12 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
Thomas von der IuK

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #13 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Löschen mit ENTF unterbinden
« Antwort #14 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #15 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

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #16 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 !!!
Thomas von der IuK

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #17 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

Offline iukhdh

  • Senior Mitglied
  • ****
  • Beiträge: 498
  • Geschlecht: Männlich
  • To be or notes to be, this is the question
Re: Löschen mit ENTF unterbinden
« Antwort #18 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.
Thomas von der IuK

Offline LN4ever

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 505
  • Geschlecht: Männlich
Re: Löschen mit ENTF unterbinden
« Antwort #19 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
Situs vilate in isse tabernit.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz