New Features
visual foxpro
foxpro
visual foxpro
  visual foxpro
foxpro
visual foxpro
Contact Us
...the professional framework for FoxPro

  Home | News | Products | Services | Support | Forum | Training | Downloads | Purchase

 
  Information
 
 
  Free Trials
 
Visual ProMatrix
Sample Apps
   
  ProMatrix Store
 
 

VPM Enterprise New Features, Changes & Fixes


This page lists all of the new features, changes and bug fixes in VPM Enterprise 6.0.

New Features

Topic

Description

lUpdateAliases_Add property

There is a new form property, lUpdateAliases_Add, that when .T. (the default) and the New button is clicked, causes a record to be added to the aliases listed in the cUpdateAliases property.

lUpdateAliases_Copy property

There is a new form property, lUpdateAliases_Copy, that when .T. (the default) and the Copy button is clicked, causes the current record to be copied in the aliases listed in the cUpdateAliases property.

New property to bring up application full screen

There is a new property of the application object, lFullScreen, that when .T. (the default) causes the application to come up full screen.

New property determines if Introductory form is run

There is a new property of the application object, lRunIntroductoryForm, that when .T. (the default) causes the Introductory form to be run upon application startup.

New property determines if tables are opened at startup

There is a new property of the application object , lOpenAtStartup_DDS, that when .T. (the default) causes the OpenAtStartup_DDS method to be run upon application startup.

New properties control logo and copyright display

There is a new property of the application object, lCopyrightNotice, that when .T. (the default) causes the product name, copyright notice, and company name to be displayed.

There is a new property of the application object, nLogoSeconds, that is used when the user has turned off the display of the logo on the Environment form. It determines the number of seconds (the default is 4) the logo, product name, copyright notice, and company name are displayed. They are not displayed at all if nLogoSeconds is not greater than zero.

International object instantiation

There is a new property of the application object, lInstantiateInternationalObject, that when .T. (the default is .F.) causes the International object to be instantiated upon application startup.

Switching data sessions

There is a new method of the application object, SetDataSession, which switches to the data session whose data session ID is passed to the method.

IsEOF method

There is a new method of the application object, IsEOF, that returns .T. if the record pointer is at EOF for the alias specified in the parameters passed to the method. The parameters accepted are cursor alias and data session ID.

IsBOF method

There is a new method of the application object, IsBOF, that returns .T. if the record pointer is positioned at the beginning of the cursor specified in the parameters passed to the method. The parameters accepted are cursor alias and data session ID.

GoEOF method

There is a new method of the application object, GoEOF, that moves the record pointer to EOF for the alias specified in the parameters passed to the method. The parameters accepted are cursor alias and data session ID.

Select_Alias method

There is a new method of the application object, Select_Alias, that selects the alias specified in the parameters passed to the method. The parameters accepted are cursor alias and data session ID.

OpenView method

There is a new method of the application object, OpenView, that opens a view with the USE command.

cDRVView_DatabaseName property

There is a new property of the application object, cDRVView_DatabaseName, that contains the name of the database that contains the Data Dictionary Remote View local or remote view, drv_v.  By default the property contains “system_v”, which is the database that contains local views of system tables. This property is used in the OpenAtStartup_PDS method.

Business Rules object

There is a new Business Rules object whose methods can be used to enforce business rules within the application. Entries in the  nBusinessRulesType, cBusinessRulesClass, and cBusinessRulesAutomationServer properties of the application object determine whether the object is instantiated from a class that is built into the application or from a DLL or EXE as an automation server. Either way, the object reference is stored in a property of the application object, oBusinessRules.

The Business Rules class, ProBusinessRules, is in the ProBusinessRules class library located in the project’s home directory. This class is based on the VPMBusinessRules class in the VPMBusinessRules class library located in the VPM home directory. The Business Rules class contains custom methods that are called automatically at various points in the application. These methods are BlankFieldCheck, PreAdd, PreCopy, PreDelete, PreRestore, PreSave, PostAdd, PostCopy, PostDelete, PostRestore, and PostSave. If the BlankFieldCheck, PreAdd, PreCopy, PreDelete, PreRestore, PreSave, PostAdd, or PostCopy method returns .F., the process that called the method is aborted. The form-level versions of these methods are called as before, and in turn call the Business Rules object methods. The call to the Business Rules object methods can be controlled at the form level through the form properties lRunBusinessRulesBlankFieldCheck, lRunBusinessRulesPreAdd, etc.. The parameters passed to these form-level and Business Rules object methods are:

1.        The name of the table or view that contains the record being added, copied, deleted, saved, or restored.

2.        The name of the alias of the table of view.

3.        A value determined by the user that helps identify a particular functionality that should occur in the method. When called from a form, the value in the form’s cRulesID property is passed.

4.        An object containing the field values from the record. The object is created with the SCATTER command.

GetFilter method

There is a new method of the application object, GetFilter, that returns the expression of the filter in use on the cursor specified in the parameters passed to the method. The parameters accepted are cursor alias and data session ID.

GetRecordNumber method

There is a new method of the application object, GetRecordNumber, that returns the record number of the current record in the cursor specified in the parameters passed to the method. If the record pointer is at EOF, zero is returned. The parameters accepted are cursor alias and data session ID.

EvaluateExpression method

There is a new method of the application object, EvaluateExpression, that returns the result of the evaluation of the expression passed to the method. The parameters accepted are cursor alias, data session ID, and expression to evaluate.

SetRelation method

There is a new method of the application object, SetRelation, that sets or removes a relation from the cursor specified in the parameters passed to the method. The parameters accepted are cursor alias, data session ID, relation expression, and alias to set relation into.

Finding a table or view (DD1) record

There is a new method of the application object, GetDD1Record, that finds a record in the dd1_v view cursor that is open in the session object’s private data session. Once the record is found, the SCATTER command is used to create an object whose properties have the same names as fields in the table. The object reference for this object is stored in the oDD1Record property so that the object’s properties can be referenced from wherever the GetDD1Record method was called.

Finding a field (DD2) record

There is a new method of the application object, GetDD2Record, that finds a record in the dd2_v view cursor that is open in the session object’s private data session. Once the record is found, the SCATTER command is used to create an object whose properties have the same names as fields in the table. The object reference for this object is stored in the oDD2Record property so that the object’s properties can be referenced from wherever the GetDD2Record method was called.

Finding a field (DD2) record for a FK field

There is a new method of the application object, GetDD2Record_FK, that finds a record in the dd2_v view cursor that is open in the session object’s private data session. It finds a record for a field in a specified child table/view that has a specified parent table/view selected as the reference table/view in the RI setup. Once the record is found, the SCATTER command is used to create an object whose properties have the same names as fields in the table. The object reference for this object is stored in the oDD2Record property so that the object’s properties can be referenced from wherever the GetDD2Record_FK method was called.

Finding a index tag (Dind) record

There is a new method of the application object, GetDIndRecord, that finds a record in the dind_v view cursor that is open in the session object’s private data session. Once the record is found, the SCATTER command is used to create an object whose properties have the same names as fields in the table. The object reference for this object is stored in the oDIndRecord property so that the object’s properties can be referenced from wherever the GetDIndRecord method was called.

Finding a remote view (DRV) record

There is a new method of the application object, GetDRVRecord, that finds a record in the drv_v view cursor that is open in the session object’s private data session. Once the record is found, the SCATTER command is used to create an object whose properties have the same names as fields in the table. The object reference for this object is stored in the oDRVRecord property so that the object’s properties can be referenced from wherever the GetDRVRecord method was called.

New Remote page in Data Builder

There is a new Remote page of the Tables/Views pageframe in the Data Builder form. The purpose of the page is to have a place to specify for a local view the name of the database that contains the equivalent remote view of the same name. Also on this page is a Use Remote View checkbox, that when checked means that the remote view should be used instead of the local view wherever the local view is used in the DE of forms and reports (see LocalToRemote method) as well as opened with the OpenView method. This remote view information is stored in a new table, S<Prefix>DRV.

SetControlProperties method

There is a new method of the application object, SetControlProperties, that is called from the Init method of controls. The method sets the value of selected control properties instead of having duplicate code in the Init method of all controls that performs this function. The properties include the Enabled (through Control Security), cAlias, cDDTable, and cDDField properties.

New key generation routine

There are two new programs, S<Prefix>DGK1 and S<Prefix>DGK2, that generate key values and store the last used values in a table, S<Prefix>DGK. Each record in the table stores the last used value for a specific field. This is now the default PK generation routine in the Data Builder. The program S<Prefix>DGK1 does the following:

1.        Opens the Generated Key table.

2.        Finds the record for the specified field or creates one.

3.        Locks the record.

4.        Passes the program S<Prefix>DGK2 the last value used.

5.        Stores the incremented value returned by S<Prefix>DGK2 in the Generated Key record.

6.        Returns the incremented value so that it can be stored in the key field.

Find form for parameterized views

There is a new property of the application object and forms, cFindForm_SQL, that holds the name of the Find form for parameterized views. The parameterized view Find form allows for the entry of parameter values and performs a REQUERY on the view cursor. By default, cFindForm_SQL in the application object contains S<Prefix>CFS, which is the name of the generic Find form used whenever the Find button on the toolbar is clicked and the current cursor is a parameterized view. If the current cursor is not a parameterized view the standard Find form, S<Prefix>CFnd, is used. The form S<Prefix>CFS is based on a new class, Find_SQL, that is in the ProGen and VPMGen class libraries. If on a particular form a custom parameterized view Find form should be used, the form’s cFindForm_SQL property can be used to hold the name of that custom Find form.

Note: The parameterized view Find form requires that the view’s parameter (variable) names follow a particular naming convention. The name must be ?Find<field name in DD2 table>. Parameters whose name does not follow the naming convention can be used in the view but must be handled independently (i.e., must be in scope and contain the appropriate value).

lFindForm_SQLOverride property

There is a new form property, lFindForm_SQLOverride, that when .T. (the default is .F.) causes the standard Find form, S<Prefix>CFnd, to be used even though the current cursor is a parameterized view.

lStartWithFind property

There is a new form property, lStartWithFind, that when .T. (the default is .F.) causes the Find form to come up when the form is initially run. The parameterized view Find form or the standard Find form is brought up depending on whether or not the current cursor is a parameterized view and the value in the lFindForm_SQLOverride property.

Bypassing VPM error handling

There are two new methods of the application object that allow for the temporary bypass of VPM error handling so that particular errors can be trapped at the point in the code where the error occurs. The BypassErrorHandling_Start method turns VPM error handling off. The BypassErrorHandling_Stop method turns VPM error handling back on. If the BypassErrorHandling_Start method is passed .T., any error that occurs before the BypassErrorHandling_Stop method is run will be logged in the Errors table. The BypassErrorHandling_Stop method returns a value of .T. or .F. depending on whether or not an error occurred. A common usage of these methods would be:

 

_SCREEN.oApp.BypassErrorHandling_Start()

<code that might cause error you want to trap>

IF _SCREEN.oApp.BypassErrorHandling_Stop()

   <code to handle error>

ENDIF

 

LocalToRemote method

There is a new method of the application object, LocalToRemote, that should be called from the BeforeOpenTables method of the DE of forms and reports that will use remote data. The LocalToRemote method finds each view cursor in the DE and determines if the local or remote version of the view should be used. If the remote view should be used it changes the value in the Database property of the cursor object to the name of the database that contains the remote view. Note that since a local view and its equivalent remote view must have the same name, only the Database property value needs to be changed. The BeforeOpenTables method should contain the following code:

 

SET TALK OFF

SET DELETED ON

_SCREEN.oApp.LocalToRemote(This)

 

AdminTool_Status method

There is a new method of the application object, AdminTool_Status, that returns .T. if a specified Admin Tool is turned on in the application.

DeleteFor method

There is a new method of the application object, DeleteFor, that deletes records from a table based on an expression. This method uses the DELETE FOR <expression> command to delete the records. Because the records are not deleted one at a time, the PreDelete, PostDelete, and VPM RI routines are not run.

Suppressing display of Object Builder background picture

The bitmap displayed in the background of the Object Builder form is now displayed only if it can be found in one of VPM’s directories. By default, ObjectBuilderBackground.bmp is located in VPM’s BITMAPS directory.

Suppressing display of SetOrder WAIT message

The SetOrder method of the application object by default displays a WAIT message to notify the user that an index is being created for a view cursor. The display of this message can now be suppressed by passing .T. as the eighth parameter to SetOrder.

Finding a Security view record

There is a new method of the application object, GetSecRecord, that finds a record in the Security_v view cursor that is open in the session object’s private data session. Once the record is found, the SCATTER command is used to create an object whose properties have the same names as fields in the table. The object reference for this object is stored in the oSecRecord property so that the object’s properties can be referenced from wherever the GetSecRecord method was called.

Null display

There is a new property of the VPMApp and ProApp classes, lNullDisplay_ChangeToBlank, that when .T. (the default) causes the following command to be issued in the SetInitialEnvironment method of _SCREEN.oApp:  SET NULLDISPLAY TO “”

Requerying a view used by a combobox or textbox

When a record is added to a FK’s lookup table by selecting the Add option on the right-click menu or by clicking the Add button on the Picklist form, the PK value of the new record is automatically entered into the FK field(s). If a combobox or textbox uses a view to display information from the same lookup table, the view cursor does not contain the new record because the view cursor was populated when the form was run. To overcome this problem, the Combobox_ and Textbox_ classes have a new property, lFKUpdateRequeryView, that when .T. (the default) causes the view specified in the control’s cLookupAlias property to be requeried at the point where the FK is filled-in.

New parameter in GetDD2Record method

There is a new logical third parameter accepted by the GetDD2Record method of _SCREEN.oApp. When .T. will cause the first field of the table or view specified in the first parameter to be found in the S<Prefix>DD2 table.

New parameter in GetDIndRecord method

There is a new numeric third parameter accepted by the GetDIndRecord method of _SCREEN.oApp. It can be used to determine if a certain type of tag exists for the table or view specified in the first parameter. Parameter values are 1 (candidate), 2 (primary), or 3 (unique).

New parameter in DeleteRecord method

There is a new logical eighth parameter accepted by the DeleteRecord method of _SCREEN.oApp. When .T. will cause the VPM RI routine to not display the “Checking referential integrity...” WAIT message.

New parameter in Save method

There is a new logical tenth parameter accepted by the Save method of _SCREEN.oApp. When .T. will cause the VPM RI routine to not display the “Checking referential integrity...” WAIT message.

OpenDBF method now opens all databases

If a database name is not passed to the OpenDBC method of _SCREEN.oApp, all databases in the S<Prefix>DD0 table are now opened.

Save method can now bypass VPM RI

There is a new logical ninth parameter accepted by the Save method of _SCREEN.oApp. When .T. prevents the VPM RI routine from being run and Audit Trail records from being created.

BUILDER.DBF fatal error

VPM now automatically fixes the corruption that can occur with the memo file of VFP’s BUILDER.DBF that causes a fatal error to be generated upon entry into VPM.

PostDelete method

The PostDelete method can now cause the deletion process to be aborted. If the PostDelete method returns .F., the deletion of the current record plus any data changes/deletions made by the VPM RI routine and any data changes made by code in the PreDelete method (if tables are in database) are aborted. The DeleteRecord method of _SCREEN.oApp now returns a value of 8 if the PostDelete method returns .F..

PostSave method

The PostSave method can now cause the save process to be aborted. If the PostSave method returns .F., the saving of the current record plus any data changes made by the VPM RI routine and any data changes made by code in the PreSave method (if tables are in database) are aborted. The Save method of _SCREEN.oApp now returns a value of 17 if the PostSave method returns .F..

Remote data changes in PreSave, PostSave, PreDelete, and PostDelete methods

If code in the PreSave, PostSave, PreDelete, or PostDelete methods make changes to remote data, those changes are made within a transaction. Therefore, when the transaction is committed or rolled-back, those remote data changes must also be committed or rolled-back. That will happen automatically as long as a different connection is not used to make those changes. If a different connection is used, that connection can be included in the SQLCOMMIT or SQLROLLBACK that is executed. There is a new property of _SCREEN.oApp, cAdditionalConnectionHandles, that can be used to include additional connections in the SQLCOMMIT or SQLROLLBACK. For more than one additional connection, separate the connection handles with commas in the property.

SQL Find form behavior

There is a new property of the Form_Toolbar class, lFindForm_SQL_NoEntriesOK, that when set to .T. will allow the user to not make any entries on the SQL Find form, click OK, and be presented with a List form showing all records. The property is .F. by default, meaning the user has to enter at least one parameter value before clicking OK.

Alternate captions for the SQL Find form

There is a new property of the Form_Toolbar class, cFindForm_SQL_AltCaptions, that can be used to specify alternate label captions to be displayed on the SQL Find form. The captions should be entered into the property in the order in which the associated parameters will be displayed on the SQL Find form. Multiple captions should be separated by semi-colons. Captions can be entered selectively, meaning that only those captions that should be different than the captions that would be used by default from the data dictionary need to be specified.

SQL Find form adds “%”

The SQL Find form now adds “%” to TRIMmed entries if the Find is being performed on a remote view. With remote views, the parameters need to be created with the LIKE operator and have “%” appended to parameter values to make a match on partial entries.

New UpdateFor method

There is a new method, UpdateFor, of _SCREEN.oApp that updates records in a specified cursor using the UPDATE command.

New specification of F2 Picklist table or view

The Integrity page of the Data Builder has a new field that is accessible when setting up Referential type Integrity. The new field allows for the specification of a table/view to be used just for the F2 Picklist. If an entry is not made in this field, the reference table/view (Ref (PK) T/V) entry is used.

New specification of validation table or view

The Integrity page of the Data Builder has a new field that is accessible when setting up Referential type Integrity. The new field allows for the specification of a table/view to be used just for the validation of the FK value. If an entry is not made in this field, the reference table/view (Ref (PK) T/V) entry or Picklist table/view entry is used, in that order depending on which of them is filled-in. A parameterized view may be used to validate the FK value as long as the parameter name is PKValue and a FK Tag has been specified.

VPM RI routine can now use views to update related tables

When setting up Referential type Integrity in the Data Builder for a FK in a view, you will now normally not make an entry in the Ref (PK) T/V field. You will instead fill in the Picklist T/V and Valid T/V fields to provide Picklist and validation functionality. You can, however, have the VPM RI routine update the view’s source table by filling in the Ref (PK) T/V field. This will only work if the view has a filter on the FK whose parameter has a name of ParentPKValue. This functionality is particularly useful if you want the VPM RI routine to update remote data.

Blank and duplicate PK checks can now be performed for remote views

The VPM RI routine will now perform a blank PK check for a remote view cursor record as long as a PK Tag has been specified for the view in the Data Builder.

The VPM RI routine will perform a duplicate PK check for a remote view cursor record if a remote view has been created that can be used for this purpose. The view must have a filter on the PK whose parameter has a name of PKValue. The view must be specified in a new field on the Remote page of the Data Builder for the view being checked and must reside in the database specified on the same page.

Displaying Set information in a combobox

Previously, when Set Integrity information was displayed in the dropdown list of a combobox, both the code and description were displayed. The lLookupDescription property setting determined if the code (.F.) or description (.T.) was displayed first. A new property, lShowSetValueAndDescription , has been added to the Combobox_ class to provide control over the dropdown list display. If the property is set to .F. (the default), only the code or description is displayed, depending on the lLookupDescription setting. If .T., both the code and description are displayed.

New combobox property

There is a new property of the Combobox_ class, lOverrideWidth, that when set to .T. will prevent code in the Init method from resizing the control. Currently, a combobox is only resized when displaying Set Integrity information.

Closing view source tables

In the field validation, F2 Picklist, and VPM RI routines, the view source tables that are opened by VFP when a view is opened are now closed when the view cursor is closed.

PerformStartupAction now run when error occurs

The command stored in the PerformStartupAction property of the application object is now run if a “return to main menu” error occurs and the new property lPerformStartupActionOnError property is set to .T..

Object Builder now runs external programs

There are two new programs that are run by VPME when, through the Object Builder, you edit a form, label, program, query, or report or run a form, label, or report. The purpose of these programs that are external to the VPME application is to allow you to modify them to gain additional control over the development environment and to allow you to interface with products like VSS. The program SAPPUOB is run prior to an object being edited or run (does not include the situation where an object is run from within an editor). If this program returns a value of .F. the object is not allowed to be edited or run. The program SAPPUOBC is run after an object is run or the editor used to edit the object is closed. Both of these programs can be found in VPME’s PRGS directory.

View filter

A single view can be used in a form that is involved in Related Forms situations as well as uses the SQL Find form. To do so requires that the PKValue, ParentPKValue, and Find<field name> variables be used in the view’s filter (WHERE clause). Using two or more of these variables in a view can cause problems because each of them may not be defined in all situations where the view is opened or requeried. You could use the TYPE function in the filter to check for the existence of each variable, but the TYPE function cannot be used in a SQL 7 view. Alternatively, we have defined three new public variables to be used in filter expressions to identify which variables have been defined in the current situation. These new variables are named No_PKValue, No_ParentPKValue, and No_FindValues and are all initialized with a value of .T..  Code has been added in the appropriate places to make sure that the new variables have the correct value for the given situation. For example, when the SQL Find form is brought up, the No_FindValues variable is set to .F. while the others are set to .T..

In a view created programmatically, the WHERE clause might look like:

WHERE (No_PKValue OR <field name> = PKValue) AND (No_ParentPKValue OR <field name> = ParentPKValue) AND (No_FindValues OR <field name> = Find<field name>)

For a view created in the View Designer, take a look at the filter of the DVSAEMAS_V and DVSAEBEN_VP views in the sample application for an example of how these new variables can be used.

_SCREEN.ActiveForm no longer used

_SCREEN.ActiveForm is no longer used in VPME code because it can at times reference ActiveX controls instead of the currently active form. A new method of the application object has been created, GetActiveForm, that places the object reference of the currently active form in a new property, oActiveForm. The code that previously referenced _SCREEN.ActiveForm now calls GetActiveForm, and if it returns a value of .T., uses the object reference stored in oActiveForm.

Referential Integrity

A “Bypass RI”checkbox has been added to the Integrity page of the Data Builder. When checked, the RI definition on that page is bypassed by VPME’s Referential Integrity routine.

 

Changes

Topic

Description

Changes to Admin Tool table

The name of the EXECUTE_MV (C 10) field in the Admin Tool table S<Prefix>FCT1 has been changed to RUN_METHOD (C 30). The field previously contained the name of the memvars that held the program and form names to run when an Admin Tool functionality was needed. Now, the field contains the name of the application object method to run when the Admin Tool functionality is needed.

Changes in use of cMainMenu property

The cMainMenu property of the application object previously contained the name of the application’s main menu. Now, it is blank and used as an override to the running of the default main menu, S<Prefix>FMAN. If a menu name is entered in cMainMenu, that menu is run at application startup instead of the default main menu.

Change in GENMENUX directive

The GENMENUX directive added to each menu option’s Comments field now calls _SCREEN.oApp.RunAdminTool(…) instead of &sgcFCT(…).

New Project Objects form

The New Project Objects form no longer has a Memory Variable field. Global memory variable assignments are no longer made in the project’s main program in favor of the use of application object properties. This change was made because global memory variables can be removed from memory when certain errors occur.

IsNew method

There is a new method of the application object, IsNew, that is equivalent to the form-level IsNew method. In fact, the form-level IsNew simply calls the application object IsNew. This means that calls to the form-level IsNew do not need to be changed to call the application object IsNew. Both versions of IsNew now accept a data session ID parameter.

DataChanged method

There is a new method of the application object, DataChanged, that is equivalent to the form-level DataChanged method. In fact, the form-level DataChanged simply calls the application object DataChanged. This means that calls to the form-level DataChanged do not need to be changed to call the application object DataChanged. Both versions of DataChanged now accept a data session ID parameter and an additional aliases parameter.

SetDataSessionEnv method removed

The Load method of forms no longer call the SetDataSessionEnv method of the form to set the environment of the form’s private data session. Instead, the load method now calls a new method of the application object, SetPrivateDataSessionEnvironment, which performs the same function.

CreateViewTags method removed

The Load method of forms no longer call the CreateViewTags method of the form to create tags for view cursors. Instead, the load method now calls a new method of the application object, CreateViewTags, which performs the same function.

Locate_For method removed

The Locate_For method of the Form_ class has been removed. A new method of the application class, Locate_For, is now used instead. The method now accepts cursor alias and data session ID parameters.

Save method

There is a new method of the application object, Save, that is called by the form-level Save method. The form-level Save method now handles interface-specific tasks. The application object Save method handles the actual saving of new and modified records.

Restore method

There is a new method of the application object, Restore, that is called by the form-level Restore method. The form-level Restore method now handles interface-specific tasks. The application object Restore method handles the actual restoring of new and modified records.

PreSave_Child and PostSave_Child methods removed

The PreSave_Child and PostSave_Child methods of the Form_Toolbar_OneToMany class have been removed. The PreSave and PostSave methods are now called instead.

BlankFieldCheck method

There is a new method of the application object, BlankFieldCheck, that is called by the form-level BlankFieldCheck method. The form-level BlankFieldCheck method now handles interface-specific tasks. The application object BlankFieldCheck method handles the actual check to see if fields are empty.

AddRecord method

The AddRecord method of the application object now handles the addition of records to additional aliases that are passed to the method. The method also now handles the copying of records.

DeleteRecord method

There is a new method of the application object, DeleteRecord, that is called by the form-level Delete and GroupDelete methods. The form-level Delete and GroupDelete methods now handle interface-specific tasks. The application object DeleteRecord method handles the actual deletion of records.

SetFilter method

There is a new method of the application object, SetFilter, that is called by the form-level Filter method. The form-level Filter method now handles interface-specific tasks. The application object SetFilter method handles the actual setting of the filter.

First method

The First method of the application object now requires that the cursor alias be passed as the first parameter.

Last method

The Last method of the application object now requires that the cursor alias be passed as the first parameter.

Next method

The Next method of the application object now requires that the cursor alias be passed as the second parameter.

Reverse method

The Reverse method of the application object now requires that the cursor alias be passed as the first parameter.

No uniqueness check for fields in remote views

The field validation routine has been changed so that it determines if the field being validated is in a remote view, and if so will not attempt to perform the uniqueness check if the Unique option is selected for the field in the Data Builder.

New datetime field in system tables

The date and time fields have been replaced by a single datetime field in the Activity, Audit Trail, and Errors tables. This has required changes in the index tags in these tables.

S<Prefix>CRI program deleted

The Referential Integrity code has been moved from the S<Prefix>CRI program into the ReferentialIntegrity method of the application object.

Note: The Audit Trail work area number parameter has been replaced with a data session ID parameter.

S<Prefix>CWhn program deleted

The code run by the When method of controls has been moved from the S<Prefix>CWhn program to the ControlWhen method of the application object.

S<Prefix>EEH program deleted

The error handling code has been moved from the S<Prefix>EEH program to the AdminTool_ErrorHandling method of the application object.

S<Prefix>FCT program deleted

The Admin Tool execution code has been moved from the S<Prefix>FCT program to the RunAdminTool method of the application object.

S<Prefix>FCTA program deleted

The Admin Tools array loading code has been moved from the S<Prefix>FCTA program to the LoadAdminToolsArray method of the application object.

S<Prefix>FDS2 program deleted

The Drive Swapping array loading code has been moved from the S<Prefix>FDS2 program to the LoadDriveSwappingArray method of the application object.

S<Prefix>FDS3 program deleted

The Drive Swap code has been moved from the S<Prefix>FDS3 program to the SwapDrive method of the application object.

S<Prefix>FEnv program deleted

The code that sets the application’s environment has been moved from the S<Prefix>FEnv program to the SetEnvironment method of the application object.

S<Prefix>HF1 program deleted

The F1 help code has been moved from the S<Prefix>HF1 program to the AdminTool_F1 method of the application object.

S<Prefix>HF2 program deleted

The F2 help code has been moved from the S<Prefix>HF2 program to the AdminTool_F2 method of the application object.

S<Prefix>HF3 program deleted

The F3 help code has been moved from the S<Prefix>HF3 program to the AdminTool_F3 method of the application object.

S<Prefix>SMCF program deleted

The code that performs the menu, control, and field security checks has been moved from the S<Prefix>SMCF program to the MenuControlFieldSecurity method of the security object.

S<Prefix>UAct program deleted

The code that adds a record to the Activity Tracking table has been moved from the S<Prefix>UAct program to the AdminTool_ActivityTracking method of the application object.

S<Prefix>UAl program deleted

The program that displays alert messages is no longer supported. Use VPM’s messaging system instead.

S<Prefix>UDir program deleted

The code that performs the check to determine if a folder exists has been moved from the S<Prefix>UDir program to the FolderExists method of the application object.

S<Prefix>UMv program deleted

The code that runs the Mover form has been moved from the S<Prefix>UMv program to the RunMoverForm method of the application object.

S<Prefix>UND program deleted

The code that creates a folder has been moved from the S<Prefix>UND program to the CreateFolder method of the application object.

S<Prefix>UPop program deleted

The code that restores SET command settings has been moved from the S<Prefix>UPop program to the SetPop method of the application object.

Note: Now has a data session ID parameter.

S<Prefix>UPsh program deleted

The code that saves and changes SET command settings has been moved from the S<Prefix>UPsh program to the SetPush method of the application object.

Note: Now has a data session ID parameter.

S<Prefix>URL program deleted

The code that locks a record has been moved from the S<Prefix>URL program to the LockRecord method of the application object.

Note: Now has a data session ID parameter.

S<Prefix>USP program deleted

The code that shortens a path string has been moved from the S<Prefix>USP program to the ShortenPath method of the application object.

S<Prefix>UUse program deleted

The code that opens a table has been moved from the S<Prefix>UUse program to the OpenTable method of the application object.

Note: Now has a data session ID parameter.

S<Prefix>VFld program deleted

The code that validates field values has been moved from the S<Prefix>VFld program to the AdminTool_FieldValidation method of the application object.

Note: Now has a form object reference parameter.

System tables accessed through views

All system tables, except for the data dictionary tables, are now accessed exclusively through views that are stored in the System_v database. This means that wherever these views are used, including system forms and reports, the views are opened with calls to the OpenView method of the application object (_SCREEN.oApp).

Custom form classes for system forms

All forms that display system table data are now based on custom form classes. What this does is move all of the code that was in the system forms into form classes. For example, the Activity form is now based on an Activity class that is in the ProGen/VPMGen class libraries.

New Data Manager class libraries

There are new class libraries (ProDD/VPMDD) that contain custom form classes for Data Manager forms. All Data Manager forms are now based on these custom form classes. What this does is move all of the code that was in the forms into form classes.

lStartWithAdd property

The lStartWithAdd property of the Form_Toolbar class is no longer used by the Related Forms engine. Instead, the new properties lRFStartWithAdd and lRFStartWithAddMessage are now used. The lStartWithAddMessage property has been removed since the message that was displayed when set to .T. was specific to a Related Forms situation.

DESC field renamed in system tables

The name of the DESC field has been changed to DESCR in the following tables: S<Prefix>URPT, S<Prefix>SCG, S<Prefix>SFG, S<Prefix>SMG, S<Prefix>SCGD, S<Prefix>UACT, S<Prefix>DD1. In using views to update these system tables, having a field named DESC produces an error when the TABLEUPDATE is issued.

Security table view opened at application startup

The Security table view is now opened in the OpenAtStartup_PDS method of the application object and remains open as long as the application is running. Leaving the cursor open will reduce network traffic and connection use.

Message table view opened at application startup

The Message table view is now opened in the OpenAtStartup_PDS method of the application object and remains open as long as the application is running. Leaving the cursor open will reduce network traffic and connection use.

New Security table tag

The Security table S<Prefix>Sec has a new tag named Encrypted to help speed up the TABLEUPDATE when issued for the Security table view.

System forms no longer directly access data dictionary tables

System forms that need to access data dictionary information no longer open the data dictionary tables to retrieve that information. That information is now retrieved from the data dictionary view cursors that are open in the session object’s private data session. There are new methods of _SCREEN.oApp that are used to retrieve the information: GetDD2Record_IsParent, GetDD2Records_FKNotInPK, LoadFieldsArray_ConditionBuilder, LoadFieldsArray_Find, LoadFieldsArray_RelatedPages, LoadFieldsArray_ReportSetupOptions, LoadTagsArray_Order, LoadTVArray_ReindexPack, LoadTVArray_ReportSetupOptions.

Field names changed in the S<Prefix>DD2 table

Some of the field names in the S<Prefix>DD2 table were VFP reserved words. These have now been changed as follows (new names in parentheses): order (fld_order), label (label_ctrl), picture (input_mask), type (fld_type), width (fld_width), decimals (fld_dec), validate (val_option), default (def_expr), unique (fld_unique), message (mess_expr), when (when_expr), error (error_expr), format (fld_format).

Field names changed in the S<Prefix>DInd table

Some of the field names in the S<Prefix>DInd table were VFP reserved words. These have now been changed as follows (new names in parentheses): descending (desc_order), candidate (tag_cand), unique (tag_unique), primary (tag_prim).

Exiting to VFP

When exiting to VFP from VPM, the VPM home directory was the initial default directory in VFP. If the default directory was changed it was not possible to return to VPM. Now, when exiting to VFP, the initial default directory is the home directory of the open project and if the default directory is changed it is possible to return to VPM.

Reindex/Pack Tables form only lists local tables

The Reindex/Pack Tables form now only lists tables that can be found locally. It is assumed that tables that are in the data dictionary that can not be found locally are being accessed remotely and therefore cannot be reindexed or packed.

VPME internal class names changed

The names of the classes that are used internally within VPME have been changed so that they are different than those used by projects created in VPME. Hopefully, this will prevent the loss of the DE in forms when saving changes prior to running the form from the Form Designer.

New fields in User table

Two fields used by VPME International have been added to the User table, S<Prefix>SUSR. This will make it easier to convert existing VPME applications to VPME International. The fields are LANG_ID – C(3) and L_USERSEL – M. An index tag has also been added whose expression is LANG_ID.

New field in Application Definition table

A field used by VPME International has been added to the Application Definition table, S<Prefix>FAPD.APD. This will make it easier to convert existing VPME applications to VPME International. The field is LANG_ID – C(3).

New field in Reports table

A field used by VPME International has been added to the Reports table, S<Prefix>URPT. This will make it easier to convert existing VPME applications to VPME International. The field is TRN_RPT – L.

“f2reftable” no longer closed

The field validation routine and F2 Picklist form no longer close the lookup table/view that they open with the “f2reftable” alias. The table/view is now closed when the form where the FK is edited is closed. What this means is that you can reference in that form the “f2reftable” record found by the validation routine or selected on the F2 Picklist form.

Open Project form

The Open Project form will now display an unlimited number of previously opened projects. The previous limit was 10 projects.

PreSave and PreRestore methods now receive GETFLDSTATE(-1) parameter

The PreSave and PreRestore methods in both forms and the Business Rules object are now passed the result of GETFLDSTATE(-1) for the record being saved or restored.

Alt+F4 now used to exit the application

Ctrl+Y is no longer used as the shortcut to exit the application. Alt+F4 is now used instead. This change was made to be consistent with other Windows applications and allows Ctrl+Y to be used to add records in a BROWSE window.

Changed hot key

The hot key of the Save File As option on the File submenu has been changed from the “V” to the “A” in the word “As”. This change was made to be consistent with other Windows applications.

Editing reports and labels through the Object Builder

Reports and labels that are run from a menu option (instead of through the Report Manager) can now be edited through the Object Builder.

Selecting records on the Permission Group forms

The lFindForm_SQL_NoEntriesOK property is now set to .T. by default on the Control Permission Groups, Field Permission Groups, and Menu Permission Groups forms so that the user can simply click the OK button on the SQL Find form and view all group records. Previously, the user had to know the code of the group they wanted to view and enter it in the SQL Find form.

Displaying all records on the Permission Group forms

If the lStartWithFind property is set to .F. on the Control Permission Groups, Field Permission Groups, or Menu Permission Groups form, the form will come up displaying all records instead of the default of no records.

Error handling

The error handling routine now uses LINENO(1) instead of LINENO() to report the line number where the error occurred..

Parameters

The PCOUNT() function is now used instead of PARAMETERS() to determine the number of parameters passed to a method or function.

Product Builder

The listboxes are now wider on the mover forms brought up from the Tools->Product Builder->Directories form in VPME to allow the entire name of files with long names to be seen.

Product Builder

When the EXE is built through the Tools->Product Builder->Build EXE form, all files are now recompiled.

New index tags for data dictionary tables

In order to speed up the saving of records through the Data Builder/Manager, new index tags have been created for the PK fields of the data dictionary tables. To do this, certain fields were shortened. The tables that were affected by these changes are S<Prefix>DD1, S<Prefix>DD2, S<Prefix>DF3, S<Prefix>DIND, and S<Prefix>DRV.

Menu Permissions

When the current user’s Menu Permissions are changed, the main menu is now re-run so that the permission changes will be reflected in the menu without having to exit the application and re-enter.

Security object properties

When the current user’s record is changed on the Users form, the values that are changed are now reflected in the properties of the security object when the record is saved. Previously, the application would have to be exited and re-entered to update the security object properties.

Displaying data from “lookup views”

Textboxes that display data from a “lookup view” will now make sure that the index tag used to find a record in the view cursor is created before the SEEK is performed.

 

Bug Fixes

Topic

Description

Control Security doesn’t disable Edit button

Library Fix: After setting Control Security to disable the Edit button on the toolbar for a particular form, the button remains enabled.

Modified: VPMForms.Toolbar_All_Edit, VPMCtrls.OnForm_Toolbar_Edit

Error when Edit Mode used with listbox

Library Fix: An error occurs when using the Edit Mode on a form that contains a listbox whose lEnableDisableControl property is set to .T..

Modified: VPMForms.Form_Toolbar

Toolbar buttons disabled when not in Edit Mode

Library Fix: When not in the Edit Mode on a form that contains a grid that has focus, the toolbar buttons do not function when clicked.

Modified: VPMForms.Form_Toolbar

Combobox_ doesn’t show selected entry

Library Fix: When a combobox in a grid has focus, the selected item is not displayed. The selected item in the combobox is displayed when the combobox does not have focus but appears blank when it has focus.


Modified: VPMCtrls.Combobox_

Reindex routine doesn’t handle tables with spaces in file name

Library Fix: When a table whose file name contains a space is reindexed through the Reindex/Pack Tables form, a message is generated stating that the table cannot be opened exclusively. The table is also left with the backlink in its header modified so that it is no linger linked to its database.

Modified: S(App/VSA)URP.scx

Deleting new remote view records

Changed the DeleteRecord method of _SCREEN.oApp to pass the TABLEUPDATE function a second parameter of .T.. This allows a newly added and saved record to be immediately deleted from a remote view cursor.

Error record date and time

The routine that creates error records now makes sure that two consecutive error records are not created with the same date and time. This will ensure that the records appear in the correct order on the Errors form.

Control Builder

The Control Builder was not positioning the label correctly.

Index Tags form

The Index Tags form brought up from the Data Builder now properly handles the situation where the view name is the same as the source table name. Also, activating the List page previously generated an error.

ControlWhen method

The ControlWhen method of _SCREEN.oApp now switches to the data session of the calling form before the When expression from the data dictionary is evaluated. This is done in case the When expression references data from the form’s data session.

Creating tags for view causes error

When more than one tag was marked as “Create in Form” in the Data Builder for a view and the form that uses the view was run, an error was generated.

Error when exiting to VFP

An error occurred when the New Project Objects form was opened, closed, and then the Exit to VFP option was selected.

Error when deleting project

An error occurred when attempting to delete a project.

Data Manager removed PK Tag selection

The Data Manager was removing the PK Tag selection of views if the Remote page was activated before the Properties page.

Related Forms

Related Forms functionality was not working properly when using views in forms.

A single view-based form can now be used as a Related Forms parent form, a Related Forms child form, as well as use the SQL Find form. Even though these three functions require that the view have different parameters, those different parameters can be used in the same view. The Related Forms parent form functionality requires that a parameter named PKValue be used on the PK field (or expression). The Related Forms child form functionality requires that a parameter named ParentPKValue be used on the FK field (or expression). The SQL Find form functionality requires that parameters be used whose names start with “Find” and are followed by the field name as stored in the data dictionary. All of these parameters can be used in the same view through the use of the IIF function in the Example field on the Filter page of the View Designer. In the sample application the Benefits form (view: employee!dvsaeben_vp) uses all three types of parameters. The Employee Basic Data form (view: employee!dvsaemas_v) uses two of the three types of parameters. Note that in these views the expression in the Example field for character fields includes the null string (“”) at the beginning and end. This is done to prevent VFP from enclosing the entire expression in quotes.

Error when Related Pages form is Related Forms parent form

When a Related Pages form is a Related Forms parent form, the Parent Mode toolbar button is now disabled for a child form if on the Related Pages form a page that edits the form’s ISA is not active. An error occurred while in Parent Mode while non-ISA page was active on Related Pages form.

Condition Builder errors

Errors occurred when using the Condition Builder to set filters, perform a Group Delete, or Locate a record.

Errors on Permission Groups forms

In certain situations, an error could occur when saving and deleting records on the Menu Permission Groups, Field Permission Groups, and Control Permission Groups forms.

Error on Users form

Fixed the error that occurred when saving on the Users form.

Validation message behind form

Fixed the problem where the validation error message came up behind the form containing the value being validated.

Error editing reports

Fixed the error that occurred in the Report Builder and Report Manager in VPME when a report was edited immediately after another report was edited.

Control Permissions

It was not possible to set Control Permissions for controls on the Errors, Activity Tracking, and Audit Trail forms.

Null values

The Refresh method of the Textbox_ class did not properly handle fields containing null values.

Refreshing a grid’s record selector column

The Refresh method of a grid now won’t call the SetFocus method of the grid to update the display of the record selector column (RecordMark) if the grid is being refreshed by the Auto List (F2) functionality. An error occurred in this situation because the Auto List functionality is initiated from a control’s Valid method and you can’t call the SetFocus method from a Valid method.

Setting focus to first column

The focus was not always moved to the first column in a grid when adding a record.

Update Builder

Fixed the error that occurred when the Update Builder application updated the data in a single-record table.

Data Builder

The Data Builder now correctly places the source table name in the VIEWSRCTBL field in the S<Prefix>DD2 table for fields in views that are based on views.

 
ProMatrix Email: customerservice@promatrix.com
Copyright © 2002 - 2010. All rights reserved. ProMatrix, Visual ProMatrix and VPM are trademarks of ProMatrix. All other trademarks acknowledged.