;ALT + J
;Desenvolvido em 01.11.2019 por Bruno Carvalho
;Script p/ realizar o modify e copiar familia de uma determinada tabela 
;
;*******************************************************************************
;Rotina Lista Diretorios                                                       *
;*******************************************************************************
Proc Lista_Diretorios(Nome_Diretorio)
Private Nome_Diretorio
Aguarde("Aguarde, Verificando DiretĒrios FechAno ")
                             
If IsAssigned(Array_Dir_FechAno)
   Then Release Vars Array_Dir_FechAno
EndIf
DynArray Array_Dir_FechAno[]
                   
If IsAssigned(Array_Diretorios)
   Then Release Vars Array_Diretorios
EndIf
DynArray Array_Diretorios[]

wcs= Lista_Diretorio(SubStr(Directory(),1,2)+Nome_Diretorio)

For wcs from 1 to DynArraySize(Array_Lista_Diretorios)
  Array_Diretorios[wcs]= Array_Lista_Diretorios[wcs]
EndFor

LimpAguarde()

Release Vars Array_Lista_Diretorios
EndProc    ;  (Lista_Diretorios)

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog2(Disparo,Campo,Evento,Elemento)
Private Disparo,Campo,Evento,Elemento 
 
Temp=True
MSG_CAMPO=""
TECLA=""
If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = 9: Temp=False
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_DiretorioO"     : CancelDialog
            Case Campo="YES" Or Campo="NO" : Campo="TG_DiretorioO"
          EndSwitch
     Case (Evento["KeyCode"] <= -104 And Evento["KeyCode"] >= -113) Or 
           Evento["KeyCode"]  = -139 Or  Evento["KeyCode"]  = -140:
           SYS_TECLA_ACIONADA=Evento["KeyCode"]
           Seta_Tecla_Acionada()
           CancelDialog
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch          
                    Case Campo="TG_DiretorioO"      : 
                         INDICE = ControlValue("TG_DiretorioO")
                         VSDGDIRO=Array_Diretorios[INDICE]
                         AcceptDialog
                  EndSwitch
                  RefreshDialog
          EndIf        
   EndSwitch
EndIf

Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog(Disparo,Campo,Evento,Elemento)
Private Disparo,Campo,Evento,Elemento 
 
Temp=True
MSG_CAMPO=""
TECLA=""
If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = 9: Temp=False
     Case Evento["KeyCode"] = -59: 
          Switch 
            Case Campo="TG_DIRO" :
                 Showdialog "DiretĒrios" Proc "SD_Dialog2"
                 Trigger "OPEN"
                 Key "F1","F3",-61,"TAB","ReverseTab","PGDN","ENTER","INS","ESC","ClearArea",-66,-6,-147,-82,-81
                 @ 00,00 height 12 width 20
                              
                 PickDynArray @00,01 Height 10 width 15
                 Columns 1
                  Array_Diretorios
                   Tag "TG_DiretorioO"
                    To ArrayElement
                
                EndDialog
                Mouse Show                 
            OtherWise : Dialog_F1()
          EndSwitch
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_DIRO"            : Campo="NO"
            Case Campo="TG_TABO"            : Campo="TG_DIRO"
            Case Campo="TG_OPCAO"           : Campo="TG_TABO"
            Case Campo="YES" Or Campo="NO" : Campo="TG_DIRO"
          EndSwitch
     Case (Evento["KeyCode"] <= -104 And Evento["KeyCode"] >= -113) Or 
           Evento["KeyCode"]  = -139 Or  Evento["KeyCode"]  = -140:
           SYS_TECLA_ACIONADA=Evento["KeyCode"]
           Seta_Tecla_Acionada()
           CancelDialog
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch          
                    Case Campo="TG_DIRO"           : 
                         VSDGDIRO=ControlValue("TG_DIRO")
                         If Not IsBlank(VSDGDIRO)
                            Then Campo="TG_TABO"
                         EndIf
                    Case Campo="TG_TABO"           : 
                         VSDGTABO=ControlValue("TG_TABO")
                         If Not IsBlank(VSDGTABO)
                            Then Campo="TG_OPCAO"
                         EndIf
                    Case Campo="TG_OPCAO"           : 
                         VSDGOPCAO=ControlValue("TG_OPCAO")
                         Campo="YES"
                  EndSwitch
                  RefreshDialog
          EndIf        
   EndSwitch
EndIf

Switch
  Case Campo="TG_DIRO" : MSG_CAMPO="DiretĒrio = "+VSDGDRIVE+"\\"+VSDGDIRO
  Case Campo="TG_TABO" : MSG_CAMPO="Tabela = "+VSDGDRIVE+"\\"+VSDGDIRO+"\\"+Rtrim(Upper(VSDGTABO))+".SC"
  Case Campo="TG_OPCAO": MSG_CAMPO="OpÆo para a reestruturaÆo da tabela"
Endswitch

Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp
EndProc

;*******************************************************************************
;* Rotina Principal - Verificar Campos em duas tabelas distintas               *
;*******************************************************************************
AutoLib="\\Sistemas\\Cadastro\\Bibliot,\\Sistemas\\Cadastro\\Bib_Show"
LimpAguarde()
VSDGDRIVE=SubStr(Directory(),1,2)

AUX_DIR = Directory()
PosI=Search("\\",AUX_DIR)
If PosI>0
   Then AUX_DIR = SubStr(AUX_DIR,PosI+1,Len(AUX_DIR))
        PosI=Search("\\",AUX_DIR)
        If PosI>0
           Then AUX_DIR = SubStr(AUX_DIR,PosI+1,Len(AUX_DIR))
                PosI=Search("\\",AUX_DIR)
                If PosI>0 
                   Then  AUX_DIR = SubStr(AUX_DIR,1,PosI-1) 
                EndIf
        EndIf  
EndIf   

VSDGDIRO  = AUX_DIR 
VSDGTABO  = ""
VSDGOPCAO = 1  

Diretorio_Inicial  ="\\Sistemas"
Lista_Diretorios(Diretorio_Inicial)

While True
  ShowDialog "Opäes para Tabela do Sistema" Proc "SD_Dialog"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","TAB",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
   @ 05,12   Height 10 Width 42

    Label  @ 00,00 "DiretĒrio" For "TG_DIRO"
    Accept @ 01,01 Width 17 "A8"  Picture "!*!" Tag "TG_DIRO" To VSDGDIRO

    Label  @ 00,20 "Tabela" For "TG_TABO"
    Accept @ 01,21 Width 17 "A8"  Picture "!*!" Tag "TG_TABO" To VSDGTABO
    
    RadioButtons @ 03,02 Height 4 Width 36
      "Modify + JustFamily",
      "Refaz a tabela a partir do base" 
    Tag "TG_OPCAO"
    To VSDGOPCAO

    Pushbutton @ 06,07 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
    Pushbutton @ 06,21 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  EndDialog
  If Not RetVal Then QuitLoop EndIf

  If Not IsTable(VSDGDRIVE+"\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO)
     Then Mensagem("DiretĒrio ou Tabela inv lida!//Caminho = "+VSDGDRIVE+"\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO)
          Loop
  EndIf   
  
  DIR_ATUAL = Directory()
  
  SetDir VSDGDRIVE+"\\SISTEMAS\\"+VSDGDIRO
  Switch
    Case VSDGOPCAO = 1 : {Modify} {Restructure} TypeIn VSDGTABO Enter
                         Do_it!
                         ClearAll
                         
                         {Tools} {Copy} {JustFamily} 
                         TypeIn VSDGDRIVE+"\\BASE\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO Enter 
                         TypeIn VSDGDRIVE+"\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO Enter 
                         {Replace}
     
    Case VSDGOPCAO = 2 : ConfGeral("Deseja efetuar o backup da tabela "+VSDGTABO+" ?")
                         If Ok="S"
                            Then TAB_REN = "BKX"+Upper(SubStr(VSDGTABO,1,5))
                                 Aguarde("Realizando o Backup para a tabela "+TAB_REN)
                                 Copy VSDGTABO TAB_REN
                         EndIf
                         
                         Aguarde("Refazendo a Tabela "+VSDGTABO)
                         
                         {Ask} TypeIn VSDGTABO Enter Check
                         Do_It!
                         ClearAll
                         
                         Tabela_Rotina=Cria_Temp(PrivDir())         
                         Rename "Answer" Tabela_Rotina                         
                         
                         Tabela_Nova=Cria_Temp(PrivDir())
                         Create Tabela_Nova Like "\\BASE\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO
                        
                         CONTADOR = 0
                         View Tabela_Nova
                         CoEdit Tabela_Rotina
                         Scan
                           Barra(NRecords(Tabela_Rotina), RecNo())
                           Aguarde("Refazendo a Tabela "+VSDGTABO+" "+BARRA_STRING)
                          
                           CopyToArray REGISTRO
                           CONTADOR = CONTADOR + 1
                           Moveto Tabela_Nova
                           If CONTADOR=1
                              Then End
                              Else End Down
                           EndIf
                           CopyFromArray REGISTRO
                           UnLockRecord   
                           
                          Moveto Tabela_Rotina
                         EndScan
                         Do_it!
                         ClearAll
                         
                         Copy Tabela_Nova VSDGDRIVE+"\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO
                         
                         {Tools} {Copy} {JustFamily} 
                         TypeIn VSDGDRIVE+"\\BASE\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO Enter 
                         TypeIn VSDGDRIVE+"\\SISTEMAS\\"+VSDGDIRO+"\\"+VSDGTABO Enter 
                         {Replace}
                         
                         Delete Tabela_Rotina
                         Delete Tabela_Nova
  Endswitch
  SetDir DIR_ATUAL 
  Mensagem("Processo Finalizado!")
  QuitLoop  
EndWhile                                                                  
ClearAll
Release Vars All
Release Procs All
