PARAMETERS BazaD
ON ERROR
LOCAL er AS Exception
PUBLIC cLV_Param AS Character, cLV_filePath AS Character 
cLV_filePath =""
cLV_param = TYPE("Lv_UpdIntern")
IF cLV_param = 'U'
  Lv_UpdIntern = .F.
ENDIF
OldSel = SELECT()
SET ESCAPE OFF
oUpdSe = CREATEOBJECT("UpdSe",BazaD)
oUpdSe.oldDataSession  = SET("Datasession")
oUpdSe.ZipFileName = "IF_6007_2025_10_20251104095549"
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.logFileName_all=CHR(34)+oUpdSe.PathExe+"Update_all.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")
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
ON ERRO do infoerro with erro(),prog(),line(1)
RETURN res
*
DEFINE CLASS UpdSe as Session
** VB

    logFileName_all = ""

	logFileName = ""
	DBID = ""
	oldDataSession = 0
	CurDataSession = 0
	Lresult = .T.
	DbSeFiNa = ""
	DbPath  = ""
	ZipFileName = ""
	UpdPath = ""
	TablesList = .Null.
** /
    R_comment = "" 
    PathExe = ""
    NameBD = ""
** VB
   	oLogFile = .NULL.
	oUpdateLog = .NULL.
** VL 01.02.2018
    oLogFile_all = .NULL.
    oUpdateLog_all = .NULL.
** /
 PROCEDURE destroy
  this.save("Update.log", "Update_all.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
** LV - 01.02.2018
 PROCEDURE openFile_all
  LPARAMETERS cFileName
  cDbID = this.dbID
  cUpdateID = JUSTSTEM(this.ZipFileName)
  oLogFile_all = CREATEOBJECT("Microsoft.XMLDOM")
  oLogFile_all.async = .F.
  IF FILE(FULLPATH(cFileName))
   oLogFile_all.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_all.loadXML(cXML)
  ENDIF
  This.oLogFile_all = oLogFile_all
  oLog = oLogFile_all.selectSingleNode("Updates/log")
  IF ISNULL(oLog)
   ERROR("Файл Update_all.log пошкоджено.")
  ELSE
  oBase = oLog.selectSingleNode('Base[@ID = "'+cDbID+'"]')
  IF ISNULL(oBase)
   oBase = oLogFile_all.createElement("Base")
   oBase.setAttribute("ID",cDbID)
   oLog.appendChild(oBase)
  ENDIF
  oUpdateLog_all = oBase.selectSingleNode('Update[@ID = "'+cUpdateID+'"]')
  IF ISNULL(oUpdateLog_all)
	oUpdateLog_all  = oLogFile_all.createElement("Update")
	oUpdateLog_all .setAttribute("ID",cUpdateID)
	oBase.appendChild(oUpdateLog_all )
  ENDIF
  this.oUpdateLog_all = oUpdateLog_all
 ENDIF
ENDPROC
*
PROCEDURE WriteString_all
 LPARAMETERS cOperation, cResult
 IF !ISNULL(This.oLogFile_all) AND !ISNULL(this.oUpdateLog_all)
	oOperation  = This.oLogFile_all.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_all.appendChild(oOperation)
 ENDIF 
ENDPROC
** --- LV	
PROCEDURE save()
 LPARAMETERS cFileName, cFilename_all
 This.oLogFile.Save(cFileName)
 This.oLogFile_all.Save(cFileName_all)
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 із оновл. БД             
** Перевірки умов оновлення
** $$ 19.05.2011 +--- вставити перевірку наявності вільного простору на диску Informs.exe 
    Bucva_Drive = UPPER(JUSTDRIVE(This.UpdPath))
    Vilno_Drive = DISKSPACE(Bucva_Drive, 2)
    IF Vilno_Drive >= 1000000000     && povynno buty vilno >= 1 Гб
** $$ 
	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))
** \\   26.07.2021
    cLV_filePath = '"'+ALLTRIM(UPPER(InfoTable.filepath))+'"' 
** \\
** !
	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)

     oUpdSe.OpenFile_all(oUpdSe.logFileName_all)
** !
     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.
** * 18.07.2019  L.V.
        x_prevUpd=m.nsyst+'_'+m.nzam+'_'+'RR'+'_'+'12...zip , де RR='
	    cM_s ="* Для актуалізації БД виконайте оновлення: "
        cM_s = cM_s + x_prevUpd
        IF  m.kipc='12'
         x_prevUpd_RR = STR(Int(VAL(m.kyear)+1),4)
         n_xRr = Int(VAL(m.nyear)-VAL(m.kyear)-2) 
        ELSE
         x_prevUpd_RR = STR(Int(VAL(m.kyear)),4)
         n_xRr = Int(VAL(m.nyear)-VAL(m.kyear)-1) 
        ENDIF
        FOR i = 1 TO n_xRr
         IF  m.kipc='12'
           x_prevUpd_RR =x_prevUpd_RR + ", " + STR(Int(VAL(m.kyear)+1+i),4)
         ELSE  
           x_prevUpd_RR =x_prevUpd_RR + ", " + STR(Int(VAL(m.kyear)+i),4)
         ENDIF
        ENDFOR    
          x_prevUpd_RR =x_prevUpd_RR + ". " + "Скачайте ці архіви з www.leonorm.com.ua/p/ukr/sinform.htm#UBDZ"+;
          " і оновіть БД <з локального каталога>"
        cM_s = cM_s + x_prevUpd_RR
** *
*!*		    cM_s ="* Для коректного оновлення БД необхідно виконати оновлення за "
*!*	        cM_s = cM_s + "попередній рік - "+x_prevUpd
       ENDIF
      ENDIF
     ELSE
	  This.Lresult = .F.
	  cM_s ="* Неактуальний набір даних з кумулятивним оновленням - "+This.ZipFileName+".zip"
     ENDIF
	ELSE
	 This.Lresult = .F.
** 03.12.2019 - utochnennia
     IF .NOT. EMPTY(x_crntupd)
	   cM_s ="* Неактуальний набір даних з кумулятивним оновленням - "+This.ZipFileName+".zip"
     ELSE 
	   cM_s ="* У цій Базі Даних відсутня інформація про стан оновлення, тому неможливо її АКТУАЛІЗУВАТИ. "
     EndIf
**      
	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)

    oUpdSe.OpenFile_all(oUpdSe.logFileName_all)
** !  
    This.WriteString('УВАГА! '+cM_s, 'Невиконано')     

  	This.WriteString_all('УВАГА! '+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
** 31.01.2018 perestavleno z pochatku 
     This.WriteString('* Старт оновлення БД - '+This.NameBD, 'СТАРТ')     

     This.WriteString_all('* Старт оновлення БД - '+This.NameBD, 'СТАРТ')     
*
** 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.
		      SELE T_23
		      USE
*
** - %18.12.2013
              IF (cLV_Param = 'U') .OR. ((cLV_Param != 'U') .AND. (.NOT. Lv_UpdIntern))
			    cM_s ="* В БД використовується індивідуальне кодування, а в оновленні - загальне. "
                cM_s = cM_s + "Використайте оновлення з індивідуальним кодуванням!"   
			    this.writeString( 'УВАГА! '+cM_s, 'Невиконано')   

			    this.writeString_all( 'УВАГА! '+cM_s, 'Невиконано')   
*
    			This.RepMes(cM_s, This.Lresult, .T.)
**  04.04.2017  -  для оновлення з Інтернету дещо по іншому видати повідомлення
               ELSE    
			    cM_s ="* БД з індивідуальним кодуванням, а в оновленні - загальне. "
                cM_s = cM_s + "Наступний крок - виконання оновлення з індивідуальним кодуванням!"   
    			This.RepMes(cM_s, This.Lresult, .T.)
             ENDIF
** - %

            CASE (Typ_cr_24='0') .AND. (Typ_cr_23='1')
		      This.Lresult = .F.
		      SELE T_23
		      USE
*
** - %18.12.2013
              IF (cLV_Param = 'U') .OR. ((cLV_Param != 'U') .AND. (.NOT. Lv_UpdIntern))
			    cM_s ="* В БД використовується загальне кодування, а в оновленні - індивідуальне. "
                cM_s = cM_s + "Використайте оновлення з загальним кодуванням!"   
			    This.writeString( 'УВАГА! '+cM_s, 'Невиконано')   

			    This.writeString_all( 'УВАГА! '+cM_s, 'Невиконано')   
*
   			    This.RepMes(cM_s, This.Lresult, .T.)
**
**  04.04.2017  -  для оновлення з Інтернету дещо по іншому видати повідомлення
**
               ELSE    
			    cM_s ="* БД з загальним кодуванням, а в оновленні - індивідуальне. "
                cM_s = cM_s + "БД з загальним кодуванням можливо вже оновлена. Перевірте стан цієї БД."   
*
    			This.RepMes(cM_s, This.Lresult, .T.)
              ENDIF
** - %
         ENDCASE
*
    ELSE  && nevidpov. DBsettings.dbf
      This.Lresult = .F.
	  cM_s ="* В одному або двох конфігураційних файлах відсутні записи з <FieldType=-1>"
      SELE T_23
      USE
*
  	  this.writeString( 'Error = '+cM_s, 'Невиконано')   

      this.writeString_all( 'Error = '+cM_s, 'Невиконано')   
   	  This.RepMes(cM_s, This.Lresult, .T.)
*
    ENDIF
   IF This.Lresult       && IIII
** #+ 20.02.2019 - для актуалізації Db2Settings у діючій БД
   SELE T_24
   Go TOP  
   Db_p_Values = Values
   SELE T_23
   Go Top
   REPLACE Values with Db_p_Values
** #+
** #
    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   
     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
*            
** 25.11.2019 - Із-за відсутності цього SELECT - циклило оновлення
     SELECT T_23
**            
    ENDDO      && II
** Dbsettings не закривати, контроль монопольн. відкриття
** -31.01.08
    SELE T_23
    USE
** -
    IF .NOT. This.Lresult  
** !  
	 this.writeString( 'Error = '+cM_s, 'Невиконано')   

	  this.writeString_all( 'Error = '+cM_s, 'Невиконано')   
** !
   	 This.RepMes(cM_s, This.Lresult, .T.)
    ENDIF
** #07.05.09  
      ENDIF  && IIII
** #
  ENDIF  && III
** /
       
  CATCH TO er
	This.Lresult = .F.
*** 09.01.2020 
    oUpdSe.OpenFile(oUpdSe.logFileName)
    oUpdSe.OpenFile_all(oUpdSe.logFileName_all)
***
	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_all( '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.writeString_all(cM_s, 'Невиконано') 
** !
	This.RepMes(cM_s, This.Lresult, .T.)
	FINALLY
	ENDTRY
** $$ 19.05.2011 
     ELSE
       This.Lresult = .F.
       oUpdSe.OpenFile(oUpdSe.logFileName)

       oUpdSe.OpenFile_all(oUpdSe.logFileName_all)
**
 	   cM_s="* НЕМОЖЛИВО ВИКОНАТИ ОНОВЛЕННЯ БД, ТОМУ ЩО НА ДИСКУ <&Bucva_Drive.> НЕДОСТАТНЬО ВІЛЬНОГО МІСЦЯ - НЕОБХІДНО >= 1 Гб" 
       this.writeString(cM_s, 'Невиконано')    

       this.writeString_all(cM_s, 'Невиконано')    
	   This.RepMes(cM_s, .T., .T.)
       =INKEY(5)
     ENDIF
** $$
 ENDPROC
**
 PROCEDURE UpdateDataBase
	LOCAL cFull_TN,Del_FN, Upd_FN, Ins_FN, Chn_FN, KL_temp1, R_txf, R_Fpdf, KL_temp2, KL_temp3
 	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')    &&  .AND. (This.DbId != '6571').AND. (This.DbId != '6572')   && 18.05.2021 - comentovano  
   		 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') .AND. (This.DbId != '6571').AND. (This.DbId != '6572')  && 18.05.2021 - dodano 6571, 6572
*
		    USE &Upd_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   13.03.2015
            KL_temp1 = cKey_FN
            DO Txf_Fpdf WITH Kl_temp1
**
            SELE T_25
            USE
*
		    USE &Ins_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   13.03.2015
            KL_temp1 = cKey_FN
            DO Txf_Fpdf WITH Kl_temp1
**
            SELE T_25
            USE
*
		    USE &Chn_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   13.03.2015
            KL_temp1 = cKey_FN
            DO Txf_Fpdf WITH Kl_temp1
**
            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
** 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 = Trim(&cKey_FN.)   && Використав TRIM 18.05.2021
               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
*
** !!!  13.03.2015 - obrobka v Docs_az fields txf, fpdf
*
        IF (Ct_Na = 'docs_az') .AND. (This.DbId != '6571') .AND. (This.DbId != '6572')     && 16.09.2021  
   		 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
*
         IF Field_yes('txf') .AND. Field_yes('fpdf')
		    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
*
		    USE &Upd_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   13.03.2015
            KL_temp1 = cKey_FN
            DO Txf_Fpdf WITH Kl_temp1
**
            SELE T_25
            USE
*
** dlia  Ins_, Chn_
            SELE &Ct_Na
            CLOSE INDEXES 
*
		    IF FILE("&Dba1..idx")
		     ERASE "&Dba1..idx"
		    ENDIF
*
            SELE &Ct_Na
		    INDEX ON LEFT(IFF,80)+LEFT(az,20) TO "&Dba1."  COMPACT    && 12.05.2017  
		    SET INDEX TO  "&Dba1..idx"                 
		    GO TOP
*
		    USE &Ins_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   13.03.2015
            KL_temp1 = "LEFT(IFF,80)+LEFT(az,20)"    && 12.05.2017 
            DO Txf_Fpdf WITH Kl_temp1
**
            SELE T_25
            USE
*
		    USE &Chn_FN. Alias T_25 In 0 Exclusive
		    SELE T_25
		    GO TOP
**   13.03.2015
            KL_temp1 = "LEFT(IFF,80)+LEFT(az,20)"    && 12.05.2017 
            DO Txf_Fpdf WITH Kl_temp1
            SELE T_25
            USE
         ENDIF
*
            SELE &Ct_Na
            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,",")),"{","}")
					This.RepMes("*ОНОВЛЮЄМО ТАБЛИЦІ... "+Ct_Pa, .f., .f.)
					For i = 2 To Getwordcount(cTableList,",")
						Ct_Na    = Alltrim(Getwordnum(Alltrim(Getwordnum(cTableList,i,",")),1,":"))
						cKey_FN = Alltrim(Getwordnum(Alltrim(Getwordnum(cTableList,i,",")),2,":"))
						*<S>
						This.RepMes("Оновлюємо: "+Ct_Na, .f., .f.)
						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
** 17.09.2021 - для коректування повідомлдень, аналогічно, як в RezervBD()
			 LOCAL Bd_oryg, Xx_Bd_oryg, Bd_dubl 
* * Формування шляху до копій БД
             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
** 17.09.2021 -------------
			 This.Lresult = .F.
			 cM_s="ERROR : "+STR(er.errorno)+" - "+er.message
			 cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
** !  
    		this.writeString(cM_s, 'Невиконано')  
    		this.writeString_all(cM_s, 'Невиконано')  
   		    This.RepMes(cM_s, This.Lresult, .F.)
*
            cM_s13='* Помилка при оновлені таблиці : '+Ct_Pa+'\'+Ct_Na+' - з ключом : '+cKey_FN
            cM_s13=cM_s13+'. '+'ТОМУ ВИКОНАННЯ ОНОВЛЕННЯ БД НЕ ВІДБУЛОСЬ.'
    		this.writeString(cM_s13, 'Невиконано')  
    		this.writeString_all(cM_s13, 'Невиконано')  
** !
			 This.RepMes(cM_s13, This.Lresult, .F.)
*
			 cM_s="* Якщо ведете КОМЕНТАРІ в базі даних, зверніться до РОЗРОБНИКА, інакше відновіть стартову базу даних"
   		       this.writeString(cM_s, 'Увага !!!')     
   		       this.writeString_all(cM_s, 'Увага !!!')     
			   This.RepMes(cM_s, This.Lresult, .F.)
	           IF DIRECTORY(Bd_dubl) .AND. (Alltrim(STR(er.errorno)) != '114')
				 cM_s="* або попередній стан бази з ПАПКИ: "+Bd_dubl
    		     this.writeString(cM_s, 'Увага !!!')     

    		     this.writeString_all(cM_s, 'Увага !!!')     
			     This.RepMes(cM_s, This.Lresult, .F.)
			   ENDIF
               cM_s="* І ПОВТОРІТЬ ВИКОНАННЯ ОНОВЛЕННЯ ! " 
    		   this.writeString(cM_s, 'Увага !!!')     

    		   this.writeString_all(cM_s, 'Увага !!!')     
			   This.RepMes(cM_s, This.Lresult, .F.)
*
			FINALLY
			IF This.Lresult
 			 *END TRANSACTION
			 cM_s="* КУМУЛЯТИВНЕ ОНОВЛЕННЯ БД УСПІШНО ЗАВЕРШЕНО З НАБОРУ ДАНИХ - "+This.ZipFileName+".zip"
** !  
			this.writeString(cM_s, 'Виконано')

			 this.writeString_all(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.writeString_all(cM_s, 'Виконано')
				 This.RepMes(cM_s, This.Lresult, .F.)		
** -31.01.08 
 				 cM_s="* В переліку змінених НД є важлива інформація про ОНОВЛЕННЯ і ТЕХНІЧНУ ПІДТРИМКУ програмного забезпечення (ПЗ) "
   			     this.writeString(cM_s, 'Увага !')

   			     this.writeString_all(cM_s, 'Увага !')
				 This.RepMes(cM_s, This.Lresult, .F.)		
** #08.05.09 повідомити версію
                 wer_LI = FILETOSTR('&x_ProtUpd.')
*!*	                 wer_defis = ATC('-', wer_LI, 1)
                 wer_defis = ATC(Chr(13)+Chr(10), wer_LI, 1)
*!*	                 IF (wer_defis != 0) .AND. (wer_defis < 20)   && є № версії
                 IF (wer_defis != 0) .AND. (wer_defis < 80)   && є № версії
                   wer_LI = SUBSTR(wer_LI,1,wer_defis-1)
*!*	 				   cM_s='* АКТУАЛЬНА ВЕРСІЯ "Леонорм-інформ" - '+TRIM(wer_LI)+'.  ЯКЩО У ВАС НЕ АКТУАЛЬНА - АКТУАЛІЗУЙТЕ !!!'
 				   cM_s='* '+TRIM(wer_LI)+'.  ЯКЩО У ВАС НЕ АКТУАЛЬНА - АКТУАЛІЗУЙТЕ !!!'
   			       this.writeString(cM_s, 'Увага !')

   			       this.writeString_all(cM_s, 'Увага !')
				   This.RepMes(cM_s, This.Lresult, .F.)		
** 20.09.2021 - про техніч. підтримку ІС "LeoMetr" версії 3.х.х
                   If (This.DbId="6317") 
 				     cM_s='* ТЕХНІЧНА ПІДТРИМКА ІС "LeoMetr" версії - 3.х.х припиняється з 01.12.2021 р.'
   			         this.writeString(cM_s, 'Увага !')

   			         this.writeString_all(cM_s, 'Увага !')
				     This.RepMes(cM_s, This.Lresult, .F.)		
                   Endif
** 20.09.2021 - -------------
                 ENDIF
** #
                 =INKEY(5)
                ENDIF
** !18.04.11 результат веріфікації
                m.Verif = This.ZipFileName
                m.Verif = STRTRAN(Verif, 'IF', 'Verif') 
                m.Kverif = AT('_', m.Verif, 4)
                IF m.Kverif != 0
                  m.Verif = SUBSTR(m.Verif, 1, m.Kverif-1) 
                  x_VerifUpd = ADDBS(This.UpdPath) + m.Verif + ".html"   && протокол з оновлення
                  x_VerifUpdDb = ADDBS(This.DbPath) + m.Verif + ".html"  && протокол в оновлюваній БД
* 
		          IF FILE("&x_VerifUpd")  && відмітити наявність протоколу
                    COPY  FILE  "&x_VerifUpd"  TO  "&x_VerifUpdDb"		
*
 				    cM_s="* ДАНІ ПРО ВІДМІННОСТІ АКТУАЛЬНОЇ БД ВІД ПОПЕРЕДНЬОЇ МІСТЯТЬСЯ В - "+x_VerifUpdDb
   			        this.writeString(cM_s, 'Виконано')

   			        this.writeString_all(cM_s, 'Виконано')
				    This.RepMes(cM_s, This.Lresult, .F.)		
*
                    =INKEY(5)
                  ENDIF
                 ENDIF
** .
				ELSE
					ROLLBACK
				ENDIF
			ENDTRY
		ENDIF
** ~        
		IF This.Lresult
** ~        
		cM_s="* ПАКУВАННЯ ТАБЛИЦЬ БД - "+ X_BazaD+".dbc"
** !  
		this.writeString(cM_s)

		this.writeString_all(cM_s)
** !
		This.RepMes(cM_s, .F., .F.)
		this.PackTales()
*
		cM_s="* ВИДАЛЕННЯ ПОШУКОВИХ ІНДЕКСІВ БД - "+ X_BazaD+".dbc"
** !  
		this.writeString(cM_s)

		this.writeString_all(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'
** 20.02.2019 - для актуалізації Db2settings
        Db_P_ds_LV_04 = ADDBS(This.DbPath)+'Db2settings.dbf'
        Db_P_ds_fpt_04 = ADDBS(This.DbPath)+'Db2settings.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"	
** #+ 20.02.2019 - Actualizacija  Db2Settings
          COPY  FILE  "&Db_P_ds_LVc2"  TO  "&Db_P_ds_LV_04"		
          COPY  FILE  "&Db_P_ds_fptc2"  TO  "&Db_P_ds_fpt_04"	
        ENDIF  	
** +----- 18.08.2017 Onovlennia Datat dli BD 6571  -----+
        IF (This.DbId = '6571') .OR. (This.DbId = '6572')   && 16.09.2019
**
          DECLARE integer SetFileAttributes IN WIN32API string cFileName, integer nTypeAttr
**
            Up_P_DT_LV = ADDBS(This.UpdPath)+'Datat\*.*'   
**
** \\ 26.07.2021 - перевірка наявності папки з документами
            Bd_P_DT_LV = ADDBS(This.DbPath)+'Datat\'
            Do CASE  
               Case !Empty(&cLV_filePath.)
                    If !Directory(&cLV_filePath)
                    Bd_P_DT_LV1 = '"'+ADDBS(This.DbPath)+'Datat\'+'"'
                    If !Directory(&Bd_P_DT_LV1)
                     MD &Bd_P_DT_LV1
                    ENDIF
   		             cM_s="* ПАПКА з ДОКУМЕНТАМИ - "+cLV_filePath+" або ВІДСУТНЯ, або НЕДОСТУПНА. "
   		             cM_s=cM_s+"Тому оновлення документів буде виконано в папку - "+Bd_P_DT_LV
			         this.writeString(cM_s)
			         this.writeString_all(cM_s)

   		             This.RepMes(cM_s, .F., .F.)
                    ELSE 
                     Bd_P_DT_LV = Addbs(&cLV_filePath.)
                    ENDIF
               OTHERWISE
                    Bd_P_DT_LV1 = '"'+ADDBS(This.DbPath)+'Datat\'+'"'

   		             cM_s="* ШЛЯХ ДО ПАПКИ З ДОКУМЕНТАМИ НЕВИЗНАЧЕНИЙ (пустий). "
   		             cM_s=cM_s+"Тому оновлення документів буде виконано в папку - "+Bd_P_DT_LV1
			         this.writeString(cM_s)
			         this.writeString_all(cM_s)

   		             This.RepMes(cM_s, .F., .F.)

                    If !Directory(&Bd_P_DT_LV1.)
                     MD &Bd_P_DT_LV1.
                    ENDIF
           ENDCASE
** \\
		    cM_s="* ОНОВЛЕННЯ ДОКУМЕНТІВ в папці - "+Bd_P_DT_LV
			this.writeString(cM_s)
			this.writeString_all(cM_s)
** !
		    This.RepMes(cM_s, .F., .F.)
*
            in_n=Adir(m_up, '&Up_P_DT_LV')

           For in1=1 TO in_n     
             Up_P_DT_LV_F = ADDBS(This.UpdPath)+'Datat\' + m_up(in1,1)  
             Db_P_DT_LV_F = Bd_P_DT_LV + m_up(in1,1)
             IF FILE("&Db_P_DT_LV_F.") 
 ** Знімаємо атрибут "read only" 
              =SetFileAttributes("&Db_P_DT_LV_F.",0x80)
             ENDIF 
              COPY  FILE  "&Up_P_DT_LV_F."  TO  "&Db_P_DT_LV_F."		
           ENDFOR  

            =INKEY(15)

			cM_s="* ВИКОНАНО ОНОВЛЕННЯ ДОКУМЕНТІВ в папці - "+Bd_P_DT_LV
    		this.writeString(cM_s, 'Виконано')
    		this.writeString_all(cM_s, 'Виконано')
** !
			This.RepMes(cM_s, .T., .T.)

        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_dubl_Reestr, Bd_Upd_Reestr
** !$ 07.02.2012
  LOCAL Bd_dubl_Library, Bd_Upd_Library
* * Формування шляхів БД оригін., копій
  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\"
** $ 29.04.11
  Bd_dubl_Reestr = Bd_dubl+"Reestr\"
  Bd_Upd_Reestr = ADDBS(This.DbPath)+"Reestr\"
** !$ 07.02.2012
  Bd_dubl_Library = Bd_dubl+"Library\"
  Bd_Upd_Library = ADDBS(This.DbPath)+"Library\"
**!!    06.05.2013 - rozshyty Bd_dubl na poslidovnist papok
    nd_sl_3=OCCURS('\', Xx_Bd_oryg)
    n_kk_papok = nd_sl_3+1
    DECLARE AP_BD_DU(n_kk_papok)  
    AP_BD_DU(1) = This.Pathexe+"Updates\TempBd\"
    FOR IM_X=1 TO nd_sl_3
       nmn_sl = ATC('\', Xx_Bd_oryg, IM_X)
      AP_BD_DU(IM_X+1) = This.Pathexe+"Updates\TempBd\"+SUBSTR(Xx_Bd_oryg, 1, nmn_sl-1)
    ENDFOR
** !!
   TRY
** $ 29.04.11 Копіювання Edb.dbc,dcx,dct в UPD
    Up_P_edb_dbc = ADDBS(This.DbPath)+'Edb.dbc'
    Up_P_edb_dcx = ADDBS(This.DbPath)+'Edb.dcx'
    Up_P_edb_dct = ADDBS(This.DbPath)+'Edb.dct'
    Db_P_edb_dbc = ADDBS(This.UpdPath)+'Edb.dbc'
    Db_P_edb_dcx = ADDBS(This.UpdPath)+'Edb.dcx'
    Db_P_edb_dct = ADDBS(This.UpdPath)+'Edb.dct'
*
    IF FILE(Up_P_edb_dbc) .AND. FILE(Up_P_edb_dcx) .AND. FILE(Up_P_edb_dct)
      COPY  FILE  "&Up_P_edb_dbc"  TO  "&Db_P_edb_dbc"		
      COPY  FILE  "&Up_P_edb_dcx"  TO  "&Db_P_edb_dcx"
      COPY  FILE  "&Up_P_edb_dct"  TO  "&Db_P_edb_dct"
    ENDIF  		
** копіювання Info.dbf, fpt v Upd
    Db_P_info_dbf = '"'+ADDBS(This.UpdPath)+'Info'+'"'
	SELECT InfoTable
    COPY TO &Db_P_info_dbf
** $
	cM_s="* ПЕРЕВІРКА НА КОРЕКТНІСТЬ ТАБЛИЦЬ БД - "+ X_BazaD+".dbc"
	this.writeString(cM_s)

	this.writeString_all(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+" Таблиця - &Ct_Na."
			cM_s=cM_s+".  "+"LINE : "+STR(er.Lineno)+" - "+er.LineContents+"."
    		this.writeString('Error = '+cM_s, 'Невиконано') 

    		this.writeString_all('Error = '+cM_s, 'Невиконано') 
			This.RepMes(cM_s, This.Lresult, .F.)
**
			FINALLY
			IF This.Lresult
			 cM_s="* СТВОРЕННЯ КОПІЇ ОНОВЛЮВАНИХ ТАБЛИЦЬ З БД " + X_BazaD+".dbc"
 		     this.writeString(cM_s)    

 		     this.writeString_all(cM_s)    
 			 This.RepMes(cM_s, .F., .F.)
             =INKEY(5)
			ELSE
			 cM_s="* ЧЕРЕЗ ПОМИЛКИ В ОКРЕМИХ ТАБЛИЦЯХ БД " + X_BazaD+".dbc"+ "  ОНОВЛЕННЯ НЕ БУДЕ ВИКОНУВАТИСЬ."
  		     this.writeString(cM_s, 'Невиконано')     

  		     this.writeString_all(cM_s, 'Невиконано')     
			 This.RepMes(cM_s, This.Lresult, .F.)
             =INKEY(5)
			 cM_s="* Якщо ведете КОМЕНТАРІ в базі даних, зверніться до РОЗРОБНИКА, інакше відновіть стартову базу даних"
   		       this.writeString(cM_s, 'Увага !!!')     

   		       this.writeString_all(cM_s, 'Увага !!!')     
			   This.RepMes(cM_s, This.Lresult, .F.)
	           IF DIRECTORY(Bd_dubl)
				 cM_s="* або попередній стан бази з ПАПКИ: "+Bd_dubl
    		     this.writeString(cM_s, 'Увага !!!')     

    		     this.writeString_all(cM_s, 'Увага !!!')     
			     This.RepMes(cM_s, This.Lresult, .F.)
			   ENDIF
               cM_s="* І ПОВТОРІТЬ ВИКОНАННЯ ОНОВЛЕННЯ ! " 
    		   this.writeString(cM_s, 'Увага !!!')     

    		   this.writeString_all(cM_s, 'Увага !!!')     
			   This.RepMes(cM_s, This.Lresult, .F.)
               =INKEY(5)
			  ENDIF
			ENDTRY
* * COPY БД в резервну папку
  Bcrezult = .T.
  IF This.Lresult 
*** 13.11.2019 - Рекомендація Сергія почистити Setusers.dbf, але для 6317. 
	If INDBC("setusers", "TABLE") .AND. (This.Dbid = '6317')
	 Select 0
	 Use Setusers EXCL
	 Zap              && ZAP не виконується під TRY
**	 Delete ALL       && DELETE виконується під TRY
	 Use IN Setusers 
	Endif
***
** !! 06.05.2013 -- stvorennia poslidovno vsih papok
    FOR IM_X=1 TO nd_sl_3+1
       X_papky = '"'+AP_BD_DU(IM_X)+'"'
       IF !DIRECTORY(&X_papky)
           MD &X_papky
       ENDIF
    ENDFOR
*
    Bd_dubl_Guide1 = '"'+Bd_dubl_Guide+'"'
    IF !DIRECTORY(&Bd_dubl_Guide1)
       MD &Bd_dubl_Guide1
    ENDIF
    Bd_dubl_UsersSet1 = '"'+Bd_dubl_UsersSet+'"'
    IF !DIRECTORY(&Bd_dubl_UsersSet1)
       MD &Bd_dubl_UsersSet1
    ENDIF
** $ 29.04.11
    Bd_Upd_Reestr1 = '"'+Bd_Upd_Reestr+'"' 
    IF DIRECTORY(&Bd_Upd_Reestr1)
        Bd_dubl_Reestr1 = '"'+Bd_dubl_Reestr+'"'   
	    IF !DIRECTORY(&Bd_dubl_Reestr1)
	       MD &Bd_dubl_Reestr1
	    ENDIF
    ENDIF 
** !$  07.02.2012
    Bd_Upd_Library1 = '"'+Bd_Upd_Library+'"' 
    IF DIRECTORY(&Bd_Upd_Library1)
        Bd_dubl_Library1 = '"'+Bd_dubl_Library+'"'
	    IF !DIRECTORY(&Bd_dubl_Library1)
	       MD &Bd_dubl_Library1
	    ENDIF
    ENDIF 
** !!
	TRY
** $$ 18.05.2011 - Очистка основної папки (Cont_...)
    All_bd_dubl = Bd_dubl+'*.*'
    ERASE "&All_bd_dubl"
** $$
	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
** $ 29.04.11  - копіювання Cont_ ......
    nn=ADBOBJECTS(A_cont, 'TABLE')
    FOR ni=1 TO nn
     IF ATC('cont_',A_cont(ni),1)=1
       Ct_Na = A_cont(ni)
       cFull_TN = ADDBS(This.DbPAth) + Ct_Na+'.*'
       xx_kudy = Bd_dubl + Ct_Na+'.*'
       COPY  FILE  "&cFull_TN"  TO  "&xx_kudy"	
     ENDIF
    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  		
** +-
** $ 29.04.11 Копіювання Edb.dbc,dcx,dct з Upd і папки Reestr
    Up_P_edb_dbc = ADDBS(This.UpdPath)+'Edb.dbc'
    Up_P_edb_dcx = ADDBS(This.UpdPath)+'Edb.dcx'
    Up_P_edb_dct = ADDBS(This.UpdPath)+'Edb.dct'
    Db_P_edb_dbc = Bd_dubl + 'Edb.dbc'
    Db_P_edb_dcx = Bd_dubl + 'Edb.dcx'
    Db_P_edb_dct = Bd_dubl + 'Edb.dct'
*
    IF FILE(Up_P_edb_dbc) .AND. FILE(Up_P_edb_dcx) .AND. FILE(Up_P_edb_dct)
      COPY  FILE  "&Up_P_edb_dbc"  TO  "&Db_P_edb_dbc"		
      COPY  FILE  "&Up_P_edb_dcx"  TO  "&Db_P_edb_dcx"
      COPY  FILE  "&Up_P_edb_dct"  TO  "&Db_P_edb_dct"
    ENDIF  		
* 
    IF DIRECTORY(Bd_Upd_Reestr)
        xz_miniR = ADDBS(This.DbPath)+'Reestr\minireestr.dbf'
        xz_miniRall = ADDBS(This.DbPath)+'Reestr\minireestrall.dbf'
	    Up_P_ds_Reestr = ADDBS(This.DbPath)+'Reestr\*.*'
	    Db_P_ds_Reestr = Bd_dubl_Reestr + '*.*'
        IF FILE(xz_miniR) .OR. FILE(xz_miniRall)
	     COPY  FILE  "&Up_P_ds_Reestr"  TO  "&Db_P_ds_Reestr"		
        ENDIF
    ENDIF 
** !$ 07.02.2012   Копіювання папки Library
    IF DIRECTORY(Bd_Upd_Library)
        xz_libakt = ADDBS(This.DbPath)+'Library\libakt.dbf'
        xz_libr = ADDBS(This.DbPath)+'Library\libr.dbf'
        xz_libre = ADDBS(This.DbPath)+'Library\libre.dbf'
        xz_librez = ADDBS(This.DbPath)+'Library\librez.dbf'
        xz_librm = ADDBS(This.DbPath)+'Library\librm.dbf'
        xz_librmz = ADDBS(This.DbPath)+'Library\librmz.dbf'
*
	    Up_P_ds_Library = ADDBS(This.DbPath)+'Library\*.*'
	    Db_P_ds_Library = Bd_dubl_Library + '*.*'
        IF FILE(xz_libakt) .OR. FILE(xz_libr) .OR. FILE(xz_libre) .OR. FILE(xz_librez) .OR. FILE(xz_librm) .OR. FILE(xz_librmz)
	     COPY  FILE  "&Up_P_ds_Library"  TO  "&Db_P_ds_Library"		
        ENDIF
    ENDIF 
** Copy Setusers.dbf, fpt
	    Up_P_SetUs_D = ADDBS(This.DbPath)+'Setusers.dbf'
	    Up_P_SetUs_F = ADDBS(This.DbPath)+'Setusers.fpt'
	    Db_P_SetUs_D = Bd_dubl + 'Setusers.dbf'
	    Db_P_SetUs_F = Bd_dubl + 'Setusers.fpt'
        IF FILE(Up_P_SetUs_D) .AND. FILE(Up_P_SetUs_F)    
         COPY  FILE  "&Up_P_SetUs_D"  TO  "&Db_P_SetUs_D"		
         COPY  FILE  "&Up_P_SetUs_F"  TO  "&Db_P_SetUs_F"
        ENDIF
** Copy Info.dbf, fpt
    Up_P_info_dbf = ADDBS(This.UpdPath)+'Info.dbf'
    Up_P_info_fpt = ADDBS(This.UpdPath)+'Info.fpt'
    Db_P_info_dbf = Bd_dubl + 'Info.dbf'
    Db_P_info_fpt = Bd_dubl + 'Info.fpt'
*
    IF FILE(Up_P_info_dbf) .AND. FILE(Up_P_info_fpt) 
      COPY  FILE  "&Up_P_info_dbf"  TO  "&Db_P_info_dbf"		
      COPY  FILE  "&Up_P_info_fpt"  TO  "&Db_P_info_fpt"
    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.writeString_all('Error = '+cM_s, 'Невиконано') 
		This.RepMes(cM_s, Bcrezult, .F.)
	FINALLY
		IF Bcrezult
 		   cM_s="* СТВОРЕНО КОПІЮ ОНОВЛЮВАНИХ ТАБЛИЦЬ В ПАПЦІ: " + Bd_dubl
	       this.writeString(cM_s, 'Виконано')    

	       this.writeString_all(cM_s, 'Виконано')    
		   This.RepMes(cM_s, .T., .T.)
           =INKEY(5)
		ELSE
			cM_s="* ВИНИКЛИ ПОМИЛКИ ПРИ КОПІЮВАННІ ТАБЛИЦЬ В РЕЗЕРВНУ ПАПКУ " + Bd_dubl
 		    this.writeString(cM_s, 'Невиконано')     

 		    this.writeString_all(cM_s, 'Невиконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            =INKEY(5)
			cM_s="* ПРИ НЕВИКОНАННІ ОНОВЛЕННЯ ВІДНОВІТЬ СТАРТОВУ БД " + X_BazaD+".dbc"
  		    this.writeString(cM_s, 'Виконано')     

  		    this.writeString_all(cM_s, 'Виконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            cM_s="* І ПОВТОРІТЬ ВИКОНАННЯ ОНОВЛЕННЯ ! " 
    		this.writeString(cM_s, 'Виконано')     

    		this.writeString_all(cM_s, 'Виконано')     
            =INKEY(5)
		ENDIF
	 ENDTRY
*
	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.writeString_all(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'+'"'
*
** 24.05.2021 - попробувати сюди вставити створення LogVal
*
     If (This.Dbid="6571") .and. (Lower(Ct_na)="logval")
	  setdbname = '"'+ADDBS(This.DbPAth + Ct_Pa)+'logval'+'"'
      IF .NOT. FILE(cFull_TN_dbf)   && Нема logval
**  створити logval.dbf, .fpt, .cdx 
		If !Indbc("logval","TABLE")
			Create Table &setdbname (ID C(10),VALUE I(4),PICTURE W,NAME C(50))
            INDEX ON id  TAG  id  ADDIT
            USE
		Else
			Create Table (ADDBS(This.DbPAth + Ct_Pa)+'logval') free(ID c(10))
			Remove Table logval DELETE
			Create Table &setdbname (ID C(10),VALUE I(4),PICTURE W,NAME C(50))
            INDEX ON id  TAG  id  ADDIT
            USE
        ENDIF
*
      ELSE
**  logval наявний, але відсутній в DBC, можна не видаляти, можна й видалити
		If !Indbc("logval","TABLE")
		 logval_dbfcdxfpt = '"'+ADDBS(This.DbPAth + Ct_Pa)+'logval.*'+'"'
         Delete File (&logval_dbfcdxfpt.)
			Create Table &setdbname (ID C(10),VALUE I(4),PICTURE W,NAME C(50))
            INDEX ON id  TAG  id  ADDIT
            USE
        ENDIF
*
      ENDIF
     ENDIF
******* --   24.05.2021 кінець фрагменту з LogVal
*
     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)  && potribno dobavyty pole
*
** 11.03.2020 -  вставка нових полів в Docs_az.dbf (BD - 6571)
*
        If (This.Dbid="6571") .and. (Lower(Ct_na)="docs_az") .and. ((Imia_F="ORR").or.(Imia_F="RZ").or.(Imia_F="RX").or.(Imia_F="PI"))
          ALTER TABLE '&Ct_Na' ADD  '&Imia_F' &Type_FA 
        ELSE 
**
        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  
** 11.03.2020
        ENDIF
**
       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  
               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.writeString_all('Error = '+cM_s, 'Невиконано') 
		This.RepMes(cM_s, Bcrezult, .F.)
	FINALLY
		IF Bcrezult
 		   cM_s="* ПРОВЕДЕНО УТОЧНЕННЯ СТРУКТУР ТАБЛИЦЬ В ПАПЦІ: " + Bd_oryg
	       this.writeString(cM_s, 'Виконано')    

	       this.writeString_all(cM_s, 'Виконано')    
		   This.RepMes(cM_s, .T., .T.)
           =INKEY(5)
		ELSE
			cM_s="* ВИНИКЛИ ПОМИЛКИ ПРИ УТОЧНЕННІ СТРУКТУР ТАБЛИЦЬ В ПАПЦІ " + Bd_oryg
 		    this.writeString(cM_s, 'Невиконано')     

 		    this.writeString_all(cM_s, 'Невиконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            =INKEY(5)
			cM_s="* ПРИ НЕВИКОНАННІ ОНОВЛЕННЯ ВІДНОВІТЬ СТАРТОВУ АБО КОПІЮ БД " + X_BazaD+".dbc"
  		    this.writeString(cM_s, 'Виконано')     

  		    this.writeString_all(cM_s, 'Виконано')     
			This.RepMes(cM_s, Bcrezult, .F.)
            cM_s="* І ПОВТОРІТЬ ВИКОНАННЯ ОНОВЛЕННЯ ! " 
    		this.writeString(cM_s, 'Виконано')     

    		this.writeString_all(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+'"'
                        This.RepMes("Пакуємо таблицю: "+Ct_Na, .f., .f.)
						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
				This.RepMes("* ВИКОНАНО ПАКУВАННЯ ТАБЛИЦЬ БД ", .f., .f.)
			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.writeString_all('Error = '+cM_s, 'Невиконано') 
				This.RepMes(cM_s, Presult, .T.)
			FINALLY
				IF PResult
				 cM_s="* ВИКОНАНО ПАКУВАННЯ ТАБЛИЦЬ БД " + X_BazaD+".dbc"
            	 this.writeString(cM_s, 'Виконано')    

    		     this.writeString_all(cM_s, 'Виконано')    
				 This.RepMes(cM_s, This.Lresult, .T.)
                 =INKEY(5)
				ELSE
				    cM_s="* НЕ ВИКОНАНО ПАКУВАННЯ ТАБЛИЦЬ БД " + X_BazaD+".dbc"
    		        this.writeString(cM_s, 'Невиконано')     

    		        this.writeString_all(cM_s, 'Невиконано')     
					This.RepMes(cM_s, Presult, .T.)
** 10.12.2015 - В клієнтів невірно працював пошук
				  cM_s="* !!! РЕКОМЕНДУЄМО ВІДНОВИТИ  БД  З КОПІЇ, ЯКА СТВОРЕНА ПЕРЕД ПОЧАТКОМ ДАНОГО ОНОВЛЕННЯ І ПОВТОРИТИ ОНОВЛЕННЯ  БД !!!"
    		      this.writeString(cM_s, ' ')    

    		      this.writeString_all(cM_s, ' ')    
				  This.RepMes(cM_s, .T., .F.)

                  =INKEY(15)
				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.writeString_all('Error = '+cM_s, 'Невиконано')
				This.RepMes(cM_s, Presult, .T.)
			FINALLY
				IF PResult
					cM_s="* ВИКОНАНО ВИДАЛЕННЯ ПОШУКОВИХ ІНДЕКСІВ БД " + X_BazaD+".dbc"
    		        this.writeString(cM_s, 'Виконано')

    		        this.writeString_all(cM_s, 'Виконано')
					This.RepMes(cM_s, This.Lresult, .T.)
                    =INKEY(5)
				ELSE
					cM_s="* НЕ ВИКОНАНО ВИДАЛЕННЯ ПОШУКОВИХ ІНДЕКСІВ БД " + X_BazaD+".dbc"
    		        this.writeString(cM_s, 'Невиконано')     

    		        this.writeString_all(cM_s, 'Невиконано')     
					This.RepMes(cM_s, Presult, .T.)
				ENDIF
**  10.12.2015  -  затримка протоколу на екрані
                =INKEY(20)
			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
**   13.03.2015
PARAMETERS KL_temp2
 DO WHILE .NOT. EOF()
  KL_temp3 = &KL_temp2. 
*!*	 -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 = .NULL.  && Do 30.05.2011 bulo R_txf = 0 
      SEEK KL_temp3
      IF .NOT. EOF()
** ^^ 30.05.2011     Bulo R_txf = txf zamist IF ....
       IF txf=0
        R_txf = .NULL.
       ELSE
        R_txf = txf
       ENDIF 
*!*	-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  значення полів з БД
*!*	- 30.06.2016 - виправив (R_flag1), (R_flag2), (R_flag3)  на (flag1), (flag2), (flag3)
       IF .NOT. ISNULL(flag1) .AND. .NOT. EMPTY(flag1)
        R_flag1 = flag1
       ENDIF              
       IF .NOT. ISNULL(flag2) .AND. .NOT. EMPTY(flag2)
        R_flag2 = flag2
       ENDIF              
       IF .NOT. ISNULL(flag3) .AND. .NOT. EMPTY(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 = Trim(&cKey_FN.)    && Використав TRIM 18.05.2021
      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
*
