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
//---------------------------------------------