hola foro,
desde programa creo una dbf con _ en un arreglo, modifico el arreglo agregandole campos, obviamente hay campos que no existen que estan en el arreglo, como hago para que la estructura de la dbf tome _ nuevos agregados?
salu2
paco
modificar una estructura dbf
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
Paco:
Si tu pregunta es para saber si hay alguna función o clase que te ayude a modificar la estructura, ummmm pues creo que no.
Si lo que necesitas es una idea de cómo hacerlo, se me ocurre lo siguiente:
1.- Tienes una nueva estructura en un arreglo, como dices
2.- Debes leer la estructura de la DBF existente y la metes en otro arreglo, me parece que la función DIRECTORY() puede ayudarte con eso
3.- Comparas ambos arreglos
4.- Si hay diferencia(s) creas una DBF temporal con la nueva estructura
5.- Copias los registros de la DBF existente a la nueva DBF, con APPEND FROM .... puedes hacerlo
6.- Borras la DBF anterior y
7.- Renombras la nueva DBF al nombre de la DBF anterior, obviamente debes abrirlas DBF en forma exclusiva.
Es solo una idea, espero te sirva
Saludos
Si tu pregunta es para saber si hay alguna función o clase que te ayude a modificar la estructura, ummmm pues creo que no.
Si lo que necesitas es una idea de cómo hacerlo, se me ocurre lo siguiente:
1.- Tienes una nueva estructura en un arreglo, como dices
2.- Debes leer la estructura de la DBF existente y la metes en otro arreglo, me parece que la función DIRECTORY() puede ayudarte con eso
3.- Comparas ambos arreglos
4.- Si hay diferencia(s) creas una DBF temporal con la nueva estructura
5.- Copias los registros de la DBF existente a la nueva DBF, con APPEND FROM .... puedes hacerlo
6.- Borras la DBF anterior y
7.- Renombras la nueva DBF al nombre de la DBF anterior, obviamente debes abrirlas DBF en forma exclusiva.
Es solo una idea, espero te sirva
Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Paco:
En el punto 2 de mi anterior respuesta no es la función DIRECTORY() es la función DBSTRUCT(), las prisas son malas consejeras
Un abrazo
En el punto 2 de mi anterior respuesta no es la función DIRECTORY() es la función DBSTRUCT(), las prisas son malas consejeras
Un abrazo
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
- Patricio Avalos Aguirre
- Posts: 1028
- Joined: Fri Oct 07, 2005 1:56 pm
- Location: La Serena, Chile
- Contact:
Hola Fancisco,
Yo hice esta rutina, pruebala y hazle ajuste para tus necesidades
espero que te sirva
Yo hice esta rutina, pruebala y hazle ajuste para tus necesidades
espero que te sirva
Code: Select all
function checkBaseDato()
local cPath, aDir, cDbf, aStruc1, aStruc2, i, j, cInfo, nHandle, lPaso, aBase := {}, lIndex := .f.
if DirMake( ViewUsu():cPathTmp + "\chkDbf" ) <> 0
MsgInfo( "imposible crear directorio" + CRLF + ViewUsu():cPathTmp + "\chkDbf"+ CRLF + CRLF + "Borrelo manualmente", "Usuario" )
return( nil )
endif
cPath := ViewUsu():cPathDbf //guardamos la ubicacion original
ViewUsu():cPathDbf := ViewUsu():cPathTmp + "\chkDbf"
AdsSetSearchPath( ViewUsu():cPathDbf )
CreaDbf() //creamos los dbf en el directorio creado
aDir := Directory( ViewUsu():cPathDbf + "\*.DBF" )
IF (nHandle := FCREATE( 'Informe.log', 0 )) == -1
msginfo( "Hubo un Error;;al crear Archivo" )
return( nil )
endif
cInfo := "Informe de structura" + CRLF
cInfo += repli("=",80) + CRLF
for i := 1 to len( aDir )
cDbf := strtran( upper(aDir[i,1]),".DBF", "" )
cInfo += "Archivo:"+PADR(cDbf,10)
aStruc1 := {}
aStruc2 := {}
use (ViewUsu():cPathDbf + "\" + cDbf )exclusive VIA "DBFCDX"
if !NetErr()
aStruc1 := dbStruct()
if file( cPath + "\" + cDbf + ".dbf" )
USE (cPath + "\" + cDbf) EXCLUSIVE VIA "DBFCDX"
if !NetErr()
aStruc2 := dbStruct()
else
cInfo += CRLF + "Imposible abrir de la ruta "+cPath
endif
else
aStruc2 := {{ "NO EXISTE FILE", "C", 0, 0 }}
endif
else
cInfo := "Error abrir archivo:"+ViewUsu():cPathDbf + "\"+cDbf
endif
lPaso := .f.
if !empty(aStruc1) .and. !empty(aStruc2)
if len( aStruc1 ) = len( aStruc2 )
for j := 1 to len( aStruc1 )
if aStruc1[j,1] <> aStruc2[j,1] .or. ;
aStruc1[j,2] <> aStruc2[j,2] .or. ;
aStruc1[j,3] <> aStruc2[j,3] .or. ;
aStruc1[j,4] <> aStruc2[j,4]
cInfo += CRLF + ;
aStruc1[j,1] + aStruc1[j,2] + str(aStruc1[j,3],3) + str(aStruc1[j,4],2)+ " " +;
aStruc2[j,1] + aStruc2[j,2] + str(aStruc2[j,3],3) + str(aStruc2[j,4],2)
lPaso:=.t.
endif
next j
if !lPaso
cInfo += chr(9)+ chr(9) + "OK" + CRLF
endif
else
lPaso := .t.
endif
endif
if lpaso
if len(aStruc1) <= len( aStruc2 )
cInfo += CRLF + chr(9) + "Estructuras de " + padr(cPath,50)+ chr(9)+ViewUsu():cPathDbf+CRLF
for j := 1 to len( aStruc1 )
cInfo += chr(9) + ;
PadR(aStruc1[j,1],10)+chr(9) + aStruc1[j,2] + chr(9) + str(aStruc1[j,3],3) + chr(9)+str(aStruc1[j,4],2) + chr(9)+chr(9)
cInfo += chr(9) + ;
PadR(aStruc2[j,1],10) + chr(9) + aStruc2[j,2] + chr(9) + str(aStruc2[j,3],3) + chr(9)+str(aStruc2[j,4],2) + CRLF
next j
while j <= len( aStruc2 )
cInfo += chr(9) + ;
PadR(aStruc2[j,1],10) + chr(9)+aStruc2[j,2] + chr(9)+str(aStruc2[j,3],3) + chr(9)+str(aStruc2[j,4],2) + CRLF
j++
enddo
else
cInfo += CRLF + chr(9) + "Estructuras de " + PadR(ViewUsu():cPathDbf,50)+ chr(9)+cPath+CRLF+CRLF
for j := 1 to len( aStruc2 )
cInfo += chr(9) + ;
PadR(aStruc2[j,1],10)+chr(9) + aStruc2[j,2] + chr(9) + str(aStruc2[j,3],3) + chr(9)+str(aStruc2[j,4],2) + chr(9)+chr(9)
cInfo += chr(9) + ;
PadR(aStruc1[j,1],10) + chr(9) + aStruc1[j,2] + chr(9) + str(aStruc1[j,3],3) + chr(9)+str(aStruc1[j,4],2) + CRLF
next j
while j <= len( aStruc1 )
cInfo += chr(9) + ;
PadR(aStruc1[j,1],10) + chr(9)+aStruc1[j,2] + chr(9)+str(aStruc1[j,3],3) + chr(9)+str(aStruc1[j,4],2) + CRLF
j++
enddo
endif
aadd( aBase, cDbf )
endif
USE
FWRITE( nHandle, cInfo+CRLF )
cInfo:=""
next i
FCLOSE( nHandle )
dbCloseAll()
WAITRUN("NOTEPAD informe.LOG")
if len( aBase ) > 0 .AND. MsgNoYes( "Desea reparar las bases!!" + CRLF + "antes de prodeder hacer una copia de respaldo", "usuario" )
lIndex := .t.
for i := 1 to len( aBase )
cDbf := aBase[i]
use (ViewUsu():cPathDbf + "\" + cDbf )exclusive VIA "DBFCDX"
if !NetErr()
if file( cPath + "\" + cDbf + ".dbf" )
MsgRun( "Espere, importando " +cDbf+"["+str(i,2)+"/"+str(len(abase),2)+"]", "Usuario",;
{ || __dbApp( cPath + "\"+cDbf,{ },,,,,.F.,"DBFCDX") } )
USE
if fErase( cPath + "\" + cDbf + ".DBF" ) = 0
if file( cPath + "\" + cDbf + ".fpt" )
fErase( cPath + "\" + cDbf + ".fpt" )
FileCopy( ViewUsu():cPathDbf + "\" + cDbf + ".fpt", cPath + "\" + cDbf + ".fpt" )
endif
FileCopy( ViewUsu():cPathDbf + "\" + cDbf + ".DBF", cPath + "\" + cDbf + ".DBF" )
else
MsgInfo( "Error al borrar "+ cPath + "\" + cDbf + ".DBF" )
endif
else
USE
FileCopy( ViewUsu():cPathDbf + "\" + cDbf + ".DBF", cPath + "\" + cDbf + ".DBF" )
if file( ViewUsu():cPathDbf + "\" + cDbf + ".FPT" )
FileCopy( ViewUsu():cPathDbf + "\" + cDbf + ".fpt", cPath + "\" + cDbf + ".fpt" )
endif
endif
else
msginfo( "imposible abrir base" + cDbf )
endif
USE
next i
endif
aDir := Directory( ViewUsu():cPathTmp + "\chkDbf\*.*" )
aEval( aDir, { |x| cDbf := X[1], fErase( ViewUsu():cPathTmp + "\chkDbf\"+ cDbf ) } )
ViewUsu():cPathDbf := cPath //restauramos el original
AdsSetSearchPath( ViewUsu():cPathDbf )
DirRemove( ViewUsu():cPathTmp + "\chkDbf" )
if lIndex
Indexar( .f. )
dbCloseAll()
endif
return( nil )
//---------------------------------------------------------------------------------------------------------------
Saludos
Patricio
__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Patricio
__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.