【问题标题】:How do i run an SQL in a CL program (AS400)如何在 CL 程序中运行 SQL (AS400)
【发布时间】:2017-01-11 19:15:45
【问题描述】:

让我先说我对 AS400 以及 RPGLE 和 CL 编程非常陌生。我对 SQL 相当了解,但在与 AS400 一起使用时就不知道了

这看起来应该很简单。

在年终,我们必须将仓库表更新为新的当年。这是一个手动过程,转到 STRSQL 并运行

 update rco set ccfscy = '2017' where crsts = 'A'

在过去的 40 年里,同一个人一直在做这件事,现在他们将在今年退休。我的老板希望它成为一个 CL 程序,无需人手动运行 STRSQL 命令即可完成所有操作,并且可以集成到年终流程中。

所有 CL 程序所要做的就是提示您也想更改仓库文件的年份,在屏幕上输入日期后,它将运行 SQL 程序并根据 SQL 命令更新记录。

有人可以指点我一个方向,让我可以了解更多关于使用 CL 程序来完成这个过程的信息吗?

谢谢。

Thomas J Cusick,系统程序员

【问题讨论】:

  • QM 查询可能是您的最佳选择。对于这样一个简单的任务,RUNSQL 也是一个不错的选择,但是 QM 查询(以及表单和过程)远远超出了 RUNSQL 的能力。熟悉 QM 会有回报。

标签: sql ibm-midrange rpgle


【解决方案1】:

假设您使用的是当前受支持的 IBM i 版本..

IBM 在几个版本前添加了 RUNSQL CL 命令...

一个完整的 CL 程序因此看起来像这样:

pgm
  runsql sql('update rco set ccfscy = ''2017'' where crsts = ''A''')
endpgm

但是如果你把年份作为参数传入就更好了……

pgm parm(&year)
  dcl &year *char 4
  dcl &stmt *char 50
  /* using &quote makes life easier than doubling quote literals */
  dcl &quote *char 1 value('''')

  chgvar &stmt value('update rco set ccfscy =' *cat &quote *cat &year *cat +
     &quote *cat 'where crsts = ' *cat &quote *cat 'A' *cat &quote)

  runsql sql(&stmt)

endpgm

【讨论】:

    【解决方案2】:

    一个使用 RPGLE 和 DDS 而不是 CL 或 QMQRY 的非常简单的示例如下所示:

    显示文件:

     A                                      INDARA
     A          R DSPLY                     WINDOW(*DFT 7 35)
     A                                      WDWTITLE((*TEXT 'Year End Process')-
     A                                       *TOP *CENTER)
     A                                      CF03(03)
     A                                  2  2'Type values, press Enter.'
     A                                      COLOR(BLU)
     A                                  4  5'Current Year :'
     A                                      COLOR(WHT)
     A            CURYR          4Y 0B  4 22EDTCDE(4)
     A  30                                  ERRMSG('Invalid Year')
     A                                  6  2'F3=Exit'
    

    角色扮演游戏

       ctl-opt Option(*SrcStmt : *NoDebugIo: *NoUnref)
               DftActGrp(*No) ActGrp(*New)
               Main(main);
    
       // display file and indicators
       dcl-f prompt Workstn Indds(Indicators);
       dcl-ds Indicators Len(99);
         F3Pressed      Ind Pos(3);
         InvalidYear    Ind Pos(30);
         Errors         Ind Pos(30) Dim(10);
       end-ds;
    
       dcl-proc main;
    
         dcl-s ContinueTransaction   Ind Inz(*On);
         dcl-s CurrentYear           Int(5) Inz(0);
    
         CurrentYear = %subdt(%date(): *YEARS);
         curyr = CurrentYear;
         dow ContinueTransaction;
           exfmt dsply;
           ContinueTransaction = *Off;
           Errors = *Off;
           select;
             when F3Pressed;
             when curyr >= CurrentYear - 1 and
                  curyr <= CurrentYear + 1;
               exec sql
                 update rco
                   set ccfscdy = :curyr
                   where crsts = 'A';
             other;
               InvalidYear = *On;
               ContinueTransaction = *On;
           endsl;
         enddo;
    
         close prompt;
         return;
       end-proc;
    

    这会将当前年份默认为提示,并在输入的年份与当前年份相差太大时提供消息。不像 QMQRY 解决方案那样快速和肮脏,但实际上也没有那么复杂,一旦你拥有它,你可以复制和更改提示、验证和 SQL,让你随心所欲。

    【讨论】:

    • 嘿,谢谢 jmarkmurphy,那里很漂亮。我必须记住...
    【解决方案3】:

    感谢查尔斯,这帮助了... 与此同时,当我的老板带着一个他真正想要的例子来找我时,我最终做了以下事情。

    首先我创建了一个 *QMQRY 类型的文件 CLD@91Q1,这个文件包含实际的 SQL 语句...

    UPDATE &amp;GWHRE.RCO SET CCFSCY = &amp;SELYEAR WHERE CRSTS = 'A'

    其次,我创建了一个调用 CLD@91Q1 查询的 XCLP

    ...
    
    /*********************************************************************/  
    /* CALL SQL TO UPDATE THE COMPANY RECORDS WITH THE CURRENT YEAR      */  
    /*********************************************************************/  
    
             CHGVAR     VAR(&SELYEAR)   VALUE(&GYEAR)                    
             STRQMQRY   QMQRY(*LIBL/CLD@91Q1) NAMING(*SYS) +             
                          SETVAR((SELYEAR &SELYEAR) (GWHRE &GWHRE))      
    ...
    

    最后我创建了 XDSPF 文件,为用户提供输入所需信息的地方。

    看起来有点复杂,但这是老板想要的,所以这就是老板得到的。

    我认为这是一个很好的练习,我可以看到在更复杂的 SQL 语句中使用这种过程。

    【讨论】:

    • 这是在 IBM 添加 RUNSQL CL 命令之前许多人使用的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2013-08-30
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多