
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 aufbigintgeändertRecRead: Der Typ des 4. Argumentes, das u.a. zur Angabe der Datensatz-ID dient, wurde aufbigintgeä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 aufbigintgeändert.CteInsertItem: Das 2. Argument zur Angabe der ID-Eigenschaft wurde aufbigintgeändert.CteInsertNode: Das 2. Argument zur Angabe der ID-Eigenschaft wurde aufbigintgeändert.WinMsdInsert: Das 2. Argument zur Angabe des neu aufzunehmenden Elementes wurde aufbigintgeändert.WinMsdDelete: Das 2. Argument zur Angabe des zu entfernenden Elementes wurde aufbigintgeändert.WinMsdRead: Das 2. Argument zur Angabe des zu lesenden Elementes wurde aufbigintgeä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.