¿Como guardo un array en una DBF?

¿Como guardo un array en una DBF?

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

veamos

Postby fleal » Sat May 31, 2008 12:37 am

Rolando,

¿Puedes mostrar el código del array de 3 dimensiones?
fleal
 
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

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

asi

Postby fleal » Sat May 31, 2008 1: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
fleal
 
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

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

Postby vlmsoft » Sat May 31, 2008 8:53 am

Hola Rolando,

Puedes probar a guardarlo en un archivo de texto.

Saludos.
vlmsoft
 
Posts: 36
Joined: Thu Jun 28, 2007 3:43 pm
Location: Madrid

Postby Antonio Linares » Sat May 31, 2008 9: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42160
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

mmmmm

Postby TecniSoftware » Sat May 31, 2008 2: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
User avatar
TecniSoftware
 
Posts: 235
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Postby quique » Sat May 31, 2008 3: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
Code: Select all  Expand view  RUN
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  Expand view  RUN
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  Expand view  RUN
cArray := ""
select arch2
seek arch1->clave
dbEval( { || cArray += datos },, { || clave == arch1->clave } )
aArray := aRead( trim( cArray ) )
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: mmmmm

Postby mmercado » Sat May 31, 2008 5: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.
Code: Select all  Expand view  RUN
#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
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby TecniSoftware » Sat May 31, 2008 6: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
User avatar
TecniSoftware
 
Posts: 235
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 30 guests

cron