Page 1 of 2

Problema en apertura de ficheros desde el Emulador.

PostPosted: Tue Jan 15, 2008 6:49 am
by tsales
Amigos

He preparado un ejemplo para probar el error que se produce en la apertura de ficheros utilizando el Emulador.

El ejemplo realiza 2 pruebas:
- El primero crea y abre ficheros en una carpeta "Pruebas" que crea en la "Storage Card" del emulador.

- El segundo hace lo mismo pero esta vez creando la carpeta "pruebas" y todo los ficheros en memoria.

Si os pasa lo que a mí, en memoria se crearan y aperturaran 80 ficheros correctamente y en el Storage card, el resultado es dispar. Se producen errores de apertura con un número NO siempre igual.

A ver si entre todos damos con la solucion.

Saludos
EL EJEMPLO:
----------------------------------------------------------------------------------

#include "Fwce.ch"
#xcommand TRY => bError := errorBlock( {|oErr| break( oErr ) } ) ;;
BEGIN SEQUENCE
#xcommand CATCH [<!oErr!>] => errorBlock( bError ) ;;
RECOVER [USING <oErr>] <-oErr-> ;;
errorBlock( bError )

STATIC bError
REQUEST DBFCDX
FUNCTION MAIN()

LOCAL oWnd
SET AUTOPEN ON

REQUEST HB_LANG_ES // Para establecer español para Mensajes, fechas, etc..
REQUEST HB_CODEPAGE_ESMWIN // Para establecer código de página a Español (Ordenación, etc..)
HB_LangSelect('ES')
HB_SetCodePage("ESMWIN") // Para ordenación (arrays, cadenas, etc..)


**-------- > Proceso de Entrada del Programa ------**
SET CONFIRM ON
SET DECIMAL TO 3
DEFINE WINDOW oWnd
ACTIVATE WINDOW oWnd ON INIT Pruebas() ON CLICK oWnd:End()

RETURN NIL

function pruebas
LOCAL cFile := SPACE( 20 )
LOCAL cAlias:= SPACE( 20 )
LOCAL x
//LOCAL cDir := "\" + CurDir() + "\Prueba\"
LOCAL cDir := "\Storage Card\Prueba\"
FOR Y=1 TO 2
IF Y=2
dbcloseall()
cDir := "\Prueba\"
ENDIF
msginfo("Comenzamos en "+ cDir)
/*
if Left(cDir,2) = "\\"
cDir := Substr(cDir,2)
endif*/
IF !FILE( cDir )
lMkDir( cDir )
ENDIF
cFile := cDir + "1" + ".dbf"
FOR X := 1 TO 80
cFile := cDir + ALLTRIM(STR(X)) + ".dbf"
if !file ( cFile)
FERASE( cFile )
endif
NEXT X

TRY
FOR X := 1 TO 80
cFile := cDir + ALLTRIM(STR(X)) + ".dbf"
DBCREATE( cFile, {{"Uno","C",10,0}} )
NEXT X
MSGINFO("Creados correctamente " + alltrim(str(x-1)))
CATCH
MSGSTOP("Error creando ficheros. Creados = " + alltrim(str(x)) + " de 80","Error en creacion de ficheros")
END
msginfo("DbCreate finalizado")
TRY
for x := 1 to 80
cFile := cDir + ALLTRIM(STR(X)) + ".dbf"
cAlias:= "A"+STRZERO(X,2)
Dbusearea( .T. ,"DBFCDX" , cFile, cAlias, .f. ,.f. )
if !NetErr()
(cAlias)->(dbappend())
Replace (cAlias)->Uno WITH cAlias
endif

next x
MSGINFO("Abiertos correctamente " + alltrim(str(x-1)))
CATCH
MSGSTOP("Error aperturando ficheros. Abiertos = " + alltrim(str(x)) + " de 80","Error en apertura de ficheros")
END

msginfo("Final")
NEXT Y

return nil

PostPosted: Tue Jan 15, 2008 7:13 am
by Antonio Linares
Toni,

Ya hemos visto en otros casos, que la Storage card falla para determinadas operaciones (apertura de ficheros, índices, etc.)

Tal vez el Windows Mobile 2006 haya mejorado esto. Aún no lo hemos probado en él.

PostPosted: Tue Jan 15, 2008 8:51 am
by tsales
Antonio
Las pruebas que he realizado han sido sobre WM6.

Lo curioso es que con FOPEN() funciona correctamente la apertura de los 80 Ficheros.

¿No será un problema propio de la funcion dbusearea?.

En el ejemplo no estoy utilizando indices.

Saludos

PostPosted: Tue Jan 15, 2008 9:17 am
by pymsoft
El problema sucede solo con el emulador o tambien con la PDA?


Gracias

PostPosted: Tue Jan 15, 2008 11:02 am
by Antonio Linares
Toni,

> ¿No será un problema propio de la funcion dbusearea?

La única explicación que se nos ocurre es que esa función haga algo que en la tarjeta de memoria no está permitido.

Habría que preguntarle a Przemek y como última solución tracear la función a bajo nivel.

PostPosted: Tue Jan 15, 2008 11:24 am
by tsales
Antonio
Ojalá encontráramos la solución.

¿Podrias hacerle tu a Przemek la pregunta?. Te estaría agradecido.
No tengo acceso al SVS de Harbour.

Saludos.

PostPosted: Tue Jan 15, 2008 11:30 am
by tsales
Pedro
El problema sucede solo en el Emulador, pero en mi caso desistí en utilizar las tarjetas de almacenamiento por problemas con los índices. Esto hace algun tiempo.
Saludos

PostPosted: Tue Jan 15, 2008 11:58 am
by Antonio Linares
Toni,

El problema es solo en el emulador ? No ocurre en la tarjeta de memoria de la PDA real ?

PostPosted: Tue Jan 15, 2008 12:09 pm
by tsales
Antonio
He realizado pruebas con una PDA con WM5, SD Card y Storage Card y en ambas tarjetas funciona correctamente.

No tengo una PDA con WM6 pero me imagino que funcionará correctamente.

Saludos

PostPosted: Tue Jan 15, 2008 12:15 pm
by Antonio Linares
Toni,

Has probado a abrir las 80 bases de datos en el emulador (tarjeta memoria), sin que usen índices ?

PostPosted: Tue Jan 15, 2008 1:00 pm
by tsales
Antonio
Estoy utilizando el mismo ejemplo para todo. En el ejemplo no utilizo indices.
Saludos

PostPosted: Tue Jan 15, 2008 3:44 pm
by pymsoft
Toni,

el unico problema que he encontrado con las SD es cuando la PDA va en stand-by (quisiera que no fuera en stand-by mientras yo lo desee, como hace TomTom Navigator). Sucede que cuando enciendes la PDA y tienes un browse abierto mostrando una base de datos da error... pero.. siempre hay un pero... en el celular-pda HTC TyTN no se por cual motivo no sucede, aunque vaya en stand-by cuando lo enciendes no da error. :shock:
En todos los otros que he probado da error.

Saludos.

PostPosted: Tue Jan 15, 2008 6:00 pm
by Antonio Linares
Toni,

Prueba con este cambio:
Code: Select all  Expand view
if ! File( cFile )
   MsgAlert( "el fichero no está aún disponible" )
else
   Dbusearea( .T. ,"DBFCDX" , cFile, cAlias, .f. ,.f. )
endif

Tal vez los ficheros esten creados en caché de memoria y no volcados aún a la tarjeta

PostPosted: Tue Jan 15, 2008 6:12 pm
by tsales
Antonio
No salta el Alert. De todas formas he probado a realizar solo la apertura de ficheros (si el DBCREATE) y sucede lo mismo. Y te recalco lo mismo, si realizo un FOPEN funciona no produce error.
Saludos

PostPosted: Tue Jan 15, 2008 6:15 pm
by tsales
Pedro
El tema del stand-by nunca me ha pasado. Aunque el 99% de los casos guardo el ejecutable en Memoria.
Utilizo Ipaq de varios modelos y funciona correctamente sin generar error en los Browses.

Utilizas el modo de apertura Shared??. Si es así prueba a quitarlo.
Saludos.