Autor Thema: Dokument im Frontend nicht speichern, im Backend speichern  (Gelesen 3070 mal)

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Hallo alle miteinander,

ich habe schon mal eine Weile gesucht, aber noch nicht das passende gefunden. Deshalb werde ich mein Problem mal schildern, vielleicht hat je jemand eine Idee.

Ein Dokument soll per Button einen neuen Status bekommen, Änderungen des Anwenders über den "Möchten Sie Speichern"-Dialgog gespeichert (oder nicht!!!) werden. Der Anwender soll gefragt werden, da im Querysave das Ändern von Daten (Speichern) geloggt wird. Dann soll im Backend der Status geändert und das Dokument gespeichert werden. Soweit die Theorie. Ich verwende folgenden Code:
Code
	Dim db As NotesDatabase
	Dim id As String
	Set db = ws.CurrentDatabase.Database
	id = ws.CurrentDocument.Document.UniversalID -->> Ich gehe den umweg über die DokumentenID
	Dim newdoc As NotesDocument
	ws.CurrentDocument.EditMode=False  -->> hier kommt die Abfrage "möchten Sie.." beantwortet mit nein
	Call ws.CurrentDocument.Close(True)
	Set newdoc=db.GetDocumentByUNID(id)
	Call setstatus(newdoc,newstate)  -->> Ändert das Statusfeld und ein paar Texte (Backend)
	Call newdoc.Save(True,False)
Hat der Anwender nichts geändert, klappt alles wie es soll. Hat er aber z.B. einen Namen geändert und entscheidet sich beim Speicherdialog für nein, so wird trotzdem der neue Name im Dok gespeichert. Witzigerweise kann ich im Debugger bis zum Schluß den alten Namen sehen. Wenn ich dann das Dokument wieder öffne, steht allerdings die ungewollte Änderung drin :-:
Nun habe ich schon den Umweg über die ID genommen um garantiert ein "anderes" Dokument im Backend zu öffnen, hilft aber nicht. Komisch ist auch, dass ich im Debugger noch auf das ui-Dokument zugreifen kann, nachdem ich es mit "Close" geschlossen habe.
Sicher habe ich nur was übersehen, aber was ???

Viele Grüße
Mirko
« Letzte Änderung: 27.09.10 - 15:16:34 von Mirko »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #1 am: 22.09.10 - 10:38:09 »
Warum reicht Dir dann kein

Set NotesUIDocument = NotesUIWorkspace.CurrentDocument
NotesUIDocument.Document.Status = "Neuer Status"
Call NotesUIDocument.Close
?

Der Status ist geändert, wird aber nur im QuerySave gespeichert, wenn der User die Standard-Abfrage mit "Ja" beantwortet.

Bernhard

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #2 am: 22.09.10 - 10:54:04 »
Hallo Bernhard,

der Status soll immer gespeichert werden, egal ob sich der Benutzer für oder gegen das Speichern entscheidet. Sinn des Ganzen ist die Weiterleitung an eine andere Abteilung.

Gruß Mirko

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #3 am: 22.09.10 - 11:05:20 »
Dann mache ein verstecktes Feld "Berechnet zur Anzeige" (!). Dein Button setzt dieses Feld auf "1".
Im QueryClose fragst Du dieses Feld ab - wenn es "1" ist, dann setzt Du das Status-Item um und speicherst im Backend.

Bernhard

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #4 am: 22.09.10 - 12:53:17 »
Das leuchtet mir grad nicht ein  ::) Da würde ich doch auch die Änderungen des Users mit speichern
Ich speichere meinen Statuswechsel ja sowieso im Backend. Aber warum werden Änderungen (die der User irrtümlich gemacht hat) gespeichert, obwohl der Speicherdialog mit "Nein" beantwortet wurde  ??? Sollte nicht, wenn ich "workspace.currentdocument.close" aufrufe als nächstes "workspace.currentdocument = nothing" sein ?

Gruß Mirko

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #5 am: 22.09.10 - 13:27:58 »
Sorry, da habe ich Dich missverstanden.

Dein Plan mit dem "ein bisschen speichern" wird so nicht klappen. Solange Du das Dokument noch "mehr oder weniger" offen hast, wird jeder Versuch, auf das Dokument "anders" zuzugreifen, wieder zur In-Memory-Instanz führen.

Bernhard

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #6 am: 22.09.10 - 13:28:24 »
Dim db As NotesDatabase
Dim id As String
Set db = ws.CurrentDatabase.Database
id = ws.CurrentDocument.Document.UniversalID -->> Ich gehe den umweg über die DokumentenID
Dim newdoc As NotesDocument
ws.CurrentDocument.EditMode=False  -->> hier kommt die Abfrage "möchten Sie.." beantwortet mit nein
Call ws.CurrentDocument.Close(True)
Set ws = New NotesUIWorkspace
Set newdoc=db.GetDocumentByUNID(id)
Call setstatus(newdoc,newstate)  -->> Ändert das Statusfeld und ein paar Texte (Backend)Call newdoc.Save(True,False)

Ich denke, Du musst das aktuelle Dokument aus dem Speicher löschen. Versuch mal, ws neu zu setzen (wie in rot angegeben). Alternativ übergibst Du nur die id an setstatus, suchst Dir dort anhand der id das Dokument und speicherst es innerhalb der Sub.

Nachtrag:

Delete ws könntest Du auch mal probieren. Habe ich noch nie gemacht, aber bei docs und uidocs hat das schon oft geholfen.
« Letzte Änderung: 22.09.10 - 13:31:50 von Peter Klett »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #7 am: 22.09.10 - 13:35:52 »
Peter, NotesSession und NotesUIWorkspace gibt es immer nur einmal.

Würde das mit der ID-Übergabe klappen (aber das Dokument ist ja noch In-Memory), dann würdest Du für den Fall "Speichern? Ja!" einen sauberen Speicherkonflikt provozieren.

Bernhard

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #8 am: 22.09.10 - 13:44:02 »
Etwas könnte Mirko noch probieren:

In der Maske global eine Variable definieren.
Im PostOpen die NoteID in der Variable speichern.
Hiermit im Terminate einen entsprechenden Agent aufrufen (und hoffen, dass Terminate gründlich war).
Wurde QuerySave komplett durchlaufen, dann kann der Agentaufruf im Terminate entfallen.

Probiert habe ich das aber nicht.

Bernhard

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #9 am: 23.09.10 - 10:15:25 »
Ich habe gerade noch mal getestet. Ich speichere die Dokumenten-ID per Button in eine Variable, die ich in den Globals der Maske definiert habe. im Terminate der Maske läuft dann:
Code
	Dim ws2 As New NotesUIWorkspace
	Dim currdoc As NotesDocument
	Set currdoc= ws2.CurrentDatabase.Database.GetDocumentByUNID(testid)
	Call currdoc.replaceitemvalue("unbenannt4","gespeichert per button"+Cstr(Now))
	Call currdoc.Save(True,False)
Obwohl ich extra noch einemal einen neuen Workspace anlege, bleibt das Ergebnis das gleiche. Es werden alle Daten gespeichert. Also muß mein Anwender wohl damit leben, dass jedesmal ein "gespeichert" in der Historie steht, wenn das Dokument auch nur weitergeleitet, nicht aber geändert wurde.
Einzige Möglichkeit wäre, in jedem Feld das OnCahange-Ereignis auszuwerten, damit eine Globale Variable setzten und die beim Speichern zu prüfen. Allerdings speichert das auch dann die Änderungen des Users, wenn der User die Abfrage "Möchten Sie ..." mit "nein" quittiert. Da werde ich wohl meinen User überzeugen müssen.
Man bräuchte so was wie ein Flush, wenn man das Dokument schließt und neu öffnet, damit der Cache leer ist ....
Trotzdem vielen Dank für Eure Mithilfe

Gruß Mirko

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #10 am: 23.09.10 - 10:36:00 »
Nun habe ich das selbst ausprobiert. In einer Maske habe ich Feld1 bearbeitbar und Feld2 berechnet beim Anlegen.

Sub Queryclose (Source As NotesUIDocument, Continue as Variant)
   Dim doc As NotesDocument
   Set doc = Source.Document
   Dim db As NotesDatabase
   Set db = doc.ParentDatabase
   Dim id As String
   id = doc.UniversalID
   Delete Source
   Set doc = db.GetDocumentByUnid (id)
   doc.Feld2 = doc.Feld2 (0) & "1"
   Call doc.Save (True, True)
End Sub

Wenn ich das Dokument bearbeite und speichere, wird auch Feld 1 gespeichert. Ändere ich Feld 1 und verlasse das Dokument ohne Speichern, wird auch Feld 1 nicht geändert. Feld 2 wird aber immer um eine 1 verlängert. Es gibt auch keinen Replizierkonflikt, weder beim Verlassen mit noch beim Verlassen ohne Speichern.
« Letzte Änderung: 23.09.10 - 10:38:59 von Peter Klett »

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #11 am: 23.09.10 - 12:08:33 »
SUPER!!!!

Vielen Dank, damit kann ich es hinbiegen. Ich setzte mir jetzt mit meinem Button zu Statuswechsel eine globale Variable, die ich dann im Queryclose auswerte. Damit kann ich dann den Wechsel speichern und die anderen Änderungen ignorieren.

Danke noch mal und viele Grüße

Mirko

Offline Mirko

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Geschlecht: Männlich
Re: Dokument im Frontend nicht speichern, im Backend speichern
« Antwort #12 am: 24.09.10 - 10:27:23 »
Mit dieser Lösung funktioniert es wie gewünscht, das Thema ist damit erledigt.

Viele Grüße

Mirko

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz