如何在CL程序(AS400)中运行SQL



这似乎应该很简单。

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

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

在过去的40年里,这是同一个人所做的,他们现在将于今年退休。我的老板希望这成为一个CL程序,在那里,所有这些都可以在没有人手动运行STRSQL命令的情况下完成,并且可以集成到年终流程中。

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

有人能告诉我一个方向吗?在那里我可以了解更多关于使用CL程序来完成这个过程的信息?

谢谢。

Thomas J Cusick,系统程序员

假设您使用的是当前支持的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

使用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'

RPGLE

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。

感谢Charles,这帮助了。。。与此同时,我的老板来找我,举了一个他真正想要的例子,下面是我最终做的事情。

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

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

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

...
/*********************************************************************/  
/* 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语句中使用这种过程。

相关内容

  • 没有找到相关文章

最新更新