¿Como guardo un array en una DBF?

Post Reply
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

¿Como guardo un array en una DBF?

Post by rolando »

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 :D
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

veamos

Post by fleal »

Rolando,

¿Puedes mostrar el código del array de 3 dimensiones?
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Post by 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 :D
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

asi

Post by fleal »

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
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Post by rolando »

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
vlmsoft
Posts: 36
Joined: Thu Jun 28, 2007 3:43 pm
Location: Madrid

Post by vlmsoft »

Hola Rolando,

Puedes probar a guardarlo en un archivo de texto.

Saludos.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Rolando,

Puedes usar las funciones ASave() y ARead() de FWH:

alias->campo_memo := ASave( aArray )

y más tarde, para recuperarlo:

aArray = ARead( alias->campo_memo )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

mmmmm

Post by TecniSoftware »

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!
Alejandro Cebolido
Buenos Aires, Argentina
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Post by quique »

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

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 } }
Para grabar tu arreglo podemos aprovechar lo que te dice Antonio mientras no incluyas hash en tu arreglo

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
Para leer el arreglo

Code: Select all

cArray := ""
select arch2
seek arch1->clave
dbEval( { || cArray += datos },, { || clave == arch1->clave } )
aArray := aRead( trim( cArray ) )
Saludos
Quique
User avatar
mmercado
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Re: mmmmm

Post by mmercado »

TecniSoftware wrote:Despues me puedo referir a cualquier elemento del array como si se tratara de un array ordinario:
Parece magia, nunca lo hubiera pensado, gracias Alejandro ya estoy elucubrando más allá, se podrá guardar un objeto?, luego les platico.

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
Saludos.

Manuel Mercado
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Post by TecniSoftware »

De nada Manuel.

Vengo usando _ memo de esa manera hace bastante tiempo.
Por lo que leo y según decen: estaban tratando de matar _ a cañonazos.

Muchos saludos.
Alejandro Cebolido
Buenos Aires, Argentina
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Post by rolando »

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 :D
Post Reply