Работа с удаленными записями с помощью журнала

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Работа с удаленными записями с помощью журнала

Сообщение Buddy »

Как работать с удаленными записями с помощью X$Journal?
Например, нужно проанализировать поле CDoc из удаленной записи в таблице DocInfo.
Пробую вытащить значение так:

Код: Выделить всё

var OldDoc, NewDoc: comp;
OldDoc:=comp(0);
NewDoc:=comp(0);
res:=GetOldFieldValueFromJournal(DocInfo.CDoc, recordFixedSize, X$Journal.DataRec, X$Journal.Operation, OldDoc);  
В OldDoc - пусто.

Пробую вытащить так:

Код: Выделить всё

res:=GetNewFieldValueFromJournal(DocInfo.CDoc, recordFixedSize, X$Journal.DataRec, X$Journal.Operation, NewDoc);  
В NewDoc - пусто.

Причем в Саппорте-то видно, что информация есть, но как ее достать - не понимаю.

X$Journal.Operation для этой записи равен 8.

recordFixedSize определяю так:

Код: Выделить всё

  if GetFirst X$Files where (('DOCINFO' == X$Files.XF$Name)) <> tsOk
  {
    message('Не найдена таблица DocInfo в словаре', error);
    recordFixedSize:=0;
  }
  else recordFixedSize:=X$Files.XF$RecordFixed;   
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Работа с удаленными записями с помощью журнала

Сообщение edward_K »

Код: Выделить всё

#declare tmp_hist_fld (wtable, wfld, wfldname)
 //
  ww_old_val:='' ; ww_new_val:='';
  if not isvalid(tntmp#wtable)
   insert current tmp#wtable;
  timelog('#wtable.#wfld '+ww_new_val+'/'+ww_old_val+'/'+string(tmp_nrec)+'/'+string(x$Journal.operation));

  if x$Journal.operation<>2 and x$Journal.operation<>8 and x$Journal.operation<>1
  { 
    _try                              
    {
      GetOldFieldValueFromJournal( #wtable.#wfld, recordFixedSize
                                          , x$Journal.DataRec, x$Journal.Operation
                                          , tmp#wtable.#wfld) 
    }                                      
    _except
    else
    {
    }
    _finally
    {
    }                                        
    ww_old_val:=string(tmp#wtable.#wfld)
  }
  _try                              
  { GetNewFieldValueFromJournal( #wtable.#wfld, recordFixedSize
                                          , x$Journal.DataRec, x$Journal.Operation
                                          , tmp#wtable.#wfld) 
  }
  _except
  else
  {
  }
  _finally
  {
  }                                        
  ww_new_val:=string(tmp#wtable.#wfld)          
  /*
  GetOldFieldValueFromJournal( #wtable.Nrec, recordFixedSize
                                          , x$Journal.DataRec, x$Journal.Operation
                                          , tmp_nrec) 
  */                                        
  timelog('#wtable.#wfld '+ww_new_val+'/'+ww_old_val+'/'+string(tmp_nrec));
  timelog('  wtable=#wtable,wfld=#wfld, wfldname='+#wfldname+'  ww_new_val='+ww_new_val+', ww_old_val='+ww_old_val)
  if ww_new_val<>ww_old_val 
  { timelog('  1')
    Ins_tmp_hist(   #wfldname ,'#wfld'
     , x$journal.LASTDATE, x$journal.LASTTIME
     , GetFldStr(co#wtable,'#wfld',ww_old_val)
     , GetFldStr(co#wtable,'#wfld',ww_new_val)
     , x$users.XU$FULLNAME
     , x$journal.nrec
     , x$journal.Operation
     ) ;
  }
// }  
#end

Полный код у тебя под носом в ...._Hist01.Vip . У соседа спроси где.
В этих фукциях нужно использовать поля из буфера таблицы.
Там буфер объявлен например так
table struct tmpPERSONS = PERSONS;
Под каждую таблу свой буфер - иначе не пашет.
Можете еще хранимку написать , чтобы напрямую дергать.
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Работа с удаленными записями с помощью журнала

Сообщение Buddy »

edward_K писал(а):...
Странно, искал, но не нашел. Спасибо!
Ответить