Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Demian am 24.06.09 - 16:46:58
-
Guuude,
also manchmal ist echt der Wurm drin :-:
Ich möchte bei Änderung eines Währungsfeldes im Frontend, im Backend alle Dokumente mitändern, die von diesem Währungsfeld abhängig sind (verschiedene Masken - keine Antwortmasken).
Also speicher ich im Postopen die aktuellen Werte zum Beispiel mit source.FieldGetText("Feld"). Das gibt mir problematischerweise das durch das Währungsfeld erzeugte Währungszeichen mit aus. Umwandlungen alla ccur gehen dann halt nicht.
Gibt es dafür Workarounds, oder muss man jetzt echt über left(Text,Länge - 2) gehen, bzw. am besten vorher noch die Clienteinstellungen auslesen? Dann geh ich lieber hin und mach ein normales Dezimalfeld draus, und lass die Währung nur in der Ansicht anzeigen.
Gruß
Demian
-
Und warum machst Du das über das Frontend?
Source.Document.Feld (0) tut doch auch - und in diesem Fall sogar richtig (nämlich nicht als Text) ;)
Bernhard
-
Moin Bernhard,
im Postopen les ich die Werte zum Beispiel folgendermaßen ein:
Function Zone_Postopen(source As NotesUIDocument) As Boolean
'*********************************************************************************************************************************
'save the current values of the form Zone to verify in the function Zone_ValuesChanged of this library if
'they were changed. Returns true in any case excluding errors. Invoked from the event Postopen of the form Zone
'*********************************************************************************************************************************
'used libraries: logging
'used functions: CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
' Text As String)
'
'Parameters: source = current zone
'
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
If Not source.IsNewDoc Then
'save old field values for comparing in the function Zone_ValuesChanged in this lib
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Postopen",_
"globale Variablen setzen um für Zone: " & source.FieldGetText("ID") & " einen Vergleich auf Änderung durchführen zu können")
strZO_IDOLD = source.FieldGetText("ID")
strZO_EffectiveFromOLD = source.FieldGetText("EffectiveFrom")
strZO_AverageDistanceOLD = source.FieldGetText("AverageLinearDistance")
strZO_ProvisionOLD = source.FieldGetText("Provision")
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Postopen",_
"globale Variablen ausgelesen")
Else
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Postopen",_
"Zone: " & source.FieldGetText("ID") & " wird bearbeitet")
End If
'RETURN
Zone_Postopen = True
Leave:
Exit Function
ErrHandle:
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Postopen",_
"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
'RETURN
Zone_Postopen = False
Resume Leave
End Function
Im Querysave hol ich mir dann die eventuell geänderten Werte ähnlich:
Function Zone_Querysave(source As NotesUIDocument) As Boolean
'*********************************************************************************************************************************
'saves the current field values of the form Zone to compare them with the values which were saved in the
'function Zone_Postopen of this library. Invoked from the event Querysave of the form Zone.
'*********************************************************************************************************************************
'used libraries: logging, this lib
'used functions: Zone_VerifyInput(source As NotesUIDocument) As Boolean
' Zone_NotExist(source As NotesUIDocument) As Boolean
' CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
' Text As String)
'
'Parameters: source = current zone
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
'verify user input
If Zone_VerifyInput(source) = False Then
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Querysave",_
"Felder nicht korrekt ausgefüllt")
'RETURN
Zone_QuerySave = False
Exit Function
End If
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Querysave",_
"Felder korrekt ausgefüllt")
'Verify if the ID allready exists. Else exit function with false
If Source.IsNewDoc Then
If Zone_NotExist(source) = False Then
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Querysave",_
"Zone_QuerySave = False - speichern verhindert")
'RETURN
Zone_QuerySave = False
Exit Function
End If
Else
'read new field values for compare with old field values
strZO_IDNEW = source.FieldGetText("ID")
strZO_EffectiveFromNEW = source.FieldGetText("EffectiveFrom")
strZO_AverageDistanceNEW = source.FieldGetText("AverageLinearDistance")
strZO_ProvisionNEW =source.FieldGetText("Provision")
If Zone_ValuesChanged = False Then
Msgbox "Es wurden keine gültigen Änderungen festgestellt. Speichern wird abgebrochen.",,"DORNHÖFER GmbH"
'RETURN
Zone_QuerySave = False
Exit Function
End If
End If
'RETURN
Zone_Querysave = True
Leave:
Exit Function
ErrHandle:
Call CreateLogEntry(libZO_DB.title,libZO_Session.CommonUserName,"Scriptbibliothek: lib_Zone","Zone_Querysave",_
"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
'RETURN
Zone_Querysave = False
Resume Leave
End Function
Zu diesem Zeitpunkt würde mir source.document.Provision(0) für strZO_ProvisionNEW ja noch den zuletzt gespeicherten Wert zurückgeben und nicht den neu eingegebenen, oder nicht?
-
Nein, das gibt Dir den Wert aus dem In-Memory-Dokument zurück.
Bernhard
-
Nein, das gibt Dir den Wert aus dem In-Memory-Dokument zurück.
Den Begriff les ich das erste Mal. Hatte offen gestanden im Debugger gar nicht geguckt, was mir source.document.feld(0) zurück gibt. Ich bin einfach davon ausgegangen, das das im NotesUIdocument gelagerte Notesdocument nur die letzten echt gespeicherten Werte enthält. Ist aber ein interessante Sache, das vereinfacht das ein oder andere.
Habe es jetzt geändert:
Postopen:
...
strZO_IDOLD = Cstr(source.Document.ID(0))
strZO_EffectiveFromOLD = Cstr(source.Document.EffectiveFrom(0))
strZO_AverageDistanceOLD = Cstr(source.Document.AverageLinearDistance(0))
strZO_ProvisionOLD = Cstr(source.Document.Provision(0))
...
Querysave:
...
strZO_IDNEW = Cstr(source.Document.ID(0))
strZO_EffectiveFromNEW = Cstr(source.Document.EffectiveFrom(0))
strZO_AverageDistanceNEW = Cstr(source.Document.AverageLinearDistance(0))
strZO_ProvisionNEW =Cstr(source.Document.Provision(0))
...
und im Postsave dann schließlich:
...
'create the tmp doc
Set docTemp = libZO_DB.Createdocument
docTemp.form = "tmpZone"
'set old data
docTemp.IDOLD = strZO_IDOLD
docTemp.EffectiveFromOLD = Cdat(strZO_EffectiveFromOLD)
docTemp.AverageDistanceOLD = Clng(strZO_AverageDistanceOLD)
docTemp.ProvisionOLD = Ccur(strZO_ProvisionOLD)
'set new data
docTemp.IDNEW = strZO_IDNEW
docTemp.EffectiveFromNEW = Cdat(strZO_EffectiveFromNEW)
docTemp.AverageDistanceNEW = Clng(strZO_AverageDistanceNEW)
docTemp.ProvisionNEW = Ccur(strZO_ProvisionNEW)
docTemp.EditingUser = libZO_Session.CommonUserName
Call docTemp.Save(True,False)
...
Danke für den Tip, Bernhard. ;)
-
Wie immer: Gerne, Demian :)
Bernhard