Функция RecodeReferences (Word; Comp; Comp; Var LongInt) : Boolean
Top  Previous  Next


Назначение  
Функцию можно использовать в двух режимах:  
· режим перекодировки (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, то следует считать все изменения недоступными, так как функция выполнит откат транзакции.  
Примеры использования функции  
Пример для Pascal'я  
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  
&nbsp; 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.  
Пример для VIP'а  
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.