Page 1 of 1

Xbrowse multi dbcombos

Posted: Wed Apr 08, 2015 12:59 pm
by brewster
Hello,

For my example, I'll use states.dbf and customer.dbf.

I have the need to have multiple (x4) Dbcombos, all using states dbf. to fill the customer.dbf (state, state1...etc.) fields.

I would add extra state field(s) in the customer.dbf (state1, etc).

I have prepared a sample below to illustrate ( along with a function to produce the Cust_2.dbf with the extra state1 field).

The sample is a modified version of Xbr_edit.prg supplied by Mr. Nages earlier.

Any help appreciated.
Bruce S.


Code: Select all

    
 #include "FiveWin.ch"
 #include "dbcombo.ch"
 
 
 static oWnd
 
 static cPath_seg := 'c:\fwh\samples\'   

function Main()

   local oBrush, oBar, oBmp
   
   REQUEST DBFCDX
   rddsetdefault("DBFCDX")

   SET EPOCH TO 2000

   SET DATE TO AMERICAN

   SET _3DLOOK ON             // Microsoft 3D Look
   
   //-------------------------------------------------
  
   SkinButtons()
  
   DEFINE WINDOW oWnd FROM 3, 38 TO 30, 110 ;
      TITLE "  -   Multiple  state  DBcombobox " 

   DEFINE BUTTONBAR oBar OF oWnd                             

   DEFINE BUTTON FILENAME cPath_seg + "Exit.bmp" OF oBar ;
      ACTION If( MsgYesNo( "Bye.. Bye", " Select" ), oWnd:End(), ) ;
      MESSAGE " End this session" ;
      TOOLTIP " Exit "
      
   DEFINE BUTTON FILENAME cPath_seg + "File.bmp" OF oBar ;
      MESSAGE " Xbrowse" ACTION xbrAddEdit() ;
      TOOLTIP " XbrAddEdit "

   DEFINE BUTTON FILENAME cPath_seg + "File.bmp" OF oBar ;
      MESSAGE " Make dbf" ACTION mkdbf() ;
      TOOLTIP " Make dbf "

   @ 22.5, 25 SAY space(3) + cPath_seg + space(3)
   @ 23.0, 40 SAY space(3) + FWVERSION + space(3)  

   ACTIVATE WINDOW oWnd 

return nil

//----------------------------------------------------------------------
function XbrAddEdit()       //From : Nages Xbr_edit 03/08/15 10:22am

   local oCust
   local oStates, aStates
   local oStates1, aStates1
   local oWnd, oBar, oBrw, oFont


   RddSetDefault( "DBFCDX" )
   SET DELETED ON

   
   
   oStates := TDataBase():New() 
   oStates  := TDataBase():Open( nil, ( cPath_seg + "states.dbf") )
   aStates  := ( oStates:nArea )->( FW_DbfToArray() )
   oStates:Close()

   
   // I have also tried copying states.dbf to states1.dbf 
   // and using states1.dbf here
   
   oStates1 := TDataBase():New() 
   oStates1  := TDataBase():Open( nil,  ( cPath_seg + "states.dbf" ) )
   aStates1  := ( oStates1:nArea )->( FW_DbfToArray() )
   oStates1:Close()
   
   oCust    := TDataBase():Open( nil, (cPath_seg + "customer.dbf" ) )

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-12
   DEFINE WINDOW oWnd
   oWnd:SetFont( oFont )
   DEFINE BUTTONBAR oBar OF oWnd SIZE 90,32 2007
   DEFINE BUTTON OF oBar PROMPT "Add"     CENTER ACTION oBrw:EditSource( .t. )
   DEFINE BUTTON OF oBar PROMPT "Edit"    CENTER ACTION oBrw:EditSource()
   DEFINE BUTTON OF oBar PROMPT "Delete"  CENTER ACTION oBrw:Delete()

   @ 0,0 XBROWSE oBrw OF oWnd DATASOURCE oCust ;
      COLUMNS "FIRST","LAST","STREET","CITY","STATE","STATE1","ZIP","HIREDATE","MARRIED","AGE","SALARY","NOTES" ;
      CELL LINES NOBORDER

   WITH OBJECT oBrw
      :SetChecks()
      :nEditTypes    := EDIT_GET
      :bEdit         := { |oRec| EditDlg( oRec ) }

      WITH OBJECT oBrw:oCol( "STATE" )
         :nEditType     := EDIT_LISTBOX
         :aEditListTxt  := aStates
      END
      WITH OBJECT oBrw:oCol( "STATE1" )
         :nEditType     := EDIT_LISTBOX
         :aEditListTxt  := aStates1
      END
      :brclicked := { || EditDlg() }
      //
      :CreateFromCode()
   END

   oWnd:oClient      := oBrw

   ACTIVATE WINDOW oWnd MAXIMIZED
   RELEASE FONT oFont
   oCust:Close()

return nil

//--------------------------------------------------------------

static function EditDlg( oRec )


   local oDlg, oGrp, oBtn
   local oStates
   local oStates1
   local lSave := .f.

   
   oStates := TDataBase():New() 
   oStates  := TDataBase():Open( , "STATES" )

   oStates1 := TDataBase():New()  
   oStates1 := TDataBase():Open( , "STATES" )
   
   
   
   DEFINE DIALOG oDlg SIZE 820,380 PIXEL FONT oRec:oBrw:oFont ;
      TITLE If( oRec:RecNo == 0, "ADD ", "EDIT " ) + "CUSTOMER"

   @ 0, 4 GROUP oGrp TO 168, 405 OF oDlg PIXEL


   @ 12, 10 SAY "First:" OF oDlg SIZE 15, 8 PIXEL
   @ 10, 44 GET oRec:First    OF oDlg SIZE 105, 12 PIXEL UPDATE

   @ 26, 10 SAY "Last:" OF oDlg SIZE 15, 8 PIXEL
   @ 24, 44 GET oRec:Last     OF oDlg SIZE 105, 12 PIXEL  UPDATE

   @ 40, 10 SAY "Street:" OF oDlg SIZE 21, 8 PIXEL
   @ 38, 44 GET oRec:Street   OF oDlg SIZE 155, 12 PIXEL UPDATE

   @ 54, 10 SAY "City:" OF oDlg SIZE 13, 8 PIXEL
   @ 52, 44 GET oRec:City     OF oDlg SIZE 155, 12 PIXEL UPDATE

   @ 68, 10 SAY "State:" OF oDlg SIZE 19, 8 PIXEL
   @ 66, 44 DBCOMBO oRec:State SIZE 100,100 PIXEL OF oDlg UPDATE ;
      ALIAS oStates:cAlias ITEMFIELD "CODE" LISTFIELD "NAME"

   @ 82, 10 SAY "State1:" OF oDlg SIZE 19, 8 PIXEL
   @ 80, 44 DBCOMBO oRec:State1 SIZE 100,100 PIXEL OF oDlg UPDATE ;
      ALIAS oStates1:cAlias ITEMFIELD "CODE" LISTFIELD "NAME"
      
   @ 96, 10 SAY "Zip:" OF oDlg SIZE 12, 8 PIXEL
   @ 94, 44 GET oRec:Zip      OF oDlg SIZE 55, 12 PIXEL  UPDATE

   @ 108, 10 SAY "Hiredate:" OF oDlg SIZE 29, 8 PIXEL
   @ 106, 44 GET oRec:Hiredate OF oDlg SIZE 44, 12 PIXEL

   @ 108, 44 CHECKBOX oRec:Married  PROMPT "&Married:" OF oDlg SIZE 43, 12 PIXEL  UPDATE

   @ 122, 10 SAY "Age:" OF oDlg SIZE 15, 8 PIXEL
   @ 120, 44 GET oRec:Age      OF oDlg SIZE 12, 12 PIXEL PICTURE  "99"

   @ 136, 10 SAY "Salary:" OF oDlg SIZE 21, 8 PIXEL
   @ 134, 44 GET oRec:Salary   OF oDlg SIZE 40, 12 PIXEL PICTURE  "999,999.99"  UPDATE

   @ 150, 10 SAY "Notes:" OF oDlg SIZE 21, 8 PIXEL
   @ 148, 44 GET oRec:Notes    OF oDlg SIZE 355, 12 PIXEL  UPDATE

   @ 172, 275 BUTTON oBtn PROMPT "&Undo" OF oDlg SIZE 42, 14 PIXEL ;
         WHEN oRec:Modified() ;
         ACTION ( oRec:Undo(), oDlg:Update() )

   @ 172, 319 BUTTON oBtn PROMPT "&Save" OF oDlg SIZE 42, 14 PIXEL ;
         WHEN oRec:Modified() ;
         ACTION (oDlg:End(), lSave := .T.)
   @ 172, 363 BUTTON oBtn PROMPT "&Cancel" OF oDlg SIZE 42, 14 PIXEL   CANCEL ACTION (oDlg:End())

   ACTIVATE DIALOG oDlg CENTERED

   if lSave
      oRec:Save()
      oRec:oBrw:SetFocus()
   endif

   oStates:Close()

return nil
//--------------------------------------------------------------------------------
Func mkdbf()     // Date   : 04/07/15
                 // Update : 04/07/15  
                 // Purpose: Build CUST_2.dbf file
              
 
 local cFile := 'CUST_2.DBF '
  
 dbcloseall()

 If !file(cPath_seg + cFile)
  // safeguard - create file ONLY if it does NOT exist 

    // CUST_2.DBF
    DbCreate(cPath_seg + cFile,;
        {;
         {"FIRST"   , "C", 20, 0 } ,;
         {"LAST"    , "C", 20, 0 } ,;
         {"STREET"  , "C", 30, 0 } ,;
         {"CITY"    , "C", 30, 0 } ,;
         {"STATE"   , "C", 02, 0 } ,;
         {"STATE2"  , "C", 02, 0 } ,;
         {"ZIP  "   , "C", 10, 0 } ,;
         {"HIREDATE", "D", 08, 0 } ,;
         {"MARRIED" , "L", 01, 0 } ,;
         {"AGE"     , "N", 02, 0 } ,;
         {"SALARY"  , "N", 09, 2 } ,;
         {"NOTES"   , "C", 70, 0 }  ;
        };
       )

 // safeguard - append to empty file ONLY      
 USE (cPath_seg + "CUST_2.DBF")
 APPEND FROM (cPath_seg + "CUSTOMER.DBF" )

ELSE
  
  msgInfo( cFile + "  already exists" )
 
Endif  
 
 msginfo(trans(lastrec(),'99999') + "  Records imported  OK" )

 
DBCLOSEALL()

return nil
//---------------------------------------------

 

Re: Xbrowse multi dbcombos

Posted: Wed Apr 08, 2015 2:52 pm
by brewster
oops, I am using

FWH 14.11
Harbour 3.2.0dev ( r1406271520 )
bcc582

Bruce S.

Re: Xbrowse multi dbcombos

Posted: Fri Apr 10, 2015 12:49 am
by nageswaragunupudi
1) You can use same alias for any number of DBCOMBO controls.
Eg:
USE STATES

@ r,c, DBCOMBO oRec:State1 ......... ALIAS "STATES" ITEMFIELD "CODE" LISTFIELD "NAME"
@ r,c, DBCOMBO oRec:State2 ......... ALIAS "STATES" ITEMFIELD "CODE" LISTFIELD "NAME"

2) You need not always use DBF for DBCOMBO. You can also use Arrays. Same arrays for any number of DBCOMBO controls.

USE STATES
aStates := STATES->( FW_DbfToArray() )
aStateCodes := ArrTranspose( aStates )[ 1 ]
aStateNames := ArrTranspose( aStates )[ 2 ]
CLOSE STATES

@ r,c, DBCOMBO oRec:State1 ......... ITEMS aStateCoddes LIST aStateNames
@ r,c, DBCOMBO oRec:State2 ......... ITEMS aStateCoddes LIST aStateNames

Re: Xbrowse multi dbcombos

Posted: Fri Apr 10, 2015 2:30 am
by brewster
Mr. Nages,

Thank you for the reply.

I understand your use of 1) & 2) in your response,

but not in the context of my above attached compileable sample.

How would 1) or 2) apply to configuring the

Code: Select all

 excerpt from compilable sample supplied above
           WITH OBJECT oBrw
                 :SetChecks()
                 :nEditTypes    := EDIT_GET
                 :bEdit             := { |oRec| EditDlg( oRec ) }

      WITH OBJECT oBrw:oCol( "STATE" )
         :nEditType     := EDIT_LISTBOX
         :aEditListTxt  := aStates
      END
      WITH OBJECT oBrw:oCol( "STATE1" )
         :nEditType     := EDIT_LISTBOX
         :aEditListTxt  := aStates
      END              

for editing of the Xbrowse.

And using either 1) or 2) in the EditDlg function still gets me

DBCMD/2001 workarea not in use __DBskipper error


Bruce S.

Re: Xbrowse multi dbcombos - Mr Nages

Posted: Thu Apr 30, 2015 5:55 am
by brewster
Mr Nages,

If after compiling and running the sample, could you suggest,
how I may get multiple dbcombos functional in this setting.

Regards,
Bruce S.