modificar una estructura dbf

modificar una estructura dbf

Postby Francisco Horta » Wed Jul 11, 2007 4:49 pm

hola foro,
desde programa creo una dbf con los campos 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 los campos nuevos agregados?
salu2
paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Armando » Wed Jul 11, 2007 5:39 pm

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: 3184
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Postby Armando » Wed Jul 11, 2007 5:51 pm

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

Postby R.F. » Wed Jul 11, 2007 7:16 pm

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

Postby Francisco Horta » Wed Jul 11, 2007 7:52 pm

enterado, gracias
paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby Patricio Avalos Aguirre » Wed Jul 11, 2007 8:07 pm

Hola Fancisco,

Yo hice esta rutina, pruebala y hazle ajuste para tus necesidades

espero que te sirva

Code: Select all  Expand view
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
User avatar
Patricio Avalos Aguirre
 
Posts: 1060
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Postby Francisco Horta » Wed Jul 11, 2007 9:57 pm

gracias patricio, la probare
salu2
paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 35 guests