¿Como guardo un array en una DBF?
¿Como guardo un array en una DBF?
Buenas tardes,
Estoy requiriendo un consejo.
En mi aplicación he agregado una opción que edito en un listbox el contenido de una pequeña DBF "ACCESORIOS" que previamente fue cargado en un array.
En la edición, decido cuales ítems del array se guardarán en un determinado registro de la DBF "CLIENTES".
Al selectar esos ítems, son cargados en otro array con la intención de guardarlos en un campo de cada registro de la dbf "CLIENTES" para que, obviamente, luego puedan ser recuperados.
Pensé en guardarlo en un campo memo, pero como pedí consejo sobre _ memo y hay un fallo dividido entre si son seguros o nó, no se que hacer.
Alguien trabaja con algo similar?, como guardan un array en un registro de una DBF (Ojo que el array es de tres dimensiones y puede tener un LEN de unos 20 renglones).
Gracias.
Rolando
Estoy requiriendo un consejo.
En mi aplicación he agregado una opción que edito en un listbox el contenido de una pequeña DBF "ACCESORIOS" que previamente fue cargado en un array.
En la edición, decido cuales ítems del array se guardarán en un determinado registro de la DBF "CLIENTES".
Al selectar esos ítems, son cargados en otro array con la intención de guardarlos en un campo de cada registro de la dbf "CLIENTES" para que, obviamente, luego puedan ser recuperados.
Pensé en guardarlo en un campo memo, pero como pedí consejo sobre _ memo y hay un fallo dividido entre si son seguros o nó, no se que hacer.
Alguien trabaja con algo similar?, como guardan un array en un registro de una DBF (Ojo que el array es de tres dimensiones y puede tener un LEN de unos 20 renglones).
Gracias.
Rolando
Suponte que quiero guardar en un campo lo siguiente:
aArray := { { .t. , "Remoto" , 1} , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } }
(Repito los datos para no perder tiempo pero serían datos distintos)
Además, la longitud del array sería variable y a veces bastante mayor.
Rolando
aArray := { { .t. , "Remoto" , 1} , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } }
(Repito los datos para no perder tiempo pero serían datos distintos)
Además, la longitud del array sería variable y a veces bastante mayor.
Rolando
asi
Lo he escrito al vuelo, a ver si es lo que necesitas.
Suponiendo que tienes una DATOS.DBF con 3 campos
static function Test()
local i
local aArray := { { .t. , "Remoto" , 1} , { .t. , "cable" , 2 } , { .t. , "casa" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } }
FOR i := 1 TO len( aArray )
DATOS->( dbappend() )
DATOS->CAMPO1 := aArray[1] // guarda .T. suponiendo que CAMPO1 sea de tipo logical
DATOS->CAMPO2 := aArray[2] // guarda Remoto suponiendo que CAMPO2 sea de tipo caracter
DATOS->CAMPO3 := aArray[3] // guarda 1 suponiendo que CAMPO3 sea numerico
DATOS->( dbcommit() )
DATOS->( dbunlock() )
NEXT
return TRUE
Suponiendo que tienes una DATOS.DBF con 3 campos
static function Test()
local i
local aArray := { { .t. , "Remoto" , 1} , { .t. , "cable" , 2 } , { .t. , "casa" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } , { .t. , "cable" , 2 } }
FOR i := 1 TO len( aArray )
DATOS->( dbappend() )
DATOS->CAMPO1 := aArray[1] // guarda .T. suponiendo que CAMPO1 sea de tipo logical
DATOS->CAMPO2 := aArray[2] // guarda Remoto suponiendo que CAMPO2 sea de tipo caracter
DATOS->CAMPO3 := aArray[3] // guarda 1 suponiendo que CAMPO3 sea numerico
DATOS->( dbcommit() )
DATOS->( dbunlock() )
NEXT
return TRUE
Me parece que no me expliqué bién.
Lo que quiero guardar es todo el array en un campo. Lo que contenga el array variará para cada registro y quisiera guardarlo en un campo o hacerlo de otro modo, por eso consulto. De todos modos, gracias por contestar.
Lo ideal sería guardarlo en un campo memo porque la extensión del mismo será acorde a la extensión del array, pero por lo que leí, a más de uno se le dañaron _ memo.
La otra que se me ocurre sería guardarlo en un campo de caracteres pero la extensión debería ser fija y grande, lo cual ocuparía mucho espacio en la dbf.
Rolando
Lo que quiero guardar es todo el array en un campo. Lo que contenga el array variará para cada registro y quisiera guardarlo en un campo o hacerlo de otro modo, por eso consulto. De todos modos, gracias por contestar.
Lo ideal sería guardarlo en un campo memo porque la extensión del mismo será acorde a la extensión del array, pero por lo que leí, a más de uno se le dañaron _ memo.
La otra que se me ocurre sería guardarlo en un campo de caracteres pero la extensión debería ser fija y grande, lo cual ocuparía mucho espacio en la dbf.
Rolando
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- TecniSoftware
- Posts: 213
- Joined: Fri Oct 28, 2005 6:29 pm
- Location: Quilmes, Buenos Aires, Argentina
mmmmm
Yo vengo usando esto desde el sixdriver de clipper y me ha sido super útil!
Creo que te entendi perfectamente:
Uso xHarbour con CDX y lo que hago es lo siguiente:
Defines el campo que quieres usar como MEMO.
aArray := { { .t. , "Remoto" , 1} ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } }
Siiiii, es asi de simple!!!
Replace DBF->TEST With aArray
Inclusive uso la clase TDBF y funciona perfecto.
Despues me puedo referir a cualquier elemento del array como si se tratara de un array ordinario:
MsgInfo( DBF->TEST[1][2], "Atención!" ) // "Remoto"
Espero que se sirva.
Saludos!
Creo que te entendi perfectamente:
Uso xHarbour con CDX y lo que hago es lo siguiente:
Defines el campo que quieres usar como MEMO.
aArray := { { .t. , "Remoto" , 1} ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } ,;
{ .t. , "cable" , 2 } }
Siiiii, es asi de simple!!!
Replace DBF->TEST With aArray
Inclusive uso la clase TDBF y funciona perfecto.
Despues me puedo referir a cualquier elemento del array como si se tratara de un array ordinario:
MsgInfo( DBF->TEST[1][2], "Atención!" ) // "Remoto"
Espero que se sirva.
Saludos!
Alejandro Cebolido
Buenos Aires, Argentina
Buenos Aires, Argentina
Para sustituir un campo memo lo que puedes hacer es crear un archivo alterno, por ejemplo, teniendo arch1 como tu archivo base y arch2 como alterno, podrías teneralgo parecido a esto
Para grabar tu arreglo podemos aprovechar lo que te dice Antonio mientras no incluyas hash en tu arreglo
Para leer el arreglo
Code: Select all
arch1 := { { "clave" , "c", 3, 0 } ,;
{ "descrip", "c", 50, 0 } ,;
:
:
{ "campo_x", "c", 15, 0 } }
arch2 := { { "clave", "c", 3, 0 } , ;
{ "datos", "c", 50, 0 } }
Code: Select all
cArray := aSave( aArray )
nPos := 1
select arch2
do while nPos <= len( cArray )
append blank
replace clave with arch1->clave, datos with subStr( cArray, nPos, 50 )
nPos += 50
endDo
Code: Select all
cArray := ""
select arch2
seek arch1->clave
dbEval( { || cArray += datos },, { || clave == arch1->clave } )
aArray := aRead( trim( cArray ) )
Saludos
Quique
Quique
Re: mmmmm
Parece magia, nunca lo hubiera pensado, gracias Alejandro ya estoy elucubrando más allá, se podrá guardar un objeto?, luego les platico.TecniSoftware wrote:Despues me puedo referir a cualquier elemento del array como si se tratara de un array ordinario:
Aquí dejo un pequeño ejemplo funcionando.
Code: Select all
#include "Fivewin.ch"
REQUEST DBFCDX, DBFFPT
Function Main()
Local oGet, oDlg, aStr, aNew, ;
aTest := { { "Hola ", .T., "Mundo" }, { "Son ", 25, " Euros" } }
aStr := { { "One", "C", 10, 0 }, { "Two", "M", 10, 0 } }
DbCreate( "TestMemo.dbf", aStr, "DbfCdx" )
use ( "TestMemo" ) Excl New Via "DbfCdx"
APPEND BLANK
Replace One With "Prueba1", Two With aTest
DbCloseAll()
use ( "TestMemo" ) Excl New Via "DbfCdx"
MsgInfo( TestMemo->One + CRLF + ;
If( TestMemo->Two[ 1, 2 ], TestMemo->Two[ 1, 1 ] + TestMemo->Two[ 1, 3 ], "" ) + CRLF + ;
TestMemo->Two[ 2, 1 ] + LTrim( Str( TestMemo->Two[ 2, 2 ] ) ) + TestMemo->Two[ 2, 3 ] )
DbCloseAll()
FErase( "TestMemo.dbf" )
Return Nil
Manuel Mercado
- TecniSoftware
- Posts: 213
- Joined: Fri Oct 28, 2005 6:29 pm
- Location: Quilmes, Buenos Aires, Argentina
Muchas gracias a todos,
Alejandro, tenía conocimiento que se podía hacer porque había leído en el foro una respuesta de Antonio y pensaba hacerlo de ese modo.
Lo que no tenía idea es la manera de la que tu lo has resuelto y voy a intentarlo así.
Mi miedo era que se dañaran los memo porque, según he leído en el foro, hay una opinión dividida respecto de la fragilidad de _ y, particularmente, me pasa esporádicamente con una aplicación que tengo en Clipper53 que el memo de un registro "se copia solo" en otro registro, perdiendo los datos que hubiere cargado previamente en el memo de este registro.
Supongo que en FWH 2.7 (la que uso), esto no será un problema, de cualquier modo, pensé que para evitar males mayores, le voy a agregar un ítem más al array que contenga alguna referencia al registro que pertenece para que si llegase a darse esta situación, la misma aplicación me advierta que se perdieron estos datos.
De nuevo, muchas gracias a todos.
Saludos
Rolando
Alejandro, tenía conocimiento que se podía hacer porque había leído en el foro una respuesta de Antonio y pensaba hacerlo de ese modo.
Lo que no tenía idea es la manera de la que tu lo has resuelto y voy a intentarlo así.
Mi miedo era que se dañaran los memo porque, según he leído en el foro, hay una opinión dividida respecto de la fragilidad de _ y, particularmente, me pasa esporádicamente con una aplicación que tengo en Clipper53 que el memo de un registro "se copia solo" en otro registro, perdiendo los datos que hubiere cargado previamente en el memo de este registro.
Supongo que en FWH 2.7 (la que uso), esto no será un problema, de cualquier modo, pensé que para evitar males mayores, le voy a agregar un ítem más al array que contenga alguna referencia al registro que pertenece para que si llegase a darse esta situación, la misma aplicación me advierta que se perdieron estos datos.
De nuevo, muchas gracias a todos.
Saludos
Rolando