Thursday, September 27, 2007

RoloFlex Companion #1



The first RoloFlex Companion Product *for Professional Version Only will be Launched on November 15th.

Contributed by longstanding custom app developer Garret Mott of Auto-Mate Software.

Note: Garret has done a number of custom email managers, adding in features such as disclaimer, logo as an image, signature with custom field placement capability, attachments, well... it has a lot of features. Any developer looking for a custom email attachment to their product please contact http://www.automatesoftware.com/.

Note: This is intended as a launch of companion products, both for RoloFlex, and a platform for getting your Visual DataFlex product out in a new market. Please contact http://www.applausesoftware.com/ for more details and a prototype agreement.

Thanks! Good luck to the pooch - "Rolo".

Saturday, September 22, 2007

www.RoloFlex.Biz - New Home for RoloFlex


RoloFlex: now 2 flavors:
Personal and Professional
*The professional version simply has a valid VDF client license sold for commercial/business clients.
The new home is:
And a more professional interface is coded to accomodate the release.
Regards, Peter & Kimberly Donovan

Friday, September 21, 2007

A guide to discovering the Visual DataFlex Studio


A beginner’s guide to coding a custom database application in *Visual DataFlex
by Peter A Donovan/Applause Software/Boston.

*Visual DataFlex is a trademark of Data Access Worldwide of Miami.

Overview:
Here’s a conceptual step-by-step methodology for creating your first Visual DataFlex application.
Note:
Visual DataFlex is a “transparent back end” database application studio where the same exact code runs on your choice of backend.
This overview assumes you will start with the native DataFlex backend as a starting point.
Goal:
To encourage you to try the Visual DataFlex studio for a test drive using [freeware] the Personal DataFlex edition licensed for personal but not commercial use.
This is a full studio deploy with no restrictions other than mentioned above.
Compelling Reasons:
You can most likely produce a fundamentally solid application in ½ the time as your current studio.

First, let’s assume you have the studio downloaded from http://www.visualdataflex.com/ and you are running on a 30 day eval prior to getting a license.

If you fire up the Visual DataFlex Studio, you’ve got the “order entry” sample example workspace automatically loaded for you, and the current project is “Order.src”. From this point, you should hit [F5] and the “source code = src” will compile into an executable and run. Please check out the features of the running program. This, we will code ourselves in a new “SRC” project to see how it was done.

1. From the menu, choose File-New-Project-Windows Project, and you will get a dialog asking for the .EXE name. Please type “Test” and press ok.
2. For fun, just hit [F5] and compile an executable, which you will find is a perfect MDI [multiple dialog interface] container with no functionality BUT… the button bar, menu headers, and runtime are all done.
3. Back in the Studio, let’s create a data entry program or form if you will. Click File-New-View/Report-Data Entry View Wizard, and click Ok.
4. From the wizard, click “next” on the opening page.
5. For an object name, please enter “oSalesOrder” and accept the defaults for the next 2 windows and click “next”.
6. Next page: change the radio button please to select “create a header-detail entry view” and click “next”.
7. Now, the time has come to select the CHILD table for the data entry view, so highlight “OrderDtl” and click “next”.
8. For the “header” data table, we will select “Orderhea” and click “next”.
9. Now, we select the columns “fields” to show in the data entry HEADER section, and I recommend: Choose ALL the columns from the OrderHeader table EXCEPT the last one [last detail number] and click “next”.
10. Now, we select the columns “fields” to show in the child grid below the header, and I recommend: Choose ALL the columns [except for the FIRST : ordernumber] from the detail table and click “next”.
11. Next, you get to customize the labels for each of the forms if you like, but the default has already been programmed into the datadictionary, so simply change the radio button to “right” justify the labels, and click “next”, and “Finish”.
12. Press [F5] which auto-saves and compiles your SRC into a EXE and test!


You now have a running program [under the view menu] which actually saves sales orders and detail lines. Not the most appealing visually, but structurally sound.
You will find that there are entry methods associated with some database columns, and exit methods associated with some. You MUST find a parent table record in order to save, and you MUST fill in some required fields. There’s a snazzy lookup list [expandable] for each of the associated tables, and some columns automatically are instantiated as comboforms for you automatically. A couple of small modifications later and we are on the road to deploying this. [omitted].

This is just a sample of the power of Visual DataFlex, and a few words of explanation are required to answer questions that this may have raised.


* The datadictionary for each of the tables has been pre-coded for you in this sample example.
* The datadictionary for the parent tables adjusts automatically, knowing that it is used as a parent reference, to be “find required” in an excellent display of polymorphism. The same exact table behaves differently when it is the main table for data entry, i.e. no “find required”.
* The key fields/columns of each table cannot be changed: they are protected from change via a checkbox in the datadictionary.
* The labels for each column are configured in the datadictionary so they appear consistent throughout your application.
* The lookup lists, called selection lists are assigned to a table-column in the datadictionary so they automatically appear with a prompt button with no code.
* The Order Header TOTAL automatically adds and subtracts based on what you do with the lineitems: delete/save new/change.
* The Product on_hand total automatically adds and subtracts based on what you do with the lineitems: delete/save new/change.
* For a real LASTING impression of visual dataflex, please note the quantity onhand of a lineitem product, and then CHANGE the product in the lineitem without changing the quantity. * Then, choose the lookup, and you will see that the lineitem quantity has been moved back INTO inventory for the product you changed. Note: there are about 5 lines of code in the datadictionary that make this happen!
* Now, for real fun…, place the cursor in the header section on customer and choose DELETE from the button bar. Surprise, the customer is not deleted but the entire order and all of it’s lineitems are deleted. Repeat: place the cursor on the product code column of an existing lineitem and hit DELETE. The product is not deleted, but only the lineitem.

By this point, you may be ready to give the datadictionary a once-over!
From the Studio, select Tools-Database Builder. This utility creates the CLASS that each datadictionary object [in your entry form] is based on.
From the “Open Table” pulldown, select “Order Header” and browse thru the settings. It’s extremely impressive I think in the maturity of the product.

Ok, you want to give Visual DataFlex a shot, but where do you go for help?
The Visual DataFlex newsgroup: The url is: news://news.dataaccess.com/visual-dataflex
Please introduce yourself as a new developer and we will welcome you with advice and support.

Thanks for giving Visual DataFlex a trial, and look forward to seeing you on the newsgroup!

Sincerely,
Peter A Donovan
http://www.applausesoftware.com/ of Boston, USA

The Agile Manifesto

Quick Note:

This morning, I read one of the greatest blog articles by Joe Coley of the NEDC. In a newly opened blog, Joe's article just posted features the AGILE MANIFESTO which is an incredibly poignant statement about software development philosophy.

I recommend checking in on Joe's blog as a "must read"- http://itknowledgeexchange.techtarget.com/customapps/

Joe's photo and background can also be found at:
http://www.nedataflex.com/NEDCtest1.asp?pageid=22

PS: You can become a signatory of this manifesto if you agree with it's content.

Thursday, September 20, 2007

Publising an article about Visual DataFlex



Publicity for Visual DataFlex:

I am writing this article specifically geared for Visual DataFlex developers who would like to write an article publicizing your views or information about visual dataflex...

I personally have tried to publicize VDF thru article writing, and posting to different sources, and would recommend the following strategy to anyone who would like to do the same:

In looking for publicity for Visual DataFlex and other associated products, I use this resource to locate a suitable article site:

http://www.manhattanservice.com/

Manhattan Service is a SEO optimization help site, but specifically a inner link especially for articles:

which lists [at the bottom] a number of article sites which accept free articles.

Now, from experience, I recommend 2 sites from this list:



EZine

and

Buzzle


The compelling reasons I recommend these two sites are:

[1] Will my article be formatted nicely and not cluttered with advertisements on key words within my article?
[2] Will the page rank [power to make the article stand out on google] be high enough to effectively publicize my work?
[3] Are the site underwriting standards tough enough to eliminate spam articles so that my article will not be cluttered by junk articles, AND will it stand a chance of being distributed to other article sites?
[4] Will they review and approve my article in a reasonable time frame?

Sites to avoid:
ISnare - this site effectively only publicizes when you pay and your articles will just hang in limbo until you do.

Secondary Site:
Article Factory - this site has low underwiting standards and your post will disappear in time if not popular, however they feed other channels and my article on Visual DataFlex product review got over 600 views, 21 other sites picked up the article, and it is still up and running.

Note: If you have a blog, and feature articles about Visual DataFlex in the blog, I recommend you visit www.BlogUpper.Com [a child site of Manhattan Service] for assistance there.

If you have a topic to write about, and would like to further the cause of Visual DataFlex, please consider publishing an article or more thru these channels!

Sincerely,
Peter A Donovan

Monday, September 17, 2007

RoloFlex 12.4 Released Today



RoloFlex 12.4 Released:

RoloFlex 12.4 was released today as a small upgrade to RoloFlex 12.3 which features finishing work to isolate 2 small bugs and add 4 small features.

Features Added:
  • Print List Of RoloFlex Entries
  • Print Envelope
  • Active Toolbar with more choices and data aware highlighting courtesy Peter Brooks [Australia] based on work by Vincent Oorsprong [Netherlands].
  • Color (or colour if you prefer) added to notes courtesy Nat St. Pierre [Canada].

Bugs Fixed:

  • [export all and re-import all did not function properly in all cases]

  • [print lead card was not programmed]

In addition, RoloFlex has been featured in some web articles, and is starting to be offered by some free software download sites:

http://www.freewarehome.com/index.html?http%3A//www.freewarehome.com/Business_and_Productivity/Business_Specific/Sales_t.html

and featured alongside the release of Visual DataFlex personal edition:

http://www.dataaccess.com/enews/2007/Jan_18_2007.htm

Thanks to all who contributed to this revision,

Regards,
Peter and Kimberly Donovan

Monday, September 10, 2007

Rewrite: VDF or VB? VDF Advantages


Visual DataFlex Advantages

Ref: Should I rewrite my system in VB or VDF?

Visual DataFlex (VDF)

VDF’s main advantage is speed of development. On a system that deals with large quantities of data, VB will probably require twice the coding time.

One example of this is in error handling. In VB error handling must be coded by hand.

Another example of “out of the box advantages” is the find messages of VDF. Coding “find first or last” is completely supported and coded by VDF into augmentable methods available at both the object and datadictionary class levels.

Overview: VDF is designed for data awareness in a completely scripted environment while VB is not designed as a data aware out of the box solution.

Second, VDF is completely in harmony with your current code base and data.

A conversion of DOS DataFlex to VDF can take your tried and true code and move it mostly intact into an OOPS VDF system dependably without reinventing the wheel.

A conversion of DOS DataFlex to VDF also has the advantage of being run simultaneously with DOS. You can phase the system in gradually instead of being an all out conversion. You can even use the same data tables as DOS until the conversion is complete, and then switch over to client-server when VDF passes validation and takes over the complete role from DOS.

VDF is a great front end for many databases: DataFlex, Pervasive, MySQL, DB2, Oracle, and MS SQL Server for example. The same program code will work, no matter what database you choose (or switch to).

VDF has a 30-year history as a development language designed for working with data. VB has data capability as an add-on. The first 2 versions of VB weren’t even database aware!

VDF has a light footprint. Complex systems can run tolerably well on 5+ year old computers. VB.net requires “power-user” type computers for all users to get reasonable performance.

VDF is truly Object Oriented. This type of programming makes development faster, cleaner, & more easily changed down the road. VB is “Object Based” – a partway implementation of the OOPs concept. One part of OOPs is “Classes”. These allow flexible extension of the controls that are used to display data.

· For example, suppose you want to color all fields that are indexed (& therefore can be used for finding). Add the code for doing this into the class, recompile & now every instance of every field that is indexed will be colored. In VB, this change could take weeks – finding every control & adding the code to it.
· Another major advantage to this process is centralized coding. If, for instance, you wanted to change the color assigned to the indexed fields VDF can do this by changing one centralized spot, giving both great power to your code, and also making month-to-month maintenance chores a snap rather than a huge conversion job.

VDF has Data Dictionaries. DD’s are arguably the most powerful part of VDF. All business rules & much of the custom code go here.

· The advantage? As a very basic example, say you always want the Customer Name capitalized. Set this in the Customer DD. From then on, every view, dialog, etc. that uses the Customer DD will always capitalize the Customer Name.

· Two years later, you decide to allow lower case. Go to the DD, change it there & then recompile the application. Every place that uses the Customer Name (doesn’t matter if it’s 1 place or 100) will now allow lower case.

VDF’s Interconnected Data Dictionary Rule Base:

In a VDF application, the database table rules are coded [as above] with basic and advanced business rules. Example: The customer table has a globally applied rule that says the customer can’t go over their credit limit. When you combine the customer DD along with the sales order and lineitem DD, this is what you get:
Customer

Sales Order

Lineitem

Now, when saving a new lineitem, the save operation cascades upwards to the customer table and any attempt to save a lineitem that puts them over the credit limit is denied!

VDF has interface features that make it far easier for the user:

Lookups: These are popup lists that (at the click of a button or press of a key) are set up to make finding easy. For example, to look up an order, you might show Order #, Date, Customer, Ship To, Total & Status. The user can really see what they need to do their job efficiently.

Indexing: Put the cursor in the Order # field & you can move back & forth through the table in Order # order. Put it in Order Date & you can browse by Order Date, etc. – no programming required (except creating the indices).

The VDF interface is designed for data entry:

The standard VDF application is MDI (Multiple Document Interface). This allows the user to have 2, 3 or more views of data open at a time, but the whole application can be minimized at one click of a button. It also puts menus and toolbars at the top of the application so they don’t have to be added to each view.

If your users prefer to navigate from field to field with the Enter key (instead of Tab) – add one line of code, recompile & you’re done.

Every action that you can do with a mouse, you can also do with a key or key combination. This means faster & easier entry for skilled users, while allowing the use of the mouse by users who prefer it.

VDF has backward & forward compatibility. An application written in version 9.1 will compile & run in 12.0 (5 versions later) with little or no changes to the code.

VDF pioneered teaming Windows applications with Web applications. A VDF WebApp can easily work with the same data (including the data dictionaries!) that your Windows system uses.

-End Presentation-

Publications:
Your article, "Visual DataFlex Vs Visual Basic - Visual DataFlex Advantages" - has been accepted and added to the EzineArticles.com directory:
http://EzineArticles.com/?id=731962
You've also earned Expert Author status:http://EzineArticles.com/?expert=Peter_Donovan

Subclassing SL in Visual DataFlex

Hi, while others would think it strange to hear, I have just programmed my first global variable ever and am happy with my decision! As many know, Applause Software is a North American Mfg's rep for Soft Sys which is currently negotiating a VDF 12.1 release of it's proven VDF7 verticle market product named "MASS" (Membership Administration Software Solution). This work is for that project. Much of the code design involves making all instances of a GUI standardized and centralized in coding technique.

Ref: http://www.membershipadmin.com/
Ref: Peter Brooks @ SoftSys: Info@MembershipAdmin.Com

In keeping with my best oops foundation, I have never ever coded a global variable until now. I always used client area properties to communicate between views etc.

The premise:
How to program a selection list or popup dialog to say whether the user pressed OK or not.

Many decisions, especially in views and reportviews need to know if the user changed the value in the dbform or form. Usage of onchange needs to be programmed into each and every dbform or form if this is desired, getting the value prior to forward sending prompt and getting the value after forward sending prompt. Very messy that way.

So:
My global variable is necessary because:
It's programmed into the classes which will be precompiled prior to the client area existing.
Since it's a SL value, each and every dbmodal panel would have to be non-deferred-create if the panel carried the property.

Explanation of this:
Procedure Prompt
Boolean bOk
Set pbOk of (prompt_object(self)) to false // doesn't exist yet! // error!
Forward Send Prompt
Get pbOk of (prompt_object(self)) to bOk // dialog has been destroyed // error!
End_Procedure

The gv: // [global variable]

Boolean gbOK
Contained in the TOP of the custom classes use package.
This way, if the classes are used in another program, you don't have to code the gv again.
My classes for Soft Sys based on the dbModalPanel: (special subclass for selection lists).

//============================================//
Class cSoftSysDbModalPanel is a dbModalPanel
Procedure Construct_Object
Forward Send Construct_Object
// Define new Properties:
Property Boolean pbSelectionList Public False
// Create child objects:
// Set property values:
End_Procedure

Procedure End_Construct_Object
Forward Send End_Construct_Object
// Add your code that needs to be executed at the end of the object construction here:
// This overrides the individual object settings as existed in VDF7
If (not(pbSelectionList(Self))) Set Border_Style to Border_Dialog
Else Set Border_Style to Border_Thick
End_Procedure
// Create and augment procedures and functions
Procedure Popup
Move False to gbOk
Forward Send Popup
End_Procedure
Procedure Set Label String sMyLabel
// intercepts the setting of the label, and does a language [australian to usa] translation!
Integer iPos1 iPos2
If (sMyLabel > "") Begin
If (CurrentCountry(Self) = "United States") Begin
POS "Enrol" in sMyLabel to iPOS1
POS "Enroll" in sMyLabel to iPOS2
If (iPOS1 <> iPOS2) Replace "Enrol" in sMyLabel With "Enroll"
POS "enrol" in sMyLabel to iPOS1
POS "enroll" in sMyLabel to iPOS2
If (iPOS1 <> iPOS2) Replace "enrol" in sMyLabel With "Enroll"
End
Forward Set Label to sMyLabel
End
End_Procedure
// Automatic Save_Header for dbgrids etc. built into dbView-dbModalPanel.
Function DoSaveHeader Returns Boolean
Send Request_Save_No_Clear
If (Should_Save(Server(Self))) Function_Return True
If (IsNullRowID(CurrentRowID(Server(Self)))) Begin
Error DFErr_Operator "Please Enter Info In Top Part Of Entry Form"
End
If (Err) Function_Return True
Function_Return False
End_Function
// Note: See individual topic in previous post for this function!
End_Class
//============================================//
// Note: with search and replace, I replaced the class of all SL panels with this one:
Class cSoftSysDbModalPanelSL is a cSoftSysdbModalPanel
Procedure Construct_Object
Forward Send Construct_Object
// Define new Properties:
// Create child objects:
// Set property values:
Set pbSelectionList to True
End_Procedure
Procedure End_Construct_Object
Forward Send End_Construct_Object
// Add your code that needs to be executed at the end of the object construction here:
End_Procedure
// Create and augment procedures and functions
End_Class
//============================================//
// Note: with search and replace, I replaced all instances of dbLists with this class:
Class cSoftSysDbList is a dbList
Procedure Construct_Object
Forward Send Construct_Object
// Define new Properties:
// Create child objects:
// Set property values:
Send DoDefineShadowedColorUpgradeProperties
End_Procedure

Import_Class_Protocol cSoftSysShadowedColorUpgrade

Procedure End_Construct_Object
Forward Send End_Construct_Object
// Add your code that needs to be executed at the end of the object construction here:
// These setting OVERRIDE the object settings whatever they may be!
// Makes previously coded stuff all uniform now.
Set CurrentRowColor to clYellow
Set GridLine_Mode to Grid_Visible_Both
Set peAnchors to anAll
End_Procedure
Procedure Set Header_Label Integer iColumn String sText
// Another interception of setting the label for a language translation...
If System.Label_Surname gt "" Replace "Surname" in sText with (Trim(System.Label_Surname))
Else If (CurrentCountry(Self) = "United States") Replace "Surname" in sText with "Last Name:"
Forward Set Header_Label item iColumn to sText
End_Procedure
// Create and augment procedures and functions
Procedure Ok
If (Move_Value_Out_State(Self)) Move True to gbOk
Forward Send Ok
End_Procedure
End_Class
//============================================//

So now, in effect, what I am doing with the global variable is setting it to false on popup and setting it to true upon clicking the OK button of the SL or pressing enter to select a record in the SL.

Because it's a global variable, it can be coded into the classes which are precompiled prior to the client area (on the desktop) and referred to in class code prior to the oApplication being executed to open the workspace etc.

End Result in Code: // if you need to know whether the user is getting a variable from the SL:

Object oMyForm is a cSoftSysForm // non data aware such as in a report.
Procedure Prompt
Forward Send Prompt
If (gbOk) Begin
// do whatever you need to do with the value like setting a property to govern the constraints or output options.
End
End_Procedure

//===================================//
End Article!
PAD

Sunday, September 09, 2007

SaveHeader Function: an upgrade

SaveHeader Function

Upgrade Suggested for your dbgrid's saveheader call to allow entry in them:

// DAW coded save_header function.

Function Save_Header Returns Integer
Boolean bHasRec bChanged
Handle hoSrvr

Get Server to hoSrvr // The Header DDO.
Get HasRecord of hoSrvr to bHasRec // Do we have a record?
Get Should_Save to bChanged // Are there any current changes?

// If there is no record and no changes we have an error.
If ( not(bHasRec) and not(bChanged) ) Begin // no rec
Error DfErr_Operator 'You must First Create & Save Main Order Header'
Function_Return 1
End

// Attempt to Save the current Record
// request_save_no_clear does a save without clearing.
Send Request_Save_No_Clear

// The save succeeded if there are now no changes, and we
// have a saved record. Should_save tells us if we've got changes.
// We must check the data-sets hasRecord property to see if
// we have a record. If it is not, we had no save.
Get Should_Save to bChanged // is a save still needed
Get HasRecord of hoSrvr to bHasRec // current record of the DD
// if no record or changes still exist, return an error code of 1
If ( not(bHasRec) or (bChanged)) ;
Function_Return 1
End_Function // Save_Header

// Suggested replacement for same:

Function SaveHeader Returns Boolean
Send Request_Save_No_Clear
If (Should_Save(Server(Self))) Function_Return True
If (IsNullRowID(CurrentRowID(Server(Self)))) Begin
Error DFErr_Operator "Please First Enter Info in the Order Header"
End
If (Err) Function_Return True
Function_Return False
End_Function
// Notes:
// Save Requests never save blank records so it's safe to call at any time
// We don't give an error when changes exist because the errors already have run
// We only give an error if no info was entered at all in the header
// Ref: Garret Mott's whitepaper "Software as a conversation" we say please.
// This function returns a true value for ANY error not just the one that we send.
// We always return a value in a function whether implied or not.

The second function is both less verbose and superior in both coding technique and performance to the code many software engineers have copied intact from the sample examples.

In addition, it can be dropped almost intact into a dbview subclass!

Note: Garret Mott's "Software as a conversation" can be found in the whitepaper section on http://www.nedataflex.com/ and the author can be reached at http://www.automatesoftware.com/

The author, Peter Donovan, can be found at http://www.applausesoftware.com/

Selection List Upgrade #1

Selection List Programming in Visual DataFlex

Programming a selection [lookup] list in VDF12 can be enhanced with the use of an “enter new” button that allows you to enter a new parent record, and have it “fall thru” the selection list into the data entry program or report.

The selection list has been made such an amazingly easy task by Data Access Worldwide, where a lookup (as pictured below) can be created in just a few clicks and keystrokes.

The Selection List [stock] from the Order Entry Sample Example VDF 12.1 …






















The second SL pictured is a great candidate for the addition of an “add new” button.
End result desired pictured here:












… and the add new dialog:





What follows is;

[1] The code from the Modal Dialog
[2] The code from the Selection List

(In VDF 12.1 code)

//====================================//
// dbModalPanel = Popup Dialog for entering new sales person

Use DFClient.pkg
Use SalesP.DD
Use Customer.DD
Use OrderHea.DD
Use DFEntry.pkg

Object SalepAddNewDialog is a dbModalPanel

Property Boolean pbOK
Property RowID priRowID

Object oSalesp_DD is a Salesp_DataDictionary
End_Object

Set Main_DD to oSalesp_DD
Set Server to oSalesp_DD

Set Label to "Add or Edit Sales Person"
Set Size to 83 308
Set Location to 2 2
Set Border_Style to Border_Dialog
Set Auto_Clear_DEO_State to False // no clear on save

Procedure Popup
Set pbOk to False
Send Clear of oSalesp_DD
Forward Send Popup
End_Procedure

Object oSalesP_ID is a dbForm
Entry_Item SalesP.ID
Set Location to 9 91
Set Size to 13 42
Set Label to "Sales Person ID:"
End_Object

Object oSalesP_Name is a dbForm
Entry_Item SalesP.Name
Set Location to 23 91
Set Size to 13 156
Set Label to "Sales Person Name:"
Set Label_Col_Offset to 2
Set Label_Justification_Mode to JMode_Right
End_Object

Object oOK_btn is a Button
Set Label to C_$OK
Set Location to 44 185
Set Default_State to True

Procedure OnClick
Handle hServer
RowID riRowID
Move oSalesp_DD to hServer
Send Request_Save
If (Should_Save(hServer)) Procedure_Return
If (not(Current_Record(hServer))) Begin
Send Info_Box "Please Find Or Enter A New Sales Person ~ Then Click Ok"
Procedure_Return
End
Get CurrentRowID of hServer to riRowID
Set priRowID to riRowID
Set pbOK to True
Send Close_Panel
End_Procedure

End_Object

Object oCancel_btn is a Button
Set Label to C_$Cancel
Set Location to 44 243

Procedure OnClick
Send Close_Panel
End_Procedure

End_Object

On_Key Key_Alt+Key_O Send KeyAction of oOk_btn
On_Key Key_Alt+Key_C Send KeyAction of oCancel_btn

End_Object

//====================================//
// Selection List augmented only for the add new button:

Use DFClient.pkg
Use DFSelLst.pkg
Use Windows.pkg

Use SalesP.DD
Use SalepAddNewDialog.dg

CD_Popup_Object SalesP_sl is a dbModalPanel

Set Minimize_Icon to False
Set Label to "Sales People List"
Set Size to 118 265
Set Location to 4 5
Set piMinSize to 97 174

Object SalesP_DD is a SalesP_DataDictionary
End_Object // Salesp_DD

Set Main_DD to SalesP_DD
Set Server to SalesP_DD

Object oSelList is a dbList
Set Main_File to SalesP.File_Number
Set Ordering to 1
Set Size to 71 248
Set Location to 6 6
Set peAnchors to anAll
Set pbHeaderTogglesDirection to True

Begin_Row
Entry_Item SalesP.ID
Entry_Item SalesP.Name
End_Row

Set Form_Width 0 to 40
Set Header_Label 0 to "ID"

Set Form_Width 1 to 200
Set Header_Label 1 to "Sales Person Name"

End_Object // oSelList

Object oOK_bn is a Button
Set Label to "&Ok"
Set Location to 81 97
Set peAnchors to anBottomRight
Set Default_State to True

Procedure OnClick
Send OK To oSelList
End_Procedure

End_Object // oOK_bn

Object oCancel_bn is a Button
Set Label to "&Cancel"
Set Location to 81 151
Set peAnchors to anBottomRight

Procedure OnClick
Send Cancel To oSelList
End_Procedure

End_Object // oCancel_bn

Object oSearch_bn is a Button
Set Label to "&Search..."
Set Location to 81 205
Set peAnchors to anBottomRight

Procedure OnClick
Send Search To oSelList
End_Procedure

End_Object // oSearch_bn

Object oAddNew_bn is a Button
Set Label to "&Add New"
Set Location to 81 8
Set peAnchors to anBottom

Procedure OnClick
Handle hModalDialog
Move (SalepAddNewDialog(Self)) to hModalDialog
Send Popup of hModalDialog
If (pbOk(hModalDialog)) Begin
Send FindByRowID of (Server(Self)) Salesp.File_Number (priRowID(hModalDialog))
Send Display of oSelList
Send Ok of oSelList
End
End_Procedure

End_Object

On_Key Key_Alt+Key_A Send KeyAction of oAddNew_bn
On_Key Key_Alt+Key_O Send KeyAction of oOk_bn
On_Key Key_Alt+Key_C Send KeyAction of oCancel_bn
On_Key Key_Alt+Key_S Send KeyAction of oSearch_bn

CD_End_Object // SalesP_sl

//====================================//

End Result of Code:

The code above results in a “drop-thru” of the new Sales Person entered and puts their ID/intials in the data entry view without stopping at the selection list.
By
Peter A Donovan
Applause Software
September, 2007