-- Шаблон создан мастером бланков
-- 16.10.2014 14:21:04
--
БланкСШаблоном "Востановление записи из логов";

var LogFile:S;
var Crd:S;
var StoreCard:S;

var logDate []:S;
var logTime []:S;
var logUser []:S;
var logState[]:S;
var logUKey []:S;
var logDate_ :S;
var logTime_ :S;
var logUser_ :S;
var logState_:S;
var logUKey_ :S;

var logField[]:S;
var logValue[]:S;

var logSubUKey[]:S;
var logSubField[]:S;
var logSubValue[]:S;

var mtlField[]:S;
var mtlType[]:S;


var BufOA_[]:S;
var BufOA []:I;
var BufUU []:S;
var BufII []:I;

var Buf[]:S;
var Buf1[]:S;
var Buf2[]:S;

--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(logDate);
 ClearVariable(logTime);
 ClearVariable(logUser);
 ClearVariable(logState);
 ClearVariable(logUKey);
 ClearVariable(logDate_);
 ClearVariable(logTime_);
 ClearVariable(logUser_);
 ClearVariable(logState_);
 ClearVariable(logUKey_);
 ClearVariable(logField);
 ClearVariable(logValue);
 ClearVariable(logSubUKey);
 ClearVariable(logSubField);
 ClearVariable(logSubValue);
end;

Func ВыбратьКарт:S;
var n,nn:i;
var tmp:S;
 nn=GetCardFileNames("*",Buf,False,True,"");
 if nn=0: Message("Список картотек пуст"); ^""; fi;
 for n=1..nn do
  if StoreCard=SubStr(Buf[n],1,Pos(" --",Buf[n])-1): Break; fi;
 od;
 if n>nn: n=0; fi;
 n=Alternate("Список картотек",Buf,-1,n,12);
 if n=0: ^""; fi;
 tmp=SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
 StoreCard=tmp;
 ^Buf[n];
end;

Func ПрочитатьКакМассивСлов (F:I):L;
var Ch,tmp,sp,Crd_:S;
var w,p:I;
 sp="|";
 ClearVariable(Buf);
 if TextFileEndOfFile(F): ^False; fi;
 w=0;
 p=0;
 While not TextFileEndOfFile(F) do
  p=p+1;
  Ch=TextFileRead(F,1);
  if not Ch="|" and p=1:
     if not TextFileEndOfFile(F): 
	Ch=Ch+TextFileReadLn(F); 
	if Match(Ch,'История удаленных записей картотеки "*"'):
	   Crd_=SubStr(Ch,38,255);
	   Crd_=SubStr(Crd_,1,Length(Crd_)-1);
	   if ExistsCardFile(Crd_):
	      Crd=Crd_;
	   fi;
	fi;
     fi;
     p=0;
    else
     if Ch=Sp or Ch="":
	w=w+1;
	Buf[w]=tmp;
	tmp="";
       else
	tmp=tmp+ch;
     fi;
     if w=6: sp=";"; fi; --начинаются поля
     if Ch="": Break; fi;
  fi;
 od;
 if not TextFileEndOfFile(F): Ch=TextFileReadLn(F); fi;
 ^True;
end;

Func ЧитатьФайл:L;
var F:I;
var cp,i,ii,s:i;
 Очистить;
 cp=0;
 s=0;
 F=TextFileOpenRead(LogFile);
 Try
  While ПрочитатьКакМассивСлов (F) do
   ii=LengthOfArray(Buf);
   cp=cp+1;
   AddInArray(logDate ,True,False,Trim(Buf[2]));
   AddInArray(logTime ,True,False,Trim(Buf[3]));
   AddInArray(logUser ,True,False,Trim(Buf[4]));
   AddInArray(logState,True,False,Trim(Buf[5]));
   AddInArray(logUKey ,True,False,Trim(Buf[6]));
   if cp=1:
      for i=7..ii do
       hint(Str(cp)+">>> "+Buf[i]);
       logField[i-6]=Up(ExtractWord(1,Trim(Buf[i]),'='));
       logValue[i-6]=ExtractWord(2,Trim(Buf[i]),'=');
       if SubStr(logValue[i-6],1,1)='"' and SubStr(logValue[i-6],Length(logValue[i-6]),1)='"':
	  logValue[i-6]=SubStr(logValue[i-6],2,Length(logValue[i-6])-2);
	 else
	  Message("Что-то пошло не так ("+Trim(Buf[i])+")",mtError);
	  Break;
       fi;
      od;
     else
      if not Match(Trim(Buf[7]),"UKEY={*}"):
	 Message("Что-то пошло не так ("+Trim(Buf[7])+")",mtError);
	 Break;
      fi;
      for i=8..ii do
       s=s+1;
       hint(Str(cp)+">>> "+Buf[i]);
       logSubUKey[s]=ExtractWord(2,Trim(Buf[7]),'=');
       logSubField[s]=Up(ExtractWord(1,Trim(Buf[i]),'='));
       logSubValue[s]=ExtractWord(2,Trim(Buf[i]),'=');
       if SubStr(logSubValue[s],1,1)='"' and SubStr(logSubValue[s],Length(logSubValue[s]),1)='"':
	  logSubValue[s]=SubStr(logSubValue[s],2,Length(logSubValue[s])-2);
	 else
	  Message("Что-то пошло не так ("+Trim(Buf[i])+")",mtError);
	  Break;
       fi;
      od;
   fi;
  od;
 Finally
  TextFileClose(F);
 end;
 if LengthOfArray(logDate)=1 and LengthOfArray(logTime)=1 and LengthOfArray(logUser)=1 and LengthOfArray(logState)=1 and LengthOfArray(logUKey)=1:
    logDate_=logDate[1];
    logTime_=logTime[1];
    logUser_=logUser[1];
    logState_=logState[1];
    logUKey_="{"+Trim(SubStr(logUKey[1],2,255));
    ^True;
   else
    logDate_="?";
    logTime_="?";
    logUser_="?";
    logState_="?";
    logUKey_="?";
    Message("Лог-файл содержит информацию о нескольких записей",mtError);
 fi;
 ^False;
end;

Func ТипПоляMTL(aКарт:S; aПоле:S):S;
var Ret:S;
var Тип:I;
  Тип=GetCardFileFieldType(aКарт,aПоле);
  if Тип=mtlREAL: Ret="N";
    |Тип=mtlINTEGER: Ret="I";
    |Тип=mtlBOOLEAN: Ret="L";
    |Тип=mtlSTRING: Ret="S";
    |Тип=mtlDATE: Ret="D";
    |Тип=mtlREF: Ret="R";
    |True: Ret="";
  fi;
  ^Ret;
end;

Proc ЧитатьMTL;
var n,nn,z,zz:i;
 ClearVariable(Buf);
 ClearVariable(Buf1);
 ClearVariable(Buf2);
 ClearVariable(mtlField);
 ClearVariable(mtlType);
 nn=GetCardFileFields(Crd,Buf,mtlSUBTAB);
 for n=1..nn do
  zz=GetCardFileFields(Crd+"@"+Buf[n],Buf1,mtlAll);
  for z=1..zz do
   InsertInArray(Buf2,1,Buf[n]+"@"+Buf1[z]+":"+ТипПоляMTL(Crd+"@"+Buf[n],Buf1[z]));
  od;
 od;
 SortArray(Buf2);
 ClearVariable(Buf);
 nn=GetCardFileFields(Crd,Buf,mtlAll);
 n=1;
 While not Buf[n]="" do
  if GetCardFileFieldType(Crd,Buf[n])=mtlSUBTAB:
     DeleteFromArray(Buf,n);
    else
     Buf[n]=Buf[n]+":"+ТипПоляMTL(Crd,Buf[n]);
     n=n+1;
  fi;
 od;
 CopyArray(Buf2,Buf,1,nn+1);
 nn=LengthOfArray(Buf);
 for n=1..nn do
  mtlField[n]=ExtractWord(1,Buf[n],":");
  mtlField[n]=Up(Раб.Формат.ReplaceSubStr(mtlField[n],"@","$"));
  mtlType[n]=Up(ExtractWord(2,Buf[n],":"));
 od;
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
Func LogFile_OnEnter(FieldName: String; Iter: Integer): logical;
 if ChooseFile(LogFile,"Выберите лог-файл","Файлы TXT (*.txt)|*.txt")=cmOk:
    ЧитатьФайл;
 fi;
 Return False;
end;

Func Crd_OnEnter(FieldName: String; Iter: Integer): logical;
 Crd=ExtractWord(1,ВыбратьКарт," ");
 if not Crd="":
    ЧитатьMTL;
 fi;
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnВосстан_OnClick(Sender: String);
var n,nn,z,i,ii,p,pp,x:i;
var UKey_,tmp:S;
var OWA,prev:I;
 if LogFile="": Message("Выберите лог-файл",mtError); Template.Field="LogFile"; Exit; fi;
 if not ЧитатьФайл: Exit; fi;
 if Crd="": Message("Выберите картотеку",mtError); Template.Field="Crd"; Exit; fi;
 ЧитатьMTL;
 if EnqOkCancel("Вы уверены, что хотите восстановить запись ?",mtWarning)=cmCancel: Exit; fi;
 ClearVariable(BufOA_);
 ClearVariable(BufOA);
 ClearVariable(BufII);
 ClearVariable(BufUU);
 nn=LengthOfArray(logField);
 ShowProgress(nn*2,"Проверка структуры лог-файла...");
 Try
  for n=1..nn do
   ProgressPos(n);
   Hint(logField[n]);
   if not logField[n]="CreateTime" and not logField[n]="UpdateTime" and not logField[n]="CreatedUser" and not logField[n]="ModifiedUser" and not logValue[n]="[...]":
      z=SearchInArray(mtlField,logField[n],False);
      if z=-1:
	 if logField[n]="GROUPDOC":
	    z=InsertInArraySort(mtlField,logField[n]);
	    InsertInArray(mtlType,z,"R");
	   else
	    Message("Поле '"+logField[n]+"' не найдено в картотеке '"+Crd+"'",mtError);
	    Exit;
	 fi;
      fi;
   fi;
  od;
  nn=LengthOfArray(logSubField);
  ShowProgress(nn*2,"Проверка структуры лог-файла...");
  for n=1..nn do
   ProgressPos(nn+n);
   Hint(logSubField[n]);
   z=SearchInArray(mtlField,logSubField[n],False);
   if z=-1:
      Message("Запись "+logSubUKey[n]+" Поле '"+logSubField[n]+"' не найдено в картотеке '"+Crd+"'",mtError);
      Exit;
   fi;
   tmp=ExtractWord(1,logSubField[n],"$");
   AddInArray(BufOA_,True,False,tmp);
  od;
  UKey_="{"+Trim(SubStr(logUKey[1],2,255));
  OWA=OpenWorkArea(Crd,"","UKey="+UKey_);
  Try
   if not Records(OWA)=0: 
      Message("Запись с UKey="+UKey_+" уже находится в картотеке "+Crd+"^MВосстановление прервано",mtError);
      Exit; 
   fi;
   BeginChanging(OWA);
   Try
    nn=LengthOfArray(logField);
    ShowProgress(nn*2,"Восстановление записи...");
    i=InsertRecordByKey(OWA,StringToRecord(UKey_));
    for n=1..nn do
     ProgressPos(n);
     Hint(logField[n]);
     if not logField[n]="CreateTime" and not logField[n]="UpdateTime" and not logField[n]="CreatedUser" and not logField[n]="ModifiedUser" and not logValue[n]="[...]":
	z=SearchInArray(mtlField,logField[n],False);
	if mtlType[z]="N": i=PutFieldN(OWA,i,logField[n],Round(Раб.Формат.ReplaceSubStr(logValue[n],",","."),10));
	  |mtlType[z]="I": i=PutFieldI(OWA,i,logField[n],Int(logValue[n]));
	  |mtlType[z]="L": i=PutFieldL(OWA,i,logField[n],logValue[n]="-1");
	  |mtlType[z]="S": i=PutFieldS(OWA,i,logField[n],logValue[n]);
	  |mtlType[z]="D": i=PutFieldD(OWA,i,logField[n],StringToDate(logValue[n]));
	  |mtlType[z]="R": i=PutFieldR(OWA,i,logField[n],StringToRecord("{"+logValue[n]+"}"));
	fi;
     fi;
    od;
    pp=LengthOfArray(BufOA_);
    for p=1..pp do
     BufOA[p]=OpenArray(OWA,i,BufOA_[p],"");
    od;
    nn=LengthOfArray(logSubField);
    ShowProgress(nn*2,"Восстановление записи...");
    for n=1..nn do
     ProgressPos(nn+n);
     Hint(logSubField[n]);
     z=SearchInArray(mtlField,logSubField[n],False);
     p=SearchInArray(BufOA_,ExtractWord(1,logSubField[n],"$"));
     x=SearchInArray(BufUU,ExtractWord(1,logSubField[n],"$")+"#"+logSubUKey[n],True);
     if x=-1:
	AddInArray(BufUU,True,False,ExtractWord(1,logSubField[n],"$")+"#"+logSubUKey[n]);
	ii=BufII[p]+1;
	ii=InsertRecord(BufOA[p],ii);
     fi;
     if mtlType[z]="N": ii=PutFieldN(BufOA[p],ii,ExtractWord(2,logSubField[n],"$"),Round(Раб.Формат.ReplaceSubStr(logSubValue[n],",","."),10));
       |mtlType[z]="I": ii=PutFieldI(BufOA[p],ii,ExtractWord(2,logSubField[n],"$"),Int(logSubValue[n]));
       |mtlType[z]="L": ii=PutFieldL(BufOA[p],ii,ExtractWord(2,logSubField[n],"$"),logSubValue[n]="-1");
       |mtlType[z]="S": ii=PutFieldS(BufOA[p],ii,ExtractWord(2,logSubField[n],"$"),logSubValue[n]);
       |mtlType[z]="D": ii=PutFieldD(BufOA[p],ii,ExtractWord(2,logSubField[n],"$"),StringToDate(logSubValue[n]));
       |mtlType[z]="R": ii=PutFieldR(BufOA[p],ii,ExtractWord(2,logSubField[n],"$"),StringToRecord("{"+logValue[n]+"}"));
     fi;
    od;
    EndChanging(OWA);
   Except
    CancelChanging(OWA);
    Raise;
   end;
  Finally
   CloseWorkArea(OWA);
  end;
 Finally
  CloseProgress;
 end;
 Message("Возможно все получилось ?");
 OpenCardFile(Crd,"",StringToRecord(logUKey_));
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
--Обработчики событий шаблона -----
--

Конец
