PARAMETERS BazaD
LOCAL er AS Exception
OldSel = SELECT()
SET ESCAPE OFF
oUpdSe = CREATEOBJECT("UpdSe",BazaD)
oUpdSe.oldDataSession  = SET("Datasession")
oUpdSe.ZipFileName = "IF_6007_2010_12_20110217121751"
oUpdSe.PathExe=ADDBS(SYS(5)+SYS(2003))
oUpdSe.UpdPath = ADDBS(SYS(5)+SYS(2003)+"\Updates\Temp\"+oUpdSe.ZipFileName)
oUpdSe.logFileName=CHR(34)+oUpdSe.PathExe+"Update.Log"+CHR(34)
oUpdSe.TablesList.Add("{},docs:iff,docs_al:iff,docs_ascc:iff,docs_az:iff,docs_az_pi:iff,docs_az_orr:iff,docs_ca:iff,docs_cm:iff,docs_ii:iff,docs_orr:iff,docs_pi:iff,docs_rx:iff,docs_rz:iff,docs_xr:iff,docs_ds:iff,docs_purchase:iff,OrderList_Step:nzam")
oUpdSe.TablesList.Add("{Guide},StatusND:code,LanguageCode:code,KND:id,lncountries:alfa2,ORGANR:iff,Status:id,LogVal:id,Prefics:pref,Kst:kst,Ds:ds")
oUpdSe.UpdateDataBase()
res =oUpdSe.Lresult
RELEASE oUpdSe
SELECT (OldSel)
SET ESCAPE ON
RETURN res
*
DEFINE CLASS UpdSe as Session
** VB
	logFileName = ""
	DBID = ""
	oldDataSession = 0
	CurDataSession = 0
	Lresult = .T.
	DbSeFiNa = ""
	DbPath  = ""
	ZipFileName = ""
	UpdPath = ""
	TablesList = .Null.
** /
    R_comment = "" 
    PathExe = ""
    NameBD = ""
** VB
   	oLogFile = .NULL.
	oUpdateLog = .NULL.
** /
 PROCEDURE destroy
	this.save("Update.log")
	oCol = This.TablesList
	RELEASE oCol
	SET DATASESSION TO (this.oldDataSession)
 ENDPROC
*
 PROCEDURE init
	LPARAMETERS BazaD
** +- 10.11.2010 -+
    PUBLIC Je_db2sett, je_dbsett
** +-	This.DbSeFiNa = BazaD
	This.DbPath  = ADDBS(JUSTPATH(BazaD))
	This.TablesList = CREATEOBJECT("Collection")
	This.CurDataSession = this.DataSessionId  
	SET DATASESSION TO (this.DataSessionId)
	SET EXCLUSIVE OFF
	SET DELETE ON
	SET EXACT ON
 ENDPROC
** VB
 PROCEDURE openFile
  LPARAMETERS cFileName
  cDbID = this.dbID
  cUpdateID = JUSTSTEM(this.ZipFileName)
  oLogFile = CREATEOBJECT("Microsoft.XMLDOM")
  oLogFile.async = .F.
  IF FILE(FULLPATH(cFileName))
	oLogFile.load(FULLPATH(cFileName))
  ELSE
	cXML='<?xml version="1.0" encoding="windows-1251"?>'+CHR(13)
	cXML=cXML+'<?xml-stylesheet type="text/xsl" href="ShowLOG.xsl"?>'+CHR(13)
	cXML=cXML+'<Updates>'+CHR(13)
	cXML=cXML+'	<LastUpdate></LastUpdate>'+CHR(13)
	cXML=cXML+'	<log></log>'+CHR(13)
	cXML=cXML+'</Updates>'+CHR(13)
	oLogFile.loadXML(cXML)
  ENDIF
  This.oLogFile = oLogFile
  oLog = oLogFile.selectSingleNode("Updates/log")
  IF ISNULL(oLog)
	ERROR("Файл Update.log пошкоджено.")
  ELSE
   oBase = oLog.selectSingleNode('Base[@ID = "'+cDbID+'"]')
   IF ISNULL(oBase)
	oBase = oLogFile.createElement("Base")
	oBase.setAttribute("ID",cDbID)
	oLog.appendChild(oBase)
   ENDIF
   oUpdateLog = oBase.selectSingleNode('Update[@ID = "'+cUpdateID+'"]')
   IF ISNULL(oUpdateLog)
	oUpdateLog  = oLogFile.createElement("Update")
	oUpdateLog .setAttribute("ID",cUpdateID)
	oBase.appendChild(oUpdateLog )
   ENDIF
   this.oUpdateLog = oUpdateLog
  ENDIF
 ENDPROC
*
PROCEDURE WriteString
 LPARAMETERS cOperation, cResult
 IF !ISNULL(This.oLogFile) AND !ISNULL(this.oUpdateLog)
	oOperation  = This.oLogFile.createElement("Operation")
	oOperation.setAttribute("Caption",IIF(empty( cOperation),"",TRANSFORM( cOperation)))
	oOperation.setAttribute("Res", IIF(empty(cResult),"",TRANSFORM(cResult)))
	oOperation.setAttribute("DateTime", TRANSFORM(DATETIME(),"@YS"))
	this.oUpdateLog.appendChild(oOperation)
 ENDIF 
ENDPROC
*	
PROCEDURE save()
 LPARAMETERS cFileName
 This.oLogFile.Save(cFileName)
ENDPROC
*
PROCEDURE CheckVersion
** /
    LOCAL Up_P_ds,Db_P_ds,Dba1,Dba2,T_23,T_24,Bd_ind,Db_kluch,Eof_sel23,NZ_sel23
    LOCAL Nm_f, Db_f, Pr_i_DS, P_u_ds, xx_d_zip, xx_d_sys, st_zipD
** /
** +04.05.07
    P_u_ds = '0'   && = '1' - обробл. Dbsettings.dbf із оновл. БД             
** +
** Перевірки умов оновлення
	TRY
** ?Syst. Date()-26.05.10
	This.RepMes('* АНАЛІЗ УМОВ ПРОВЕДЕННЯ ОНОВЛЕННЯ Бази Даних !', .F., .F.)
    xx_d_zip = ''
    xx_d_sys = DTOS(DATE())
    st_zipD = AT('_',This.ZipFileName, 4)
    IF st_zipD # 0
     xx_d_zip = SUBSTR(This.ZipFileName, st_zipD+1, 8)
    ENDIF
    IF xx_d_zip <= xx_d_sys
** ?
** ~ Чи є Info.txt
    f_info=This.UpdPath + "Info.txt"
	IF FILE('&f_info.') 
** !
      Pr_i_ds = '0'
** !
** ~
	infotxt=FILETOSTR(This.UpdPath + "Info.txt")
	CrntVersion=GetValstring(infotxt,"CrntVersion")
	PrevVersion=GetValstring(infotxt,"PrevVersion")
	X_TabL ='"'+This.DbPath+'Info'+'"'
** /
	This.R_comment = GetValstring(infotxt,"Comment")
** /
	USE &X_TabL Alias InfoTable In 0 Exclusive
	SELECT InfoTable
	x_crntupd = ALLTRIM(UPPER(InfoTable.crntupdate))
** !
	This.NameBD = InfoTable.Name
** !
	IF .NOT. EMPTY(x_crntupd) .AND. (CrntVersion >= x_crntupd)
** актуальн оновлення.
     m.n1=AT('_',CrntVersion, 1)
     m.n2=AT('_',CrntVersion, 2)
     m.n3=AT('_',CrntVersion, 3)
     m.n4=AT('_',CrntVersion, 4)
*         
     m.nsyst=SUBSTR(CrntVersion,1,2)
     m.nzam=SUBSTR(CrntVersion,m.n1+1,m.n2-m.n1-1)
     m.nyear=SUBSTR(CrntVersion,m.n2+1,m.n3-m.n2-1)
     m.nipc=SUBSTR(CrntVersion,m.n3+1,m.n4-m.n3-1)
** попередн оновлення.
     m.k1=AT('_',x_crntupd, 1)
     m.k2=AT('_',x_crntupd, 2)
     m.k3=AT('_',x_crntupd, 3)
     m.k4=AT('_',x_crntupd, 4)
*         
     m.ksyst=SUBSTR(x_crntupd,1,2)
     m.kzam=SUBSTR(x_crntupd,m.k1+1,m.k2-m.k1-1)
     m.kyear=SUBSTR(x_crntupd,m.k2+1,m.k3-m.k2-1)
     m.kipc=SUBSTR(x_crntupd,m.k3+1,m.k4-m.k3-1)
** !  
** VB  
     this.dbID = m.nzam
     oUpdSe.OpenFile(oUpdSe.logFileName)
     This.WriteString('* Старт оновлення БД - '+This.NameBD, 'СТАРТ')     
** !
     IF (m.nsyst=m.ksyst) .and. (m.nzam=m.kzam)
      IF m.nyear # m.kyear 
       IF ((VAL(m.nyear)-VAL(m.kyear))=1) .AND. (m.kipc='12')
    	This.Lresult = .T.
       ELSE
        x_prevUpd=m.nsyst+'_'+m.nzam+'_'+STR(VAL(m.nyear)-1,4)+'_'+'12...zip'
    	This.Lresult = .F.
	    cM_s ="* Для коректного оновлення БД необхідно виконати оновлення за "
        cM_s = cM_s + "попередній рік - "+x_prevUpd
       ENDIF
      ENDIF
     ELSE
	  This.Lresult = .F.
	  cM_s ="* Неактуальний набір даних з кумулятивним оновленням - "+This.ZipFileName+".zip"
     ENDIF
	ELSE
	 This.Lresult = .F.
	 cM_s ="* Неактуальний набір даних з кумулятивним оновленням - "+This.ZipFileName+".zip"
	ENDIF
** ~25.12.06 
   ELSE 
   	This.Lresult = .F.
	cM_s ="* Відсутній файл - "+ F_info
   ENDIF
** ?      
     ELSE 
    	This.Lresult = .F.
		cM_s ="* Некоректна системна Дата - "+ DTOC(DATE())
     ENDIF
** ?      
   IF .NOT. This.Lresult  
    oUpdSe.OpenFile(oUpdSe.logFileName)
** !  
    This.WriteString('Error = '+cM_s, 'Невиконано')     
** !
   	This.RepMes(cM_s, This.Lresult, .T.)
   ENDIF
** ~
** /14.01.07
  IF This.Lresult  && III   
** !
    Pr_i_ds = '1'
** !
** -= Перевірка на відповідність dbsettings в плані криптографії
** Формування списку табл. і полів з криптографією в Db_crypt
** +- 10.11.2010 -+
    Je_dbsett = '0'      && '1' - je
    Db_P_dbsett = '"'+ADDBS(This.DbPath)+'Dbsettings.dbf'+'"'
    IF FILE(Db_P_dbsett)
     Je_dbsett = '1'
    ENDIF
*    
    Je_db2sett = '0'     && '1' - je
    Db_P_db2sett = '"'+ADDBS(This.DbPath)+'Db2settings.dbf'+'"'
    IF FILE(Db_P_db2sett)
     Je_db2sett = '1'     
     Up_P_ds = '"'+ADDBS(This.UpdPath)+'Db2settings'+'"'
     Db_P_ds = '"'+ADDBS(This.DbPath)+'Db2settings'+'"'
    ELSe
     Up_P_ds = '"'+ADDBS(This.UpdPath)+'Dbsettings'+'"'
     Db_P_ds = '"'+ADDBS(This.DbPath)+'Dbsettings'+'"'
    ENDIF
** +-
    Dba1 = ADDBS(This.UpdPath)+'Dba1'
    Dba2 = ADDBS(This.UpdPath)+'Dba2'
    Bd_ind="Alltrim(UPPER(Tblname))+ALLTRIM(UPPER(Caption))"      && Index
*
    IF FILE("&Dba1..idx")
     ERASE "&Dba1..idx"
    ENDIF
*
    IF FILE("&Dba2..idx")
      ERASE "&Dba2..idx"
    ENDIF
*
    USE &Up_P_ds. Alias T_23 In 0 Exclusive
** +07.05.07 
    P_u_ds = '1'
** +
	USE &Db_P_ds. Alias T_24 In 0 Exclusive
** +- 10.11.2010
    IF (Je_db2sett = '1') .AND. (Je_dbsett = '1')
	 USE &Db_P_dbsett. Alias T_24_old In 0 Exclusive
    ENDIF
** +-
** +07.05.07
    P_u_ds = '0'
** +
** #07.05.09 Перевірка відповідності кодування <БД> і <оновл. для БД>
*
    Typ_cr_23='0'    && "0" - zagaln. kod., "1" - ind. kod.
    Typ_cr_24='0'    && "0" - zagaln. kod., "1" - ind. kod.
*     
    SELE T_23
    SET FILTER TO (FieldType=-1)
    GO TOP
*
    SELE T_24
    SET FILTER TO (FieldType=-1) 
    GO TOP
* 
    IF .NOT. EOF('T_23') .AND. .NOT. EOF('T_24')
** perevirka kod. v BD     
     SELE T_24
     IF ATC('TypeCrypt=1', STRTRAN(Values, " ", "")) != 0
        Typ_cr_24='1' && "1" - indyvid. koduv.
     ELSE 
        Typ_cr_24='0' && "0" - zagaln. koduv.
     ENDIF
** perevirka kod. v Onovlenni     
     SELE T_23
     IF ATC('TypeCrypt=1', STRTRAN(Values, " ", "")) != 0
        Typ_cr_23='1'    && "1" - indyvid. koduv.
     ELSE 
        Typ_cr_23='0'    && "0" - zagaln. koduv.
     ENDIF
** korektn. i nekorektn. umov
     DO CASE
** korektno
            CASE ((Typ_cr_24='1') .AND. (Typ_cr_23='1')) .OR. ((Typ_cr_24='0') .AND. (Typ_cr_23='0'))
                This.Lresult = .T.
** - #29.05.09
             IF TYPE("_TypeCrypt") = "L"
              IF ((Typ_cr_24='1') .AND. (Typ_cr_23='1'))
               _TypeCrypt = .T.  && indyv. koduv.
              ELSE
               _TypeCrypt = .F.  && zagal. koduv. 
              ENDIF
             ENDIF
** - #
** Nekorektnо
            CASE (Typ_cr_24='1') .AND. (Typ_cr_23='0')
		      This.Lresult = .F.
			  cM_s ="* В БД використовується індивідуальне кодування, а в оновленні - загальне. "
              cM_s = cM_s + "Використайте оновлення з індивідуальним кодуванням!"   
		      SELE T_23
		      USE
*
			  this.writeString( 'Error = '+cM_s, 'Невиконано')   
   			  This.RepMes(cM_s, This.Lresult, .T.)
            CASE (Typ_cr_24='0') .AND. (Typ_cr_23='1')
		      This.Lresult = .F.
			  cM_s ="* В БД використовується загальне кодування, а в оновленні - індивідуальне. "
              cM_s = cM_s + "Використайте оновлення з загальним кодуванням!"   
		      SELE T_23
		      USE
*
			  this.writeString( 'Error = '+cM_s, 'Невиконано')   
   			  This.RepMes(cM_s, This.Lresult, .T.)

         ENDCASE
    ELSE  && nevidpov. DBsettings.dbf
      This.Lresult = .F.
	  cM_s ="* В одному або двох конфігураційних файлах відсутні записи з <FieldType=-1>"
      SELE T_23
      USE
*
  	  this.writeString( 'Error = '+cM_s, 'Невиконано')   
   	  This.RepMes(cM_s, This.Lresult, .T.)
*
    ENDIF
   IF This.Lresult       && IIII

** #
    SELE T_23
    INDEX ON &Bd_ind. TO "&Dba1" COMPACT
    SET INDEX TO  "&Dba1..idx"                 
    GO TOP
*
    SET FILTER TO (FieldType=1) .OR. (FieldType=2)
    GO TOP
*
    SELE T_24
    INDEX ON &Bd_ind. TO "&Dba2" COMPACT
    SET INDEX TO  "&Dba2..idx"                 
    GO TOP
*
    SET FILTER TO (FieldType=1) .OR. (FieldType=2)
    GO TOP
** Перевірка відповідності полів з криптографією
    SELE T_23
    DO WHILE .NOT. EOF()  && II - poznach. cyclu  
     SELE T_23
     Db_kluch = Alltrim(UPPER(Tblname))
     DO WHILE .NOT. EOF() .AND. (Db_kluch = Alltrim(UPPER(Tblname)))            
      SELE T_23
      Nm_f = ALLTRIM(UPPER(Caption))
      Db_f = Alltrim(UPPER(Tblname))+Nm_f
         
** Перевірка поля на криптогр.  в СЕЛ 23                    
      IF ATC('Cryption=1', STRTRAN(Values, " ", "")) != 0
** Є криптогр.            
** Перевірка в Dbsettings БД                
       SELE T_24
       SEEK Db_f
** Перевірка поля на криптогр. в СЕЛ 24                     
       IF .NOT. EOF() .AND. (ATC('Cryption=1', STRTRAN(Values, " ", "")) != 0)
** Є криптогр            
       ELSE
   	    This.Lresult = .F.
		cM_s ="* Виявлена невідповідність в конфігураційних файлах оновлення та БД "
       ENDIF
*                 
      ENDIF
      SELE T_23
      SKIP 
     ENDDO            
*  
     IF This.Lresult  
      Eof_sel23='1'
      IF .NOT. EOF()
       Eof_sel23='0'
       Nz_seL23=RECNO()
      ENDIF 
** Прокрутка СЕЛ 24 на предмет наявності інших полів з криптогр в Таблиці
**
      SELE T_24
      SET EXACT OFF
      SEEK Db_kluch 
      SET EXACT ON
*
      DO WHILE .NOT. EOF() .AND. (Db_kluch = Alltrim(UPPER(Tblname)))            
       SELE T_24
       Nm_f = ALLTRIM(UPPER(Caption))
       Db_f = Alltrim(UPPER(Tblname))+Nm_f

** Перевірка поля на крипт. в СЕЛ 24                    
       IF ATC('Cryption=1', STRTRAN(Values, " ", "")) != 0
** Є крипт.            
** Перевірка в Dbsettings оновлення                
        SELE T_23
        SEEK Db_f
** Перевірка поля на криптог в СЕЛ 23                     
        IF .NOT. EOF() .AND. (ATC('Cryption=1', STRTRAN(Values, " ", "")) != 0)
** Є крипт.            
        ELSE
          This.Lresult = .F.
		  cM_s ="* Виявлена невідповідність в конфігураційних файлах оновлення та БД "
        ENDIF
       ENDIF
       SELE T_24
       SKIP 
      ENDDO            
*
      IF Eof_sel23='0'
       SELE T_23
       GO Nz_seL23
      ENDIF 
     ENDIF
*            
    ENDDO      && II
** Dbsettings не закривати, потрібно для контролю монопольн. відкриття
** -31.01.08
    SELE T_23
    USE
** -
    IF .NOT. This.Lresult  
** !  
	 this.writeString( 'Error = '+cM_s, 'Невиконано')   
** !
   	 This.RepMes(cM_s, This.Lresult, .T.)
    ENDIF
** #07.05.09  
      ENDIF  && IIII
** #
  ENDIF  && III
** /
       
  CATCH TO er
	This.Lresult = .F.
	cM_s="* ERROR : "+STR(er.errorno)+" - "+er.message
	cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
** !  
	this.writeString( 'Error = '+cM_s, 'Невиконано')   
** !
	This.RepMes(cM_s, This.Lresult, .T.)
    IF Pr_i_ds = '0'
	 cM_s="* Відбувся збій при аналізі конфігураційних файлів : Info.txt або Info.dbf"
    ELSE
** +21.07.09
    IF (P_u_ds = '1')
     IF (ALLTRIM(STR(er.errorno))='3') .OR. (ALLTRIM(STR(er.errorno))='1705')
      cM_s="* Не вдається БД відкрити монопольно. Можливо з БД працюють інші користувачі. Необхідно всім закрити БД і після цього повторити ОНОВЛЕННЯ."
     ELSE
      cM_s="* Не вдається БД відкрити монопольно.  Або відсутній доступ до БД або файли: DbSettings.dbf або Db2Settings.dbf. Відновіть коректні умови і повторіть ОНОВЛЕННЯ."
     ENDIF
    ELSE 
** + 
	cM_s="* Відбувся збій при аналізі файлів налаштування: DbSettings.dbf або Db2Settings.dbf"
   ENDIF
  ENDIF
** !  
	This.writeString(cM_s, 'Невиконано') 
** !
	This.RepMes(cM_s, This.Lresult, .T.)
	FINALLY
	ENDTRY
 ENDPROC
*
 PROCEDURE UpdateDataBase
	LOCAL cFull_TN,Del_FN, Upd_FN, Ins_FN, Chn_FN, KL_temp1, R_txf, R_Fpdf
 	cM_s = ""
   	X_BazaD= This.DbPath+"Edb"
	This.CheckVersion()
** ? 18.05.10  Rezerv. BD
		IF This.Lresult
          This.RezervBD()
        ENDIF
** ?
** + 04.11.10  Structur. BD
		IF This.Lresult
          This.UP_FI()
        ENDIF
** +
	IF This.Lresult
*!*	 Збереження в Docs значення поля Txf -15.10.07 
*!*	 В транзакції цей блок не пішов
	FOR EACH cTableList IN This.TablesList
		Ct_Pa = STREXTRACT(ALLTRIM(GETWORDNUM(cTableList,1,",")),"{","}")
		FOR i = 2 TO GETWORDCOUNT(cTableList,",")
		Ct_Na    = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),1,":"))
		cKey_FN = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),2,":"))
        SET EXACT ON
        IF Ct_Na = 'docs'
   		 cFull_TN = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'"'
	 	 Del_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Del_'+Ct_Na+'"'
		 Upd_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Upd_'+Ct_Na+'"'
		 Ins_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Ins_'+Ct_Na+'"'
		 Chn_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Chn_'+Ct_Na+'"'

 	  	 USE &cFull_TN Alias &Ct_Na In 0 Exclusive
         SELE &Ct_Na
		    Dba1 =ADDBS(This.UpdPath)+'Dba25'
*
		    IF FILE("&Dba1..idx")
		     ERASE "&Dba1..idx"
		    ENDIF
*
            SELE &Ct_Na
		    INDEX ON &cKey_FN. TO "&Dba1."  COMPACT
		    SET INDEX TO  "&Dba1..idx"                 
		    GO TOP
*
         IF Field_yes('txf') .AND. Field_yes('fpdf')
*
		    USE &Upd_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   16.11.2010
            DO Txf_Fpdf
**
            SELE T_25
            USE
*
		    USE &Ins_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   16.11.2010
            DO Txf_Fpdf
**
            SELE T_25
            USE
*
		    USE &Chn_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   16.11.2010
            DO Txf_Fpdf
**
            SELE T_25
            USE
         ENDIF
*
**  nnn - 16.11.2010 - обробка Flag...1,2,3  i  nzam
         SELE &Ct_Na
         GO Top
*
         IF Field_yes('flag1') .AND. Field_yes('flag2') .AND. Field_yes('flag3') .AND. Field_yes('nzam')
*
		    USE &Upd_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   16.11.2010
            DO Flag123_nzam
**
            SELE T_25
            USE
*
		    USE &Ins_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   16.11.2010
            DO Flag123_nzam
**
            SELE T_25
            USE
*
		    USE &Chn_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   16.11.2010
            DO Flag123_nzam
**
            SELE T_25
            USE
          ENDIF
** nnn -
** ddd - 17.11.2010 - ddd Vstanovlennia Flag4
			Path_dbflag4 = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Dbflag4'+'"'
	 	  	USE &Path_dbflag4 Alias T_dbflag4 In 0 Exclusive
            SET ORDER TO TAG IFF
            Go Top
*
            SELE &Ct_Na
            GO Top
          IF Field_yes('flag4') .and. (cKey_FN='iff')
            SELE &Ct_Na
            REPLACE flag4 WITH .NULL.  ALL  && Ochystka flag4 pered onovlennim
** Vstaovlennia flag4 v tablyciah onovlennia
*
		    USE &Upd_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
            DO Flag4_act
**
            SELE T_25
            USE
*
		    USE &Ins_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
            DO Flag4_act
**
            SELE T_25
            USE
*
		    USE &Chn_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
            DO Flag4_act
**
            SELE T_25
            USE
*
** Vstaovlennia flag4 v DOCS
            SELECT T_dbflag4
            GO Top
            DO WHILE .NOT. EOF() 
               KL_temp1 = &cKey_FN.
               SELE &Ct_Na
               SEEK KL_temp1
               IF .NOT. EOF()
                REPLACE flag4 WITH '33'
               ENDIF
               SELECT T_dbflag4
               SKIP
            ENDDO
          ENDIF
** ddd -
            SELE &Ct_Na
            USE
            SELECT T_dbflag4
            USE
        Endif
        SET EXACT OFF

		 ENDFOR
      ENDFOR
*!*	-
			TRY
				BEGIN TRANSACTION
				OPEN DATABASE (This.DbPath+"Edb") EXCLUSIVE 
				FOR EACH cTableList IN This.TablesList
					Ct_Pa = STREXTRACT(ALLTRIM(GETWORDNUM(cTableList,1,",")),"{","}")
					FOR i = 2 TO GETWORDCOUNT(cTableList,",")
						Ct_Na    = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),1,":"))
						cKey_FN = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),2,":"))
						this.UpdateTable(Ct_Pa, Ct_Na, cKey_FN)
					ENDFOR
				ENDFOR
** /
	       UPDATE InfoTable SET crntupdate = This.ZipFileName, comment = This.R_comment
** /			
** -31.01.08
           SELE InfoTable
           USE
** -
			CATCH TO er
			 This.Lresult = .F.
			 cM_s="* ERROR : "+STR(er.errorno)+" - "+er.message
			 cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
** !  
    		this.writeString('Error = '+cM_s, 'Невиконано')  
    		this.writeString('* Помилка при оновлені таблиці : '+Ct_Pa+Ct_Na+' - з ключом : '+cKey_FN, 'Невиконано')  
** !
			 This.RepMes(cM_s, This.Lresult, .T.)
			FINALLY
			IF This.Lresult
 			 END TRANSACTION
			 cM_s="* КУМУЛЯТИВНЕ ОНОВЛЕННЯ БД УСПІШНО ЗАВЕРШЕНО З НАБОРУ ДАНИХ - "+This.ZipFileName+".zip"
** !  
			this.writeString(cM_s, 'Виконано')
** !
			This.RepMes(cM_s, This.Lresult, .F.)		
            =INKEY(5)
** .03.12.07  вставка стосовно протоколу змін
                m.ProtUpd = This.ZipFileName
                m.ProtUpd = STRTRAN(m.ProtUpd, 'IF', 'ProtUpd') 
                x_ProtUpd = ADDBS(This.UpdPath) + m.ProtUpd + ".txt"   && протокол з оновлення
                x_ProtUpdDb = ADDBS(This.DbPath) + m.ProtUpd + ".txt"  && протокол в оновлюваній БД
* 
		        IF FILE("&x_ProtUpd")  && відмітити наявність протоколу
                 COPY  FILE  "&x_ProtUpd"  TO  "&x_ProtUpdDb"		

 				 cM_s="* ПЕРЕЛІК ЗМІНЕНИХ НД МІСТИТЬСЯ В - "+x_ProtUpdDb
   			     this.writeString(cM_s, 'Виконано')
				 This.RepMes(cM_s, This.Lresult, .F.)		
** -31.01.08 
 				 cM_s="* В ПЕРЕЛІКУ ЗМІНЕНИХ НД Є ВАЖЛИВА ІНФОРМАЦІЯ ПРО ОНОВЛЕННЯ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ (ПЗ) "
   			     this.writeString(cM_s, 'Виконано')
				 This.RepMes(cM_s, This.Lresult, .F.)		
** -
** #08.05.09 повідомити версію
                 wer_LI = FILETOSTR('&x_ProtUpd.')
                 wer_defis = ATC('-', wer_LI, 1)
                 IF (wer_defis != 0) .AND. (wer_defis < 20)   && є № актуальної версії
                   wer_LI = SUBSTR(wer_LI,1,wer_defis-1)
 				   cM_s='* АКТУАЛЬНА ВЕРСІЯ "Леонорм-інформ" - '+TRIM(wer_LI)+'.  ЯКЩО У ВАС НЕ АКТУАЛЬНА - АКТУАЛІЗУЙТЕ !!!'
   			       this.writeString(cM_s, 'Виконано')
				   This.RepMes(cM_s, This.Lresult, .F.)		
                 ENDIF
** #
                 =INKEY(5)
                ENDIF
** .
				ELSE
					ROLLBACK
				ENDIF
			ENDTRY
		ENDIF
** ~        
		IF This.Lresult
** ~        
		cM_s="* ПАКУВАННЯ ТАБЛИЦЬ БД - "+ X_BazaD+".dbc"
** !  
		this.writeString(cM_s)
** !
		This.RepMes(cM_s, .F., .F.)
		this.PackTales()
*
		cM_s="* ВИДАЛЕННЯ ПОШУКОВИХ ІНДЕКСІВ БД - "+ X_BazaD+".dbc"
** !  
		this.writeString(cM_s)
** !
		This.RepMes(cM_s, .F., .F.)
		this.DeletInd()
** \03.03.08 Оновлення Dbsettings
        Up_P_ds_LV = ADDBS(This.UpdPath)+'Dbsettings.dbf'
        Db_P_ds_LV = ADDBS(This.DbPath)+'Dbsettings.dbf'
        Up_P_ds_fpt = ADDBS(This.UpdPath)+'Dbsettings.fpt'
        Db_P_ds_fpt = ADDBS(This.DbPath)+'Dbsettings.fpt'
** \
** +- 10.11.2010  -+
        Up_P_ds_LV2 = ADDBS(This.UpdPath)+'Db2settings.dbf'
        Db_P_ds_LVc2 = ADDBS(This.DbPath)+'CDb2settings.dbf'
        Up_P_ds_fpt2 = ADDBS(This.UpdPath)+'Db2settings.fpt'
        Db_P_ds_fptc2 = ADDBS(This.DbPath)+'CDb2settings.fpt'
** +-
** -31.01.08
        SELE T_24
        USE
** -
** +- 10.11.2010 -+
        IF (Je_db2sett = '1') .AND. (Je_dbsett = '1')
          SELE T_24_old
          USE
        ENDIF
** +-
** \03.03.08  Оновлення Dbsettings
        IF FILE(Up_P_ds_LV) .AND. FILE(Up_P_ds_fpt)
          COPY  FILE  "&Up_P_ds_LV"  TO  "&Db_P_ds_LV"		
          COPY  FILE  "&Up_P_ds_fpt"  TO  "&Db_P_ds_fpt"
        ENDIF  		
** \
** Ї10.02.09 Оновлення Userssettings.xml 
        Up_P_ds_xml = ADDBS(This.UpdPath)+'Userssettings.xml'
        Db_P_ds_xml = ADDBS(This.DbPath)+'Userssettings\Userssettings.xml'
        COPY  FILE  "&Up_P_ds_xml"  TO  "&Db_P_ds_xml"		
** Ї
** +- 10.11.2010  -+
        IF FILE(Up_P_ds_LV2) .AND. FILE(Up_P_ds_fpt2)
          COPY  FILE  "&Up_P_ds_LV2"  TO  "&Db_P_ds_LVc2"		
          COPY  FILE  "&Up_P_ds_fpt2"  TO  "&Db_P_ds_fptc2"	
        ENDIF  	
** +-
** ~       
		ENDIF
** ~        
      CLOSE DATABASES  
	ENDPROC
** ? Створення копії БД,18.05.10
 PROCEDURE RezervBD  
  LOCAL Bd_oryg, Bd_dubl, Bd_dubl_Guide, Bd_dubl_usersSet, xx_Bd_oryg, xx_kudy, Bcrezult
* * Формування шляхів БД оригін., копій
  Bd_oryg = This.Dbpath
  Xx_Bd_oryg = STRTRAN(Bd_oryg, '\\', '')
  Xx_Bd_oryg = STRTRAN(Xx_Bd_oryg, ':', '')
  Bd_dubl = This.Pathexe+"Updates\TempBd\"+Xx_Bd_oryg
  Bd_dubl_Guide = Bd_dubl+"Guide\"
  Bd_dubl_UsersSet = Bd_dubl+"UsersSettings\"
*
   TRY
*
	cM_s="* ПЕРЕВІРКА НА КОРЕКТНІСТЬ ТАБЛИЦЬ БД - "+ X_BazaD+".dbc"
	this.writeString(cM_s)
	This.RepMes(cM_s, .F., .F.)
*
    OPEN DATABASE (This.DbPath+"Edb") EXCLUSIVE 
	FOR EACH cTableList IN This.TablesList
     Ct_Pa = STREXTRACT(ALLTRIM(GETWORDNUM(cTableList,1,",")),"{","}")
	  FOR i = 2 TO GETWORDCOUNT(cTableList,",")
		Ct_Na    = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),1,":"))
        cFull_TN = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'"'
** +! 12.11.2010 +! 
        cFull_TN_DBF = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'.dbf'+'"'
        IF FILE(cFull_TN_DBF) 
** +!
		USE &cFull_TN Alias &Ct_Na In 0 Exclusive		
		USE IN &Ct_Na	
** +! 12.11.2010 +! 
        ENDIF  
** +!
	  ENDFOR
	ENDFOR
		CATCH TO er
		    This.Lresult = .F.
			cM_s="* ERROR : "+STR(er.errorno)+" - "+er.message
			cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
    		this.writeString('Error = '+cM_s, 'Невиконано') 
			This.RepMes(cM_s, This.Lresult, .F.)
*
			FINALLY
			IF This.Lresult
			 cM_s="* СТВОРЕННЯ КОПІЇ ОНОВЛЮВАНИХ ТАБЛИЦЬ З БД " + X_BazaD+".dbc"
 		     this.writeString(cM_s)    
 			 This.RepMes(cM_s, .F., .F.)
             =INKEY(5)
			ELSE
			 cM_s="* ЧЕРЕЗ ПОМИЛКИ В ОКРЕМИХ ТАБЛИЦЯХ БД " + X_BazaD+".dbc"+ "  ОНОВЛЕННЯ НЕ БУДЕ ВИКОНУВАТИСЬ."
  		     this.writeString(cM_s, 'Невиконано')     
			 This.RepMes(cM_s, This.Lresult, .F.)
             =INKEY(5)
			 cM_s="* ВІДНОВІТЬ СТАРТОВУ БД " + X_BazaD+".dbc"
             IF DIRECTORY(Bd_dubl)
			   cM_s=cM_s+" АБО ПОПЕРЕДНІЙ СТАН З ПАПКИ: "+Bd_dubl
             ENDIF
   		       this.writeString(cM_s, 'Виконано')     
			   This.RepMes(cM_s, This.Lresult, .F.)
               cM_s="* І ПОВТОРІТЬ ВИКОНАННЯ ОНОВЛЕННЯ ! " 
    		   this.writeString(cM_s, 'Виконано')     
			   This.RepMes(cM_s, This.Lresult, .F.)
               =INKEY(5)
			  ENDIF
			ENDTRY
* * COPY БД в резервну папку
  Bcrezult = .T.
  IF This.Lresult 
    IF !DIRECTORY(Bd_dubl)
       MD(Bd_dubl)
    ENDIF
    IF !DIRECTORY(Bd_dubl_Guide)
       MD(Bd_dubl_Guide)
    ENDIF
    IF !DIRECTORY(Bd_dubl_UsersSet)
       MD(Bd_dubl_UsersSet)
    ENDIF
* * ---+ 02.12.2010 +--- вставити перевірку наявності вільного простору на диску 
    Bucva_Drive = UPPER(JUSTDRIVE(Bd_dubl))
    Vilno_Drive = DISKSPACE(Bucva_Drive, 2)
    IF Vilno_Drive >= 500000000     && povynno buty vilno >= 500 Mb
* * ---+ 02.12.2010 +---
*
	TRY
*
	FOR EACH cTableList IN This.TablesList
    Ct_Pa = STREXTRACT(ALLTRIM(GETWORDNUM(cTableList,1,",")),"{","}")
	  FOR i = 2 TO GETWORDCOUNT(cTableList,",")
		Ct_Na    = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),1,":"))
        cFull_TN = ADDBS(This.DbPAth + Ct_Pa) + Ct_Na+'.*'
** +! 12.11.2010 +! 
        cFull_TN_DBF = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'.dbf'+'"'
        IF FILE(cFull_TN_DBF) 
** +!
*
         IF ATC('GUIDE',cFull_TN) # 0
           xx_kudy = Bd_dubl_Guide + Ct_Na+'.*'
           COPY  FILE  "&cFull_TN"  TO  "&xx_kudy"		
         ELSE
           xx_kudy = Bd_dubl + Ct_Na+'.*'
           COPY  FILE  "&cFull_TN"  TO  "&xx_kudy"		
         ENDIF
*
** +! 12.11.2010 +! 
        ENDIF  
** +!
	  ENDFOR
	ENDFOR
    Up_P_ds_LV = ADDBS(This.UpdPath)+'Dbsettings.dbf'
    Up_P_ds_fpt = ADDBS(This.UpdPath)+'Dbsettings.fpt'
    Db_P_ds_LV = Bd_dubl + 'Dbsettings.dbf'
    Db_P_ds_fpt = Bd_dubl + 'Dbsettings.fpt'
*
    IF FILE(Up_P_ds_LV) .AND. FILE(Up_P_ds_fpt)
      COPY  FILE  "&Up_P_ds_LV"  TO  "&Db_P_ds_LV"		
      COPY  FILE  "&Up_P_ds_fpt"  TO  "&Db_P_ds_fpt"		
    ENDIF
* 
    Up_P_ds_xml = ADDBS(This.DbPath)+'Userssettings\Userssettings.xml'
    Db_P_ds_xml = Bd_dubl_UsersSet + 'Userssettings.xml'
    COPY  FILE  "&Up_P_ds_xml"  TO  "&Db_P_ds_xml"		
*
** +- 10.11.2010  -+
    Up_P_ds_LV2 = ADDBS(This.UpdPath)+'Db2settings.dbf'
    Up_P_ds_fpt2 = ADDBS(This.UpdPath)+'Db2settings.fpt'
    Db_P_ds_LV2 = Bd_dubl + 'Db2settings.dbf'
    Db_P_ds_fpt2 = Bd_dubl + 'Db2settings.fpt'
*
    IF FILE(Up_P_ds_LV2) .AND. FILE(Up_P_ds_fpt2)
      COPY  FILE  "&Up_P_ds_LV2"  TO  "&Db_P_ds_LV2"		
      COPY  FILE  "&Up_P_ds_fpt2"  TO  "&Db_P_ds_fpt2"
    ENDIF  		
** +-
*
	CATCH TO er
		Bcrezult = .F.
		cM_s="* ERROR : "+STR(er.errorno)+" - "+er.message
		cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
   		this.writeString('Error = '+cM_s, 'Невиконано') 
		This.RepMes(cM_s, Bcrezult, .F.)
	FINALLY
		IF Bcrezult
 		   cM_s="* СТВОРЕНО КОПІЮ ОНОВЛЮВАНИХ ТАБЛИЦЬ В ПАПЦІ: " + Bd_dubl
	       this.writeString(cM_s, 'Виконано')    
		   This.RepMes(cM_s, .T., .T.)
           =INKEY(5)
		ELSE
			cM_s="* ВИНИКЛИ ПОМИЛКИ ПРИ КОПІЮВАННІ ТАБЛИЦЬ В РЕЗЕРВНУ ПАПКУ " + Bd_dubl
 		    this.writeString(cM_s, 'Невиконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            =INKEY(5)
			cM_s="* ПРИ НЕВИКОНАННІ ОНОВЛЕННЯ ВІДНОВІТЬ СТАРТОВУ БД " + X_BazaD+".dbc"
  		    this.writeString(cM_s, 'Виконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            cM_s="* І ПОВТОРІТЬ ВИКОНАННЯ ОНОВЛЕННЯ ! " 
    		this.writeString(cM_s, 'Виконано')     
            =INKEY(5)
		ENDIF
	 ENDTRY
*
* * ---+ 02.12.2010 +---
     ELSE
 	   cM_s="* НЕМОЖЛИВО СТВОРИТИ РЕЗЕРВНУ КОПІЮ БАЗИ ДАНИХ. НА ДИСКУ <&Bucva_Drive.> ВІЛЬНОГО МІСЦЯ < 500 Mb" 
       this.writeString(cM_s, 'Невиконано')    
	   This.RepMes(cM_s, .T., .T.)
       =INKEY(5)
     ENDIF
* * ---+ 02.12.2010 +---
	ENDIF
ENDPROC
** ?
** + New поля,01.11.10
*
 PROCEDURE Up_Fi  
  LOCAL Bd_oryg, Imia_F, Type_FA, Dovg_FA, DEC_FA, Type_old, Dovg_old, DEC_OLD, Upd_f, x_kp, x_i, Bcrezult
  Bd_oryg = This.Dbpath
**   New Structure
  Bcrezult = .T.
  IF This.Lresult 
*
	TRY
*
	cM_s="* УТОЧНЕННЯ СТРУКТУР ТАБЛИЦЬ БД - "+ X_BazaD+".dbc"
	this.writeString(cM_s)
	This.RepMes(cM_s, .F., .F.)
*
	FOR EACH cTableList IN This.TablesList
	 Ct_Pa = STREXTRACT(ALLTRIM(GETWORDNUM(cTableList,1,",")),"{","}")
	 FOR i = 2 TO GETWORDCOUNT(cTableList,",")
	 Ct_Na    = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),1,":"))
** +! 12.11.2010  +!
   	 cFull_TN_dbf = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'.dbf'+'"'
     IF FILE(cFull_TN_dbf)
** +!
   	 cFull_TN = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'"'
	 Upd_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Upd_'+Ct_Na+'"'

 	 USE &cFull_TN Alias &Ct_Na In 0 Exclusive
     SELE &Ct_Na
*
   	 USE &Upd_FN Alias Upd_F In 0 Exclusive
     SELE Upd_F
         
** Пошук відсутності полів в таблицях EDB
     SELE Upd_F
     x_kp=FCOUNT()
     Dovg_FA = 0
     DEC_FA = 0
     DEC_OLD = 0
     Dovg_old = 0
     SET EXACT ON
     FOR   x_i =1 TO x_kp
       SELE Upd_F
       Imia_F=FIELD(x_i)
       Type_FA=TYPE(Imia_F)
**
       DO CASE
          CASE Type_FA='C' .OR. Type_FA='N' .OR. Type_FA='F' .OR. Type_FA='Q' .OR. Type_FA='V'     
              Dovg_FA = FSIZE(Imia_F)
              IF Type_FA='N' .OR. Type_FA='F'
                DEC_FA = Ret_drob(&Imia_F)
              ELSE
                DEC_FA = 0
              ENDIF
          OTHERWISE          
              Dovg_FA = 0
       ENDCASE  
*            
       SELE &Ct_Na
       IF .NOT. FIELD_YES(Imia_F)  && nema polia, potribno dobavyty
        DO CASE
          CASE Type_FA='W' .OR. Type_FA='Y' .OR. Type_FA='D' .OR. Type_FA='T' .OR. Type_FA='G' .OR. Type_FA='I' .OR. Type_FA='L' .OR. Type_FA='M'   
             ALTER TABLE '&Ct_Na' ADD  '&Imia_F' &Type_FA NULL
          CASE Type_FA='C' .OR. Type_FA='V'
             ALTER TABLE '&Ct_Na' ADD  '&Imia_F' &Type_FA (Dovg_FA) NULL     && NOCPTRANS
          CASE Type_FA='Q' 
             ALTER TABLE '&Ct_Na' ADD  '&Imia_F' &Type_FA (Dovg_FA) NULL 
          CASE Type_FA='N' .OR. Type_FA='F'
             ALTER TABLE '&Ct_Na' ADD  '&Imia_F' &Type_FA (Dovg_FA, DEC_FA) NULL
        ENDCASE  
       ELSE     && je pole, vykonaty zminy v storonu zbilshennia
         Type_old=TYPE(Imia_F)
         IF Type_FA = Type_old
*
	       DO CASE
	          CASE Type_old='C' .OR. Type_old='N' .OR. Type_old='F' .OR. Type_old='Q' .OR. Type_old='V'     
	              Dovg_old = FSIZE(Imia_F)
	              IF Type_old='N' .OR. Type_old='F'
	                DEC_OLD = Ret_drob(&Imia_F)
	              ELSE
	                DEC_OLD = 0
	              ENDIF
	          OTHERWISE          
	              Dovg_OLD = 0
	       ENDCASE  
** Vyznachennia umov zminy dovgyn poliv          
	        DO CASE
	          CASE Type_FA='C' .OR. Type_FA='V'
               IF (Dovg_FA > Dovg_old)
	             ALTER TABLE '&Ct_Na' ALTER COLUMN  &Imia_F &Type_FA (Dovg_FA) NULL  && NOCPTRANS
               ENDIF
	          CASE Type_FA='Q' 
               IF (Dovg_FA > Dovg_old)
	             ALTER TABLE '&Ct_Na' ALTER COLUMN  &Imia_F &Type_FA (Dovg_FA) NULL
               ENDIF
	          CASE Type_FA='N' .OR. Type_FA='F'
                 IF (Dovg_FA > Dovg_old) .and. (DEC_FA > DEC_old)
 	               ALTER TABLE '&Ct_Na' ALTER COLUMN  &Imia_F &Type_FA (Dovg_FA, DEC_FA)  NULL
                 ENDIF
                 IF (Dovg_FA > Dovg_old) .and. (DEC_FA <= DEC_old)
 	               ALTER TABLE '&Ct_Na' ALTER COLUMN  &Imia_F &Type_FA (Dovg_FA, DEC_old) NULL
                 ENDIF
                 IF (Dovg_FA <= Dovg_old) .and. (DEC_FA > DEC_old)
 	               ALTER TABLE '&Ct_Na' ALTER COLUMN  &Imia_F &Type_FA (Dovg_old, DEC_FA) NULL
                 ENDIF
	        ENDCASE  
*
         ELSE    && Type_FA='D', Type_old='M', Imia_F='dateofcorr' .or. 'dateofform', Ct_na = 'docs' поміняти тип
           IF (Type_FA='D') .and. (Type_old='M') .and. ((LOWER(Imia_F)='dateofcorr') .or. (LOWER(Imia_F)='dateofform')) .and.(Ct_na = 'docs')
 	         ALTER TABLE '&Ct_Na' ALTER COLUMN  &Imia_F &Type_FA  NULL
           ENDIF
*
         ENDIF
       ENDIF
       ENDFOR
        USE IN &Ct_Na
        USE IN Upd_F
** +! 12.11.2010  +!
      ENDIF
** +!        
      ENDFOR    
     ENDFOR

	CATCH TO er
	    This.Lresult = .F.
		Bcrezult = .F.
		cM_s="* ERROR : "+STR(er.errorno)+" - "+er.message
		cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
   		this.writeString('Error = '+cM_s, 'Невиконано') 
		This.RepMes(cM_s, Bcrezult, .F.)
	FINALLY
		IF Bcrezult
 		   cM_s="* ПРОВЕДЕНО УТОЧНЕННЯ СТРУКТУР ТАБЛИЦЬ В ПАПЦІ: " + Bd_oryg
	       this.writeString(cM_s, 'Виконано')    
		   This.RepMes(cM_s, .T., .T.)
           =INKEY(5)
		ELSE
			cM_s="* ВИНИКЛИ ПОМИЛКИ ПРИ УТОЧНЕННІ СТРУКТУР ТАБЛИЦЬ В ПАПЦІ " + Bd_oryg
 		    this.writeString(cM_s, 'Невиконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            =INKEY(5)
			cM_s="* ПРИ НЕВИКОНАННІ ОНОВЛЕННЯ ВІДНОВІТЬ СТАРТОВУ АБО КОПІЮ БД " + X_BazaD+".dbc"
  		    this.writeString(cM_s, 'Виконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            cM_s="* І ПОВТОРІТЬ ВИКОНАННЯ ОНОВЛЕННЯ ! " 
    		this.writeString(cM_s, 'Виконано')     
            =INKEY(5)
		ENDIF
	 ENDTRY
*
       ERASE "&Bd_oryg.*.TBK"
       ERASE "&Bd_oryg.*.BAK"
*
	ENDIF
   SET EXACT OFF
ENDPROC
** +
** Pack
	PROCEDURE PackTales  
		IF This.Lresult
			PResult = .T.
			TRY
				FOR EACH cTableList IN This.TablesList
** -31.01.08 
                    Ct_Pa = STREXTRACT(ALLTRIM(GETWORDNUM(cTableList,1,",")),"{","}")
** -
					FOR i = 2 TO GETWORDCOUNT(cTableList,",")
						Ct_Na    = ALLTRIM(GETWORDNUM(ALLTRIM(GETWORDNUM(cTableList,i,",")),1,":"))
** +! 12.11.2010  +!
     	              cFull_TN_dbf = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'.dbf'+'"'
                      IF FILE(cFull_TN_dbf)
** +!
** -31.01.08 
                        cFull_TN = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'"'
						USE &cFull_TN Alias &Ct_Na In 0 Exclusive		
** -
** #10.06.09 Видалення TAG "NAMEUA", "Caption"
                        cFullTableCDX = ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'.CDX' 
                        SET EXACT ON
                        IF ('docs' = Ct_Na) 
                           IF FILE('&cFullTableCDX.')   && cdx je
                             Xz_NAMEUA = ""
                             Xz_CAPTION = ""
							 FOR ikj =1 TO Tagcount(cFullTableCDX)
                               cTag = TAG(ikj)
                               IF UPPER(cTag) = "NAMEUA" 
                                Xz_NAMEUA = cTag
                               ENDIF
                               IF UPPER(cTag) = "CAPTION" 
                                Xz_CAPTION = cTag
                               ENDIF
							 ENDFOR 
*
                             IF .NOT. EMPTY(Xz_NAMEUA)
                               DELETE TAG &Xz_NAMEUA
                             ENDIF
*
                             IF .NOT. EMPTY(Xz_CAPTION)
                               DELETE TAG &Xz_CAPTION
                             ENDIF
						  ENDIF
                        ENDIF
                        SET EXACT OFF
** #
						Pack
						USE IN &Ct_Na	
** +! 12.11.2010  +!
                     ENDIF
** +!        
					ENDFOR
				ENDFOR
			CATCH TO er
				PResult = .F.
				cM_s="* ERROR : "+STR(er.errorno)+" - "+er.message
				cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
** !  
    		this.writeString('Error = '+cM_s, 'Невиконано') 
** !
				This.RepMes(cM_s, Presult, .T.)
			FINALLY
				IF PResult
				 cM_s="* ВИКОНАНО ПАКУВАННЯ ТАБЛИЦЬ БД " + X_BazaD+".dbc"
** !  
            	 this.writeString(cM_s, 'Виконано')    
** !
				 This.RepMes(cM_s, This.Lresult, .T.)
                 =INKEY(5)
				ELSE
				 cM_s="* НЕ ВИКОНАНО ПАКУВАННЯ ТАБЛИЦЬ БД " + X_BazaD+".dbc"
** !  
    		this.writeString(cM_s, 'Невиконано')     
** !
					This.RepMes(cM_s, Presult, .T.)
				ENDIF
			ENDTRY
		ENDIF
	ENDPROC
** Видалення пошукових індексів з EDB і з БД
	PROCEDURE DeletInd  
		IF This.Lresult
			PResult = .T.
			TRY
                nn=ADBOBJECTS(A_cont, 'TABLE')
                FOR ni=1 TO nn
                 IF ATC('cont_',A_cont(ni),1)=1
                  REMOVE TABLE A_cont(ni) DELETE
                 ENDIF
                ENDFOR 
			CATCH TO er
				PResult = .F.
				cM_s="* ERROR : "+STR(er.errorno)+" - "+er.message
				cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
** !  
    		this.writeString('Error = '+cM_s, 'Невиконано')
** !
				This.RepMes(cM_s, Presult, .T.)
			FINALLY
				IF PResult
					cM_s="* ВИКОНАНО ВИДАЛЕННЯ ПОШУКОВИХ ІНДЕКСІВ БД " + X_BazaD+".dbc"
** !  
    		this.writeString(cM_s, 'Виконано')
** !
					This.RepMes(cM_s, This.Lresult, .T.)
                    =INKEY(5)
				ELSE
					cM_s="* НЕ ВИКОНАНО ВИДАЛЕННЯ ПОШУКОВИХ ІНДЕКСІВ БД " + X_BazaD+".dbc"
** !  
    		this.writeString(cM_s, 'Невиконано')     
** !
					This.RepMes(cM_s, Presult, .T.)
				ENDIF
			ENDTRY
		ENDIF
	ENDPROC
*
	PROCEDURE UpdateTable
	  LPARAMETERS Ct_Pa, Ct_Na, cKey_FN
	  LOCAL cFull_TN,Del_FN, Upd_FN, Ins_FN, Chn_FN
** +! 12.11.2010  +!
      cFull_TN_dbf = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'.dbf'+'"'
      IF FILE(cFull_TN_dbf)
** +!

		cFull_TN = '"'+ADDBS(This.DbPAth + Ct_Pa)+ Ct_Na+'"'
		Del_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Del_'+Ct_Na+'"'
		Upd_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Upd_'+Ct_Na+'"'
		Ins_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Ins_'+Ct_Na+'"'
		Chn_FN = '"'+ADDBS(This.UpdPath+Ct_Pa)+ 'Chn_'+Ct_Na+'"'
		
		USE &cFull_TN Alias &Ct_Na In 0 Exclusive		
** -31.01.08 
		USE &Del_FN Alias DelFileDel In 0 Exclusive		
		USE &Upd_FN Alias UpdFileUpd In 0 Exclusive		
		USE &Ins_FN Alias InsFileIns In 0 Exclusive		
		USE &Chn_FN Alias ChnFileChn In 0 Exclusive		
** -
		Delete From &Ct_Na Where &cKey_FN in (Select &cKey_FN From &Del_FN)
		Delete From &Ct_Na Where &cKey_FN in (Select &cKey_FN From &Upd_FN)
		Insert Into &Ct_Na Select * From &Upd_FN
		Delete From &Ct_Na Where &cKey_FN in (Select &cKey_FN From &Ins_FN)
		Insert Into &Ct_Na Select * From &Ins_FN
		Delete From &Ct_Na Where &cKey_FN in (Select &cKey_FN From &Chn_FN)
		Insert Into &Ct_Na Select * From &Chn_FN
** -31.01.08 
        USE In &Ct_Na 
		USE IN DelFileDel    	
		USE IN UpdFileUpd    	
		USE IN InsFileIns    	
		USE IN ChnFileChn    	
** -
** +! 12.11.2010  +!
       ENDIF
** +!

	ENDPROC

	PROCEDURE RepMes
		LPARAMETERS cText, Lresult, IsUpdate
		SET DATASESSION TO (this.oldDataSession)
		IF USED('ProcessStatus')
			IF !IsUpdate
				APPEND BLANK IN ProcessStatus
			ENDIF
			GO BOTTOM IN ProcessStatus
			REPLACE Lstatus WITH Lresult, cCaption WITH cText IN ProcessStatus
            SELECT ProcessStatus
			IF TYPE("_screen.ActiveForm.Pageframe1.Page2.Grid1")="O"
				_screen.ActiveForm.Refresh
				_screen.ActiveForm.Pageframe1.Page2.Grid1.Refresh 
				DOEVENTS
			ENDIF 
			
		ENDIF
		SET DATASESSION TO (This.CurDataSession)
     ENDPROC
ENDDEFINE


PROCEDURE GetValstring
	LPARAMETERS cFrom, cVal
	RETURN ALLTRIM(STRTRAN(STREXTRACT(STRTRAN(cFrom,";;",CHR(3)),UPPER(cVal)+" =",";",1,1),CHR(3),";"))
ENDPROC

** -18/10/07  чи є поле
PROCEDURE Field_yes
PARAMETERS Naim_fi
PRIVATE x_kp, x_i  
 x_kp=FCOUNT()
 FOR   x_i =1 TO x_kp
  IF LOWER(ALLTRIM(naim_fi))=LOWER(ALLTRIM(FIELD(x_i)))
   RETURN .T.
  ENDIF
 ENDFOR    
RETURN .F.
*
** Vid Sergija
FUNC Ret_drob && возвращает размер дробной части переменной 
PARA chislo && может использоваться для задания маски при вводе данных 
*-ПРИМЕР ЗАПУСКА --------- 
* ? ret_drob(1.000) 
*------------------------- 
IF Type('m.chislo')#'N' .AND. Type('m.chislo')#'F'
 chislo=0 
Endif 
Priv d_chislo,p_chislo 
d_chislo=ALLTRIM(PADC(m.chislo,30)) 
p_chislo=AT(SET('Point'),m.d_chislo) 
Return IIF(m.p_chislo=0,0,Len(m.d_chislo)-m.p_chislo)
*
**   16.11.2010 
PROCEDURE Txf_Fpdf
 DO WHILE .NOT. EOF()
  KL_temp1 = &cKey_FN.
*!*	 -29.11.07 корекція поля FPDF в оновленні
      R_FPDF = FPDF
      IF .NOT. ISNULL(R_FPDF) .AND. EMPTY(R_FPDF)
       R_FPDF = .NULL.
      ENDIF              
*!*	 -
      SELE &Ct_Na
      R_txf = 0 
      SEEK KL_temp1
      IF .NOT. EOF()
        R_txf = txf
*!*	-29.11.07  значення поля FPDF з БД
       IF .NOT. ISNULL(FPDF) .AND. .NOT. EMPTY(FPDF)
        R_FPDF = FPDF
       ENDIF              
*!*	-
      ENDIF
      SELE T_25
      REPLACE txf WITH R_txf, fpdf WITH R_FPDF
      SKIP
  ENDDO
RETURN
**
PROCEDURE Flag123_nzam
 DO WHILE .NOT. EOF()
  KL_temp1 = &cKey_FN.
*!*	 -16.11.10 корекція полiв в оновленні
      R_flag1 = flag1
      R_flag2 = flag2
      R_flag3 = flag3
*
      IF .NOT. ISNULL(R_flag1) .AND. EMPTY(R_flag1)
       R_flag1 = .NULL.
      ENDIF              
      IF .NOT. ISNULL(R_flag2) .AND. EMPTY(R_flag2)
       R_flag2 = .NULL.
      ENDIF              
      IF .NOT. ISNULL(R_flag3) .AND. EMPTY(R_flag3)
       R_flag3 = .NULL.
      ENDIF              
*!*	 -
      SELE &Ct_Na
      R_nzam = '  ' 
      SEEK KL_temp1
      IF .NOT. EOF()
        R_nzam = nzam
*!*	-16.11.10  значення полів з БД
       IF .NOT. ISNULL(R_flag1) .AND. .NOT. EMPTY(R_flag1)
        R_flag1 = flag1
       ENDIF              
       IF .NOT. ISNULL(R_flag2) .AND. .NOT. EMPTY(R_flag2)
        R_flag2 = flag2
       ENDIF              
       IF .NOT. ISNULL(R_flag3) .AND. .NOT. EMPTY(R_flag3)
        R_flag3 = flag3
       ENDIF              
*!*	-
      ENDIF
      SELE T_25
      REPLACE Flag1 WITH R_flag1, Flag2 WITH R_flag2, Flag3 WITH R_flag3, Nzam WITH R_nzam
      SKIP
  ENDDO
RETURN
**
PROCEDURE Flag4_act
 DO WHILE .NOT. EOF()
  KL_temp1 = &cKey_FN.
      SELE T_dbflag4
      R_Flag4 = .NULL. 
      SEEK KL_temp1
      IF .NOT. EOF()
        R_Flag4 = '33'
      ENDIF
      SELE T_25
      REPLACE Flag4 WITH R_flag4
      SKIP
  ENDDO
RETURN
*
