XBROWSE FIELDS with Name in Array

Post Reply
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

XBROWSE FIELDS with Name in Array

Post by Jimmy »

hi,

i want to "pick" Name of FIELD from DBSTRUCT() an use it with XBROWSE
now i have Names of FIELD in Array but how to pass it to XBROWSE :?:

Code: Select all | Expand

 90, 10 XBROWSE oBrw1 FIELDS One->First, One->Last ;
this Style need to "know" Name of FIELD

what i like to have are this

Code: Select all | Expand

 90, 10 XBROWSE oBrw1 FIELDS aMyFields
! Note : i do NOT want to Browse a Array, i want to use DBF but Name of FIELD are in Array "aMyFields"
greeting,
Jimmy
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: XBROWSE FIELDS with Name in Array

Post by Jimmy »

hi,

i now have

Code: Select all | Expand

   // store Array
   SP_aDbfStruct( DBSTRUCT() )

   @ 50,  2 XBROWSE oBrwDBF FIELDS Struct2String()

Code: Select all | Expand

FUNCTION SP_aDbfStruct( xValue )
STATIC aDbfStruct :=  {}
   IF PCOUNT() > 0
      aDbfStruct := ACLONE( xValue )
   ENDIF
RETURN aDbfStruct

Code: Select all | Expand

FUNCTION Struct2String()
LOCAL aStruc := SP_aDbfStruct()  // recall Array
LOCAL ii, iMax,cField , cRet := ""

   iMax := LEN(aStruc)
   FOR ii := 1 TO iMax
      cField := aStruc[ii][DBS_NAME]
      cRet += CHR(34) + cField + CHR(34)
      IF ii <> iMax
         cRet += ", "
      ENDIF
   NEXT

   FWLOG cRet
RETURN cRet
 
now XBROWSE does display all Column + 1 Extra Column which display String i got from Function Struct2String() :shock:

Image
what i´m doing wrong :?:

p.s. Fieldname will later come from Picklist
Image
greeting,
Jimmy
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: XBROWSE FIELDS with Name in Array

Post by Jimmy »

i try to ask other Way

i saw Sample

Code: Select all | Expand

    @ 0, 0 XBROWSE oBrw OF oDlg FIELDS One->First, One->Last
or
   @ 0, 0 XBROWSE oBrw OF oDlg COLUMNS 1,2
which both can "reduce" Column to DBF FIELD which i want

but that is "hardcode" an now i have a "Picklist" for it
so i try

Code: Select all | Expand

    @ 0, 0 XBROWSE oBrw OF oDlg FIELDS FieldNameFunc()
or
   @ 0, 0 XBROWSE oBrw OF oDlg COLUMNS FiledNumberFunc()
both Function return String, but it seems not to work as i want
i still get "all" FIELD of DBF display in XBROWSE ...

so how is the right Syntax for XBROWSE or XCbrowseNew( ) :?:
greeting,
Jimmy
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: XBROWSE FIELDS with Name in Array

Post by Jimmy »

hi,

ok got it this Way

Code: Select all | Expand

 XBROWSE oBrwDBF COLUMNS ColsNumber( DBSTRUCT() ) SIZE nWidth - 20, nHeight - 90 PIXEL OF oWnd ;
    FONT oFontDefault ;
    COLOR BFcolor, BGcolor ;
    ALIAS cAlias CELL LINES NOBORDER FASTEDIT AUTOCOLS

FUNCTION ColsNumber(aDbfStruct)
LOCAL aStruc := SP_aDbfStruct()  // Array from Picklist
LOCAL ii, iMax, nPosi
LOCAL aRet := {}

   iMax := LEN( aStruc )
   FOR ii := 1 TO iMax
      nPosi := ASCAN(aDbfStruct,{|x| x[DBS_NAME] = aStruc[ii][DBS_NAME] } )
      IF nPosi > 0
         AADD(aRet, nPosi)
      ENDIF
   NEXT
RETURN aRet
so it must be a Array which Function return

---

when use "reduce" FIELDs in XBROWSE and call

Code: Select all | Expand

   oBrwDBF:EditSource( .T. )
it will open Form which include all FIELDs of DBF :shock:
how can i change to edit only FIELD that i define ?

---

i have try again Option FIELDS
@ 50, 2 XBROWSE oBrwDBF FIELDS Struc2Array( cAlias )
@ 50, 2 XBROWSE oBrwDBF FIELDS Struc2String( cAlias )

Code: Select all | Expand

STATIC FUNCTION Struc2String( cAlias )
LOCAL aStruc := SP_aDbfStruct()
LOCAL ii, iMax, cField, cRet := ""

   iMax := LEN( aStruc )
   FOR ii := 1 TO iMax
      cField := aStruc[ ii ] [ DBS_NAME ]
      //       cRet += CHR( 34 ) + cField + CHR( 34 )
      cRet += "'" + cAlias + "->" + cField + "'"
      //       cRet += cAlias +"->"+ cField
      IF ii <> iMax
         cRet += ", "
      ENDIF
   NEXT
RETURN cRet

Code: Select all | Expand

STATIC FUNCTION Struc2Array( cAlias )
LOCAL aStruc := SP_aDbfStruct()
LOCAL ii, iMax, cField, aRet := {}

   iMax := LEN( aStruc )
   FOR ii := 1 TO iMax
      cField := aStruc[ ii ] [ DBS_NAME ]
      AADD( aRet, cField )
   NEXT

RETURN aRet
both show all FIELDs of DBF + 1 "extra" Column ...

so how will it work right when use FIELDS and a Function :idea:
greeting,
Jimmy
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: XBROWSE FIELDS with Name in Array

Post by nageswaragunupudi »

1) Important: Please do not use FIELDS clause. This was originally meant to facilitate easy migration from WBrowse.
Using COLUMNS clause allows us to to take full power of XBrowse. Using FIELDS clause makes XBrowse dumb

2) If we want to specify all columns of the DBF, there is no need for our program to read the structure and specify the column names.
Use the clause AUTOCOLS instead of COLUMNS .... clause.
When we use AUTOCOLS clause, XBrowse itself reads the DBSTRUCT() and builds all the columns suitably, including the sort orders.

Example:

Code: Select all | Expand

[code]@ r,c XBROWSE oBrw SIZE w,h PIXEL OF oDlg ;
DATASOURCE "aliasname" AUTOCOLS
;
<otherClauses>[/code]

Still just for academic interest, just to know how to generate column names from DBSTRUCT():

Code: Select all | Expand

@ r,c XBROWSE oBrw SIZE w,h PIXEL OF oDlg ;
DATASOURCE "CUSTOMER" ;
COLUMNS ArrTranspose( CUSTOMER->(DBSTRUCT()))[ 1 ] ....
though we do not recommend this because this is totally unnecessary
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: XBROWSE FIELDS with Name in Array

Post by nageswaragunupudi »

Interesting use of DBSTRUCT()

Code: Select all | Expand

   USE CUSTOMER
   aCols := ArrTranspose( DBSTRUCT() )[ 1 ]
   aCols := AShuffle( aCols, 2, 9 )

   DEFINE WINDOW oWnd
   @ 0,0 XBROWSE oBrw SIZE 0,0 PIXEL OF oWnd ;
      DATASOURCE "CUSTOMER" ;
      COLUMNS aCols ;
      CELL LINES NOBORDER

   oBrw:AutoFit()
   oBrw:CreateFromCode()

   oWnd:nWidth    := 900
   oWnd:nHeight   := 300

   ACTIVATE WINDOW oWnd CENTERED

   return nil
 
Image
Regards

G. N. Rao.
Hyderabad, India
User avatar
karinha
Posts: 7932
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Been thanked: 3 times
Contact:

Re: XBROWSE FIELDS with Name in Array

Post by karinha »

WOW. Super interesting. One can shuffle the content of xBrowse()

Many thanks.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: XBROWSE FIELDS with Name in Array

Post by nageswaragunupudi »

it will open Form which include all FIELDs of DBF :shock:
how can i change to edit only FIELD that i define ?

Code: Select all | Expand

METHOD EditSource( lNew, cFieldList, lNavigate, aInitVals )
Regards

G. N. Rao.
Hyderabad, India
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: XBROWSE FIELDS with Name in Array

Post by Jimmy »

hi,
nageswaragunupudi wrote:

Code: Select all | Expand

METHOD EditSource( lNew, cFieldList, lNavigate, aInitVals )
ah, ok thx for Answer

how does"cFieldList" look like and what Delimiter is used :?:

would be nice if it also accept a Array with (reduce) Structure of DbStruct()
greeting,
Jimmy
User avatar
Marc Venken
Posts: 1485
Joined: Tue Jun 14, 2016 7:51 am
Location: Belgium

Re: XBROWSE FIELDS with Name in Array

Post by Marc Venken »

Marc Venken
Using: FWH 23.08 with Harbour
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: XBROWSE FIELDS with Name in Array

Post by Jimmy »

hi Marc ,
ok, thx for link
greeting,
Jimmy
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: XBROWSE FIELDS with Name in Array

Post by nageswaragunupudi »

how does"cFieldList" look like and what Delimiter is used :?:
Comma delimited
Eg: "FIRST,CITY,SALARY,..."

We can easily convert an array like DbStruct() to list like this:
FW_ArrayAsList( ArrTranspose( aStruct )[ 1 ] )
Regards

G. N. Rao.
Hyderabad, India
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: XBROWSE FIELDS with Name in Array

Post by Jimmy »

hi,
nageswaragunupudi wrote:Comma delimited
Eg: "FIRST,CITY,SALARY,..."
thx for Answer
nageswaragunupudi wrote: We can easily convert an array like DbStruct() to list like this:
FW_ArrayAsList( ArrTranspose( aStruct )[ 1 ] )
ah, that is nice :)
greeting,
Jimmy
Post Reply