FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Defining xBrowse COLUMNS for array of hashes
Posts: 1096
Joined: Fri Oct 28, 2005 02:27 AM
Defining xBrowse COLUMNS for array of hashes
Posted: Wed Dec 05, 2018 03:11 AM

Lets say an array is made up of a few records of hashes with the following structure
h_["receipt"] := "100"
h_["date"] := ctod("05/12/2018")
h_["amount"] := 1000

How to specify the COLUMNS part in xBrowse command if we just want to display h_["receipt"] and h_["amount"]?

TIA

FWH 11.08/FWH 19.12

BCC5.82/BCC7.3

xHarbour/Harbour
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Wed Dec 05, 2018 04:42 AM
Code (fw): Select all Collapse
DATASOURCE h_ ;
COLUMNS "receipt","amount"
Regards



G. N. Rao.

Hyderabad, India
Posts: 1096
Joined: Fri Oct 28, 2005 02:27 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Wed Dec 05, 2018 04:52 AM
Thanks for the quick reply Rao

Just to confirm, h_ is stored inside an array.

aFiledbf := {}
aadd(aFiledbf, h_)

Would coding it as below sufficient?
Code (fw): Select all Collapse
DATASOURCE aFiledbf
COLUMNS "receipt", "amount"


Thanks!
FWH 11.08/FWH 19.12

BCC5.82/BCC7.3

xHarbour/Harbour
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Wed Dec 05, 2018 04:55 AM
hua wrote:Thanks for the quick reply Rao

Just to confirm, h_ is stored inside an array.

aFiledbf := {}
aadd(aFiledbf, h_)

Would coding it as below sufficient?
Code (fw): Select all Collapse
DATASOURCE aFiledbf
COLUMNS "receipt", "amount"


Thanks!


Yes.

But you seem to be using a very old version of FWH.
What I said works with any recent version. I am not sure about very old versions.
Regards



G. N. Rao.

Hyderabad, India
Posts: 1096
Joined: Fri Oct 28, 2005 02:27 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Wed Dec 05, 2018 11:08 AM

Thanks Rao. It works! :)

FWH 11.08/FWH 19.12

BCC5.82/BCC7.3

xHarbour/Harbour
Posts: 1096
Joined: Fri Oct 28, 2005 02:27 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Fri Dec 07, 2018 03:00 AM
Rao, for some reason the autosort doesn't seem to work.

Anything wrong with my definition?
Code (fw): Select all Collapse
       redefine xbrowse oBrw id 111 of oDlg                    ;
        COLUMNS "select", "receipt", "date", "name", "amount"                                     ;
        HEADERS 'Select', 'Receipt#', 'Date', 'Customer', 'Amount' ;
        PICTURES nil, nil, nil, nil, '999,999,999.99' ;
        DATASOURCE aFiledbf CELL LINES NOBORDER FASTEDIT AUTOSORT
FWH 11.08/FWH 19.12

BCC5.82/BCC7.3

xHarbour/Harbour
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Sat Dec 08, 2018 02:58 AM

Autosort and incremental seek are not provided for array of hashes.

Regards



G. N. Rao.

Hyderabad, India
Posts: 1096
Joined: Fri Oct 28, 2005 02:27 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Sat Dec 08, 2018 02:45 PM

Thanks for the info Rao. Seems I have to dump the array into a temporary dbf then

FWH 11.08/FWH 19.12

BCC5.82/BCC7.3

xHarbour/Harbour
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Sat Dec 08, 2018 08:17 PM

What are your requirements?
Autosort only?

Regards



G. N. Rao.

Hyderabad, India
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Sun Dec 09, 2018 01:08 AM
Please implement Autosort and Incremental seek with this code
Code (fw): Select all Collapse
   REDEFINE XBROWSE oBrw id 111 of oDlg                    ;
   COLUMNS "select", "receipt", "date", "name", "amount"                                     ;
   HEADERS 'Select', 'Receipt#', 'Date', 'Customer', 'Amount' ;
   PICTURES nil, nil, nil, nil, '999,999,999.99' ;
   DATASOURCE aFiledbf CELL LINES NOBORDER FASTEDIT AUTOSORT

   WITH OBJECT oBrw
   
      :Cargos        := { "select", "receipt", "date", "name", "amount" }
      :cSortOrders   := { |oCol| HashArraySort( oCol ) }
      :bSeek         := { |c| HashArraySeek( oBrw, c ) }
   
      // YOUR OTHER CODE HERE   
   
   END


Add these functions to your program
Code (fw): Select all Collapse
function HashArraySort( oCol )

   local hSave    := oCol:oBrw:aRow
   local cKey     := oCol:Cargo
   local cOrder   := If( oCol:cOrder == "A", "D", "A" )

   if cOrder == "A"
      if ValType( hSave[ cKey ] ) == "C"
         ASort( oCol:oBrw:aArrayData, , , { |x,y| Upper( x[ cKey ] ) < Upper( y[ cKey ] ) } )
      else
         ASort( oCol:oBrw:aArrayData, , , { |x,y| x[ cKey ] < y[ cKey ] } )
      endi
   else
      if ValType( hSave[ cKey ] ) == "C"
         ASort( oCol:oBrw:aArrayData, , , { |x,y| Upper( x[ cKey ] ) > Upper( y[ cKey ] ) } )
      else
         ASort( oCol:oBrw:aArrayData, , , { |x,y| x[ cKey ] > y[ cKey ] } )
      endi
   endif

   oCol:oBrw:nArrayAt := AScan( oCol:oBrw:aArrayData, { |h| h == hSave } )

return cOrder


function HashArraySeek( oBrw, cSeek )

   local lFound   := .f.
   local nAt, oCol, cKey

   nAt   := AScan( oBrw:aCols, { |o| !Empty( o:cOrder ) } )
   if nAt == 0
      return .f.
   endif
   oCol  := oBrw:aCols[ nAt ]
   cKey  := oCol:Cargo
   cSeek := Upper( cSeek )

   nAt   := AScan( oBrw:aArrayData, { |h| Upper( cValToChar( h[ cKey ] ) ) = cSeek } )
   if nAt == 0
      return .f.
   endif
   oBrw:nArrayAt  := nAt

return .t.
Regards



G. N. Rao.

Hyderabad, India
Posts: 1096
Joined: Fri Oct 28, 2005 02:27 AM
Re: Defining xBrowse COLUMNS for array of hashes
Posted: Sun Dec 09, 2018 04:35 AM

This is great! Thanks for your support Rao!

FWH 11.08/FWH 19.12

BCC5.82/BCC7.3

xHarbour/Harbour

Continue the discussion