Кодинг

Синхронизация

2011 год, 21 неделя (16 - 22 мая)

В большинстве случаев, с этим словом в мире компьютеров связывают операцию копирования измененных или отсутствующих файлов с одного носителя на другой. Реже это может быть связано с проблемой размонтирования флэшки под Windows. Кстати, консольная программа Sync из бесплатного набора Sysinternals от Microsoft может предотвратить потерю данных, которые еще не записаны на флэшку и находятся в кэше. И уж совсем редко это может быть связано с прикладными программами.

Предположим, есть СУБД в которой две таблицы должны быть синхронизированы по некоторым полям и по какой-то причине произошла разсинхронизация этих таблиц, что приводит к бесконечным сообщениям об этом и очень нервирует ваших знакомых. Решить эту проблему с помощью подручных средств к этой СУБД можно лишь с помощью процедурного программирования. Запросы SQL здесь не работают. Не ошибусь, если скажу, что таких СУБД образца прошлого века работающих под Windows и по сей день, наберется немалое количество. Замечу, что проблема эта не разовая и устранять ее приходится на протяжении нескольких последних лет.

Итак, есть две таблицы. Они имеют необходимые индексы. Особенность в том, что исходная таблица избыточна и содержит несколько записей за интересующую дату, а выбрать нужно только последнюю запись. Сделать это можно следующим образом:


var Rcp = open("recip_Dat");            
var Src = open("sourc_Dat", index);     
var d_Acc;   // Первое ключевое поле sourc_Dat   
var d_Dat;   // Второе ключевое поле sourc_Dat   
var d_Id=0;  // Третье ключевое поле sourc_Dat   
var d_Sum1, d_Sum2;                     
var flag = true;                        
next(Src);                              
while ( flag )                          
  d_Acc  = Src.IdAcc;               
  d_Dat  = Src.Date;          
  while ((d_Acc == Src.IdAcc) and (d_Dat==Src.Date)) 
       d_Acc    = Src.IdAcc;        
       d_Dat    = Src.Date;    
       d_Id     = Src.Id;           
       d_Sum1   = Src.restIn;       
       d_Sum2   = Src.restOut;      
       if (not next(Src))               
          flag=false;                   
       end;                             
  end;                                  
  if (d_Id>0)                           
     Rcp.IdAcc  = d_Acc;            
     Rcp.Dat    = d_Dat;            
     Rcp.Id     = d_Id;             
     Rcp.InSum  = d_Sum1;           
     Rcp.OutSum = d_Sum2;           
     Rcp.Insert();                      
  end;                                  
end; 
                               


Если вы заметили ошибки в тексте, пришлите message. I'm sorry.