Wie bereits im ersten Teil des Blog-Artikels zum Release der Version 5.8 angedeutet, wurden für die Verarbeitung von 64-Bit Datensatz-IDs auch Änderungen am conzept 16-Befehlssatz durchgeführt. Warum dies notwendig ist, beschreibt der vorliegende zweite Teil.
Einleitung
Das folgende Beispiel 1 demonstriert die Problematik.
main
local
{
tPrime : int;
}
{
tPrime # RecInfo(MyTable,_RecGetPrime);
// Verarbeitung von tPrime
// ...
}
Handelt es sich bei MyTable um eine Tabelle mit 64-Bit-Datensatz-IDs, muss der Befehl RecInfo()
prinzipiell auch in der Lage sein, 64-Bit-Werte zurückzuliefern. Deshalb wurde der Befehl angepasst und besitzt nun einen 64-Bit-Rückgabewert (Beispiel 2).
main
local
{
tPrime : bigint;
}
{
tPrime # RecInfo(MyTable,_RecGetPrime);
// Verarbeitung von tPrime als 64-Bit Wert.
// ...
}
Durch die Umstellung der lokalen Variable tPrime von int
auf bigint
kann nun auch der 64-Bit Prime-Counter ausgelesen werden. Allerdings müssten beim Umstieg auf die Version 5.8 alle Prozeduren angepasst und neu übersetzt werden, die RecInfo()
aufrufen. Damit dies nicht notwendig ist und der vorhandene Prozedur-Code kompatibel bleibt, wird mit der Version 5.8 die implizite Typkonvertierung eingeführt. Diese erlaubt die Zuweisung eines bigint
-Wertes an einen int
-Wert (und auch umgekehrt) ohne den Aufruf einer Konvertierungsfunktion (Beispiel 3).
main
local
{
tVal32 : int;
tVal64 : bigint;
}
{
tVal64 # 4711;
tVal32 # tVal64;
}
Vor der Version 5.8 wäre der Aufruf der Konvertierungsfunktion CnvIB()
notwendig, um die Prozedur fehlerfrei zu übersetzen. Mit der impliziten Typkonvertierung ist dies nicht mehr notwendig, da die Variable tVal64 bei der Zuweisung implizit nach int
konvertiert wird. Überschreitet tVal64 den Wertebereich von tVal32, wird der Laufzeitfehler „Wert zu groß“ generiert. Da die Typkonvertierung Konstanten mit einschließt, funktioniert auch die Zuweisung des Wertes 4711
an tVal64 ohne die Angabe von \b
. Gleiches gilt auch für die Datentypen byte
und word
. Diese werden ebenfalls implizit nach und von bigint
gewandelt. Die Wandlung von byte
und word
nach int
und zurück war bereits vor der Version 5.8 ohne Konvertierungsfunktion möglich.
Durch die implizite Typkonvertierung kann somit der Code aus Beispiel 1 unverändert und ohne Neuübersetzung in Version 5.8 ausgeführt werden. Erst bei Aktivierung der 64-Bit Datensatz-IDs der betreffenden Tabelle muss der Prozedurtext angepasst werden, um Laufzeitfehler bei der Zuweisung von RecInfo()
zu vermeiden.
Eine detaillierte Beschreibung der impliziten Typkonvertierung enthält die Online-Hilfe.
Befehle, Ereignisse und Eigenschaften
Nicht nur der Befehl RecInfo()
ist von 64-Bit-IDs betroffen. Auch weitere Befehle sowie Ereignisse und Eigenschaften wurden angepasst.
Befehle für die Datensatzverarbeitung
RecInfo
: Der Rückgabewert und das 3. Argument wurden aufbigint
geändertRecRead
: Der Typ des 4. Argumentes, das u.a. zur Angabe der Datensatz-ID dient, wurde aufbigint
geändert.
Befehle der Mehrfachselektion für RecList und DataList
Die Mehrfachselektion für das RecList-Objekt baut auf eine Cte-Liste auf. Die Datensatz-ID wird hier in der Eigenschaft spID
abgelegt.
spID
: Der Typ der Eigenschaft wurde aufbigint
geändert.CteInsertItem
: Das 2. Argument zur Angabe der ID-Eigenschaft wurde aufbigint
geändert.CteInsertNode
: Das 2. Argument zur Angabe der ID-Eigenschaft wurde aufbigint
geändert.WinMsdInsert
: Das 2. Argument zur Angabe des neu aufzunehmenden Elementes wurde aufbigint
geändert.WinMsdDelete
: Das 2. Argument zur Angabe des zu entfernenden Elementes wurde aufbigint
geändert.WinMsdRead
: Das 2. Argument zur Angabe des zu lesenden Elementes wurde aufbigint
geändert.
Ereignisse
Einige Ereignisse von Oberflächenobjekten erhalten beim Aufruf im Argument aID bzw. aRecID eine Datensatz-ID. Dort ist es nun möglich das Argument als bigint
zu definieren. Der folgende Code-Ausschnitt zeigt dies exemplarisch am Ereignis EvtLstSelect.
sub EvtLstSelect
(
aEvt : event; // Ereignis
aID : bigint; // Record-ID des Datensatzes oder Zeilennummer
)
: logic; // Wird nicht ausgewertet
{
// aID kann als int oder bigint deklariert werden.
return(true);
}
Werden die Argumente der betreffenden Ereignisse als int
deklariert, wird ein Laufzeitfehler ausgelöst, wenn die übergebene Datensatz-ID außerhalb des Wertebereiches von int
liegt. Dies ist nur dann der Fall, wenn die 64-Bit-Datensatz-IDs in der Tabelle aktiviert sind und auch tatsächlich Datensätze mit einer Datensatz-ID >= 0x80000000\b
existieren. Die folgenden Ereignisse wurden angepasst:
- EvtHelpTip
- EvtKeyItem
- EvtLstDataInit
- EvtLstEditFinished
- EvtLstRecControl
- EvtLstSelect
- EvtLstSelectRange
- EvtMenuContext
- EvtMouseItem
API-Client und DLL-Schnittstelle
Die Schnittstelle des API-Client und die DLL-Schnittstelle (DllCall()
) wurden um die Funktionen C16_RecInfo64()
sowie C16_RecRead64()
erweitert.