Domino 9 und frühere Versionen > ND7: Entwicklung
Aus PosteSave zurück ins QuerySave gehen
Klaas:
Guten Morgen,
ich habe das Problem das ich ein Dokument 2x speichern muss, damit die Berechneten Werte im Dokument stimmen.
Zum Hintergrund, ich soll aus einer Exceltabelle ein NotesDB machen. In der Exceltabelle werden Personen in Spalten angelegt. Deshalb habe ich eine Person also eine Spalte zu einem Dokument gemacht. Nun kann es aber sein das Person 1 (Spalte 1) in beziehung mit Person 5 (Spalte 5) steht. Das habe ich auch schon gelöst.
Nun ist nurnoch das Problem, das wenn sich ein Dokument ändert, die Werte erst nach 2maligen Speichern in den anderen Dokumenten "erscheinen" bzw "verrechnet" werden.
Wäre echt toll wenn mir jemand sagen kann wie ich aus dem PostSave zurück ins QuerySave komme.
Mit einem Buttom zu Arbeiten (Speichern) wodrin 2x @Comand(FileSave) steht hatte ich auch schon überlegt.
Finde ich aber unschön. Da bei uns nicht jeder User die Dokumente so abspeichert.
Vielen Dank für euer Hilfe
Peter Klett:
Das wird nicht funktionieren, da Notes das nicht zulässt. In das QuerySave kommst Du nämlich nur durch ein Speichern des Dokuments im Frontend. Wenn Du im PostSave oder QuerySave das Dokument nochmal im Frontend speicherst, vermutet Notes dort eine Endlosschleife (ich hatte das Problem mal mit einem gewünschten F9 im PostRecalc einer Dialogbox - keine Chance).
Die Frage ist, warum Du das Dokument zweimal speichern musst. Wenn Du das nur benötigst, um den Code des Querysave zweimal auszuführen, lagere das Script in eine eigene Funktion aus und rufe die bei Bedarf zweimal auf, z.B aus dem QuerySave oder PostSave.
Klaas:
Hallo Peter,
ich muss das zu dem Zeitpunkt 2 mal speichern wenn ich werte im momentanen Doc geändert habe.
Ich möchte mit der Datenbank Löhne anhand der Leistung im Betrieb berechen.
Das hat alles Super funktioniert.
Bis ich Daten von einer FoxPro-Datenquelle importieren sollte. Der Import steht auch.
Nur leider müssen die Daten teilweise nochmals geändert werden.
Das heißt es wird bei einer Person eine Leistung hinzugefügt.
Diese ist aber für 2 weiter Personen relevant.(Bei uns Gruppenarbeitsplatz genannt)
Deshalb habe ich ein Berechnetes Feld erstellt, welches mit einem DBLookup die Werte aus einer Ansicht zieht.
In der Ansicht stehen alle Leistungen aller Personen mit einem Schlüssel aus Datum und GruppenNummer.
Wenn ich das Dokument nun nachdem es erstellt wurde ändere und einmal Speicher, dann steht der Wert in der Ansicht.
Und beim 2 Mal steht der Wert wieder im Dokument.
Peter Klett:
Dann müsste Dir nach dem Speichern ein F9 genügen, denn das Feld berechnet sich ja nicht nur beim Speichern. Also das Speichern aktualisiert Dir die Ansicht und das F9 das berechnete Feld.
Dann führst Du im PostSave nur noch ein Source.Refresh aus.
Was passiert eigentlich mit den Dokumenten der anderen Mitglieder der Arbeitsgruppe? Die Dokumente müssten sich doch inhaltlich auch nach dem Speichern ändern. Da das Feld berechnet ist, erfolgt die Neuberechnung aber nur im Editmodus. Naja, andere Baustelle ...
Klaas:
Stimmt. Und wenn der User dann aus dem Dokument möchte, wird er ja gefragt ob er speichern möchte.
Du hast vollkommen recht. Die anderen Mitglieder müssen auch aktuallisiert werden. das ganze sieht dann so aus:
--- Code: ---Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim ws As New Notesuiworkspace
Dim db As NotesDatabase
Dim session As New NotesSession
Dim doc As NotesUIDocument
Dim backDoc As NotesDocument
Dim agent As NotesAgent
Dim PatnerID As String
Dim LGrad As String
Dim Dummy As Integer
Set doc = ws.CurrentDocument
Set db = session.CurrentDatabase
Set backDoc = Source.Document
Call doc.FieldSetText("SaveControlle","")
Call doc.Refresh
LGrad =doc.FieldGetText("CalcLeistungsgrad")
If doc.FieldGetText("GNummer") <>"" Then
Goto WithGroup
End If
If doc.FieldGetText("GNummer") ="" And doc.FieldGetText("LGNummer") <>"" Then
Call ws.Prompt(Prompt_OK, "Achtung !","Es wurde kein Gruppe hinterlegt. Das Speichern wurde abgebrochen.")
Dummy = 0
Goto StopSave
End If
If LGrad="" Or Cint(Strleft(LGrad , "," )) =0 Or Cint(Strleft(LGrad , ",")) > 139 Then
Dummy = ws.Prompt(Prompt_YesNO, "Achtung !","Leistungsgrad ist 0 oder größer 139%. Trotzdem Speichern?")
StopSave:
If dummy = 0 Then
Continue = False
Call doc.FieldSetText("SaveControlle","")
Exit Sub
Elseif dummy = 1 Then
Continue = True
Else
Continue = False
Call doc.FieldSetText("SaveControlle","")
Exit Sub
End If
End If
WithGroup:
If doc.FieldGetText("GNummer") <>"" Then
If Not doc.EditMode Then
Set doc = ws.EditDocument(True)
End If
PatnerID = doc.FieldGetText("PatnerID")
Call session.SetEnvironmentVar( "PrämienLDateID", PatnerID )
Call doc.Refresh
End If
Call doc.FieldSetText("SaveStatus","1")
Call doc.FieldSetText("SaveControlle","1")
End Sub
--- Ende Code ---
--- Code: ---Sub Postsave(Source As Notesuidocument)
Dim gSession As New NotesSession
Dim view As NotesView
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim currentDB As NotesDatabase
Dim mailDoc As NotesDocument
Dim rtItem As NotesRichTextItem
Dim Dummy As String
Dim DummyVariant As Variant
Dim i As Integer
Const Ansicht1 = "ALLDocID"
Set currentDB = gSession.CurrentDatabase
Set view = currentDB.GetView( Ansicht1 )
Set dc = currentDB.Search( |@False|,Nothing, 0 )
Dummy = gSession.GetEnvironmentString( "PrämienLDateID" )
If Dummy ="" Then
Goto Ende
Else
DummyVariant = Fulltrim(Split (Dummy , ";"))
End If
Forall x In DummyVariant
Set doc = view.GetDocumentByKey(x)
Call dc.AddDocument(doc)
End Forall
For i= 1 To 4
Set doc = dc.GetFirstDocument
While Not doc Is Nothing
Dim success As Variant
success = doc.ComputeWithForm( False, False )
Call doc.Save( True, False )
Set doc =dc.GetNextDocument(doc)
Wend
Next
Ende:
Call gSession.SetEnvironmentVar( "PrämienLDateID", "" )
End Sub
--- Ende Code ---
Wobei ich mir sicher bin das ich noch viel optimieren kann.
Aber funktionieren tut es.
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln