gente os Srs. são tão "ninjas" em tudo... que até agora não vi nada que os Srs. não resolvessem ou desse uma opinião certa!
até de "software de rádio" os srs. quase entendem... rsrsrs
por enquanto fiz o procedimento assim (até estudar melhor o do JQuintas ou asimoes):
*************** função para alterar/incluir um campo (tamanho, tipo, etc) 18/2/16w ***************
Código: Selecionar todos
static function ALTERA_ARQUIVO ( MATRIZ , MATRIZA , MATRIZN )
local ARQUIVO := MATRIZ [ 1 , 1 , 1 ],;
NOME_EXTERNO := MATRIZ [ 1 , 1 , 3 ],;
NOME_INDICE := nil,;
CHAVE := nil,;
MATRIZ_AUX := aclone (MATRIZ),;
I := 0
local n_stru := 1 , a_stru := stru_antiga := stru_nova := {} // acrescentado em 7/2/16w (pctoledo)
local lATUALIZA := .t.
local lATUALIZA2 := .f.
local tela_anterior
static INICIO := .f.
private L := 3 // 1
lboxmessage( "Por favor, pressione [ENTER] ou clique em [OK] para uma verificação inicial e saber se o arquivo "+ARQUIVO+" precisa ou não ser atualizado!!!" )
if file (NOME_EXTERNO) .and. INICIO
return
endif
adel (MATRIZ_AUX,1)
asize (MATRIZ_AUX,len (MATRIZ_AUX) - 1)
if file (NOME_EXTERNO)
a_stru := dbstruct()
for n_stru = 1 to len(MATRIZN)
if ascan( a_stru , { |x| x[1] = MATRIZN [ n_stru , 1 ] } ) = 0
aadd ( a_stru , { MATRIZN [ n_stru , 1 ] , MATRIZN [ n_stru , 2 ], MATRIZN [ n_stru , 3 ] , MATRIZN [ n_stru , 4 ] } )
else
lATUALIZA := .f.
end
next
if lATUALIZA
lboxmessage( "A verificação inicial foi feita, e, realmente o arquivo "+ARQUIVO+" precisa ser atualizado. Pressione [ENTER] ou clique em [OK] para ele ser atualizado imediatamente!" , , 2 )
if lYesNo( "Arquivo de dados " + ARQUIVO + " existe ! Deseja alterar ?" )
&ARQUIVO.->(dbclosearea())
COPY FILE (NOME_EXTERNO) TO (NOME_EXTERNO) + "-BACK"
if frename(NOME_EXTERNO, NOME_EXTERNO+"2") = 0
dbcreate(NOME_EXTERNO, a_stru)
use (NOME_EXTERNO) exclusive new
append from (NOME_EXTERNO)+"2"
use
ferase(NOME_EXTERNO+"2")
lboxmessage( "Atualização do arquivo " + ARQUIVO + " efetuada com sucesso!!!" )
else
lboxmessage( "Não foi possível renomear o arquivo! Favor verificar se existe um arquivo com esse nome! A atualização não será possível. O DBatualiza será encerrado." , , 3 )
return
endif
else
lboxmessage( "Não foi alterado nada. A atualização não será realizada. Aplicativo será encerrado!" , , 3 )
return
endif
else
lboxmessage( "A verificação inicial foi feita, e, realmente o arquivo "+ARQUIVO+" não possui novos campos!" , , 2 )
lboxmessage( "ATENÇÃO! Agora verificaremos no arquivo " + ARQUIVO + " se algum campo foi modificado. Pressione [ENTER] ou clique em [OK] para iniciar a verificação!" , , 2 )
stru_antiga := dbstruct()
stru_nova := MATRIZN
tela_anterior := savescreen ( 03 , 19 , 21 , 69 )
// moldura ( 03 , 19 , 21 , 69 )
janela ( 03 , 19 , 21 , 69 , "w* /n" )
for n_stru = 1 to len(stru_antiga)
@ scrolMV( 04 , 20 , 20 , 68 ) , 20 say "valor atual : " + stru_antiga[n_stru,1] + stru_antiga[n_stru,2] + str( stru_antiga[n_stru,3] ) + str (stru_antiga[n_stru,4] )
@ scrolMV( 04 , 20 , 20 , 68 ) , 20 say "valor correto: " + stru_NOVA[n_stru,1] + stru_NOVA[n_stru,2] + str( stru_NOVA[n_stru,3] ) + str (stru_NOVA[n_stru,4] )
if stru_antiga [n_stru,1] <> stru_nova [n_stru,1]
lATUALIZA2 := .t.
elseif stru_antiga [n_stru,2] <> stru_nova [n_stru,2]
lATUALIZA2 := .t.
elseif stru_antiga [n_stru,3] <> stru_nova [n_stru,3]
lATUALIZA2 := .t.
elseif stru_antiga [n_stru,4] <> stru_nova [n_stru,4]
lATUALIZA2 := .t.
endif
next
if lATUALIZA2
lboxmessage( "A verificação foi feita, e, realmente o arquivo "+ARQUIVO+" precisa ter os campos corrigidos. Pressione [ENTER] ou clique em [OK] para ele ser atualizado imediatamente!" , , 2 )
if lYesNo( "Arquivo de dados "+ARQUIVO+" existe ! Deseja alterar?" )
&ARQUIVO.->(dbclosearea())
COPY FILE (NOME_EXTERNO) TO (NOME_EXTERNO) + "-BACK"
if frename(NOME_EXTERNO, NOME_EXTERNO+"2") = 0
// dbcreate(NOME_EXTERNO, a_stru)
dbcreate(NOME_EXTERNO, stru_nova)
use (NOME_EXTERNO) exclusive new
append from (NOME_EXTERNO) + "2"
use
ferase(NOME_EXTERNO+"2")
lboxmessage( "Atualização do arquivo "+ARQUIVO+" efetuada com sucesso!!!" )
else
lboxmessage( "Não foi possível renomear o arquivo! Favor verificar se existe um arquivo com esse nome! A atualização não será possível. O DBatualiza será encerrado." , , 3 )
return
endif
else
lboxmessage( "Não foi alterado nada. A atualização não será realizada. Aplicativo será encerrado!" , , 3 )
return
endif
else
lboxmessage( "ATENÇÃO! O arquivo "+ARQUIVO+" já estava atualizado. Isso significa que não precisa ser atualizado por este aplicato, ou este aplicativo já foi executado anteriormente!" , , 2 )
return
endif
endif
else
if lYesNo( "Arquivo "+ARQUIVO+" não encontrado. Será criado então um novo arquivo! Você Concorda ???" , , 2)
dbcreate (NOME_EXTERNO,MATRIZ_AUX)
else
lboxmessage( "Arquivo "+ARQUIVO+" não foi criado. Tudo continuará do jeito em que estava!" , , 3 )
endif
endif
use (NOME_EXTERNO) shared new
CHAVE := MATRIZ [1,2,2]
index on &CHAVE to (MATRIZ [1,2,3])
for I = 3 to len (MATRIZ [1])
CHAVE := MATRIZ [1,I,2]
index on &CHAVE to (MATRIZ [1,I,3])
next
restscreen ( 03 , 19 , 21 , 69 , tela_anterior )
return
*************** função para alterar/incluir um campo (tamanho, tipo, etc) 18/2/16w ***************
esta é a função que cheguei até o presente momento... isso foi antes de ver as postagens dos srs.
aqui nesta função ela (pelo menos é o que entendi) faz 2 coisas:
1 - verifica se tem novos campos (se tiver toma as providências);
2 - verifica se algum campo foi alterado.
Estou testando, e, até agora não apresentou erros...
Por enquanto é só...
Nota: abro o arquivo em modo EXCLUSIVO.
O que acharam?