Autor Thema: Aus PosteSave zurück ins QuerySave gehen  (Gelesen 3078 mal)

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Aus PosteSave zurück ins QuerySave gehen
« am: 11.10.10 - 08:04:27 »
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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Aus PosteSave zurück ins QuerySave gehen
« Antwort #1 am: 11.10.10 - 16:20:20 »
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.

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Re: Aus PosteSave zurück ins QuerySave gehen
« Antwort #2 am: 12.10.10 - 07:41:02 »
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.

« Letzte Änderung: 12.10.10 - 07:44:09 von Klaas »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Aus PosteSave zurück ins QuerySave gehen
« Antwort #3 am: 12.10.10 - 08:01:44 »
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 ...

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Re: Aus PosteSave zurück ins QuerySave gehen
« Antwort #4 am: 12.10.10 - 08:48:18 »
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
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

Wobei ich mir sicher bin das ich noch viel optimieren kann.
Aber funktionieren tut es.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Aus PosteSave zurück ins QuerySave gehen
« Antwort #5 am: 12.10.10 - 10:38:10 »
Da Du das Script veröffentlicht hast und selbst schreibst, dass dort Optimierungsbedarf enthalten sein könnte, möchte ich (ungefragt) ein bißchen daran herummäkeln. Ein Thema, auf das Du vielleicht etwas mehr achtgeben solltest, ist Bedingungslogik. Ein Beispiel:

If doc.FieldGetText("GNummer") <>"" Then
   Goto WithGroup
End If
   
If doc.FieldGetText("GNummer") ="" And doc.FieldGetText("LGNummer") <>"" Then

Den roten Text kannst Du weglassen, denn die Bedingung hast Du direkt darüber schon einmal abgefragt. In WithGroup fragst Du es dann noch mal ab.

Ein anderes Beispiel:

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

Die beiden blauen Befehlsfolgen sind identisch, also würde ich sie auch nur einmal schreiben. Bei späteren Erweiterungen ist die Gefahr groß, nur eine zu ändern, also Thema Wartbarkeit.

Wenn Du es so schreibst, passiert das gleiche, es ist aber übersichtlicher, lesbarer und wartungsfreundlicher, wobei der Else-Part nicht nötig ist, denn Continue ist True

If dummy <> 1 Then
   Continue = False
   Call doc.FieldSetText("SaveControlle","")
   Exit Sub
Else
   Continue = True
End If

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz