Free Form Calcs

From MidrangeWiki
Revision as of 20:08, 31 March 2011 by David (talk | contribs) (Updated to use new highlighting engine ... which is RPG aware (CL too))
Jump to: navigation, search

One of the major new features of RPG 4, introduced in V5R1, is free form calculation specifications.

Features

  • Removes the column restrictions on calculations.
  • Can be interspersed with standard, fixed form, calcs

Usage

Using free form calculations is quite easy.

  • To start a section of free form calculations, simply put '/free' starting in column 7.
  • On the next line start your free form calculations.
  • Each line must end with a semi-colon ";".
  • Calculations can span multiple lines.
  • End the free form calculation area by putting '/end-free' starting in column 7 on the last line.

Limitations

certain opcodes have not been implemented in free form RPG. Many have been replaced with corresponding built in functions.

These include ...

  • Move operations (it is debatable as to the wisdom of not supporting these operations)
    • MOVE
    • MOVEL
    • MOVEA
    • MHHZO
    • MHLZO
    • MLHZO
    • MLLZO
  • Arithmetic operations (use free form evaluations or corresponding built in function)
    • ADD
    • SUB
    • DIV
    • MULT
    • MVR
    • XFOOT (use %XFOOT)
  • Comparison (use free form comparisons)
    • COMP
    • IFxx
    • WHENxx
  • Flow control
    • DO
    • GOTO
  • Parameters (use prototyped calls)
    • PARM
    • PLIST
  • Other
    • TESTB
    • TESTN
    • TESTZ
    • XLATE (use %XLATE)

Example

<source lang="rpg"> C if PCFRS = '*ALL' C eval #CFRSF = *BLANK C eval #CFRSH = *BLANK C else C eval #CFRSF = i_CF_Const(PCFRS) C eval #CFRSH = #CFRSF C endif

/free                                                      
 if (pMOLS = '*ALL');                                      
   eval #MOLSF = *blank;                                   
   eval #MOLSH = *blank;                                   
 else;                                                     
   eval #MOLSF = pMOLS;                                    
   eval #MOLSH = pMOLS;                                    
 endif;                                                    
/end-free                                             
    

C C#RTNS IFNE '*EXITPGM' C C#RTNS ANDNE '*RETURN' </source >