A vueltas con el Memdataset
Publicado: Jue Ago 09, 2007 3:45 pm
Hola!
He visto en mensajes anteriores que están saliendo problemas con los memdataset
en la versión 1.5 y me guastaría el recapitular un poco y saber cómo ha quedado
el tema, ya que también estoy teniendo problemas.
En la versión 1.4, tenía más o memos lo siguiente funcionando a la perfección.
Creaba un Memdataset y en el evento OnCreate ponía lo siguiente:
-----------------
METHOD MemDataSet1Create( oSender ) CLASS TForm4
WITH OBJECT oSender
WITH OBJECT :AddField( "fra" )
:cType := "C"
:nLen := 10
END WITH
WITH OBJECT :AddField( "fecha" )
:cType := "D"
:nLen := 8
END WITH
WITH OBJECT :AddField( "cliente" )
:cType := "C"
:nLen := 50
END WITH
WITH OBJECT :AddField( "importe" )
:cType := "n"
:nLen := 10
:ndec := 2
END WITH
END
RETURN Nil
----------------------------
Con esto, el memdataset sabía perfectamente la estructura del array y sólo
tenía que abrirlo y empezar a meter datos como en una dbf normal.
Ahora, con la versión 1.5 , al hacer un open() sobre el memdataset el debugger
me da un mensaje que dice:
-------------
#1: XAILER: TMemDataSet:'aData' parameter empty with no structure defined.
:lReadOnly set to TRUE.
---------------
Al parecer, no toma la estructura del onCreate y lo pone como solo lectura
¿¿??, y claro, al intentar insertar un dato me salta un error
---------------
TMEMDATASET:FIELDPUT(960)
Error BASE/1132 Bound error: array access
Argumentos: ( [ 1] = Tipo: A Valor: [ 2] = Tipo: N Valor: 0)
--------------------------
Lo cusioso es que si no hago el open() y simplemente inserto nuevos datos,
no da ningún error, aunque al no estar habierto no veo los datos introducidos
en el browse asociado al memdataset.
Si una vez introducidos los datos, hago un open(), entonces sí que los veo,
pero todos los addnew() que hago a partir de entonces no añaden nuevos datos,
sino que "pisan los ya existentes".
Para solucionarlo he tenido que poner e el memdataset:open() los parámetros
con la estructura. Algo así:
--------------
::omemdataset1:open({{" ",date(),space(50),0}}, {"fra","fecha","cliente","importe"})
------------------
Pero entonces, como decía Bingen en uno de sus mensajes, el memdataset se
crea con un registro en blanco que no tiene que estar.
¿Hay alguna forma de crear la estructura pero vacía?
De momento, para solucionarlo hago esto, pero no deja de ser una ñapa temporarl
--------------
::omemdataset1:open({{" ",date(),space(50),0}}, {"fra","fecha","cliente","importe"})
::omemdataset1:delete()
------------------
A mi entender la clave está en que vuelva a funcionar lo puesto en el OnCreate,
ya que así se puede crear toda la estructura del array asociado al memdataset
sin necesidad de introducir datos que no se necesitan.
Tal y como está ahora está bien si partimos de un memdataset que ya tiene
datos en el momento de crearlo, pero no es corresto para memdataset que tienen
que abrirse sin ningún dato inicial.
Un saludico,
Fredy
He visto en mensajes anteriores que están saliendo problemas con los memdataset
en la versión 1.5 y me guastaría el recapitular un poco y saber cómo ha quedado
el tema, ya que también estoy teniendo problemas.
En la versión 1.4, tenía más o memos lo siguiente funcionando a la perfección.
Creaba un Memdataset y en el evento OnCreate ponía lo siguiente:
-----------------
METHOD MemDataSet1Create( oSender ) CLASS TForm4
WITH OBJECT oSender
WITH OBJECT :AddField( "fra" )
:cType := "C"
:nLen := 10
END WITH
WITH OBJECT :AddField( "fecha" )
:cType := "D"
:nLen := 8
END WITH
WITH OBJECT :AddField( "cliente" )
:cType := "C"
:nLen := 50
END WITH
WITH OBJECT :AddField( "importe" )
:cType := "n"
:nLen := 10
:ndec := 2
END WITH
END
RETURN Nil
----------------------------
Con esto, el memdataset sabía perfectamente la estructura del array y sólo
tenía que abrirlo y empezar a meter datos como en una dbf normal.
Ahora, con la versión 1.5 , al hacer un open() sobre el memdataset el debugger
me da un mensaje que dice:
-------------
#1: XAILER: TMemDataSet:'aData' parameter empty with no structure defined.
:lReadOnly set to TRUE.
---------------
Al parecer, no toma la estructura del onCreate y lo pone como solo lectura
¿¿??, y claro, al intentar insertar un dato me salta un error
---------------
TMEMDATASET:FIELDPUT(960)
Error BASE/1132 Bound error: array access
Argumentos: ( [ 1] = Tipo: A Valor: [ 2] = Tipo: N Valor: 0)
--------------------------
Lo cusioso es que si no hago el open() y simplemente inserto nuevos datos,
no da ningún error, aunque al no estar habierto no veo los datos introducidos
en el browse asociado al memdataset.
Si una vez introducidos los datos, hago un open(), entonces sí que los veo,
pero todos los addnew() que hago a partir de entonces no añaden nuevos datos,
sino que "pisan los ya existentes".
Para solucionarlo he tenido que poner e el memdataset:open() los parámetros
con la estructura. Algo así:
--------------
::omemdataset1:open({{" ",date(),space(50),0}}, {"fra","fecha","cliente","importe"})
------------------
Pero entonces, como decía Bingen en uno de sus mensajes, el memdataset se
crea con un registro en blanco que no tiene que estar.
¿Hay alguna forma de crear la estructura pero vacía?
De momento, para solucionarlo hago esto, pero no deja de ser una ñapa temporarl
--------------
::omemdataset1:open({{" ",date(),space(50),0}}, {"fra","fecha","cliente","importe"})
::omemdataset1:delete()
------------------
A mi entender la clave está en que vuelva a funcionar lo puesto en el OnCreate,
ya que así se puede crear toda la estructura del array asociado al memdataset
sin necesidad de introducir datos que no se necesitan.
Tal y como está ahora está bien si partimos de un memdataset que ya tiene
datos en el momento de crearlo, pero no es corresto para memdataset que tienen
que abrirse sin ningún dato inicial.
Un saludico,
Fredy