modificar una estructura dbf

Post Reply
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

modificar una estructura dbf

Post by Francisco Horta »

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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post by Armando »

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
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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post by Armando »

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 :oops:

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
R.F.
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Post by R.F. »

Exactamente como indica Armando es como se hace.

Creas una estrutrua vacia en un archivo temporal.
Abres el archivo temporal
Haces un append from
renombras el archivo original por ejemplo como .OLD
y renombras el temporal con el nombre del original

y listo.
Saludos
R.F.
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

enterado, gracias
paco
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

Post by Patricio Avalos Aguirre »

Hola Fancisco,

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
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

gracias patricio, la probare
salu2
paco
Post Reply