Функция RecodeReferences Назад В начало Вперед

Назначение

Функцию можно использовать в двух режимах:

Описание

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, иначе - нуль.

Возвращаемое значение

Функция возвращает флаг выполненной операции:

Операция может быть не выполнена по следующим причинам:

Примечания

При возникновении внутренней ошибки функция выполняет откат транзакции, и изменения становятся недоступными. При этом функция возвращает значение 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.