Функция RecodeReferences |
Функцию можно использовать в двух режимах:
режим перекодировки (oldNRec <> newNRec): функция просматривает все таблицы, ссылающиеся на таблицу targetTable, находит все ссылки на запись с номером oldNRec и переадресовывает их на запись с номером newNRec. Параметр f возвращает количество перекодированных ссылок;
режим проверки (oldNRec = newNRec): функция просматривает все таблицы, ссылающиеся на таблицу targetTable, и если находит хотя бы одну ссылку на запись с номером oldNRec, то параметр f возвращает единицу, иначе - ноль.
function RecodeReferences (targetTable: word; oldNRec, newNRec: comp; var f: longInt ): boolean;
targetTable : word - код таблицы; в которой находятся записи с номерами oldNRec и newNRec.
oldNRec : comp - номер заменяемой записи в таблице targetTable.
newNRec : comp - номер заменяющей записи в таблице targetTable.
f : longInt - в режиме перекодировки параметр f получает значение, равное количеству перекодированных ссылок (нуль, если не найдена ни одна ссылка). В режиме проверки (для oldNRec = newNRec) параметр равен единице, если функция нашла хотя бы одну ссылку на запись с номером oldNRec, иначе - нуль.
Функция возвращает флаг выполненной операции:
true - успешно;
false - не успешно.
Операция может быть не выполнена по следующим причинам:
в функцию переданы неверные аргументы;
перед вызовом функции словарь не был открыт;
не открылась системная таблица X$Relate;
не прошло BeginTransaction;
не открылась одна из ссылающихся таблиц (ссылающаяся на таблицу targetTable);
не выполнилось UpDate в ссылающейся таблице (т.е. не выполнилась перекодировка);
не прошло EndTransaction.
При возникновении внутренней ошибки функция выполняет откат транзакции, и изменения становятся недоступными. При этом функция возвращает значение false.
Если в режиме перекодировки была перекодирована хотя бы одна ссылка (параметр F получил значение, отличное от нуля), но при этом функция возвратила значение false, то следует считать все изменения недоступными, так как функция выполнит откат транзакции.
program Example1; uses Access, DateTime, atFields, BtConsts, XRef, AtlApp, StdParam, AtDos; const DirectoryOfDictionary = 'DICT'; var (*Входные параметры*) TargetTable: word; OldNRec, NewNRec: comp; F: pField; (*Выходные параметры*) Res: boolean; begin InitResourceAndParamStr(StartPath + 'EXAMPLE.RES', 'EXAMPLE.CFG', New(PAppCfg, Init(DirectoryOfDictionary)), false); Write('Открытие словаря... '); if not Dictionary.Init(DirectoryOfDictionary) then begin WriteLn('словарь не открылся.'); Halt(1); end else WriteLn('done'); ========================================================== Write('Enter Target table num => '); Readln(TargetTable); Write('Enter Old NRec=> '); Readln(OldNRec); Write('Enter New NRec=> '); Readln(NewNRec); F := New(pField, lConstant(0)); Res := RecodeReferences(TargetTable, OldNRec, NewNRec, F); Writeln('Recode:', Res); if Res then Writeln('Count:', LongInt(F^.Data^.Value^)); Dispose(F, Done); ========================================================== Write('Закрываем словарь... '); Dictionary.Done; Writeln('done'); DoneResourceAndParamStr; end.
interface Test 'Example2'; create view; var oldNRec, newNRec: comp; aTableCode: word; count: longInt; res: boolean; handleEvent cmInit: begin aTableCode := 1430; // Код таблицы KatParty // (oldNRec = newNRec) <> 0 - Exists Test // (oldNRec <> newNRec) <> 0 - Recode Test oldNRec := 7; newNRec := 7; res := RecodeReferences(aTableCode, OldNRec, NewNRec, Count); if res then if (oldNRec <> newNRec) then // Recode Test Message('Recode Test. References recoded = ' + String(Count, 0, 0)); else // Exist Test Message('Exists Test. References exists = ' + String(Count, 0, 0)) else Message('Error. Count = ' + String(Count, 0, 0), mfError); Abort; end; end; end.