Newsletters   Subscriptions  Forums  Store   Career  Media Kit  About Us  Contact  Search   Home 
fhg
Volume 4, Number 38 -- November 10, 2004

Executing Dynamic Calculations with Embedded SQL

by Michael Sansoterra


The code for this article is available for download.


Every so often I encounter an application where an advanced user wants the ability to maintain a formula. Further, the formula may change every so often, so that building the formulas into the program is undesirable. This is a difficult situation in the RPG world, since the RPG language has no ability to evaluate a string expression at runtime.

Here's an example:

Formula='Qty * Price * (1 + Case When Qty > 100 Then .10 Else 0 End)';

Fortunately, SQL can handle this dynamic calculation.

This calculation can be done by following these steps:

  1. Build a string containing an SQL column expression.

  2. Replace the predefined parameters in the string with their runtime values. (Users must know beforehand a list of variables they're able to use in a formula.)

  3. Embed the column expression in a SELECT statement that returns a single row.

  4. Use SQL's Prepare statement to convert the SELECT statement into an executable form.

  5. Open a cursor from the prepared SELECT statement.

  6. Fetch the data into a host variable.

  7. Close the cursor.

These steps are outlined in RPG program CALCR. The program uses subprocedure Calculator to dynamically calculate a value from a string expression. Here's a sample of how the Calculator subprocedure can be used:

/Free
    Amt=23.50;
    Qty=10;
    Expr='AMT*CASE WHEN QTY>5 THEN .1 ELSE .05 END';
    Expr=Replace(Expr:'AMT':%Char(AMT));
    Expr=Replace(Expr:'QTY':%Char(QTY));

    // Discount evaluates to 2.35  (23.50 * .01)
    Discount=Calculator(Expr);

    Amt=50.00;
    Qty=1;
    Expr='AMT*CASE WHEN QTY>5 THEN .1 ELSE .05 END';
    Expr=Replace(Expr:'AMT':%Char(AMT));
    Expr=Replace(Expr:'QTY':%Char(QTY));

    // Discount evaluates to 2.50  (50.00 * .05)
    Discount=Calculator(Expr);

/End-Free
 

There are a few things to note.

  • Typically, dynamic formulas are stored in a table, a data area, or an IFS file. The formula is only hard-coded in the sample program for the sake of illustration.

  • Any predefined variables a user might want to use will have to be available to the RPG program at calculation time.

  • Calculator's result returns a generic DEC(15,5) value. This can be expanded to fit your needs if a greater precision or scale is required. On V5R3 systems, the maximum precision has been increased to 63! For extremely large or small numbers, create a version of Calculator that returns the double data type.

  • The SQL Prepare statement is expensive, in terms of performance, so don't overuse it.

  • Any SQL column functions can be used in your expressions, such as random number generation, date calculations, trigonometric functions, and CASE expressions.

  • Any expression that returns a NULL will create an error. If you're unhappy with this behavior, it can be avoided by always using the IFNULL function to force the result to zero, or by adding an indicator variable to the program.

Sample program CALCR shows how easily these calculations can be done. Simply pass a column expression (conforming to DB2's SQL syntax) as a parameter on the command line, and watch the program return the result. The program demo can accept two substitution variables QTY (replaced by a value of 5) and AMT (replaced by a value of 23.50).


Note that the expression parameter is only 30 characters long.

CALL CALCR PARM('3+3')    /* Displays 6 */

CALL CALCR PARM('5*QTY')  /* Displays 25 */

CALL CALCR PARM('ROUND(PI() * 2,2)')  /* Displays 6.28 */

As you can see, SQL gives RPG the same power that the Eval function has given to Access, Visual Basic, VBScript, and JavaScript programmers: that is the ability to dynamically evaluate complex expressions without technical programming.


Michael Sansoterra is a programmer/analyst for i3 Business Solutions, an IT services firm based in Grand Rapids, Michigan. Click here to contact Michael Sansoterra by e-mail.

Sponsored By
LINOMA SOFTWARE

Linoma Software
Revolutionary Solutions for Your World

TRANSFER ANYWHERE - Affordable PGP Encryption & Distribution
* Secure your internet transmissions with PGP Encryption
* Automate FTP & email distributions of information
* Extract data from database systems
* Convert to Excel, XML and text formats
* Replicate records between database systems
* Connects to DB2, SQL Server, Oracle and Informix
* Runs natively on iSeries or NT
* Includes a
FREE license of Linoma's new PGP Studio to manage keys

AXES - web-enable ALL your iSeries screens with no programmer intervention and no interactive. Load & Go! Be web-enabled in less than 30 minutes.

RPG TOOLBOX - convert to RPG IV and free-form. Includes 70+ predefined SEU commands.

SURVEYOR/400 - graphically edit database files, import, export, convert spooled files to PDF, run SQL and more!

Purchase a new iSeries (upgrades are now included too) and get an IBM rebate to purchase Linoma's IBM ServerProven tools!

Get more information and download your FREE trials today at
www.linomasoftware.com.


Technical Editors: Howard Arner, Joe Hertvik, Ted Holt,
Shannon O'Donnell, Kevin Vandever
Managing Editor: Shannon Pastore
Contributing Technical Editors: Joel Cochran, Wayne O. Evans, Raymond Everhart,
Bruce Guetzkow, Marc Logemann, David Morris
Publisher and Advertising Director: Jenny Thomas
Advertising Sales Representative: Kim Reed
Contact the Editors: To contact anyone on the IT Jungle Team
Go to our contacts page and send us a message.


THIS ISSUE
SPONSORED BY:

Linoma Software
ProData Computer Svcs
WorksRight Software


BACK ISSUES

TABLE OF
CONTENTS
Executing Dynamic Calculations with Embedded SQL

Let Me Out of Here!

More Conditional Sorting with SQL


The Four Hundred
i5 Model 595: Big Bang for Big Bucks

IBM's New Customer Design Center Focuses on High Availability

Gartner Releases IT and Business Trends Through 2010

Four Hundred Stuff
Unleash the Borg: OS/400 Gets Autonomic Tooling

TeamQuest Brings Capacity Planning Tool to OS/400 Server

No More Coding for EAI? DAM Right, Says Magic

Four Hundred Monitor


Copyright © 1996-2008 Guild Companies, Inc. All Rights Reserved.
Guild Companies, Inc. (formerly Midrange Server), 50 Park Terrace East, Suite 8F, New York, NY 10034
Privacy Statement