本文内容源于 Go4AS400

简介

  AS400 Control Language(CL) 是由指令(Command)组合而成,用于控制操作和调用系统功能。在 CL 程序中,指令用于和系统 OS400 进行交互。

  以下是 CL 程序的主要功能

  • 可以交互式地调用,也可以在批量模式下调用程序
  • 决定程序的调用顺序
  • 处理文件和其他对象(objects)
  • 监控所有类型的消息
  • 在不同的任务之间通信
  • 改变对象的属性,然后进行处理

注,在 AS400 中,对象范指各种类型的概念,例如程序,文件。

尽管 CL 的功能丰富,但是它不是一个高级语言。有一些更接近高级语言的语言会调用 CL 。

有两种方法调用 CL 程序

1.  关键字表示法( Keyword notation ):可以调换传入参数的顺序,但是需要将所有传入的参数和其对应的键名称对应起来。

CPYF      FROMFILE(A)   +
TOFILE(B) +
FROMMBR(M1) +
TOMBR(M2) +
MBROPT(*ADD)

2. 位置表示法( Position notation ):根据位置依次分配传入参数和程序里的关键词

CPYF       A  +
B +
M1 +
M2 +
*ADD

CL 程序里的指令

PGM PARM (&A)

PGM 指令位于程序开始位置,可选。如果需要传入参数,则该指令是必须的

DCL, DCLF, COPYRIGHT

声明指令,用于声明程序中使用到的变量、文件,位于其他命令之前,仅在 PGM 指令后面。

CHGVAR, SNDPGMMSG, OVRDBF, DLTF...

用于处理程序中的文件、变量的操作指令

IF, THEN, ELSE, DO, ENDDO, DOWHILE, DOUNTIL, DOFOR, LEAVE, ITERATE, GOTO, SELECT, ENDSELECT, WHEN, OTHERWISE, ENDSUBR

CL 程序中的流程控制指令

%SUBSTRING (%SST), %BINARY(%BIN), %ADDRESS(%ADDR), %CAT()

内置方法,用于进行算术、关联或逻辑运算

CALL, RETURN, TFRCTL

用于转移控制权的指令

CALLPRC

转移控制权给其他 procedure

ENDPGM

结束程序指令,可选。

CL 的局限性(和 RPG 对比)

  • 无法用于添加、更新数据库文件的记录
  • 显示功能有局限
  • 无法使用程序描述文件(Program Dscribed files)
  • 不支持子文件(subfile,子文件用于展示多条记录),不过支持单一消息文件。单一消息文件是一种特殊类型的子文件
  • 无法使用子程序 (subroutines)
  • 无法定义多个对象(文件)。在 CLLE 中,可以通过 OPENID 来使用多个文件。

OPENID

OPENDID 用于标示 CL 程序中任何已打开的文件

DCLF       FILE(AMIT/ACCOUNT) OPNID(ID1)
QUALIFIED FILE NAME - AMIT/ACCOUNT
RECORD FORMAT NAME - REC1

当程序编译完后,在池文件(spool file) 里可以看到带有 ID 作为前缀的字段。因此,在 CL 中声明的字段,都是用过唯一的 open-id 为标示的。

*CAT / *BCAT / *TCAT

*CAT, 拼接两个字符串

*BCAT, 拼接两个字符串,并使两个字符串之间只保留一个空格

*TCAT, 去掉前面字符串的尾空格,然后拼接两个字符串

'String One ' *CAT 'String Two '

输出 'String One String Two '

'String One ' *BCAT 'String Two '

输出'String One String Two '

'String One ' *TCAT 'String Two '

输出 'String OneString Two '

改变指示符 (Indicator) 的值

VERIFY:
CHGVAR VAR(&IN69) VALUE('')
CHGVAR VAR(&IN91) VALUE('')
CHGVAR VAR(&F9301) VALUE(' ')
CONFIRM: +
CHGVAR VAR(&IN96) VALUE('')
CHGVAR VAR(&IN97) VALUE('')
CHGVAR VAR(&IN73) VALUE('')
SNDF RCDFMT(CAS09R90)
SNDF RCDFMT(MSGSFLC)

读取多个文件

 Columns . . . :    1  71           Browse                       AMIT/QRPGLESRC
SEU==> READDSPFCL
FMT ** ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data *************************************
0001.00 PGM
0002.00 DCLF FILE(*LIBL/ACC_DSPF)
0002.01 DCLF FILE(AMIT/ACCOUNT) OPNID(ID1)
0002.02 DCLF FILE(AMIT/CUST) OPNID(ID2)
0002.03 DCL VAR(&COUNT) TYPE(*INT) VALUE(0)
0002.04 DCL VAR(&CHAR) TYPE(*CHAR) VALUE(' ')
0003.00 READ:
0003.01 IF COND(&IN03 *EQ '0') THEN(DO)
0003.10 RCVF OPNID(ID1)
0003.12 MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END1))
0003.13 RCVF OPNID(ID2)
0003.14 MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END1))
0003.15 CHGVAR VAR(&S_ORG) VALUE(&ID1_ORG)
0003.16 CHGVAR VAR(&S_ACC) VALUE(&ID1_ACC)
0003.17 CHGVAR VAR(&S_CCY) VALUE(&ID1_CCY)
0003.18 CHGVAR VAR(&S_PARTY) VALUE(&ID1_PARTY)
0003.19 CHGVAR VAR(&COUNT) VALUE(&COUNT+1)
0003.20 CHGVAR VAR(&CHAR) VALUE(&COUNT)
0003.21 CHGVAR VAR(&S_MSG) VALUE('THIS IS RECORD NO' +
0003.22 *CAT ' ' *CAT &CHAR +
0003.23 *CAT ' ' *CAT &ID2_CSNAME)
0003.24 SNDF RCDFMT(HEADER)
0003.25 SNDF RCDFMT(FOOTER)
0003.26 RCVF RCDFMT(HEADER)
0003.27 GOTO READ
0005.10 ENDDO
0007.00 END1:
0007.01 CLOF OPNID(ID1)
0007.02 MONMSG MSGID(CPF4520)
0007.03 CLOF OPNID(ID2)
0007.04 MONMSG MSGID(CPF4520)
0007.05 /** BY USING THIS THE MSG CPF4520 WON'T APPEAR **/
0009.00 ENDPGM
****************** End of data ****************************************

输出效果

                             ACCOUNT ENTRY DISPLAY                             

                        ORG       190
ACC A00000000001
CCY EUR
PARTY P00000000001 F3 = EXIT F12 = CANCEL

调用程序,并传入参数

 CHGVAR VAR(&IPARM) VALUE(&LVLID || &ORGCODE || &RPTID || &PRINTQ-
|| &PRTQLIB || &HOLD || &SAVE || &PRIORITY || &COPIES || &LANGCODE -
|| &LPI || &CPI || &LPP || &FORM || &ALIGNMT || &EXTFID || &PRTFID ||-
&PRTPID || &REQOPT || &LPPOS) CALL PGM(CTO04R00) PARM(&IPARM)
PGM       PARM(&IPARM)
DCL &IPARM TYPE(*CHAR) LEN()
DCL &TYPE TYPE(*CHAR) LEN()
DCL &LEVLID TYPE(*CHAR) LEN()
DCL &ORGAN TYPE(*CHAR) LEN()
DCL &REPID TYPE(*CHAR) LEN()
DCL &PRTQ TYPE(*CHAR) LEN()
DCL &PRTQLB TYPE(*CHAR) LEN()
DCL &IHOLD TYPE(*DEC) LEN( )
DCL &ISAVE TYPE(*DEC) LEN( )
DCL &OUTPRI TYPE(*CHAR) LEN() CHGVAR &LEVLID %SST(&IPARM )
CHGVAR &ORGAN %SST(&IPARM )
CHGVAR &REPID %SST(&IPARM )
CHGVAR &PRTQ %SST(&IPARM )
CHGVAR &PRTQLB %SST(&IPARM )
CHGVAR &IHOLD %SST(&IPARM )
CHGVAR &ISAVE %SST(&IPARM )
CHGVAR &OUTPRI %SST(&IPARM )
CHGVAR &COPIES %SST(&IPARM )

QCMDEXC

用于执行来自 HLL 的指令。

. DCMDDSC           S            256A
. DCMDLEN S 15P
. C Eval CMDDSC='DLTDTAQ DTAQ(IROBO1/DTAQ000)'
.
. C Eval CMDLEN=%len(%trim(CMDDSC))
. C CALL 'QCMDEXC'
. C PARM CMDDSC
. C PARM CMDLEN

输出结果

IROBO1 里面的数据队列 DTAQ000 被删除

SNDF, RCVF

用于读取数据库文件。

读取数据库文件

下面是一个例子,读取并显示数据库文件内容,在读取下一行之前都会弹出提示信息

CL 程序中使用的 Physical file - CUST

 Columns . . . :                 Browse                       AMIT/QRPGLESRC
SEU==> CUST
FMT PF .....A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++
*************** Beginning of data *************************************
.
. A R CUSTR
. A CSNBR 6A
. A CSNAME 10A
. A CS#OPN 5P
. A CS$OPN 10P
****************** End of data ****************************************

CL 程序

 Columns . . . :                 Browse                       AMIT/QRPGLESRC
SEU==> READFILE
FMT ** ...+... ...+... ...+... ...+... ...+... ...+... ...+...
*************** Beginning of data *************************************
. PGM
. DCL VAR(&VAR1) TYPE(*CHAR) LEN()
. DCL VAR(&REPLY) TYPE(*CHAR) LEN() +
. VALUE('N')
. DCLF FILE(AMIT/CUST)
. READ:
. RCVF
. MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END1))
. CHGVAR VAR(&VAR1) VALUE(&CSNBR||' '|| +
. &CSNAME||' '||+
. ' ')
. SNDUSRMSG MSG('DO U WANT TO CONTINUE FILE READING') +
. MSGRPY(&REPLY) VALUES('Y' 'N')
.
. IF (&REPLY='Y') DO
. SNDUSRMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&VAR1) +
. MSGTYPE(*INFO)
. GOTO CMDLBL(READ)
. ENDDO
. ELSE DO
. GOTO CMDLBL(END2)
. ENDDO
. END1:
. SNDUSRMSG MSG('THE END OF FILE IS REACHED')
. END2:
. ENDPGM
****************** End of data ****************************************

输出结果

DO U WANT TO CONTINUE FILE READING
Y
AMI.
DO U WANT TO CONTINUE FILE READING
Y
upi.
DO U WANT TO CONTINUE FILE READING
Y
KUM.
THE END OF FILE IS REACHED

DSPMSGD

下面的例子,用于显示消息文件 AM_MSGF 里面的所有消息

DSPMSGD RANGE(*FIRST *LAST) MSGF(AMIT/AM_MSGF) DETAIL(*BASIC) OUTPUT(*PRINT)
                          Work with All Spooled Files                          

 Type options, press Enter.
=Send =Change =Hold =Delete =Display =Release =Messages
=Attributes =Work with printing status Device or Total Cur
Opt File User Queue User Data Sts Pages Page Copy
QPMSGD AMIT AMIT RDY Bottom
Parameters for options , , or command
===>
F3=Exit F10=View F11=View F12=Cancel F22=Printers F24=More keys
                                          Display Spooled File
File . . . . . : QPMSGD Page/Line /
Control . . . . . Columns -
Find . . . . . .
*...+........+........+........+........+........+........+........+........+........+.....
5722SS1 V5R4M0 Message File // :: Page
Message file . . . . . . . . . : AM_MSGF Library . . . . . . . . . . . . : AMIT
Start message ID . . . . . . . : *FIRST Ending message ID . . . . . . . : *LAST
MSGID SEV MSG
MSG0001 ORG CODE CAN NOT BE BLANK
MSG0002 THE ACCOUNT NUMBER CAN NOT BE BLANK
MSG0003 THE ACCOUNT CURRENCY CAN NOT BE BLANK
MSG0004 THE PARTY NUMBER CAN NOT BE BLANK
MSG0011 THE ORGANISATION CODE SHOULD BE EITHER OR '
MSG0012 0 THE ACCOUNT NUMBER SHOULD BE PREFIXED WITH A
MSG0013 0 THE CURRENCY CAN BE THEREE CHARACTER CODE e.g. EUR,USD,TRY etc.
MSG0014 0 THE PARTY NUMBER SHOULD START WITH PREFIX 'P'
MSG0015 0 'THE CURRENCY CAN BE'THREE'CHARACTER CODE e.g. EUR,USD,TRY etc.'
MSG0099 0 ORGANISATION CODE, ACCOUNT NUMBER , CURRENCY AND PARTY NUMBER ARE MANDATORY
* * * * * E N D O F L I S T I N G * * * * * Bottom
F3=Exit F12=Cancel F19=Left F20=Right F24=More keys

OPNQRYF

创建一个临时的文件访问路径。在使用结束后,该路径被被抛弃。详情

Logical file

Logical File 是持久化的对象,而 OPNQRYF 是临时的对象。

RETURN

CL 或 OPM 程序中的  RETURN 指令,会从调用栈(call stack)中移除该程序。

RTVJOBA

Retrive Job Attribute, 获取任务的属性。详情

RTVSYSVAL

用于获取系统值,例如系统的日期,时间,年月日,世纪等。

/* Retrieve current Timestamp (system value).                        */

              RTVSYSVAL  SYSVAL(QCENTURY) RTNVAR(&CENTURY)
CHGVAR VAR(&CENT) VALUE('')
IF COND(&CENTURY *EQ '') THEN(CHGVAR +
VAR(&CENT) VALUE(''))
RTVSYSVAL SYSVAL(QYEAR) RTNVAR(&YEAR)
RTVSYSVAL SYSVAL(QMONTH) RTNVAR(&MONTH)
RTVSYSVAL SYSVAL(QDAY) RTNVAR(&DAY)
RTVSYSVAL SYSVAL(QTIME) RTNVAR(&TIME)
CHGVAR VAR(&TIMESTAMP) VALUE(&CENT *CAT &YEAR *CAT +
&MONTH *CAT &DAY *CAT &TIME) SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('Performing Update')
CHGVAR VAR(&ERROROUT) VALUE('')
CALL PGM(PGM001) PARM(&ERROROUT &LEVEL &ORG +
&PARTY &PRCDATY &PRCDATM &PRCDATD &TIMESTAMP)

OVRDBF

用于重写 physical file 的属性。详情

CRTCMD

Create command,用于创建指令,像系统指令一样,在命令行上执行特定的请求。

[AS/400] Control Language(CL) 基本概念的更多相关文章

  1. [AS/400] Control Language

    下面是一个简单的 CL 例子,转换日期格式:从 Julian 到 MDY,或者反方向转换. 接受两个参数,日期值 IN,目标类型 TYP,将转换后的日期值存入 OUT 中. PGM (&IN ...

  2. 在CDS(Core Data Services)中使用DCL(Data Control Language)

    最近,我在玩ABAP CDS视图,并且遇到了一些权限方面的挑战.我在网上没看到有多少有关CDS开发的文档,因为它是个相当新的东西.因此,我决定写下这篇博客,也许我的想法可以帮助到一些人. 和你已经意识 ...

  3. hardware control language

    Computer Systems A Programmer's Perspective Second Edition We then provide some background on digita ...

  4. OAF_架构MVC系列4 - Control的概述(概念)

    2014-06-18 Created By BaoXinjian

  5. [综述]领域特定语言(Domain-Specific Language)的概念和意义

    领域特定语言(Domain Specific Language, DSL)是一种为解决特定领域问题而对某个特定领域操作和概念进行抽象的语言.领域特定语言只是针对某个特定的领域,这点与通用编程语言(Ge ...

  6. SAP smartforms之Zebra print control language

    因为在做个小标签的时候需要将部分字符旋转180度,在scn上找了很久也发布了自己的提问,不过最终的结果却不尽人意.Rotated text in smartforms need use the PCL ...

  7. SQL Fundamentals || DCL(Data Control Language) || 用户管理&Profile概要文件

    SQL Fundamentals || Oracle SQL语言 语句 解释 Create user Creates a user(usually performed by a DBA) Grant ...

  8. SQL Fundamentals || DCL(Data Control Language) || 角色ROLES

    SQL Fundamentals || Oracle SQL语言 语句 解释 Create user Creates a user(usually performed by a DBA) Grant ...

  9. SQL Fundamentals || DCL(Data Control Language) || 系统权限&对象权限管理(GRANT&REVOKE)

    SQL Fundamentals || Oracle SQL语言 语句 解释 Create user Creates a user(usually performed by a DBA) Grant ...

随机推荐

  1. servlet 项目 ,,启动没问题,,但是,一请求也面就报错误。。。。求解决。。。。。。。。。。。。。各种百度,都没解决了啊。。。。。急急急急急急急急急急急急急急急急急急

    信息: Server startup in 1674 mslog4j:WARN No appenders could be found for logger (com.mchange.v2.log.M ...

  2. JavaScript Window Screen

    window.screen 对象包含有关用户屏幕的信息. Window Screen window.screen对象在编写时可以不使用 window 这个前缀. 一些属性: screen.availW ...

  3. javascript 之DOM篇

    要怎么样的开场白才能使我有力气再更新学习进度呢?啊啊啊啊啊,表示好累啊~~~默念“棒棒棒,我最棒~”召唤精气神开总结敲字咯.哈哈哈. --------------------------------- ...

  4. iframe的缺点与优点?

    iframe是一种框架,也是一种很常见的网页嵌入方式. iframe的优点: iframe能够原封不动的把嵌入的网页展现出来. 如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可 ...

  5. ios开发之xcode6中如何添加pch全局引用文件

    xcode6中去掉了默认添加pch文件,这就需要我们自己手动添加pch文件了,添加pch文件是为了一些琐碎的头文件引用,加快编译速度! 下面就说下该如何手动添加pch文件: 1.添加一个文件,在oth ...

  6. meta里面的viewport属性

    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1, ...

  7. bootstrap学习--什么是bootstrap

    2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端工具集--BootStrap.Bootstrap由MARK ...

  8. js 表达式与运算符 详解(上)

    表达式: 表达式是用于JavaScript脚本运行时进行计算的式子,可以包含常量.变量.运算符 <script> var r = 2 var pi = 3.14 var circle = ...

  9. 分页插件jquery.simplePagination.js使用

    利用ecshop后台,利用插件更改分页显示样式遇到的问题,由于是利用Ajax获取数据进行页面数据更新?所以出现了以下情况: 初始化页面前 : 分页更新后: 点击后出现了分页插件内容消失, 原因:分页一 ...

  10. codevs 4163 hzwer与逆序对

    传送门 题目描述 Description hzwer在研究逆序对. 对于数列{a},如果有序数对(I,j)满足:i<j,a[i]>a[j],则(i,j)是一对逆序对. 给定一个数列{a}, ...