-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Адаптация кода к 64 битному ИД #4115
Comments
Суть проблемыПосле перехода на 64 битный ИД:
Решение:
Функции преобразования и присваивания TIDОпределены в gdcBaseInterface.pas: // функции для получения ИД из запроса, строки, варианта
function GetTID(f: TIBXSQLVAR): TID; overload;
function GetTID(f: TField): TID; overload;
function GetTID(s: String): TID; overload;
function GetTID(s: String; def: TID): TID; overload;
function GetTID(v: Variant): TID; overload;
// функции для присваивания и преобразования ИД
function SetTID(f: TIBXSQLVAR; const ID: TID): TID; overload;
function SetTID(f: TField; const ID: TID): TID; overload;
function SetTID(f: TIBXSQLVAR; fld: TField): TID; overload;
function TID2S(const ID: TID): String; overload;
function TID2V(const ID: TID): variant; overload;
function TID264(const ID: TID): Int64; overload;
// функции для проверки ИД в 32битном диапазоне
function Is32TID(const ID: TID): boolean;
procedure Check32TID(const ID: TID); Задача
Примеры обработкиБыло: var
ID, Dep: Integer; Стало: var
ID, Dep: TID; Здесь всё понятно. Мы используем специальный тип для идентфикаторов вместо Integer. Он определен в gdcBaseInterface.pas. Было: gdcObject.FieldByName('wcompanykey').AsInteger Стало: GetTID(gdcObject.FieldByName('wcompanykey') Используем специальную функцию для получения значения идентификатора из поля вместо прямого обращения к значению поля AsInteger. Было: Format('lb > (SELECT c.lb FROM gd_contact c WHERE c.id = %d) ' +
'AND rb <= (SELECT c2.rb FROM gd_contact c2 WHERE c2.id = %d) ', [ID, ID])); Стало: Format('lb > (SELECT c.lb FROM gd_contact c WHERE c.id = %d) ' +
'AND rb <= (SELECT c2.rb FROM gd_contact c2 WHERE c2.id = %d) ', [TID264(ID), TID264(ID)])); Обратите внимание, заменили прямые значения переменных на преобразования через функцию. Альтернативный вариант -- использовать строки: Format('lb > (SELECT c.lb FROM gd_contact c WHERE c.id = %s) ' +
'AND rb <= (SELECT c2.rb FROM gd_contact c2 WHERE c2.id = %s) ', [TID2S(ID), TID2S(ID)])); Было: gdcObject.FieldByName('parent').AsInteger := Dep; Стало: SetTID(gdcObject.FieldByName('parent'), Dep); Выше было чтение через специальные функции, а здесь запись в значение поля. Было: gdcObject.ExecSingleQuery('UPDATE OR INSERT INTO gd_employee (contactkey) ' +
'VALUES (' + IntToStr(gdcObject.ID) + ') MATCHING (contactkey)'); Стало: gdcObject.ExecSingleQuery('UPDATE OR INSERT INTO gd_employee (contactkey) ' +
'VALUES (' + TID2S(gdcObject.ID) + ') MATCHING (contactkey)'); Обратите внимание, используем свою функцию преобразования в строку вместо IntToStr. Было: if gdcObject.ParamByName('companykey').AsInteger <> ibcmbCompany.CurrentKeyInt then Стало: if GetTID(gdcObject.ParamByName('companykey')) <> ibcmbCompany.CurrentKeyInt then Здесь обратите внимание, как мы используем функцию, чтобы получить значение из параметра. И обратите внимание, что свойство CurrentKeyInt компонента выпадающий список мы не трогаем, так как мы просто поменяем его объявление в коде с Integer на TID. Это же касается свойства CurrentKey у выпадающего списка. Оно как было String, так и останется. |
Обработаны папки:
Проверены папки:
The text was updated successfully, but these errors were encountered: