Page 2 of 2

PostPosted: Mon Dec 04, 2006 9:20 am
by Elias Torres
Enviado Antonio a tu correo....


Gracias.

Elías Torres.

PostPosted: Mon Dec 04, 2006 11:15 am
by Antonio Linares
Elias,

Efectivamente los ficheros son iguales, a excepción de una referencia a la base de datos que lo contiene (en el que no es libre) y de ahi que se detecte la corrupción de datos.

La solución parece fácil :-), sólo hay que cambiar esos bytes usando una función que use FOpen(), FRead(), FWrite() y FClose(). Si no sabes cómo hacerla, te ayudamos.

Image
Image

PostPosted: Mon Dec 04, 2006 11:24 am
by Elias Torres
Antonio,

gracias por la información. Te agradeceria que me guiaras en la forma de hacerlo, puesto que no tengo ni idea de como afrontar esto. Es la primera vez que me topo con algo así y se me escapa de las manos....

Gracias...

Elías Torres.

PostPosted: Mon Dec 04, 2006 4:40 pm
by Elias Torres
Antonio,

para poder hacer que la tabla sea libre, no existe algo parecido a StrToFile() o a FileToStr() del fox pro??

Lo digo porque la solución sería mas rapida..(convierto a caracter el fichero *.dbf, busco la ristra que contenga el nombre de la base de datos *.dbc, la sustituyo por espacios en blanco, y luego vuelvo a pasarlo a fichero, con lo que ya tendría de forma directa la trasformación de la tabla....)

Si por un casual esto no se puede hacer supongo que la otra forma seria algo asi:


lnFile = fopen(curdir()+"\articulo.dbf")
if lnFile < 0
msginfo("Error al abrir el archivo.")
else
i = 0
do while !feof(lnFile)

&&aqui va el codigo que no lo tengo muy claro....

enddo
fclose(lnFile)
endif

Alguien puede hecharme una mano en esto???


Saludos y gracias..


Elías Torres.

PostPosted: Mon Dec 04, 2006 4:57 pm
by Antonio Linares
Elías,

Este sería un prototipo, y está funcionando bien! :-):
Code: Select all  Expand view
REQUEST DBFCDX

function Main()

   FoxDBF( "articulo.dbf" )
   
   USE articulo VIA "DBFCDX"
   MsgInfo( Alias() )
   USE
   
   FoxDbf( "articulo.dbf", "datos.dbc" )
   
return nil

function FoxDbf( cDbfName, cDbc )

   local hFile := FOpen( cDbfName, 1 )
   
   if hFile != -1
      FSeek( hFile, 0x41 )
      if cDbc == nil
         FWrite( hFile, Replicate( Chr( 0 ), 15 ) )
      else
         FWrite( hFile, cDbc )
      endif     
      FClose( hFile )
   endif
   
return nil

PostPosted: Tue Dec 05, 2006 5:52 pm
by Elias Torres
Hola Antonio...

Antes de nada muchisimas gracias por la ayuda prestada. Comentarte un par de cosas..

El código que me pasastes no me ha funcionado, nose si quizas solo está probado para la tabla que te pasé, pero la tabla que tengo que utilizar es mucho más grande. Supongo que quizás sea por eso o simplemente que no lo estoy usando bien. A parte de que no me deja luego abrir la tabla, me devuelve una tabla que pesa más de 20 MB!!...Tengo una duda en cuanto a las sentencias que se encuentran en la funcion main, ¿para que sirve?. Las sentencias a las que me refiero son estas:

1.................FoxDBF( "articulo.dbf" )

2.................USE articulo VIA "DBFCDX"
3.................MsgInfo( Alias() )
4.................USE

5.................FoxDbf( "articulo.dbf", "datos.dbc" )

Otra cuestión por lo que no se si será lo más acertado hacerlo así es que tendría que hacer esto mismo para cada una de las tres tablas que necesito, porque me tengo que montar una tabla con la combinación de otras tres(articulos, precios y stock), por lo que nose si el tiempo de respuesta será bueno.

Lo suyo sería que el propio FWPPC permitiera abrir tablas ubicadas en una *.dbc, :wink:

Otra opción que he pensado es la de crearme un programa en Fox, puesto que la aplicación desde donde tengo que coger las tablas está hecha en FOX, y utilizarlo como un servicio del servidor, para que desde que le de a la opcion de actualizar en la pda me haga el cambio a tabla libre con un copy to.... y aprovechar y usar un select para motar las 3 tablas en una y entonces devolvermela ya montada. Supongo que el tiempo de respuesta no será demasiado grande puesto que el trabajo lo hará el servidor... Por cierto existe la posibilidad de recibir la tabla comprimida y luego desde la pda poder descomprimirla??. Lo digo porque a lo mejor gano tiempo en enviar una tabla que pese poco...


Saludos y gracias.

Elías Torres.

PostPosted: Tue Dec 05, 2006 8:48 pm
by Antonio Linares
Elias,

>
El código que me pasastes no me ha funcionado, nose si quizas solo está probado para la tabla que te pasé, pero la tabla que tengo que utilizar es mucho más grande.
>

Aqui ha funcionado correctamente. Envíame por email (como ZIP) la tabla que tienes que usar y la probamos.

> 1.................FoxDBF( "articulo.dbf" )

Modifica la cabecera de "articulo.dbf" para que no tenga referencias a datos.dbc

>
2.................USE articulo VIA "DBFCDX"
3.................MsgInfo( Alias() )
4.................USE
>

Abrimos la DBF una vez modificada, se abre bien, se muestra su alias y la cerramos. Es solo una prueba que demuestra el uso de la función FoxDBF().

> 5.................FoxDbf( "articulo.dbf", "datos.dbc" )

Volvemos a modificar la cabecera de "articulo.dbf" para dejarla como estaba.

> por lo que nose si el tiempo de respuesta será bueno.

La función FoxDBF() es muy muy rápida.

>
Lo suyo sería que el propio FWPPC permitiera abrir tablas ubicadas en una *.dbc,
>

Tienes que entender la diferencia entre FWPPC y Harbour. Harbour es el compilador open source y el que se encarga de abrir y usar las DBFs, índices, etc. Nosotros no producimos Harbour, sólo colaboramos en su desarrollo ya que es un producto de software libre.

FWPPC es la librería GUI que permite usar el entorno gráfico del Pocket PC usando Harbour. Luego la modificación a la que te refieres no pertenece a FWPPC, sino a Harbour :-) pero usando la función FoxDBF() podrías usar las DBFs sin problemas.

PostPosted: Thu Dec 07, 2006 12:48 pm
by Elias Torres
Hola Antonio.

Efectivamente el codigo que me has mandado funciona perfectamente. Yo era el que lo estaba usando mal. Lo que pasa es que por lo que veo la función localiza una dirección de memoria en concreto...Supongo que se ha preparado exclusivamente para la tabla que te mandé. El tema es que la tabla que uso es más grande o simplemente puede que un dia cambie porque se le añada un campo o porque se le quite. Lo que quiero decir con esto es que no deberia pasarle una dirección, sino que lo ideal sería pasarle al seek una cadena con el nombre de la *.dbc, con lo que daría igual el tamaño de las tablas y se podría usar de forma genérica para cualquiera. ¿Esto que te comento se puede hacer? Por ejemplo:

Usar FSeek( hFile, 'datos.dbc' ) en vez de FSeek( hFile, 0x41 )

La otra opción sería recorrer byte a byte toda la tabla buscando la cadena datos.dbc......., ¿no?


Saludos

Elías Torres.

PostPosted: Mon Dec 11, 2006 6:08 pm
by Elias Torres
Hola...

Necesito la ayuda de ustedes....

Vamos a ver tengo el siguiente código que lo que se supone deberia hacer es el suprimirme de la tabla el enlace a una *dbc.
¿Cual es el problema? Pues logicamente que no me funciona.

Si alguien puede echarme una mano se lo agradecería..llevo unos cuantos dias con esto..


*** Abre fichero ***
local a,b,c,n
a= fopen('articulo.dbf',1)

*** Si no logra abrirlo ***
if a < 0
return
endif

*** Inicializa variables
c= 'datos.dbc' && se trata del enlace q tiene la tabla al *.dbc
n= 0

do while !feof(a)
b= lower(fread(a,1))
n= n + 1
c= right(c+b,11)

if c= 'datos.dbc'
fseek(a,0,0) && se posiciona al principio del fichero
fseek(a,n-15) && se posiciona al principio cadena encontrada
fwrite(a,replicate(chr(0),15)) && sustituye
endif
enddo
fclose(a)



Saludos y gracias.

Elías Torres.