Hallo,
ich habe einen Wert (eine Rundungsfehlertoleranz), die ich gerne an einer Stelle setzen und verwalten möchte, auf die ich aber beim Erstellen von Filtern, in Skripten, in den Eingabemasken Zugriff habe (im Prinzip eine globale Variable).
Ich muss einfach an vielen Stellen |Wert1-Wert2|<Toleranzwert abprüfen…
Gibt es so etwas im cRM?
Hat jemand so etwas schon realisiert? Wenn ja, wie?
Sie könnten im Ereignis „Projekt wurde geöffnet“ eine Sessionvariable definieren (mal in der SDK Doku danach suchen), die Sie „Toleranz“ nennen. Ab dem Augenblick steht in sämtlichen Formeln unterhalb des cRM-Zweiges ein Unterordner „Session“ mit ebendieser Variablen zur Verfügung.
Dieser Wert sollte sich nicht besonders dynamisch verändern, da Formelergebnisse uU auch gecacht werden, d.h. ein Eingabemaskenelement, das per Formel diesen Wert nutzt, würde sich nicht automatisch aktualisieren, bloß weil ein Script diese Sessionvariable auf einen anderen Wert ändert.
Alternativ zur Session-Variablen könnten Sie auch ein neues Firmenstammdatenfeld spendieren und den Toleranzwert fest hinterlegen. Firmenstammdatenfelder stehen auch in der gesamten Anwendung in Formeln zur Verfügung. Dieser Ansatz ist dann statisch.
Die Preisfrage ist, zu welchem Zeitpunkt Sie die Sessionvariable zum aller ersten Mal definieren? Haben Sie das wie oben angegeben im „Projekt wurde geöffnet“ Ereignis gemacht?
Wenn Sie das erst später machen, kann es zu spät sein, wenn dann eine Ansicht beim Programmstart automatisch wieder-geöffnet wird, bevor das Script mit der Sessionvariable gelaufen ist. Dann sind vielleicht bei der Übersichtsliste die Variablen bereits schon „festgezurrt“ worden.
Wenn Sie es im „Projekt wurde geöffnet“ Ereignis gemacht haben, riecht es nach einem kleinen Fehler.
Sub InitializeToleranz
Dim oProject : Set oProject = cRM.CurrentProject
Dim oViewConfigs : Set oViewConfigs = oProject.ViewConfigs
Dim oViewConfig : Set oViewConfig = oViewConfigs.ItemByName("Datenbankkonfiguration")
Dim sStandardwert : sStandardwert = "1"
Dim sWert
Dim sFilter : sFilter = "SetFilterDirectSQL: SELECT ""STRK_UID"" FROM ""dbo"".""v_archiv_DBConfiguration"" WHERE ""STRK_Id"" = 'PriceRoundingDifferences'"
Dim oRecordSet : Set oRecordSet = oViewConfig.CreateRecordSet(sFilter)
Dim oRecord
If Not IsLeer(oRecordSet) Then
oRecordSet.MoveFirst
Set oRecord = oRecordSet.CurrentRecord
If Not IsLeer(oRecord) Then
sWert = CStr(oRecord.GetContentsByName("STRK_NUMERIC5_2Value"))
If IsLeer(sWert) Then
sWert = CStr(sStandardwert)
End If
Else
sWert = CStr(sStandardwert)
End If
Else
sWert = CStr(sStandardwert)
End If
call oProject.SetSessionProperty ("Rundungstoleranz", sWert)
Set oRecord = Nothing
Set oRecordSet = Nothing
Set oViewConfig = Nothing
Set oViewConfigs = Nothing
Set oProject = Nothing
End Sub
Die Funktion IsLeer wühlt sich nur durch die Variablentypen und -inhalte und liefert bei Nichtbelegung (Nothing, „“,…) true zurück.
Sorry, das ist wohl ein kleiner Fehler, dass die dort fehlen. Wird mit Service Pack 11.007 (kommt in den nächsten 2-3 Wochen) gefixt. Wenn Sie vorher eine Prerelease-Version brauchen, damit Sie weitermachen können, nehmen Sie bitte Kontakt mit dem Support auf, wir organisieren dass dann.