Функция
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 |
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.
|