RPG

98. 入力パラメータを省略可能にするには?

複数のパラメータを持つプログラムやプロシージャーで省略可能にするにはどのようにすれば
よいのであろうか?
あるいは、あるプログラムやプロシージャーのパラメータを増やしたいのだが単純にパラメータの
数を増やしただけでは、それを呼び出して利用している既存のプログラムがパラメータの実行時の
不足エラーとなってしまう。
このような問題を解決する手法を紹介する。

それは %PARMSOPTIONS(*NOPASS) の組み合わせを利用することである。
%PARMS とは受け取りパラメータの個数を示している。
またパラメータ欄のオプションとして OPTIONS(*NOPASS) を記述することによって
そのパラメータは省略可能なものとして理解される。

ここではその例として RPGエンジンIII の SPAWN_CGI プロシージャーを紹介する。
SPAWN_CGI プロシージャーとは、任意のユーザーCGI の中から別のCGI を呼び出す
プロシージャーである。
CALL で子CGI を呼び出したのでは結果のHTMLは同じブラウザ上に表示されるが
SPAWN_CGI で子CGI を呼び出すと別の新しいブラウザが起動されて子CGI の結果
が表示される。

それはともかく SPAWN_CGI

SPAWM_CGI(子CGI名: 子CGIライブラリー名: 待機オプション: パラメータ1:パラメータ2: ... パラメータ10)

という形式である。
このとき待機オプション以下は省略可能とする。
次は RPGエンジンIII のソースの一部である。
SPAWN_CGI は C/400で書かれた別の RPGSPAWN_CGI というプロシージャーを呼び出している。

1484.00  ************************************************************  
1485.00  *   SPAWN_CGI :   子 CGI の投入                               
1486.00  ************************************************************  
1487.00  *---( SPAWN_CGI PROCEDURE  ここから )----------------------*  
1488.00 P SPAWN_CGI       B                   EXPORT                   
1489.00  *( 出力プロシージャーの定義 )                                 
1490.00 D SPAWN_CGI       PI                                           
1491.00 D  CGI                          10A   Value                    
1492.00 D  CGILIB                       10A   Value                    
1493.00 D  WAIT                          4A   Value  OPTIONS(*NOPASS)  
1494.00 D  PARM01                      256A   Value  OPTIONS(*NOPASS)  
1495.00 D  PARM02                      256A   Value  OPTIONS(*NOPASS)  
1496.00 D  PARM03                      256A   Value  OPTIONS(*NOPASS)  
1497.00 D  PARM04                      256A   Value  OPTIONS(*NOPASS)  
1498.00 D  PARM05                      256A   Value  OPTIONS(*NOPASS)  
1499.00 D  PARM06                      256A   Value  OPTIONS(*NOPASS)  
1500.00 D  PARM07                      256A   Value  OPTIONS(*NOPASS)  
1501.00 D  PARM08                      256A   Value  OPTIONS(*NOPASS)  
1502.00 D  PARM09                      256A   Value  OPTIONS(*NOPASS)  
1503.00 D  PARM10                      256A   Value  OPTIONS(*NOPASS)  
1504.00                                                                
1485.00  *   SPAWN_CGI :   子 CGI の投入                             
1486.00  ************************************************************
1487.00  *---( SPAWN_CGI PROCEDURE  ここから )----------------------*
1488.00 P SPAWN_CGI       B                   EXPORT                 
1489.00  *( 出力プロシージャーの定義 )                               
1490.00 D SPAWN_CGI       PI                                         
1491.00 D  CGI                          10A   Value                  
1492.00 D  CGILIB                       10A   Value                  
1493.00 D  WAIT                          4A   Value  OPTIONS(*NOPASS)
1494.00 D  PARM01                      256A   Value  OPTIONS(*NOPASS)
1495.00 D  PARM02                      256A   Value  OPTIONS(*NOPASS)
1496.00 D  PARM03                      256A   Value  OPTIONS(*NOPASS)
1497.00 D  PARM04                      256A   Value  OPTIONS(*NOPASS)
1498.00 D  PARM05                      256A   Value  OPTIONS(*NOPASS)
1499.00 D  PARM06                      256A   Value  OPTIONS(*NOPASS)
1500.00 D  PARM07                      256A   Value  OPTIONS(*NOPASS)
1501.00 D  PARM08                      256A   Value  OPTIONS(*NOPASS)
1502.00 D  PARM09                      256A   Value  OPTIONS(*NOPASS)
1503.00 D  PARM10                      256A   Value  OPTIONS(*NOPASS)
1504.00                                                              
1505.00 D*( RPGSPAWN_CGI   プロトタイプ宣言 )                        
1506.00 D RPGSPAWN_CGI    PR                  ExtProc('RPGSPAWN_CGI')  
1507.00 D  CGI                            *   Value                    
1508.00 D  CGILIB                         *   Value                    
1509.00 D  WAIT                           *   Value                    
1510.00 D  PRMSU                          *   Value                    
1511.00 D  PARM01                         *   Value  OPTIONS(*NOPASS)  
1512.00 D  PARM02                         *   Value  OPTIONS(*NOPASS)  
1513.00 D  PARM03                         *   Value  OPTIONS(*NOPASS)  
1514.00 D  PARM04                         *   Value  OPTIONS(*NOPASS)  
1515.00 D  PARM05                         *   Value  OPTIONS(*NOPASS)  
1516.00 D  PARM06                         *   Value  OPTIONS(*NOPASS)  
1517.00 D  PARM07                         *   Value  OPTIONS(*NOPASS)  
1518.00 D  PARM08                         *   Value  OPTIONS(*NOPASS)  
1519.00 D  PARM09                         *   Value  OPTIONS(*NOPASS)  
1520.00 D  PARM10                         *   Value  OPTIONS(*NOPASS)  
1521.00                                                                
1522.00 D YES             S              4A                            
1523.00 D PRMSU           S              3S 0                          
1524.00 D PRMC            S              3A                            
1525.00                                                                
1526.00 C     CGI           CAT       X'00':0       CGI                
1527.00 C     CGILIB        CAT       X'00':0       CGILIB                   
1528.00 C                   EVAL      PRMSU = %PARMS                         
1529.00 C                   SUB       3             PRMSU                  50
1530.00 C   50              Z-ADD     0             PRMSU                    
1531.00 C                   MOVE      PRMSU         PRMC                     
1532.00 C     PRMC          CAT       X'00':0       PRMC                     
1533.00 C                   IF        %PARMS >=3                             
1534.00 C     WAIT          CAT       X'00':0       WAIT                     
1535.00 C                   END                                              
1536.00 C                   IF        PRMSU  >=1                             
1537.00 C     PARM01        CAT       X'00':0       PARM01                   
1538.00 C                   END                                              
1539.00 C                   IF        PRMSU  >=2                             
1540.00 C     PARM02        CAT       X'00':0       PARM02                   
1541.00 C                   END                                              
1542.00 C                   IF        PRMSU  >=3                             
1543.00 C     PARM03        CAT       X'00':0       PARM03                   
1544.00 C                   END                                              
1545.00 C                   IF        PRMSU  >=4                             
1546.00 C     PARM04        CAT       X'00':0       PARM04                   
1547.00 C                   END                                              
1548.00 C                   IF        PRMSU  >=5                   
1549.00 C     PARM05        CAT       X'00':0       PARM05         
1550.00 C                   END                                    
1551.00 C                   IF        PRMSU  >=6                   
1552.00 C     PARM06        CAT       X'00':0       PARM06         
1553.00 C                   END                                    
1554.00 C                   IF        PRMSU  >=7                   
1555.00 C     PARM07        CAT       X'00':0       PARM07         
1556.00 C                   END                                    
1557.00 C                   IF        PRMSU  >=8                   
1558.00 C     PARM08        CAT       X'00':0       PARM08         
1559.00 C                   END                                    
1560.00 C                   IF        PRMSU  >=9                   
1561.00 C     PARM09        CAT       X'00':0       PARM09         
1562.00 C                   END                                    
1563.00 C                   IF        PRMSU  >=10                  
1564.00 C     PARM10        CAT       X'00':0       PARM10         
1565.00 C                   END                                    
1566.00 C*                                                         
1567.00 C                   SELECT                                 
1568.00 C                   WHEN      %PARMS = 2                   
1569.00 C                   MOVEL     '*YES'        YES                        
1570.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):   
1571.00 C                             %ADDR(YES):%ADDR(PRMC))                  
1572.00 C                   WHEN      %PARMS = 3                               
1573.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):   
1574.00 C                             %ADDR(WAIT):%ADDR(PRMC))                 
1575.00 C                   WHEN      %PARMS = 4                               
1576.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):   
1577.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01))   
1578.00 C                   WHEN      %PARMS = 5                               
1579.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):   
1580.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):   
1581.00 C                             %ADDR(PARM02))                           
1582.00 C                   WHEN      %PARMS = 6                               
1583.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):   
1584.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):   
1585.00 C                             %ADDR(PARM02):%ADDR(PARM03))             
1586.00 C                   WHEN      %PARMS = 7                               
1587.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):   
1588.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):   
1589.00 C                             %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1590.00 C                   WHEN      %PARMS = 8                                
1591.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):    
1592.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):    
1593.00 C                             %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04) 
1594.00 C                             %ADDR(PARM05))                            
1595.00 C                   WHEN      %PARMS = 9                                
1596.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):    
1597.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):    
1598.00 C                             %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04) 
1599.00 C                             %ADDR(PARM05):%ADDR(PARM06))              
1600.00 C                   WHEN      %PARMS = 10                               
1601.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):    
1602.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):    
1603.00 C                             %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04) 
1604.00 C                             %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07) 
1605.00 C                   WHEN      %PARMS = 11                               
1606.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):    
1607.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):    
1608.00 C                             %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04) 
1609.00 C                             %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07) 
1610.00 C                             %ADDR(PARM08))                            
1611.00 C                   WHEN      %PARMS = 12                               
1612.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):    
1613.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):    
1614.00 C                             %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04) 
1615.00 C                             %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07) 
1616.00 C                             %ADDR(PARM08):%ADDR(PARM09))              
1617.00 C                   WHEN      %PARMS = 13                               
1618.00 C                   CALLP     RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):    
1619.00 C                             %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):    
1620.00 C                             %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04) 
1621.00 C                             %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07) 
1622.00 C                             %ADDR(PARM08):%ADDR(PARM09):%ADDR(PARM10) 
1623.00 C                   ENDSL                                               
1624.00 C                   RETURN                                              
1625.00 P SPAWN_CGI       E                                                     
1626.00  *---( SPAWN_CGI PROCEDURE  ここまで )----------------------*