faz o seguinte
#include "FiveWin.ch"
#include "FileIO.ch"
*****************************
FUNCTION E_IGUAL( A1 , A2 )
*****************************
//
// Compara duas matrizes verificando se todos os elementos sao iguais
//
LOCAL I
//
IF LEN( A1 ) != LEN( A2 )
RETURN .F.
ENDIF
FOR I:= 1 TO LEN(A1)
IF VALTYPE( A1[I] ) == "A"
IF ! E_IGUAL( A1[I] , A2[I] )
RETURN ( .F. )
ENDIF
ELSE
IF A1[I] != A2[I]
RETURN .F.
ENDIF
ENDIF
NEXT
RETURN ( .T. )
*************************
PROCEDURE AR_TRIM( A1 )
*************************
//
LOCAL I
//
FOR I:= 1 TO LEN(A1)
IF VALTYPE( A1[I] ) == "A"
AR_TRIM( A1[I] )
ELSEIF VALTYPE( A1[I] ) == "C"
A1[I] := ALLTRIM( A1[I] )
ENDIF
NEXT
RETURN
*****************************************
PROCEDURE MODISTRU( file , arq , cDirec)
*****************************************
//
// MODIFY SYTRUCT
//
local orig , Fname, Ftype, Arrblock, Block, Dummy, Pos, i, new_arq ,;
cAreafile , cAreanew
*
DBCLOSEALL()
*
file := UPPER(ALLTRIM(file))
IF VALTYPE(cDirec) <> "U"
cDirec := ALLTRIM(cDirec)
file := cDirec + file
new_arq:= cDirec + "NEW.DBF"
ELSE
new_arq:="NEW.DBF"
ENDIF
IF ! FILE( file + ".DBF" )
MsgStop( file + " Nao encontrado no pasta dados" ,"Erro na abertura dos dados")
QUIT
ENDIF
*
IF !NETUSE( file , .F. , 5)
MSGSTOP("Sistema em uso exclusivo no momento.","Atencao")
QUIT
ENDIF
orig := DBSTRUCT()
CLOSE DATA
*
AR_TRIM( orig ) // Estrutura antiga
AR_TRIM( arq ) // Estrutura nova
*
IF ! E_IGUAL( orig , arq )
* Se houve alteracao
MsgRun("ALTERANDO... " + file)
DBCREATE(new_arq , arq )
USE (new_arq)
cAreanew:=ALIAS(SELECT())
SELECT 0
IF ! NETUSE( file , .T. , 5)
MSGSTOP("Sistema em uso exclusivo no momento.","Atencao")
QUIT
ENDIF
cAreafile:=ALIAS(SELECT())
Arrblock := {}
FOR i:= 1 TO LEN(arq)
fname := arq[i,1]
ftype := arq[i,2]
Pos := ASCAN( orig , {|x| IF(x[1] == fname , .T. , .F. )} )
IF pos > 0
*
IF ftype == Orig[pos,2]
* Se de tipos iguais
*
/* Campo origem */
AADD(arrblock,{ fname,FIELDWBLOCK(fname,SELECT(cAreafile))})
ENDIF
*
ENDIF
NEXT
(cAreafile)->( DBGOTOP() )
WHILE !(cAreafile)->( EOF() )
(cAreanew)->( DBAPPEND() )
FOR i:= 1 TO LEN(arrblock)
fname := arrblock[i,1]
block := arrblock[i,2]
Dummy := (cAreafile)->(EVAL( block )) // Campo Origem
*
(cAreanew)->( EVAL( fieldblock(fname) , Dummy ) )
*
NEXT
*
(cAreafile)->( DBSKIP(+1) )
*
END
DBCLOSEALL()
FERASE(".\DADOS\" + file )
FRENAME(".\DADOS\" + new_arq ,".\DADOS\" + file )
FERASE(".\DADOS\*.CDX" )
ENDIF
DBCLOSEALL()
RETURN
///////////////////////////////////////////////////////////////
* NetUse( <cDatabase>, <lOpenMode>, <nWaitSeconds> ) --> lSuccess
* Attempt to USE a database file with optional retry
FUNCTION NETUSE( CDATABASE, LOPENMODE, NSECONDS )
LOCAL LFOREVER
LFOREVER = (NSECONDS = 0)
DO WHILE (LFOREVER .OR. NSECONDS > 0)
IF LOPENMODE
USE (CDATABASE) EXCLUSIVE NEW
ELSE
USE (CDATABASE) SHARED NEW
ENDIF
IF .NOT. NETERR() // USE SUCCEEDS
RETURN (.T.)
ENDIF
INKEY(1) // WAIT 1 SECOND
NSECONDS = NSECONDS - 1
ENDDO
RETURN (.F.) // USE FAILS
compile e link a rotina junto com seu sistema
aqui exemplo de como usar a funcao
aStr := {}
AADD(aStr,{'CODIGO', 'C' ,13, 00})
AADD(aStr,{'NOME', 'C' ,40, 00})
AADD(aStr,{'QUANT', 'N' ,10, 02})
AADD(aStr,{'VALOR', 'N' ,10, 02})
AADD(aStr,{'TOTAL', 'N' ,10, 02})
AADD(aStr,{'DATA', 'D' ,08, 00})
AADD(aStr,{'CVENDE', 'N' ,10, 00})
AADD(aStr,{'VENDED', 'C' ,40, 00})
IF ! FILE('DEVOLUC.DBF')
DBCREATE('DEVOLUC.DBF',aStr)
ELSE
MODISTRU("DEVOLUC.DBF",aStr)
ENDIF