Subject Re: Forms Processing Text Box buffer to Data Fields
From maurizio S. <mau@mau.it>
Date Fri, 12 Sep 2014 15:12:09 +0200
Newsgroups dbase.getting-started

Recently (almost dB 8.x and 9.x) I changed my programming mind approach,
follows other tips here in NG

to keep much clear the code, in case you will switch to backend server, but
also continue using BDE, they convinced me to NOT use rowset.methods nor
datalinked nor editable grid

use Server side approach, like Insert, Update, Delete...

just my two cents
Maurizio



"Mervyn Bick"  ha scritto nel messaggio news:op.xl2ctuzl380wm4@mervynb...

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