In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

TMemDataSet Vacio

Foro público de Xailer en español
Responder
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

TMemDataSet Vacio

Mensaje por jasm.quitaesto »

Hola,
Necesito crear MemDataSet vací­o al que en determinado momento le tengo
que añadir datos.
Después de crearlo de esta forma:
::oParaP := TMemDataSet():Create()
WITH OBJECT ::oParaP
WITH OBJECT :AddField( "Nombre" )
:cType := "C"
:nLen := 25
END WITH
WITH OBJECT :AddField( "Telefono" )
:cType := "C"
:nLen := 12
END WITH
END WITH
intento añadir datos usando
WITH OBJECT ::oParaP
:Open()
IF :AddNew()
:Nombre := "Pepe"
:Telefono := "123456789"
:UpDate()
END IF
:Close()
END WITH
Compruebo que los datos NO se han añadido. Para que funcione, tengo que
inventarme esto:
WITH OBJECT ::oParaP
:Open( { { "", "" } } ) // Al abrir pongo un registro fantasma.
IF :AddNew()
:Nombre := "Pepe"
:Telefono := "123456789"
:UpDate()
END IF
:GoTop() // Despues de añadir y guardar el registro, voy al primero
:Delete() // y lo borro
:Close()
END WITH
Esto es un apaño que me vale en algunos casos pero no para todos.
No se si este funcionamiento es el correcto, pero necesito poder crear
un MemDataSet vací­o para añadir cuando lo requiera el programa.
Gracias y un saludo,
Alf+.
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

TMemDataSet Vacio

Mensaje por jasm.quitaesto »

Versión de Xailer: 2.0.18
El 28/11/2010 23:13, José Alfonso Suárez Moreno escribió:
> Hola,
>
> Necesito crear MemDataSet vací­o al que en determinado momento le tengo
> que añadir datos.
>
> Después de crearlo de esta forma:
>
> ::oParaP := TMemDataSet():Create()
> WITH OBJECT ::oParaP
> WITH OBJECT :AddField( "Nombre" )
> :cType := "C"
> :nLen := 25
> END WITH
> WITH OBJECT :AddField( "Telefono" )
> :cType := "C"
> :nLen := 12
> END WITH
> END WITH
>
> intento añadir datos usando
>
> WITH OBJECT ::oParaP
> :Open()
> IF :AddNew()
> :Nombre := "Pepe"
> :Telefono := "123456789"
> :UpDate()
> END IF
> :Close()
> END WITH
>
> Compruebo que los datos NO se han añadido. Para que funcione, tengo que
> inventarme esto:
>
> WITH OBJECT ::oParaP
> :Open( { { "", "" } } ) // Al abrir pongo un registro fantasma.
> IF :AddNew()
> :Nombre := "Pepe"
> :Telefono := "123456789"
> :UpDate()
> END IF
> :GoTop() // Despues de añadir y guardar el registro, voy al primero
> :Delete() // y lo borro
> :Close()
> END WITH
>
> Esto es un apaño que me vale en algunos casos pero no para todos.
>
> No se si este funcionamiento es el correcto, pero necesito poder crear
> un MemDataSet vací­o para añadir cuando lo requiera el programa.
>
> Gracias y un saludo,
>
> Alf+.
zeasoftware
Mensajes: 1831
Registrado: Mar Oct 11, 2005 9:53 am

TMemDataSet Vacio

Mensaje por zeasoftware »

Yo hago esto:
Tengo el MemDataSet Hecho en la propiedad ::oDataSet, luego lo destruyo y lo
vuelvo a crear...
____________________________________________________________ ______________________
WITH OBJECT ::oDataSet
:Open( { { "", "", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } }, ;
{ "Codigo", "Descrip", "Costo", "Existencia", "Exist_Ini",
"Entradas", "Salidas", "Exist_Fin", "StockMin", "StockMax" } )
:Zap()
END WITH
____________________________________________________________ ______________
//relleno a Campos y aDatos....
::oDataSet:Destroy()
WITH OBJECT ::oDataSet := TMemDataSet():Create( Self )
:Open( aDatos, aCampos )
END WITH
::oDBBrowse1:oDataSet := ::oDataSet
ME ha funcionado bien, espero te sirva.
Saludos.
--
Ramón Zea
01.993.231-62-29
http://www.paginasprodigy.com/zeasoftware/
zeasoftware@prodigy.net.mx
zeasoftware@hotmail.com
ramonzea@yahoo.com
zeasoft.movil@hotmail.com
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

TMemDataSet Vacio

Mensaje por Bingen Ugaldebere »

Hola compañero, yo lo que hago es crear el memdatatset con estructura
pero de la siguiente manera:
::oMem:GetStructFrom(xxxxxxxx)
pero los parámetros que has de meterle son en formato xBase por ejemplo
::oMem:GetStructFrom ({{"cFile","C",500,0},{"attach","C",500,0}})
asi que para que te valga para una tabla MySql preparé esto:
::oMemForm:GetStructFrom(ListaCampos("demandantes_formacion "))
Donde ListaCampos es:
// Devuelve un array con una lista de los campos de una tabla SqLite o MySql
Function ListaCampos(cFrom)
Local aCampos :={}, nItem:=1
If AppData:cSQLMotor == "SQLITE"
AppData:oSqlSource:Execute("pragma table_info("+cFrom+")",,aCampos)
For nItem:=1 to len(aCampos)
aCampos[nItem,1]:=Lower(aCampos[nItem,2])
aCampos[nItem,2]:=Alltrim(Lower(aCampos[nItem,3]))
Next
Else
AppData:oSqlSource:Execute("show columns from "+Lower(cFrom)
,,aCampos)
Endif
For nItem:=1 to Len(aCampos)
//Longitudes

aCampos[nItem,3]:=Val(SubStr(aCampos[nItem,2],At("(",aCampos[nItem,2])+1))
aCampos[nItem,3]:=If(aCampos[nItem,2]="date",8,aCampos[nItem,3])
aCampos[nItem,3]:=If(aCampos[nItem,2]="tinyint(1)" .Or.
aCampos[nItem,2]="boolean",1,aCampos[nItem,3])
aCampos[nItem,3]:=If(aCampos[nItem,2]="integer" ,10,aCampos[nItem,3])
aCampos[nItem,3]:=If(aCampos[nItem,2]="longtext",10,aCampos[nItem,3])
//Decimales
aCampos[nItem,4]:=If(At(",",aCampos[nItem,2])>0,
Val(SubStr(aCampos[nItem,2],At(",",aCampos[nItem,2])+1)), 0)
//Tipos
Do Case
Case At("char",aCampos[nItem,2])>0
aCampos[nItem,2]:="C"
Case At("date",aCampos[nItem,2])>0
aCampos[nItem,2]:="D"
Case At("tinyint(1)",aCampos[nItem,2])>0 .Or.
At("boolean",aCampos[nItem,2])>0
aCampos[nItem,2]:="L"
Case At("longtext",aCampos[nItem,2])>0
aCampos[nItem,2]:="M"
Case At("longblob",aCampos[nItem,2])>0
aCampos[nItem,2]:="M"
Case At("int",aCampos[nItem,2])>0 .Or.
At("double",aCampos[nItem,2])>0.Or. At("float",aCampos[nItem,2])>0
aCampos[nItem,2]:="N"
Otherwise
MsgStop("Function ListaCampos() campo "+aCampos[nItem,1]+"
de tipo SQL "+aCampos[nItem,2]+" no procesado" )
EndCase
Next
Return aCampos
Que te servirá si sustituyes AppData:cSQLMotor y AppData:oSqlSource:
Salu2
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

TMemDataSet Vacio

Mensaje por jasm.quitaesto »

Gracias Ramon y Bingen,
Ninguno de los dos soluciones que me aportáis me vale. El MemDataSet se
crea perfertamente, mi cuestión es dejar la estructura del MemDataSet
creada SIN pasarle datos ninguno para posteriormente, el determinada
parte del programa, abrirlo y meterle datos, pero SIN tener que pasarle
datos desde el método Open.
Saludos,
Alf+.
El 28/11/2010 23:13, José Alfonso Suárez Moreno escribió:
> Hola,
>
> Necesito crear MemDataSet vací­o al que en determinado momento le tengo
> que añadir datos.
>
> Después de crearlo de esta forma:
>
> ::oParaP := TMemDataSet():Create()
> WITH OBJECT ::oParaP
> WITH OBJECT :AddField( "Nombre" )
> :cType := "C"
> :nLen := 25
> END WITH
> WITH OBJECT :AddField( "Telefono" )
> :cType := "C"
> :nLen := 12
> END WITH
> END WITH
>
> intento añadir datos usando
>
> WITH OBJECT ::oParaP
> :Open()
> IF :AddNew()
> :Nombre := "Pepe"
> :Telefono := "123456789"
> :UpDate()
> END IF
> :Close()
> END WITH
>
> Compruebo que los datos NO se han añadido. Para que funcione, tengo que
> inventarme esto:
>
> WITH OBJECT ::oParaP
> :Open( { { "", "" } } ) // Al abrir pongo un registro fantasma.
> IF :AddNew()
> :Nombre := "Pepe"
> :Telefono := "123456789"
> :UpDate()
> END IF
> :GoTop() // Despues de añadir y guardar el registro, voy al primero
> :Delete() // y lo borro
> :Close()
> END WITH
>
> Esto es un apaño que me vale en algunos casos pero no para todos.
>
> No se si este funcionamiento es el correcto, pero necesito poder crear
> un MemDataSet vací­o para añadir cuando lo requiera el programa.
>
> Gracias y un saludo,
>
> Alf+.
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

TMemDataSet Vacio

Mensaje por jasm.quitaesto »

Es que no entiendo por que motivo hay que pasarle necesariamente datos
desde el método Open.
Según lo veo, el método Open es para abrir el MemDataSet, esta bien que
como opción se le pueda pasar un array de datos, pero no tiene por que
ser obligatorio.
Yo necesito que en determinado momento se produzca un Open del
MemDataSet, y en otro momento, se le añadan valores, pero si no he
añadido nada desde el Open, desde el AddNew - Update no funciona.
Esta tarde subo un ejemplo para que se vea más claro.
Saludos
Alf+.
El 29/11/2010 9:03, José Alfonso Suárez Moreno escribió:
> Gracias Ramon y Bingen,
>
> Ninguno de los dos soluciones que me aportáis me vale. El MemDataSet se
> crea perfertamente, mi cuestión es dejar la estructura del MemDataSet
> creada SIN pasarle datos ninguno para posteriormente, el determinada
> parte del programa, abrirlo y meterle datos, pero SIN tener que pasarle
> datos desde el método Open.
>
> Saludos,
>
> Alf+.
>
> El 28/11/2010 23:13, José Alfonso Suárez Moreno escribió:
>> Hola,
>>
>> Necesito crear MemDataSet vací­o al que en determinado momento le tengo
>> que añadir datos.
>>
>> Después de crearlo de esta forma:
>>
>> ::oParaP := TMemDataSet():Create()
>> WITH OBJECT ::oParaP
>> WITH OBJECT :AddField( "Nombre" )
>> :cType := "C"
>> :nLen := 25
>> END WITH
>> WITH OBJECT :AddField( "Telefono" )
>> :cType := "C"
>> :nLen := 12
>> END WITH
>> END WITH
>>
>> intento añadir datos usando
>>
>> WITH OBJECT ::oParaP
>> :Open()
>> IF :AddNew()
>> :Nombre := "Pepe"
>> :Telefono := "123456789"
>> :UpDate()
>> END IF
>> :Close()
>> END WITH
>>
>> Compruebo que los datos NO se han añadido. Para que funcione, tengo que
>> inventarme esto:
>>
>> WITH OBJECT ::oParaP
>> :Open( { { "", "" } } ) // Al abrir pongo un registro fantasma.
>> IF :AddNew()
>> :Nombre := "Pepe"
>> :Telefono := "123456789"
>> :UpDate()
>> END IF
>> :GoTop() // Despues de añadir y guardar el registro, voy al primero
>> :Delete() // y lo borro
>> :Close()
>> END WITH
>>
>> Esto es un apaño que me vale en algunos casos pero no para todos.
>>
>> No se si este funcionamiento es el correcto, pero necesito poder crear
>> un MemDataSet vací­o para añadir cuando lo requiera el programa.
>>
>> Gracias y un saludo,
>>
>> Alf+.
>
artur
Mensajes: 31
Registrado: Lun Sep 06, 2010 11:13 am

TMemDataSet Vacio

Mensaje por artur »

Hola!
Yo también me he encontrado con el mismo problema, mi solución fue inicializarlo con un array bidimensional de tantas columnas como necesito por una fila.
Como lo muestro en un browse , aparece como si se hubiera insertado una nueva fila , la cual se edita luego al añadir nuevas no hay problema.
Aquí­ un fragmento de código :

datos = array(1,11)
::oDSMem:Open(datos,NomCabecera)
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

TMemDataSet Vacio

Mensaje por jasm.quitaesto »

Hola Artur,
Gracias por responder.
Yo también he llegado a esa solución, pero no me vale. En el momento que
hago el Open no tengo datos y cuando voy a añadir no puedo hacer Open.
Además, si por cualquier motivo quiero averiguar si el MemDataSet esta
vací­o usando EoF(), al añadir una fila al hacer Open(), ya no funciona bien.
Saludos
Alf+.
El 29/11/2010 17:26, artur escribió:
> Hola!
>
> Yo también me he encontrado con el mismo problema, mi
> solución fue inicializarlo con un array bidimensional de
> tantas columnas como necesito por una fila.
> Como lo muestro en un browse , aparece como si se hubiera
> insertado una nueva fila , la cual se edita luego al añadir
> nuevas no hay problema.
> Aquí­ un fragmento de código :
>
> datos = array(1,11)
> ::oDSMem:Open(datos,NomCabecera)
Responder