top of page

Vorbelegung Feldwerte für neue Datensätze / Preset of field values for new data records

(alle Versionen/all versions)

Donnerstag, 18. April 2024

Deutsch

Hintergrund/Anforderung

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.

Im Datensatz klinkt man sich in das "Before Update"-Ereignis ein.
Im Datensatz klinkt man sich in das "Before Update"-Ereignis ein.

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

Das Makro greift ausschließlich bei Server-Ausführung wegen der Bedingung "IsRunningOnServer()" - "$CurrentDate" liefert keine Uhrzeit - wenn man auch die Uhrzeit benötigt , sollte man die Funktion "GetDateTime()" verwenden!
Das Makro greift ausschließlich bei Server-Ausführung wegen der Bedingung "IsRunningOnServer()" - "$CurrentDate" liefert keine Uhrzeit - wenn man auch die Uhrzeit benötigt , sollte man die Funktion "GetDateTime()" verwenden!

Um die Ausführung auf die Neuanlage eines Datensatzes zu beschränken , muss ergänzend folgende Bedingung eingefügt werden.

IsRecordInsert() = True

Bzw. 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.

"GetDateTime()" liefert neben dem Datum auch korrekt die Uhrzeit mit!
"GetDateTime()" liefert neben dem Datum auch korrekt die Uhrzeit mit!
ree



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

END

Bemerkenswert 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.






bottom of page