Subject Re: Forms Processing Text Box buffer to Data Fields
From Mervyn Bick <invalid@invalid.invalid>
Date Fri, 12 Sep 2014 09:38:08 +0200
Newsgroups dbase.getting-started

On Thu, 11 Sep 2014 01:25:25 +0200, Robert Hughes <hughes@infoconn.com>  
wrote:

> Hello, I have not coded anything since COBOL for Y2K. Can anyone point  
> me to a sample File Maintenance Form that manages a sub-form  
> Master/Detail relationship using the native .dbf file format. Is there  
> any documentation concerning the Forms Processing definitions and  
> Variables created by the Forms program generator.

If you ask 12 programmers how to do this you'll probably get a dozen  
different answers and each programmer will tell you that his/her method is  
better than all the others. <g>

The examples below have been tested with dBASE Plus 2.8 and dBASE Plus  
8.1.3.  They haven't been tested with dBASE Plus 9 but they should work.

Mark and copy the code in masterrowset.wfm.  In the dBASE command panel  
enter  modi comm masterrowset.wfm  and press enter.  This will open the  
sourcecode editor.  Paste the code into the editor and save.  Follow the  
same process with master_edit.wfm and child_edit.wfm.  You can then run  
masterrowset.wfm.  The examples are written to recreate the tables every  
time masterrowset.wfm is run.  To change this simply comment out each of  
the two "drop table" commands at the top of masterrowset.wfm by placing //  
at the start of each line

dBASE is now focused on Object Oriented Programming (OOP) although most of  
the old hierarchical commands that date back to CP/M and MSDOS based dBASE  
are still available.  With OOP it is more common to use properties of  
objects rather than variables although variables are available to the  
programmer.

The properties of all objects are listed in the Language Reference and the  
dBASE help file.  In addition when a form is open in the form designer all  
the properties, events and methods for the form and any objects on the  
form can be seen in the Inspector.  If the Inspector isn't visible  
pressing F11 should do the trick.

You don't say what experience you have with OOP or which version of dBASE  
you will be using.  Later versions of dBASE came with a complimentary copy  
of the second issue of Ken Mayer's The dBASE Book.  (A copy of the third  
edition would be a good investment.  Ken has also published the dBASE  
Reports Book.  http://www.goldenstag.net/dbase/ )  You could also have a  
look at the dBASE knowledgebase at  
http://www.dbase.com/support/knowledgebase/

Event driven programming for the Windows environment is a whole new ball  
game compared to hierarchical programming so if you don't follow the code  
in the examples please feel free to come back with questions.


Mervyn.


******** Start of masterrowset.wfm ***************
if file('mbcustomer.dbf')
     drop table mbcustomer
endif

if not file('mbcustomer.dbf')
    create table mbcustomer (custid autoinc,custname character(10),;
      custcity character(15))

   insert into mbcustomer (custname,custcity) values ("Alpha  
","Bloemfontein ")
   insert into mbcustomer (custname,custcity) values ("Bravo ","Durban ")
   insert into mbcustomer (custname,custcity) values ("Charlie ","Cape Town  
")
   insert into mbcustomer (custname,custcity) values ("Delta  
","Johannesburg ")
   insert into mbcustomer (custname,custcity) values ("Echo ","Brandfort ")
endif

if file('mbtrans.dbf')
     drop table mbtrans
endif

if not file('mbtrans.dbf')
    create table mbtrans (id autoinc,custid numeric(10,0),invno  
character(10),invdate date,;
      invamt numeric(10,2))

   insert into mbtrans (custid,invno,invdate,invamt) values (1,"1001  
","01/31/2011",100.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (2,"1002  
","02/28/2011",200.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (3,"1003  
","03/31/2011",300.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (4,"1004  
","04/30/2010",400.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (1,"1005  
","05/31/2010",500.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (2,"1006  
","06/30/2010",110.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (3,"1007  
","07/31/2010",120.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (4,"1008  
","08/31/2010",130.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (1,"1009  
","09/30/2010",150.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (2,"1010  
","10/31/2010",150.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (3,"1011  
","11/30/2010",160.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (4,"1012  
","12/31/2010",170.00)
   insert into mbtrans (custid,invno,invdate,invamt) values (4,"1013  
","12/31/2010",180.00)


   use mbtrans exclusive
   index on custId tag custid
   use

endif

** END HEADER -- do not remove this line
//
// Generated on 2014/09/11
//
parameter bModal
local f
f = new masterrowsetForm()
if (bModal)
    f.mdi = false // ensure not MDI
    f.readModal()
else
    f.open()
endif

class masterrowsetForm of FORM
    with (this)
       onOpen = class::FORM_ONOPEN
       onClose = class::FORM_ONCLOSE
       height = 24.5455
       left = 4.8571
       top = 0.3636
       width = 124.7143
       text = ""
    endwith

    this.MBCUSTOMER1 = new QUERY()
    this.MBCUSTOMER1.parent = this
    with (this.MBCUSTOMER1)
       left = 2.8571
       top = 0.4091
       sql = 'select * from "mbcustomer.DBF"'
       active = true
    endwith

    with (this.MBCUSTOMER1.rowset)
       autoEdit = false
    endwith

    this.MBTRANS1 = new QUERY()
    this.MBTRANS1.parent = this
    with (this.MBTRANS1)
       left = 20.4286
       top = 0.4091
       sql = 'select * from mbtrans.dbf"'
       active = true
    endwith

    with (this.MBTRANS1.rowset)
       autoEdit = false
       indexName = "CUSTID"
       masterRowset = form.mbcustomer1.rowset
       masterFields = "custid"
    endwith

    this.GRID1 = new GRID(this)
    with (this.GRID1)
       dataLink = form.mbcustomer1.rowset
       allowEditing = false
       allowAddRows = false
       height = 7.7727
       left = 5.0
       top = 4.2273
       width = 85.1429
    endwith

    this.GRID2 = new GRID(this)
    with (this.GRID2)
       dataLink = form.mbtrans1.rowset
       allowEditing = false
       allowAddRows = false
       height = 7.7727
       left = 5.0
       top = 13.8182
       width = 85.1429
    endwith

    this.TEXTLABEL1 = new TEXTLABEL(this)
    with (this.TEXTLABEL1)
       height = 1.0
       left = 5.8571
       top = 2.7273
       width = 12.0
       text = "Master"
    endwith

    this.TEXTLABEL2 = new TEXTLABEL(this)
    with (this.TEXTLABEL2)
       height = 1.0
       left = 5.8571
       top = 12.2727
       width = 12.0
       text = "Child"
    endwith

    this.PUSHBUTTON1 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON1)
       onClick = class::PUSHBUTTON1_ONCLICK
       height = 1.0909
       left = 97.0
       top = 7.5455
       width = 15.2857
       text = "Update Master"
    endwith

    this.PUSHBUTTON2 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON2)
       onClick = class::PUSHBUTTON2_ONCLICK
       height = 1.0909
       left = 97.8571
       top = 16.7273
       width = 15.2857
       text = "Update Child"
    endwith

    this.rowset = this.mbcustomer1.rowset

    function PUSHBUTTON1_onClick
       form.master_edit.mbcustomer1 = form.mbcustomer1
       form.master_edit.entryfield1.datalink =  
form.mbcustomer1.rowset.fields["custid"]
       form.master_edit.entryfield2.datalink =  
form.mbcustomer1.rowset.fields["custname"]
       form.master_edit.entryfield3.datalink =  
form.mbcustomer1.rowset.fields["custcity"]
       form.master_edit.readmodal()
       return

    function PUSHBUTTON2_onClick
       form.child_edit.mbcustomer1 = form.mbcustomer1
       form.child_edit.entryfield1.datalink =  
form.mbtrans1.rowset.fields["id"]
       form.child_edit.entryfield2.datalink =  
form.mbtrans1.rowset.fields["custid"]
       form.child_edit.entryfield3.datalink =  
form.mbtrans1.rowset.fields["invno"]
       form.child_edit.entryfield4.datalink =  
form.mbtrans1.rowset.fields["invdate"]
       form.child_edit.entryfield5.datalink =  
form.mbtrans1.rowset.fields["invamt"]
       form.child_edit.readmodal()
       return

    function form_onClose
       form.mbcustomer1.active = false
       form.mbtrans1.active = false
       return

    function form_onOpen
       set procedure to master_edit.wfm
       form.master_edit = new master_editform()
       form.master_edit.mdi = false
       form.master_edit.parent = this
       set procedure to child_edit.wfm
       form.child_edit = new child_editform()
       form.child_edit.mdi = false
       form.child_edit.parent = this
       return

endclass
*********** End of masterrroset.wfm ************

******** Start of master_edit.wfm *************
** END HEADER -- do not remove this line
//
// Generated on 2014/09/11
//
parameter bModal
local f
f = new master_editForm()
if (bModal)
    f.mdi = false // ensure not MDI
    f.readModal()
else
    f.open()
endif

class master_editForm of FORM
    with (this)
       height = 16.0
       left = 54.4286
       top = 7.9091
       width = 74.1429
       text = "Update master table"
       sysMenu = false
    endwith

    this.PUSHBUTTON1 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON1)
       onClick = class::PUSHBUTTON1_ONCLICK
       height = 1.0909
       left = 2.4286
       top = 12.1364
       width = 15.2857
       text = "New"
    endwith

    this.PUSHBUTTON2 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON2)
       onClick = class::PUSHBUTTON2_ONCLICK
       height = 1.0909
       left = 2.8571
       top = 10.5
       width = 15.2857
       text = "Edit"
    endwith

    this.PUSHBUTTON3 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON3)
       onClick = class::PUSHBUTTON3_ONCLICK
       height = 1.0909
       left = 51.8571
       top = 10.5
       width = 15.2857
       text = "Save"
    endwith

    this.PUSHBUTTON4 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON4)
       onClick = class::PUSHBUTTON4_ONCLICK
       height = 1.0909
       left = 51.8571
       top = 12.1364
       width = 15.2857
       text = "Abandon/Close"
    endwith

    this.ENTRYFIELD1 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD1)
       onOpen = class::ENTRYFIELD1_ONOPEN
       when = {||false}
       height = 1.0
       left = 8.1429
       top = 6.4545
       width = 8.0
       value = ""
    endwith

    this.ENTRYFIELD2 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD2)
       onOpen = class::ENTRYFIELD2_ONOPEN
       height = 1.0
       left = 21.5714
       top = 6.5
       width = 16.2857
       value = ""
    endwith

    this.ENTRYFIELD3 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD3)
       onOpen = class::ENTRYFIELD3_ONOPEN
       height = 1.0
       left = 43.2857
       top = 6.5
       width = 20.0
       value = ""
    endwith

    this.TEXTLABEL1 = new TEXTLABEL(this)
    with (this.TEXTLABEL1)
       height = 1.0
       left = 8.1429
       top = 4.5909
       width = 12.0
       text = "custid"
    endwith

    this.TEXTLABEL2 = new TEXTLABEL(this)
    with (this.TEXTLABEL2)
       height = 1.0
       left = 21.5714
       top = 4.5909
       width = 12.0
       text = "custname"
    endwith

    this.TEXTLABEL3 = new TEXTLABEL(this)
    with (this.TEXTLABEL3)
       height = 1.0
       left = 43.2857
       top = 4.5909
       width = 12.0
       text = "custcity"
    endwith

    this.PUSHBUTTON5 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON5)
       onClick = class::PUSHBUTTON5_ONCLICK
       height = 1.0909
       left = 27.2857
       top = 10.5
       width = 15.2857
       text = "Delete"
    endwith

    function PUSHBUTTON1_onClick
       form.entryfield1.datalink = null
       form.entryfield1.value = "AutoInc"
       form.parent.mbcustomer1.rowset.beginAppend()
       form.entryfield2.setfocus()
       return

    function PUSHBUTTON2_onClick
       form.parent.mbcustomer1.rowset.beginEdit()
       return

    function PUSHBUTTON3_onClick
       form.parent.mbcustomer1.rowset.save()
       form.close()
       return

    function PUSHBUTTON4_onClick
       form.parent.mbcustomer1.rowset.abandon()
       form.close()
       return

    function PUSHBUTTON5_onClick
      local cMessage
      cMessage = "Are you sure you want to delete this  
record?"+chr(13)+chr(10)
      cMessage += "All its child records will be deleted as well."
      if msgbox( cMessage, "Delete", 4) == 6
         form.parent.mbtrans1.rowset.first()
         do while not form.parent.mbtrans1.rowset.endofset
            form.parent.mbtrans1.rowset.delete()
            form.parent.mbtrans1.rowset.next()
         enddo
         form.mbcustomer1.rowset.delete()
         form.close()
       endif
       return

endclass
*********** End of master_edit.wfm ***************

***********child_edit.wfm ******************
** END HEADER -- do not remove this line
//
// Generated on 2014/09/11
//
parameter bModal
local f
f = new child_editForm()
if (bModal)
    f.mdi = false // ensure not MDI
    f.readModal()
else
    f.open()
endif

class child_editForm of FORM
    with (this)
       height = 16.0
       left = 54.4286
       top = 7.9091
       width = 74.1429
       text = "Update master table"
       sysMenu = false
    endwith

    this.PUSHBUTTON1 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON1)
       onClick = class::PUSHBUTTON1_ONCLICK
       height = 1.0909
       left = 2.4286
       top = 12.1364
       width = 15.2857
       text = "New"
    endwith

    this.PUSHBUTTON2 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON2)
       onClick = class::PUSHBUTTON2_ONCLICK
       height = 1.0909
       left = 2.8571
       top = 10.5
       width = 15.2857
       text = "Edit"
    endwith

    this.PUSHBUTTON3 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON3)
       onClick = class::PUSHBUTTON3_ONCLICK
       height = 1.0909
       left = 51.8571
       top = 10.5
       width = 15.2857
       text = "Save"
    endwith

    this.PUSHBUTTON4 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON4)
       onClick = class::PUSHBUTTON4_ONCLICK
       height = 1.0909
       left = 51.8571
       top = 12.1364
       width = 15.2857
       text = "Abandon/Close"
    endwith

    this.ENTRYFIELD1 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD1)
       when = {||false}
       height = 1.0
       left = 7.4286
       top = 2.9545
       width = 8.0
       value = ""
    endwith

    this.ENTRYFIELD2 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD2)
       when = {||false}
       height = 1.0
       left = 20.8571
       top = 3.0
       width = 8.0
       value = ""
    endwith

    this.ENTRYFIELD3 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD3)
       height = 1.0
       left = 6.2857
       top = 6.6818
       width = 17.4286
       value = ""
    endwith

    this.TEXTLABEL1 = new TEXTLABEL(this)
    with (this.TEXTLABEL1)
       height = 1.0
       left = 7.4286
       top = 1.0909
       width = 12.0
       text = "id"
    endwith

    this.TEXTLABEL2 = new TEXTLABEL(this)
    with (this.TEXTLABEL2)
       height = 1.0
       left = 20.8571
       top = 1.0909
       width = 12.0
       text = "custid"
    endwith

    this.TEXTLABEL3 = new TEXTLABEL(this)
    with (this.TEXTLABEL3)
       height = 1.0
       left = 6.2857
       top = 5.1818
       width = 12.0
       text = "invno"
    endwith

    this.PUSHBUTTON5 = new PUSHBUTTON(this)
    with (this.PUSHBUTTON5)
       onClick = class::PUSHBUTTON5_ONCLICK
       height = 1.0909
       left = 27.2857
       top = 10.5
       width = 15.2857
       text = "Delete"
    endwith

    this.ENTRYFIELD4 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD4)
       height = 1.0
       left = 27.4286
       top = 6.7273
       width = 17.4286
       value = " "
    endwith

    this.ENTRYFIELD5 = new ENTRYFIELD(this)
    with (this.ENTRYFIELD5)
       height = 1.0
       left = 48.5714
       top = 6.6818
       width = 17.4286
       value = " "
    endwith

    this.TEXTLABEL4 = new TEXTLABEL(this)
    with (this.TEXTLABEL4)
       height = 1.0
       left = 27.4286
       top = 5.1818
       width = 12.0
       text = "invdate"
    endwith

    this.TEXTLABEL5 = new TEXTLABEL(this)
    with (this.TEXTLABEL5)
       height = 1.0
       left = 48.5714
       top = 5.0455
       width = 12.0
       text = "invdate"
    endwith


    function PUSHBUTTON1_onClick
       form.entryfield1.datalink = null
       form.entryfield1.value = "AutoInc"
       form.parent.mbtrans1.rowset.beginAppend()
       form.entryfield3.setfocus()
       return

    function PUSHBUTTON2_onClick
       form.parent.mbtrans1.rowset.beginEdit()
       return

    function PUSHBUTTON3_onClick
       form.parent.mbtrans1.rowset.save()
       form.close()
       return

    function PUSHBUTTON4_onClick
       form.parent.mbtrans1.rowset.abandon()
       form.close()
       return

    function PUSHBUTTON5_onClick
       if msgbox( "Are you sure you want to delete this record?", "Delete",  
4) == 6
          form.parent.mbtrans1.rowset.delete()
          form.close()
       endif
       return

endclass
*********** End of child_edit.wfm ***********