OFFICIUM INSERVIO
Your reliable partner for your business software...
Vorbelegung Feldwerte für neue Datensätze / Preset of field values for new data records
(alle Versionen/all versions)
Donnerstag, 18. April 2024
AppDesigner-Umsetzung über "Before Update" Makro im Datensatz
AppDesigner-Umsetzung über "Standardwerte" (Default values) im Datensatz
MS-SQL-Server-Umsetzung über CONSTRAINT DEFAULT in SQL-Tabelle
Deutsch
Hintergrund/Anforderung
Man möchte gewisse Werte von Datenfeldern für die Anlage eines neuen Datensatzes sinnvoll vorbelegen.
Z.B. automatisch einen Benutzernamen oder Datum etc. in bestimmten Feldern vorgeben , damit diese Informationen beim Speichern eines neuen Datensatzes vorbelegt werden.
👆🏻Tipp: Für den Bau von Tabellen, die als Datensatz im AppDesigner verwendet werden sollen , empfiehlt sich die Einhaltung gewisser Primärschlüssel-Regeln. Details siehe hier:
https://www.officium-inservio.com/sage-100-appdesigner/writablelists1#viewer-oa2th115954
AppDesigner-Umsetzung über "Before Update" Makro im Datensatz
Ein möglicher Weg ist , direkt auf der Datensatz-Ebene auf das Makro-Ereignis "Before Update" zu reagieren.

Für die Vorbelegung ist ein Makro ausreichend , welches man Server-seitig ausführen lässt.

Um die Ausführung auf die Neuanlage eines Datensatzes zu beschränken , muss ergänzend folgende Bedingung eingefügt werden.
IsRecordInsert() = TrueBzw. einfach auch nur wie folgt , da dies der boolschen Abfragelogik folgend natürlich auch ausreichend ist (wie bei dem Beispiel "IsRunningOnServer()"im Screenshot zuvor):
IsRecordInsert()Die Vorbelegung der Feldinhalte kann man nach Belieben durchführen.
Im vorliegenden Fall wurde mit "$[CurrentDate]" und "$[UserName]" jeweils das Datum (keine Uhrzeit!) und Benutzername Server-seitig vorbelegt.
Wenn man auch die Uhrzeit benötigt , sollte man anstatt "$[CurrentDate]" dann die "GetDateTime()"-Funktion verwenden.
AppDesigner-Umsetzung über "Standardwerte" (Default values) im Datensatz
Ein anderer Ansatz ist es , direkt im Datensatz auf Feldebene über die Funktionen "=$[UserName]" sowie "=$[CurrentDate]" bzw. "=GetDateTime()" die Informationen als Standardwert (Default value) im entsprechenden Feld vorzubelegen.
Wichtig ist an dieser Stelle ein Gleichheitszeichen = an den Anfang zu setzen , da spezielle Ausdrücke und Funktionsaufrufe in diesem Kontext speziell mit einem Gleichheitszeichen eingeleitet werden müssen.


Die Funktion "GetDateTime()" liefert dabei auch entsprechend die Uhrzeit.
MS-SQL-Server-Umsetzung über CONSTRAINT DEFAULT in SQL-Tabelle
Man kann für die Anlage auch einen entsprechenden DEFAULT-Wert als CONSTRAINT für die SQL-Tabelle definieren.
ALTER TABLE [dbo].[KHKSAGBookingInterfaceTextImpMap] ADD CONSTRAINT [DF_KHKSAGBookingInterfaceTextImpMap_CreatedBy]
DEFAULT ( [dbo].[fnGetPrincipalName]() )
FOR [CreatedBy]
ALTER TABLE [dbo].[KHKSAGBookingInterfaceTextImpMap] ADD CONSTRAINT [DF_KHKSAGBookingInterfaceTextImpMap_CreatedOn]
DEFAULT ( GETDATE() )
FOR [CreatedOn]Dabei kann die SQL-Funktion "fnGetPrincipalName" von Sage nützlich sein.
In vielen Fällen wird diese im Rahmen der SQL-Datenzugriffe des Sage Applikationsservers mit dem Benutzernamen aus dem Kontext vorbelegt , mittels SQL-Kontext "CONTEXT_INFO".
Diese Information wird von Sage im Rahmen des Datenbank-Kontext im Applikationsserver bei den Datenzugriffen teilweise vorbelegt.
Ist kein passender Wert im SQL-Kontext "CONTEXT_INFO" der SQL-Server-Datenverbindung vorhanden , dann wird das übliche SQL "SYSTEM_USER" angenommen.
Nachfolgend der TSQL-Code der Funktion "fnGetPrincipalName":
DECLARE @name varchar(128)
DECLARE @contextInfo varbinary(128)
DECLARE @IsAzureSql bit
SET @IsAzureSql = CASE WHEN (CONVERT(int, ServerProperty('EngineEdition')) = 5) THEN 1 ELSE 0 END
SET @contextInfo = CONTEXT_INFO();
--No Access Linked Tables Connection
IF (@contextInfo IS NOT NULL)
BEGIN
IF (@IsAzureSql = 0)
BEGIN
SELECT @name = CAST(@contextInfo AS varchar(128))
IF @name IS NOT NULL
BEGIN
SET @name = RTRIM(@name)
END
END
ELSE
BEGIN
SELECT @name = [ApplicationUsername]
FROM [USysContextInfo]
WHERE [ContextInfo] = @contextInfo
END
END
IF @name IS NULL
BEGIN
SET @name = SUBSTRING(SYSTEM_USER,1,128)
IF @name LIKE '[_]OLSYS[_]%'
BEGIN
SET @name = SUBSTRING(@name, 8, 128)
END
ENDBemerkenswert an dieser Stelle ist die vorhandene Differenzierung , ob die Datenbank in einer Microsoft Azure Cloud als MS-Azure-SQL-Server-Datenbank läuft.
Dies dürfte in den meisten Sage 100-Praxisfällen nicht der Fall sein.
