Saving an array
Saving an array
I can write a function to do this, but why re-invent the wheel if it exists.
Is there a function to save the data contained in the elements of an array to a database field ? I'm using DBFCDX and ADS.
Is there a function to save the data contained in the elements of an array to a database field ? I'm using DBFCDX and ADS.
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
- James Bott
- Posts: 4654
- Joined: Fri Nov 18, 2005 4:52 pm
- Location: San Diego, California, USA
- Contact:
Tim,
Here is one. I haven't tried it.
Regards,
James
Here is one. I haven't tried it.
Regards,
James
Code: Select all
From: "Luis Krause Mantilla" <luis_krause@hotmail.com>
Subject: Re: Flexfile III
Date: Wednesday, December 22, 2004 6:19 PM
Colin
The 32 dll's (or whatever it was) from FF3 are unfinished and don't
work. I spend several days trying to make it work, but I realized
I was just wasting my time.
Because I only stored text and arrays in FF2 (I didn't use FF3),
DBFCDX or ADS will work just fine.
For storing arrays in xHarbour, usind ADS, I just created a function
to "stringify" the array before storing it in the memo field, and
a simple macro evaluation from the memo to get the array back.
If you use the V_xxx() functions, you'll also have to work your
way around this, but it won't be that difficult.
So far it's been more than I year since we've been using our app
with xHarbour + ADSCDX and we haven't missed FF.
This is the function to convert an array to a string (will work
with nested arrays)
* ÉÍ͹ Funci¢n ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
* º Nombre : wfAToC() º
* º Autor : C.P. Luis Krause Mantilla º
* º Objetivo : Convierte Arreglo a Cadena para almacenar en campos memo º
* º Fecha : 31/07/2003 º
* º Hora : 17:38:52 º
* ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ
* º Argumentos : aArray º
* ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ
* º Retorna : cArray º
* ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
Function wfAToC( aArray )
Local nI, nJ, cArray, nLen := Len( aArray ), cType, cString
cArray := "{"
For nI := 1 To nLen
cType := ValType( aArray[nI] )
If cType == "C" .or. cType == "M"
cString := aArray[nI]
// Considerar que la doble comilla puede ser parte de la cadena
Do While ( nJ := At( '"', cString ) ) > 0
cArray += '"' + SubStr( cString, 1, nJ - 1 ) + '"+["]+'
cString := SubStr( cString, nJ + 1 )
Enddo
cArray += '"' + cString + '"'
Elseif cType == "N"
cArray += LTrim( Str( aArray[nI] ) )
Elseif cType == "D"
cArray += "SToD(" + DToS( aArray[nI] ) + ")"
Elseif cType == "L"
cArray += If( aArray[nI], ".T.", ".F." )
Elseif cType == "A" // llamada recursiva para
cArray += wfAToC( aArray[nI] ) // procesar arreglos anidados
#ifdef __XHARBOUR__
Elseif cType == "P" // Pointer - s¢lo xHarbour
cArray += HB_NumToHex( aArray[nI] )
Elseif cType == "H" // Hash - s¢lo xHarbour; llamada recursiva para
cArray += wfAToC( aArray[nI] ) // procesar hashes anidados
#endif
Else // objects & codeblocks can't be stored anyway
cArray += "NIL"
Endif
If nI < nLen
cArray += ","
Endif
Next
cArray += "}"
Return cArray
This is the one that retrieves the array
* ÉÍ͹ Funci¢n ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
* º Nombre : wfCToA() º
* º Autor : C.P. Luis Krause Mantilla º
* º Objetivo : Convierte Cadena a Arreglo para restaurar de campos memo º
* º Fecha : 31/07/2003 º
* º Hora : 17:38:52 º
* ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ
* º Argumentos : cArray º
* ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ
* º Retorna : aArray º
* ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
Function wfCToA( cArray )
Local aArray, bArray
If wfCompile( cArray, .F., @bArray ) // no queremos mensaje si truena
aArray := Eval( bArray )
Endif
If ! ValType( aArray ) == "A" // par metro no proporcionado o
aArray := {} // error al intentar convertir
Endif
Return aArray
Replace wfCompile() for you function that will test and trap
a possible error, i.e. Eval( &( "{||" + cArray + "}" ) )
HTH.
Colin Wisbey wrote:
> I am a FW (16 bit) user and have delayed going 32 bit due to extensive use
> of Flexfile functions in all my current apps. I love Flexfile. ADS doesn't
> suit my needs and I want to avoid using traditional memo fields if at all
> possible.
>
> I had the impression that Flexfile was not available for 32 bit but I just
> discovered that GrafX currently sell Flexfile III, including 32 bit.
>
> Is anyone using it with xHarbour? If so, I'd be grateful for any feedback on
> reliability etc in the 32 bit environment.
>
> (I've already emailed Grafx too and am awaiting their reply)
>
> TIA
> Colin Wisbey
>
>
--
Luis Krause Mantilla
lkrausem at shaw dot ca
luis_krause at hotmail dot com
"May the Source be with GNU"
Array save
Encoding is the way I anticipated. I'm a bit puzzled by the decoding logic ... and Replace comment.
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
- James Bott
- Posts: 4654
- Joined: Fri Nov 18, 2005 4:52 pm
- Location: San Diego, California, USA
- Contact:
Tim,
Here is another string to array function. It appears that this only works with single dimension arrays though.
James
Here is another string to array function. It appears that this only works with single dimension arrays though.
James
Code: Select all
// Convert a string to an array
// cSeparator is the separator character, defaults to TAB
function string2array(cString,cSeparator)
local nCount:=1,aArray:={},cToken:=""
default cSeparator:=chr(9)
do while .t.
cToken:= strToken(cString,nCount,cSeparator)
if ! empty(cToken)
aadd(aArray,cToken)
nCount++
else
exit
endif
enddo
return aArray
Array
I'm only using single dimensional arrays with the module I'm working on. I was going to store the array elements plus separators to a string, and then save that value to a memo field. Since it is only a list, one dimension is all that is needed, and it will be only character data. Of course I could see expanding the capability, needing to do multi-dimensional arrays, plus numeric and logical values, so I'll probably "build it strong" to start !
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
- James Bott
- Posts: 4654
- Joined: Fri Nov 18, 2005 4:52 pm
- Location: San Diego, California, USA
- Contact:
Tim,
I just found this reference in my notes too. You might want to check into it also.
James
I just found this reference in my notes too. You might want to check into it also.
James
From: "Ron Pinkas" <Ron@remove-this.xharbour.com>
Subject: Re: Array in memo field?
Date: Thursday, December 02, 2004 9:13 AM
> Is it possible write an array in a memo field with xHarbour or
> Harbour?
Yes, xHarbour has ValToPrg() and ValToPrgExp() which will save ANY TYPE
(Even Objects) into a String.
Ron
Arrays
I'll have to play with that. You can use ValToPrgExp( ), and then reverse the result with PrgExpToVal( ).
I did a search on the xHarbour newsgroup, and a search of the docs, but apparently didn't have the keywords to find those.
Thanks.
Is it wet enough yet ?
I did a search on the xHarbour newsgroup, and a search of the docs, but apparently didn't have the keywords to find those.
Thanks.
Is it wet enough yet ?
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
- James Bott
- Posts: 4654
- Joined: Fri Nov 18, 2005 4:52 pm
- Location: San Diego, California, USA
- Contact:
Tim,
> You can use ValToPrgExp( ), and then reverse the result with PrgExpToVal( ).
I'm putting this in my notes. Keep us posted on your progress with this.
>Is it wet enough yet ?
Judging from the water in the cat food dish on our patio, we have had over an inch so far today. Boy do we need it! The cats are not happy though...
James
> You can use ValToPrgExp( ), and then reverse the result with PrgExpToVal( ).
I'm putting this in my notes. Keep us posted on your progress with this.
>Is it wet enough yet ?
Judging from the water in the cat food dish on our patio, we have had over an inch so far today. Boy do we need it! The cats are not happy though...
James
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Tim,
FWH provides:
ASave( aArray ) --> cText
ARead( cText ) --> aArray
Here you have a sample:
FWH provides:
ASave( aArray ) --> cText
ARead( cText ) --> aArray
Here you have a sample:
Code: Select all
function Main()
local aInfo := { { "one", 1, .T. }, { "two", 2, .F. }, { "three", 3, Date() } }
local cText := ASave( aInfo )
aInfo := nil
aInfo = ARead( cText )
MsgInfo( Len( aInfo ) )
MsgInfo( aInfo[ 1 ][ 1 ] )
MsgInfo( aInfo[ 3 ][ 3 ] )
return nil
Last edited by Antonio Linares on Sat Dec 01, 2007 1:17 am, edited 1 time in total.
- James Bott
- Posts: 4654
- Joined: Fri Nov 18, 2005 4:52 pm
- Location: San Diego, California, USA
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
ASave / ARead
OK Antonio ... you're working late again ... go hang with your family !
James and I are getting our first real rain in quite awhile ... and hopefully it will be short enough to not cause mud slides in the fire areas !
I looked at ASave and ARead in the docs, but I thought it meant it put the names of the arrays into memory, not the values of the array elements.
Parameters:
<aArray> Array to code.
Returns:
<cInfo> String containing the coded array.
Thanks for the sample. I asked the question after reading that.
James and I are getting our first real rain in quite awhile ... and hopefully it will be short enough to not cause mud slides in the fire areas !
I looked at ASave and ARead in the docs, but I thought it meant it put the names of the arrays into memory, not the values of the array elements.
Parameters:
<aArray> Array to code.
Returns:
<cInfo> String containing the coded array.
Thanks for the sample. I asked the question after reading that.
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
- James Bott
- Posts: 4654
- Joined: Fri Nov 18, 2005 4:52 pm
- Location: San Diego, California, USA
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact: