Subject Re: Form to Form
From Mervyn Bick <invalid@invalid.invalid>
Date Fri, 2 Jun 2023 17:29:42 +0200
Newsgroups dbase.getting-started
Attachment(s) Main_form.wfmedit_form.wfm

On 2023/06/01 19:49, Peter wrote:

> Hi Mervyn,
> I'm back at work, but still no success at getting form1 to get form2 to get the custom "variable" to change the query1 in form 2.
>
> I am showing the adjustments as per your latest messages.
> To answer some of your questions, pat_no is a numeric field of 5 digits.  The grid allows the user to enter either a number (the Pat_no, unique number to each patient, index set to pat_no) or a character (index set to lname+fname). No apparent need to check for going past last rowset or above first rowset as grid does that.
>

There's more than one way to do what you want.  The two example forms
attached are merely one possibility.

The main form opens with focus on the blank entryfield.  The first
character entered determines which index to set. Each keystroke refines
the selection.  If the rowpointer is against the correct record in the
grid TAB or ENTER executes the function pushbutton1_onClick().

Instead of typing the full name the user can use the mouse to select the
correct record and then click on the pushbutton.  Try compu which are
the first characters of three records.

The function pushbutton1_onClick() saves the customerId for the selected
record and then uses that to navigate to the same record in the instance
of edit_form held in memory.  The edit form is then launched using
readModal().  To ensure that the user can't close the edit form without
either saving or abandoning any changed the form's sysMenu property is
set false.

Although the mouse can be used on the edit form I prefer not to use it.
The user can, therefore, enter edit mode by pressing Enter when the form
opens.  All further editing, including saving and closing the form, can
be done from the keyboard.

Mervyn.












d = new database()
d.databaseName = "dbasesamples"
d.active = true
tDef = new tableDef()
tDef.database := d
tDef.tableName := "customers"
tDef.load()
for n = 1 to tdef.indexes.size
//    cIndex = tDef.indexes[n].indexname
//    ?cindex
   if upper(tDef.indexes[n].indexname) = 'COMPANY_LOWER'
      cSafety = set('safety')
      set safety off
      use :dbasesamples:customers exclusive
      index on lower(company) tag company_lower
      use
      set safety &cSafety  
      n = tdef.indexes.size //Abort loop
   endif
next
d.active = false


** END HEADER -- do not remove this line
//
// Generated on 2023-06-02
//
parameter bModal
local f
f = new Main_formForm()
if (bModal)
   f.mdi = false // ensure not MDI
   f.readModal()
else
   f.open()
endif

class Main_formForm of FORM
   with (this)
      canClose = class::FORM_ONCLOSE
      onOpen = class::FORM_ONOPEN
      height = 20.0
      left = 2.0
      top = 0.0
      width = 100.0
      text = ""
   endwith

   this.DBASESAMPLES1 = new DATABASE(this)
   with (this.DBASESAMPLES1)
      left = 13.0
      width = 11.0
      height = 1.0
      databaseName = "DBASESAMPLES"
      active = true
   endwith

   this.CUSTOMERS1 = new QUERY(this)
   with (this.CUSTOMERS1)
      left = 6.0
      width = 9.0
      height = 1.0
      database = form.dbasesamples1
      sql = "select * from CUSTOMERS.DBF"
      active = true
   endwith

   this.GRID1 = new GRID(this)
   with (this.GRID1)
      dataLink = form.customers1.rowset
      height = 9.5455
      left = 7.7143
      top = 2.1364
      width = 82.5714
   endwith

   this.ENTRYFIELD1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELD1)
      onKey = class::ENTRYFIELD1_ONKEY
      height = 1.0
      left = 27.2857
      top = 17.7273
      width = 19.4286
      value = ""
   endwith

   this.TEXT1 = new TEXT(this)
   with (this.TEXT1)
      height = 4.4545
      left = 23.7143
      top = 12.0909
      width = 36.0
      text = "Enter Customer ID (max 101) or <P>Company name.  (Not case-sensitive). <P>Left-click pushbutton or press either Enter or Tab to open Edit form for the selected record."
   endwith

   this.PUSHBUTTON1 = new PUSHBUTTON(this)
   with (this.PUSHBUTTON1)
      onClick = class::PUSHBUTTON1_ONCLICK
      height = 1.7273
      left = 60.1429
      top = 17.3182
      width = 15.2857
      text = "Edit selected record"
   endwith

   this.rowset = this.customers1.rowset

   function ENTRYFIELD1_onKey(nChar, nPosition,bShift,bControl)
      local cVal
      if len(this.value) <> 0 //Avoid error if entryfield is cleared
          //If Enter or Tab press, execute the function pb_goto_onClick
          if nChar = 13 or nChar = 9
             form.pushbutton1_onClick()
          endif
          //Check first character and set appropriate index
          if nPosition = 2 and not isAlpha(this.value)
             form.CUSTOMERS1.rowset.indexname = 'CustomerID'
          endif
          if nPosition = 2 and isAlpha(this.value)
             form.CUSTOMERS1.rowset.indexname = 'company_lower'
          endif
          //Change rowpointer
          //findKey() requires a variable, not an object property,
          //as its argument hence the use of cVal instead of this.value
          if isAlpha(this.value)
            cVal = trim(this.value)
            form.CUSTOMERS1.rowset.findkey(cVal)
          else
            cVal = val(this.value)
            form.CUSTOMERS1.rowset.findkey(cVal)
          endif
       endif      
      return

   function PUSHBUTTON1_onClick()
      form.edit_form = new edit_formForm() //Create instance of edit_form in memory.
      form.edit_form.parent = form // Open path back to form from edit_form to facilitate requery().
      nCustID = form.customers1.rowset.fields['customerID'].value //Save the customerID value
      form.edit_form.customers1.rowset.findkey(nCustId)  //Move the rowpointer to the correct record in the edit form
      form.edit_form.mdi = false
      form.edit_form.readModal()
      return

   function form_onClose()
      form.customers1.active = false
      form.dbasesamples1.active = false
      return true

   function form_onOpen()
      set procedure to edit_form.wfm
      form.entryfield1.setFocus()
      return

endclass



** END HEADER -- do not remove this line
//
// Generated on 2023-06-02
//
parameter bModal
local f
f = new edit_formForm()
if (bModal)
   f.mdi = false // ensure not MDI
   f.readModal()
else
   f.open()
endif

class edit_formForm of FORM
   with (this)
      onOpen = class::FORM_ONOPEN
      onClose = class::FORM_ONCLOSE
      height = 20.0
      left = 30.1429
      top = 4.2727
      width = 100.0
      text = ""
      mdi = false
      sysMenu = false
   endwith

   this.DBASESAMPLES1 = new DATABASE(this)
   with (this.DBASESAMPLES1)
      left = 9.0
      width = 11.0
      height = 1.0
      databaseName = "DBASESAMPLES"
      active = true
   endwith

   this.CUSTOMERS1 = new QUERY(this)
   with (this.CUSTOMERS1)
      width = 9.0
      height = 1.0
      database = form.dbasesamples1
      sql = "select * from CUSTOMERS.DBF"
      active = true
   endwith

   with (this.CUSTOMERS1.rowset)
      indexName = "CUSTOMERID"
   endwith

   this.ENTRYFIELDCOMPANY1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDCOMPANY1)
      dataLink = form.customers1.rowset.fields["company"]
      height = 1.0
      left = 11.1429
      top = 5.8182
      width = 42.0
   endwith

   this.ENTRYFIELDADDRESS11 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDADDRESS11)
      dataLink = form.customers1.rowset.fields["address1"]
      height = 1.0
      left = 11.1429
      top = 8.0455
      width = 32.0
   endwith

   this.ENTRYFIELDADDRESS21 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDADDRESS21)
      dataLink = form.customers1.rowset.fields["address2"]
      height = 1.0
      left = 11.1429
      top = 10.3182
      width = 32.0
   endwith

   this.ENTRYFIELDCITY1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDCITY1)
      dataLink = form.customers1.rowset.fields["city"]
      height = 1.0
      left = 11.1429
      top = 12.5455
      width = 22.0
   endwith

   this.ENTRYFIELDSTATE1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDSTATE1)
      dataLink = form.customers1.rowset.fields["state"]
      height = 1.0
      left = 11.1429
      top = 14.6364
      width = 4.0
   endwith

   this.ENTRYFIELDZIP1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDZIP1)
      dataLink = form.customers1.rowset.fields["zip"]
      height = 1.0
      left = 22.8571
      top = 14.5
      width = 12.0
   endwith

   this.ENTRYFIELDFIRSTNAME1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDFIRSTNAME1)
      dataLink = form.customers1.rowset.fields["firstname"]
      height = 1.0
      left = 56.1429
      top = 7.7273
      width = 17.0
   endwith

   this.ENTRYFIELDLASTNAME1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDLASTNAME1)
      dataLink = form.customers1.rowset.fields["lastname"]
      height = 1.0
      left = 75.1429
      top = 7.8182
      width = 17.0
   endwith

   this.ENTRYFIELDPHONE1 = new ENTRYFIELD(this)
   with (this.ENTRYFIELDPHONE1)
      dataLink = form.customers1.rowset.fields["phone"]
      height = 1.0
      left = 62.8571
      top = 10.2727
      width = 22.0
   endwith

   this.PUSHBUTTON1 = new PUSHBUTTON(this)
   with (this.PUSHBUTTON1)
      onClick = class::PUSHBUTTON1_ONCLICK
      height = 1.0909
      left = 12.8571
      top = 17.9545
      width = 15.2857
      text = "Edit"
   endwith

   this.PUSHBUTTON2 = new PUSHBUTTON(this)
   with (this.PUSHBUTTON2)
      onClick = class::PUSHBUTTON2_ONCLICK
      height = 1.0909
      left = 33.7143
      top = 17.9545
      width = 15.2857
      text = "Save"
   endwith

   this.PUSHBUTTON3 = new PUSHBUTTON(this)
   with (this.PUSHBUTTON3)
      onClick = class::PUSHBUTTON3_ONCLICK
      height = 1.0909
      left = 54.5714
      top = 17.9545
      width = 15.2857
      text = "Abandon"
   endwith

   this.PUSHBUTTON4 = new PUSHBUTTON(this)
   with (this.PUSHBUTTON4)
      onClick = class::PUSHBUTTON4_ONCLICK
      height = 1.0909
      left = 75.4286
      top = 17.9545
      width = 15.2857
      text = "Close form"
   endwith

   this.TEXT1 = new TEXT(this)
   with (this.TEXT1)
      height = 4.4545
      left = 24.1429
      top = 0.4545
      width = 50.7143
      text = "<p>The Edit button has focus when the form opens. Either press Enter or click on the button to enable edit. <P></p><p>Tab moves through entryfields.</p><p></p><p> Any changes must either be saved or abandoned before the form can be closed.</p>"
   endwith

   this.rowset = this.customers1.rowset

   function PUSHBUTTON1_onClick()
      form.entryfieldcompany1.setFocus() // First field.  User can now Tab to following fields
      form.customers1.rowset.beginEdit()
      return

   function PUSHBUTTON2_onClick()
      form.customers1.rowset.save()
      form.parent.customers1.requery()
      return

   function PUSHBUTTON3_onClick()
      form.customers1.rowset.abandon()
      return

   function PUSHBUTTON4_onClick()
      if form.customers1.rowset.modified = true
        msgbox('Data modified.  Abandon or Save the changes'+chr(13)+chr(10)+ 'before the form can be closed') = 1
      else  
         form.close()
      endif  
      return

   function form_onClose()
      form.customers1.active = false
      form.dbasesamples1.active = false
      return

   function form_onOpen()
      form.pushbutton1.setFocus() //When form opens pressing Enter will initiate edit mode.
      return

endclass