FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ¿Como guardo un array en una DBF?
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
¿Como guardo un array en una DBF?
Posted: Fri May 30, 2008 11:21 PM

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 estos campo 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

Posts: 234
Joined: Tue Oct 25, 2005 12:39 AM
veamos
Posted: Sat May 31, 2008 12:37 AM

Rolando,

¿Puedes mostrar el código del array de 3 dimensiones?

Posts: 593
Joined: Sat May 12, 2007 11:47 AM
¿Como guardo un array en una DBF?
Posted: Sat May 31, 2008 12:53 AM

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

Posts: 234
Joined: Tue Oct 25, 2005 12:39 AM
asi
Posted: Sat May 31, 2008 01:07 AM
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[i][1] // guarda .T. suponiendo que CAMPO1 sea de tipo logical
DATOS->CAMPO2 := aArray[i][2] // guarda Remoto suponiendo que CAMPO2 sea de tipo caracter
DATOS->CAMPO3 := aArray[i][3] // guarda 1 suponiendo que CAMPO3 sea numerico
DATOS->( dbcommit() )
DATOS->( dbunlock() )
NEXT

return TRUE
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
¿Como guardo un array en una DBF?
Posted: Sat May 31, 2008 01:37 AM

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 los campos 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

Posts: 36
Joined: Thu Jun 28, 2007 03:43 PM
¿Como guardo un array en una DBF?
Posted: Sat May 31, 2008 08:53 AM

Hola Rolando,

Puedes probar a guardarlo en un archivo de texto.

Saludos.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
¿Como guardo un array en una DBF?
Posted: Sat May 31, 2008 09:47 AM

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
Posts: 244
Joined: Fri Oct 28, 2005 06:29 PM
mmmmm
Posted: Sat May 31, 2008 02:37 PM

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
Posts: 408
Joined: Sun Aug 13, 2006 05:38 AM
¿Como guardo un array en una DBF?
Posted: Sat May 31, 2008 03:45 PM
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
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
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
cArray := ""
select arch2
seek arch1->clave
dbEval( { || cArray += datos },, { || clave == arch1->clave } )
aArray := aRead( trim( cArray ) )
Saludos

Quique
Posts: 782
Joined: Wed Dec 19, 2007 07:50 AM
Re: mmmmm
Posted: Sat May 31, 2008 05:55 PM
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.
#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
manuelmercado at prodigy dot net dot mx
Posts: 244
Joined: Fri Oct 28, 2005 06:29 PM
¿Como guardo un array en una DBF?
Posted: Sat May 31, 2008 06:07 PM

De nada Manuel.

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

Muchos saludos.

Alejandro Cebolido

Buenos Aires, Argentina
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
¿Como guardo un array en una DBF?
Posted: Sat May 31, 2008 09:47 PM

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 estos campos 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

Continue the discussion