5769.23人民币人民币数字大写怎么写写

博客访问: 58888
博文数量: 14
博客积分: 1410
博客等级: 上尉
技术积分: 320
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
设置正确的模糊查询 解答 有些用户在对数据库进行中文的模糊查询的时候,发现查询结果不正确,而对英文的模糊查询完全正确。检查用户的数据库文件,发现其CCSID=836,而用户的作业CCSID=935,这样就存在一个字符集的转换,而不幸的是从836到935的转换是没有的,也不能用CHGPF进行修改。为了实现模糊查询,方法有很多,这里介绍两个:1 利用CPYF将原数据库文件复制一个副本,而副本的CCSID=935,然后再对该副本进行模糊查询。2 利用DDS建立一个数据结构完全一样的逻辑文件,对需要模糊查询的字段定义CCSID=935,对逻辑文件进行查询。
深渊野鱼 阅读(59) |
我们知道字符字段中可以包含大写字符和小写字符, 如何在SQL模糊查询中忽略对大小写字符的处理?例如: SELECT * FROM TABLENAME WHERE FIELDB LIKE 'A%', 希望得到以'A' 或 'a'开头的所有记录. 解答 使用sort sequence table可以解决此类问题. 以下将解释如何使用'SORT SEQUENCE':*系统值QSRTSEQ默认值为*HEX;*用户简要表中SRTSEQ参数默认值为*SYSVAL;*命令STRSQL和CRTSQLxxx中SRTSEQ参数默认值为*JOB.因此,通常OS/400的作业默认的sort sequence值为*HEX, 这就是说, 字符表中的每一个字符都有各自的相对顺序和权重. 例如: 字符'A'的权重为x'C1', 字符'a'的权重为x'81'. 因此任何在字符'A'和'a'之间的比较, 都认为两者不相同. 那么如果希望等同字符'A'和'a'之间的比较, 就需要将两者的权重设置为相同. 将'SORT SEQUENCE'设置为*LANGIDSHR就能达到这样的效果. 设置方法如下:
1. STRSQL2. F13 - 服务3. 1 - 改变对话属性4. 向下翻页后找到'Sort Sequence'并将其改为*LANGIDSHR5. 按两次回车键6. 运行一条SQL语句, 例如:SELECT * FROM FILE WHERE FIELD1 LIKE 'A%' 或SELECT * FROM FILE WHERE FIELD1 LIKE 'a%'7. 检查查询结果可以发现, 字段FIELD1以字符'A'和'a'开头的记录都被搜索出来.
深渊野鱼 阅读(104) |
如何在store procedure中使用动态SQL 解答 所谓动态SQL,是相对静态SQL而言的,静态SQL在编译的时候就已经知道他的全部内容了。而动态SQL脚本在编译的时候还不完整,直到执行过程中才能确定的SQL语句。在DB2/400中实现动态SQL的方式很多,但一般都采用PREPARE的方式来实现,下面是在SQLC中实现动态SQL:
EXEC SQL BEGIN DECLARE SECTION;DCL EMP CHAR(6);DCL PRJ CHAR(6);DCL SEARCH_PRJ CHAR(6); //真正的查询条件DCL ACT BINARY FIXED(15);DCL TIM DEC FIXED(5,2);DCL SELECT_STMT CHAR(200) VARYING; //定义动态SQL字符串变量EXEC SQL END DECLARE SECTION;
SELECT_STMT = .SELECT EMPNO, PROJNO, ACTNO, EMPTIME . ||.FROM EMP_ACT . ||.WHERE PROJNO = ?.; //动态查询SQL...EXEC SQL PREPARE SELECT_PRJ FROM :SELECT_STMT; //定义新的SQL Prepare StatementEXEC SQL DECLARE C1 CURSOR FOR SELECT_PRJ;EXEC SQL OPEN C1 USING :SEARCH_PRJ; //把SEARCH_PRJ的值赋给SELECT_STMT中的‘?’EXEC SQL FETCH C1 INTO :EMP, :PRJT, :ACT, :TIM;IF SQLSTATE = .02000. THEN //查询到头CALL DATA_NOT_FOUND;ELSEDO WHILE (SUBSTR(SQLSTATE,1,2) = .00.| SUBSTR(SQLSTATE,1,2) = .01.);EXEC SQL FETCH C1 INTO :EMP, :PRJ, :ACT, :TIM; //检索CURSOR的查询内容END;EXEC SQL CLOSE C1;
在Store Procedure中使用SQL的一个难题就是如何把传入的变量反映到SQL语句中,这里就必须用到动态SQL。例如:
CREATE PROCEDURE QGPL/TEST(IN file char(10),IN field char(10),INOUT max_value INTEGER)LANGUAGE SQLBEGIN atomicDECLARE stmt varchar(256);DECLARE not_found CONDITION FOR ‘02000’;DECLARE CONTINUE HANDLER FOR not_DECLARE C1 DYNAMIC SCROLL CURSOR FOR S1;SET max_value =NULL;SET stmt=‘SELECT '||field||' FROM '||file || ' ORDER BY 1';PREPARE S1 FROMOPEN C1;FETCH LAST FROM c1 INTO :max_CLOSE C1;END
利用传入的文件名和字段名把最大的纪录值作为传出参数传出来。
深渊野鱼 阅读(104) |
1.将光标移动到要进行分屏的列。2.按F21功能键,将会在屏幕上出现一条竖线。3.按F19、F20功能键,就可以将竖线左侧各列锁定,逐个察看右侧各列的数据。
深渊野鱼 阅读(55) |
如何在SQL中使用循环结构 解答 FOR,LOOP,WHILE,REPEAT是UDB/400的一种内部循环控制,用于遍历表中符合条件的每一行记录。
例如:目的:更新employee库,把所有北京籍员工的工资提高10%
例一:使用FOR循环--------------------------------------------CREATE PROCEDURE QGPL/TEST_FORLANGUAGE SQLBEGINFOR each_record AS---cur01 CURSOR FOR------SELECT * FROM code,salary,city from employee where city="Beijing"---------DO------------UPDATE employee------------SET salary=salary * 1.1------------WHERE CURRENT OF cur01;ENDFOR;END;
例二:使用LOOP循环----------------------------------------CREATE PROCEDURE QGPL/TEST_LOOPLANGUAGE SQLBEGINDECLARE code_v char(10);DECLARE salary_DECLARE city_v char(20);
DECLARE C1 CURSOR FOR---SELECT code,salary,city FROM employee WHERE city="Beijing";OPEN C1;loop_label:LOOP- FETCH C1 INTO code_v,salary_v,city_v;--IF SQLCODE=0 THEN ------SET salary_v=salary_v*1.1;------UPDATE employee SET salary=salary_v---------WHERE CURRENT OF C1;--ELSE------LEAVE loop_--END IF;END LOOP loop_CLOSE C1;END;
例三:使用WHILE循环---------------------------------------CREATE PROCEDURE QGPL/TEST_WHILELANGUAGE SQLBEGINDECLARE code_v char(10);DECLARE salary_DECLARE city_v char(20);DECLARE at_
DECLARE C1 CURSOR FOR---SELECT code,salary,city FROM employee WHERE city="Beijing";OPEN C1;
SET at_end=0;WHILE at_end = 0 DO--FETCH C1 INTO code_v,salary_v,city_v;--IF SQLCODE=0 THEN ------SET salary_v=salary_v*1.1;------UPDATE employee SET salary=salary_v---------WHERE CURRENT OF C1;--ELSE------SET at_end=1;--END IF;END WHILE;CLOSE C1;END;
例四:使用REPEAT循环------------------------------------------------CREATE PROCEDURE QGPL/TEST_REPEATLANGUAGE SQLBEGINDECLARE code_v char(10);DECLARE salary_DECLARE city_v char(20);
DECLARE C1 CURSOR FOR---SELECT code,salary,city FROM employee WHERE city="Beijing";OPEN C1;
repeat_label:REPEAT--FETCH C1 INTO code_v,salary_v,city_v;--IF SQLCODE=0 THEN ------SET salary_v=salary_v*1.1;------UPDATE employee SET salary=salary_v---------WHERE CURRENT OF C1;--END IF;--UNTIL SQLCODE0;END REPEAT repeat_CLOSE C1;END;
总结:四种循环结构实现的功能基本相同,用户可以根据自己的习惯选择使用。
深渊野鱼 阅读(427) |
在AS/400的SELECT语句中可以使用CASE表达式,它可根据表达式的内容返回不同的值,它可以简化原来需多条SQL语句实现的查询,以前用多个游标完成的统计可在一条语句中完成,以下举例加以说明。 解答 1.语法规则:Case语句--当对不同条件产生不同的结果值时,可使用Case语句。--Case语句计算所有定义的条件,并按条件是否为真而返回结果。语法如下:CASE []WHEN
THEN [ELSE ]ENDInput_expression是任何有效的SQL Server表达式或布尔表达式。When_expression是任何有效的SQL --Server表达式或布尔表达式。这个表达式和Input_expression比较,如果Input_expression没有定义,则When_expression应该是一个布尔表达式。Result_expression是任何有效的SQL Server表达式。如果When_expression和Input_expression的比较返回TRUE(如果定义了Input_expression)或When_expression的值为TRUE,则计算表达式,并返回其结果。否则计算Else_expression中的表达式,并返回其结果。2.举例说明例如:AS/400上有一个学生成绩表GRADE。要根据学生成绩生成成绩等级。
执行SQL查询,这个查询是按照学生成绩的等级进行分类,在报表中生成新的一列“grade_class”select no,grade, case when grade>=90 then 'Excellence' when grade>=70 and grade <90 then 'Good'when grade>=60 and grade <70 then 'Pass'else 'Not pass' end as grade_class from xqlib/grade
深渊野鱼 阅读(116) |
我们在AS/400上观看SQL查询结果,会因为颜色单一,无法观看具有警示形的文字,其实,是可以在SQL查询结果中加入颜色以区分不同类型的结果。 解答 1.颜色属性。为了在SQL查询结果中加入颜色,可以在SQL查询语句中加入颜色的属性。常用的颜色属性有:x'21' 反白 Reversex'22' 高亮度 HIx'23' 高亮度反白 HI reversex'28' 红色 Redx'29' 红色反白 Red reversex'2A' 闪烁 Blink
2.举例说明。现在,举例说明如何在SQL查询结果中加入颜色。有一个学生成绩表,成绩高于90分的用闪烁的红色显示;成绩在70到90之间的用红色显示;成绩在60到70之间的拥高亮显示。SQL语句如下:select no,grade, case when grade>=90 then (X'2a'||'Excellence'||X'28') when grade>=70 and grade <90 then (X'28'||'Good') when grade>=60 and grade <70 then (X'22'||'Pass') else 'Not pass' end as grade_class from xqlib/grade
深渊野鱼 阅读(79) |
如何在SQL/400中计算两日期间的天数? 解答 1. 使用DATE函数, 返回格式为'yyyymmdd'的8位数字: SELECT digits(DATE('02/01/01') - DATE('05/04/99')) FROM ....返回值为:'', 表示其间天数为1年零8个月零28天;
2. 使用DAYS函数, 返回格式为10位的数字: SELECT digits(DAYS('01/01/96') - DAYS('01/01/95')) FROM ....返回值为:'', 表示其间天数为365天;
注意: 函数DATE和DAYS的参数可以是字段名, 因此该方法也可以计算记录中某字段与某个特定日期之间的天数:SELECT digits(DAYS(field1) - DAYS('01/01/95')) FROM ....
深渊野鱼 阅读(144) |
如何取出表中前n条记录? 解答 在OS/400 V5R1M0 中,SELECT语句中新增了子句: FETCH FISRT n ROW(S) ONLY, 使用方法如下:
1. 从表t1中取符合条件的第一条记录:SELECT * FROM t1 ORDER BY age FETCH FISRT ROW ONLY;
2. 从表t1中取符合条件的前n条记录:SELECT * FROM t1 ORDER BY age FETCH FIRST 20 ROWS ONLY
深渊野鱼 阅读(57) |
利用sql参照另一个table更新当前table的数据 解答 假设要求更新a表中的a2,a3字段,条件是a1和用b表中的b1相等:
create table qgpl/a(a1 char(1),a2 char(1),a3 char(1));create table qgpl/b(b1 char(1),b2 char(1),b3 char(1));insert into qbpl/a values('1','a','b');insert into qbpl/a values('2','c','d');insert into qbpl/b values('1','0','1');
update qgpl/a as table1set (a2,a3)=(select b2,b3 from qgpl/b as table2 --==>要求检索条件必须唯一,否则set会失败where table2.b1=table1.a1))
where table1.a1 not in--------------- ==>仅修改在b表中有相同数据的a表纪录(select b1 from qgpl/b);
深渊野鱼 阅读(63) |
如何以批处理方式执行多条SQL语句? 解答
1. 在QGPL/QTXTSRC文件中增加一个成员, 把想要执行的所有语句写入其中;2. 在命令行执行: RUNSQLSTM SRCFILE(QGPL/QTXTSRC) SRCMBR(XXX).注意: (1). 成员的类型一定要指定为SQL;(2). 每条语句要以分号(;)结束;(3). 不支持SELECT语句;(4). RUNSQLSTM命令一次性执行成员中定义的所有SQL语句.
深渊野鱼 阅读(146) |
创建SQL存储过程所需要的许可程序 解答 创建SQL存储过程需要以下许可程序来支持, 否则系统会报告SQL7032的错误.
1. 操作系统R450及以前版本:5769ST1 -- DB2 UDB Query Manager and SQL Development K5769CX2 -- ILE C; -- System Openness I
2. 操作系统R510及以后版本:5722ST1 -- DB2 UDB Query Manager and SQL Development K -- System Openness I
由此可以看出, 操作系统R510开始, ILE C已经不是创建SQL存储过程的必要条件了.
深渊野鱼 阅读(32) |
SQL中的四舍五入功能 解答 在OS/400 R440版本之前,SQL不提供四舍五入函数; 从OS/400 R450版本开始,SQL提供四舍五入函数 -- ROUND。
在OS/400 R440版本之前,可以通过函数CASE 和CAST 组合编写四舍五入功能:例如:字段FLD1定义为numeric(5,3)类型,想要四舍五入到小数点后一位,则select子句可以定义成: select FLD1, case when FLD1 < 0 then cast ((FLD1 - 0.05) as decimal(5,1)) when FLD1 = 0 then 0 when FLD1 > 0 then cast ((FLD1 + 0.05) as decimal(5,1)) end from Lib/File
结果显示为:FLD1 CASE expression 12.534 12.55.230 5.26.990 7.023.500 23.576.001 76.090.000 90.015.520- 15.5-.000 .076.130- 76.1-5.500- 5.5-
在OS/400 R450版本,四舍五入函数的使用方法如下:例如:字段F1定义为numeric(5,3)类型,想要四舍五入到小数点后一位,则select子句可以定义成: SELECT f1, round(f1,1) FROM Lib/File
结果显示为:
F1 ROUND ( F1 , 1 )23.011 23.000 33.589 33.600 .000 .000 .378- .400- 5.978- 6.000-
深渊野鱼 阅读(887) |
在V5R2 OS/400的SQL中新增加了一些功能,这里介绍这些新功能之一:自动生成标识列。 解答 具体方法如下:1、在AS/400命令行输入命令STRSQL。
2、输入下列命令创建新表:create table xqlib/employee1 ( empno int generated always as identity, name char(20), salary int, bonus int )“generated always as identity”谓词用一说明empno是自动标示列。
3、用insert语句输入值:insert into xqlib/employee1(name,salary,bonus)values('bill',) 注意:用insert into语句将无法为empno列指定值。在默认情况下,该列的数值将从1开始并以1为步长递增。也可以按自己的要求来定制,如:“generated always as identity(start with 100,increment by 10)”,含义是“自动标示列以100为起始值,步长为10递增”
查看结果,如下图所示:-----------------------------------------Display Data
Position to line . . . . . ....+....1....+....2....+....3....+....4....+....5....+....6....+... ----EMPNO ----NAME --------SALARY ----BONUS --------1 ----george ------20,000 ----2,000 --------2 ----bill --------30,000 ----5,000 --------3 ----tom -------- 25,000 ----3,000 --------4 ----smith -------10,000 ----6,000 --------5 ----black -------15,000 ----5,000 --------6 ----grant -------25,000 ----5,000 --------7 ----john --------25,000 ----5,000 ******** End of data ********
图中EMPNO列为自动生成标识列。
深渊野鱼 阅读(46) |
This will delete RRN 1 thru RRN 9,999
delete from labelsbk/dds850 a where RRN(a) < 10000
深渊野鱼 阅读(31) |
S=select and O=Omit A* A R ORPPL PFILE(SROORPPL) A K OLPRDC A K OLDTIM DESCEND A K OLORNO A K OLLINE A O OLORDS COMP(EQ 60) A OLCQTY COMP(EQ 0) A S OLSTAT COMP(EQ ' ')
深渊野鱼 阅读(14) |
A R MKCRSPR PFILE(MRKCRSP) * A K SVANSQ * A S SVSYID COMP(EQ 'SUBSCRIPTIONS ') A SVATYP COMP(EQ 'SUBST') A SVLINE COMP(EQ 001) *
深渊野鱼 阅读(21) |
在實際的應用中,我們經常要檢查是否為 潤年 ?一般情況我們都通過數字計算,下面提供一種簡單的方法,跟大家分享...
指令 CVTDAT 已經知道那一年是潤年, 只要將 "0229" 與二位數字年合併成 'mmddyy' 的格式, 當成指令 CVTDAT 的 DATE 參數值, 如果指令CVTDAT 傳回錯誤訊息 "CPF0555 日期錯誤或日期格式錯誤" , 那表示此二位數字年非潤年, 如果無傳回錯誤訊息, 此二位數字年即潤年.
代码: PGM (&YEAR) DCL &YEAR *CHAR 2 DCL &MDY *CHAR 6
CHGVAR (&MDY) ('0229' *cat &YEAR) CVTDAT DATE(&MDY) TOVAR(&MDY) FROMFMT(*MDY) TOFMT(*MDY) TOSEP(*NONE) MONMSG CPF0555 EXEC(DO) SNDMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('YEAR' *BCAT &YEAR *BCAT 'is not leap year') + MSGTYPE(*COMP) RETURN ENDDO SNDMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('YEAR' *BCAT &YEAR *BCAT 'is leap year') + MSGTYPE(*COMP) ENDPGM
深渊野鱼 阅读(1005) |
作业需要一个目标之前分配目标,这样在用目标是不用再等,可保证完成所需功能,这叫目标的原县分配。可用ALCOBJ命令预先分配目标,用DLCOBJ解除分配目标是根据要他们做什么来分配的(读或者修改)和他们是否可以共享。文件和成员总是以*SHRRD来分配。而数据用规定所状态来分配锁的级别。锁状态标志使用的目标已是否可共享。有下列五个锁状态:1. *EXCL(排他)目标对请求他的作业保留排他使用。其他作业不可使用它。2.*EXCLRD(排他但允许读)目标已分配给请求他的作业,但是别的作业可以读他3. *SHRUP(共享更新)目标对其他作业共享读或更新。即另外的用户可对同一目标请求共享读锁状态或共享修改锁状态4.*SHRNUP(共享不更新)5 *SHRRD(共享更新)
深渊野鱼 阅读(25) |
/* Copy the temporary view to the incoming IFS file name. This com- *//* mand assumes that the target IFS file is a CSV (comma separted *//* variable" file and that it is to be converted to ASCII format. */
CPYTOIMPF FROMFILE(&FROMLIB/&FROMFILE) TOSTMF(&TOFILE) +MBROPT(*ADD) STMFCODPAG(*PCASCII) +RCDDLM(*CRLF)
深渊野鱼 阅读(43) |
PGM PARM(&CALL)
DCL VAR(&CALL) TYPE(*CHAR) LEN(7)DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)DCL VAR(&SLT1) TYPE(*CHAR) LEN(250) +VALUE('NOSALE *EQ %RANGE(" " " ")')
CHGVAR VAR(&TYPE) VALUE(%SST(&CALL 1 1))CHGVAR VAR(%SST(&SLT1 20 3)) VALUE(%SST(&CALL 2 3))CHGVAR VAR(%SST(&SLT1 26 3)) VALUE(%SST(&CALL 5 3))
OVRDBF FILE(RU1NOI) SHARE(*YES)
OPNQRYF FILE((RU1NOI)) QRYSLT(&SLT1) KEYFLD((NOSALE) +(NONUM))
IF COND(&TYPE *EQ 'Y') THEN(CALL PGM(APWSLSITM) +PARM(&CALL))
IF COND(&TYPE *NE 'Y') THEN(CALL PGM(APWSLSINV) +PARM(&CALL))
CLOF OPNID(RU1NOI)
DLTOVR FILE(RU1NOI)
深渊野鱼 阅读(65) |
一个程序要使用一个目标前,要加查它是否存在,你是否有权使用它。这在一个功能同时使用多个目标是很有用用CHKOBJ来检查目标存在与否。可在过程和程序的任何地方使用这个命令。
CHKOBJ OJB(库名/目标名) OBJTYPE(目标类型)MONMSG MSGID(CPF9801) EXEC(GOGO NOTFOUND)
深渊野鱼 阅读(20) |
//获取系统时间RTVSYSVAL SYSVAL(QTIME) RTNVAR(&TIME)
//系统的日期格式由系统值QDATFMT决定。初值为MDY(月日年),也可以改成YMD(年月日),DMY(日月年)或者JUL格式//JUL格式中,QDAY的值是001-366的三位字符。可以用来确定两个日期之间的天数。//可用CVTDAT命令来闪出日期分割的字符。CVTDAT的格式:CVTDAT DATE(要转换的日期) TOVAR(CL变量)FROMFMT(旧格式) TOFMT(新格式) TOSEP(新分隔符)
//SAMPLECVTDAT DATE(&DATE) TOVAR(&CVTDAT) FROMFMT(*MDY) TOFMT(*DMY) TOSEP(*SYSVAL)//JUL示例CVTDAT DATE(&DATE6) TOVAR(&DATE5)) TOFMT(*JUL) TOSEP(*NONE)//如果&QDATE6=6位 &QDATE5=5位 &QDATE6=010502 &QDATE5=02005//如果&QDATE6=8位 &QDATE5=7位 &QDATE6= &QDATE5=2002005
//Get Current Local Time (CEELOCT), to convert a date to Julian format.PGMDCL &LILDATE *CHAR LEN(4)DCL &PICTSTR *CHAR LEN(5) VALUE(YYDDD)DCL &JULDATE *CHAR LEN(5)DCL &SECONDS *CHAR 8 /* Seconds from CEELOCT */DCL &GREG *CHAR 23 /* Gregorian date from CEELOCT *//* */CALLPRC PRC(CEELOCT)   /* Get current date and time */ +PARMS (&LILDATE)    /* Date in Lilian format */ +&SECONDS     /* Seconds field will not be used */&GREG     /* Gregorian field will not be used */*OMIT    /* Omit feedback parameter so exceptions are signalled */
CALLPRC PRC(CEEDATE) +PARMS (&LILDATE) /* Today.s date */ +&PICTSTR /* How to format */ +&JULDATE /* Julian date */ +*OMITENDPGM
深渊野鱼 阅读(34) |
One example: PRINTING A SPOOL ON BOTH SIDES OF THE PAPER
Follow the Steps:
1. Create a new DTAQ by the following command: CRTDTAQ DTAQ(QGPL/ZDTAQ1) MAXLEN(64512)
2. Create a OUTQ with the following command: CRTOUTQ OUTQ(QGPL/DUPLEX) DTAQ(QGPL/ZDTAQ1)
3. Compile the following CL program after making necessary modifications to it. (You probably need to change the out queue name in the last CL command CHGPLFA)
Note 1: The program needs to be running all the time in the system. The program doesn't take any CPU resource as it waits in DEQW status until a spool file comes in the OUTQ.
Note 2: You may want to add the CALL to this program in the system startup program, so that it gets executed automatically, after every IPL.
So, from now on, whenever you need to print the spool file on the both sides of a paper, just send the spool file to the OUTQ DUPLEX instead of the regular OUTQ (PRINT01 in this case). The output will appear on PRINT01 (your actual existing OUTQ) only.
To print regular one-sided spool files simply send the spool files to PRINT01 (your actual existing OUTQ).
CL Program: /**********************************************************************/ /* Author : Ravinder K. Pal */ /* Description : Print both sides of the paper (driver) */ /**********************************************************************/ PGM DCL VAR(&FLDLEN) TYPE(*DEC) LEN(5 0) VALUE(128) DCL VAR(&FIELD) TYPE(*CHAR) LEN(128) DCL VAR(&ERR) TYPE(*CHAR) LEN(50) DCL VAR(&SPLNBR) TYPE(*DEC) LEN(9 0) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&SPLNM) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNM) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) DCL VAR(&ERR) TYPE(*CHAR) LEN(50) DCL VAR(&TNAME) TYPE(*CHAR) LEN(50) DCL VAR(&FM) TYPE(*CHAR) LEN(32) DCL VAR(&SNAME) TYPE(*CHAR) LEN( DCL VAR(&WAIT) TYPE(*DEC) LEN(5 0) LOOP: CHGVAR VAR(&WAIT) VALUE(-1) /* wait for new entry + on the data queue */ CHGVAR VAR(&FIELD) VALUE(' ') CALL PGM(QRCVDTAQ) PARM(ZDTAQ1 QGPL &FLDLEN &FIELD + &WAIT) /* Get the Spool file number for the spool file */ CHGVAR VAR(&SPLNBR) VALUE(%BIN(&FIELD 49 4)) /* Get the Job name for the spool file */ CHGVAR VAR(&JOBNM) VALUE(%SST(&FIELD 13 10)) /* Get the user ID for the spool file */ CHGVAR VAR(&USER) VALUE(%SST(&FIELD 23 10)) /* Get the Job Number for the spool file */ CHGVAR VAR(&JOBNBR) VALUE(%SST(&FIELD 33 6)) /* Get the spool file name */ CHGVAR VAR(&SPLNM) VALUE(%SST(&FIELD 39 10))
CHGSPLFA FILE(&SPLNM) JOB(&JOBNBR/&USER/&JOBNM) + SPLNBR(&SPLNBR) DUPLEX(*YES) MONMSG CPF0000 CHGSPLFA FILE(&SPLNM) JOB(&JOBNBR/&USER/&JOBNM) + SPLNBR(&SPLNBR) OUTQ(PRINT01) /* PRINT01 is used as an example. Instead of PRINT01, you will use the name of an existing OUTQ */
GOTO CMDLBL(LOOP) ENDPGM
深渊野鱼 阅读(58) |
代码: 用SQLRPGLE做行不行? SELECT * FROM systables WHERE TABLE_SCHEMA ='*你要找的LIB' 自己把systables和你放LIB的PF做个外连接就行了.然后用QCMDEXC改权限 代码: PGM PARM(&GETLIB)
DCL VAR(&GETLIB) TYPE(*CHAR) LEN(10)
DCLF FILE(DLDSES/GETLIBL4)
NEXT: RCVF RCDFMT(GETLIBL4)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END))
CHGVAR VAR(&GETLIB) VALUE(&LIBRARY)
CALL PGM(DLDSES/CHGAUT) PARM(&GETLIB)
GOTO CMDLBL(NEXT) END: ENDPGM
PGM PARM(&GETLIB)
DCL VAR(&GETLIB) TYPE(*CHAR) LEN(10)
DCLF FILE(DLDSES/WORKFILE)
DSPOBJD OBJ(&GETLIB/*ALL) OBJTYPE(*ALL) +
OUTPUT(*OUTFILE) OUTFILE(DLDSES/WORKFILE)
NEXT: RCVF RCDFMT(QLIDOBJD)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END))
GRTOBJAUT OBJ(&GETLIB/&ODOBNM) OBJTYPE(*ALL) +
USER(DLPBACKUP) AUT(*USE) REPLACE(*YES)
GOTO CMDLBL(NEXT) END: ENDPGM
深渊野鱼 阅读(35) |
Displaying a Data Area
You can display the attributes (name, library, type, length, data area textdescription), and the value of a data area. See the CL section of the Programmingcategory in the iSeries Information Center for a detailed description of theDisplay Data Area (DSPDTAARA) command.
The display uses the 24-digit format with leading zeros suppressed.
Changing a Data Area
The Change Data Area (CHGDTAARA) command changes all or part of the valueof a specified data area. It does not change any other attributes of the data area.The new value can be a constant or a CL variable. If the command is in a CLprocedure, the data area does not need to exist when the program is created.
Retrieving a Data Area
The Retrieve Data Area (RTVDTAARA) command retrieves all or part of aspecified data area and copies it into a CL variable. The data area does not need toexist at compilation time, and the CL variable need not have the same name as thedata area. Note that this command retrieves, but does not alter, the contents of thespecified data area.
Retrieve Data Area ExamplesExample 1
Assume that you are using a data area named ORDINFO to track the status of anorder file. This data area is designed so that:* Position 1 contains an O (open), a P (processing), or a C (complete).* Position 2 contains an I (in-stock) or an O (out-of-stock).* Positions 3 through 5 contain the initials of the order clerk.
You would declare these fields in your procedure as follows:DCL VAR(&ORDSTAT) TYPE(*CHAR) LEN(1)DCL VAR(&STOCKC) TYPE(*CHAR) LEN(1)DCL VAR(&CLERK) TYPE(*CHAR) LEN(3)
To retrieve the order status into &ORDSTAT, you would enter the following:把数据区的内容复制到一个CL变量中RTVDTAARA DTAARA(ORDINFO (1 1)) RTNVAR(&ORDSTAT)
修改数据区CHGDTAARA
生成一个数据区CRTDTAART
删除一个数据区DLTDTAARA
显示一个数据区DSPDTAARA
远程数据区可用DDM来访问远程数据区,在一个AS400上的应用程序要修改或取得在远程AS400的数据区只需要作如下的一个操作即可删除标准数据区,再生成一个与其同名的DDM数据区,把标准数据区改名生成DDM数据区CRTDTAARA DTAARA(LOCALLIB/DDMDTAARA) TYPE(*DDM)RMTDTAARA(REMOTELIB/RMTDTAARA) RMTLOCNAME(SYSTEMB)TEXT('DDM data ara to access data area on SYSTEMB')要在CL程序中使用远程AS400的数据区,用RTVDTAARA命令,规定DDM数据区的名字把当前值放到程序变量中。如果修改之后,要把它放回远程数据区,用CHGDTAARA命令,在其中规定一个DDM数据区
深渊野鱼 阅读(45) |
可以编写一个CLP程序实现统计某台AS/400中有多少个library,程序的内容如下:程序名:countlib,类型:CLP。FMT ** ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...*************** Beginning of data **************************0001.00 PGM 0002.00 DSPOBJD OBJ(*ALL) OBJTYPE(*LIB) OUTPUT(*OUTFILE) + 0003.00 OUTFILE(XQLIB/OUTPUTS) 0004.00 RUNQRY QRYFILE((XQLIB/OUTPUTS)) OUTTYPE(*PRINTER) + 0005.00 OUTFORM(*SUMMARY) 0006.00 ENDPGM ****************** End of data *****************************编译,执行后,生成一个SPOOL FILE,名称为:QPQUPRFIL,可以用WRKSPLF查看。*..+..1..+..2..+..3..+..4..+..5..+..6..+..7..+..8..+..9FILE LIBRARY MEMBER FORMAT OUTPUTS XQLIB OUTPUTS QLIDOBJD DATE . . . . . . . . 12/20/03 TIME . . . . . . . . 14:33:30 12/20/03 14:33:30 PAGE 1 FINAL TOTALS COUNT 303 * * * E N D O F R E P O R T * * * 结果显示系统中有303个library。
深渊野鱼 阅读(30) |
问题: 能否用 CL 命令将一个 LIB 中的所有 OBJ 名称和类型输出到一个物理文件 (PF) 中去,以便程序读取处理?
答案: 可以, 你可以用 CL 命令 DSPOBJD,例如将 mylib 中的所有对象属性输出到 outlib 库下面的 PF myoutf 文件中,可运行下面命令: DSPOBJD OBJ(mylib/*ALL) OBJTYPE(*ALL) OUTPUT(*OUTFILE) OUTFILE(outlib/myoutf).
深渊野鱼 阅读(23) |
如何在程序中获取系统ASP使用率等系统状态信息
AS/400系统管理员都对系统ASP空间增长情况很关心,当系统ASP 空间涨满了以后将会引起系统DOWN机等安全问题。系统ASP空间与硬盘空间并不完全等同,如果系统只配置了一个ASP分区,那么系统ASP空间与硬盘空间是等同的,如果系统配置了多个ASP分区,则系统ASP只是ASP 1的分区。用WRKSYSSTS命令查看到的% system ASP used就是表示系统ASP空间的使用率。
与系统ASP空间使用率有关的系统值有两个:QSTGLOWLMT和QSTGLOWACN。QSTGLOWLMT系统值设定了最小硬盘空间警告线百分比,比如设定为5,即表示系统ASP使用率达到95%,即引起安全动作,安全动作由系统值QSTGLOWACN设定。
能不能在程序中自动获取系统ASP使用率,这样当硬盘空间达到危险值时,由程序提前报警呢?或者在程序中自动执行一些安全动作,比如自动清理一些过时的文件,或停止某些程序运行,以降低系统ASP使用率?
OS/400 系统提供了一个叫QWCRSSTS的API函数,该函数功能就可以提取用WRKSYSSTS命令看到的系统状态信息,还可以提取更多的用 WRKSTSSTS命令看不到的一些其他系统信息。可以在RPG、C、CL等程序里调用该API以获取系统信息。该函数的详细使用说明可以参看《System API Reference》这本书。
下面我用一个实际获取系统ASP使用率的CL程序做例子,来看看如何使用QWCRSSTS。
QWCRSSTS 共有五个入口参数,第一个参数是接受返回系统状态信息的输出参数,存放的是返回系统状态信息块。该系统状态信息块是按照一定结构来存放各种系统状态信息的。第二个参数是输入参数,指定第一个接受系统状态信息块变量的长度,类型为Binary。第三个参数是指定第一个参数系统状态信息块中的系统信息存放结构名,共有三种不同的结构可选,分别是:SSTS0100、SSTS0200、SSTS0300。第四个参数是表示是否重新设置状态统计,通常我们选 *YES。第五个参数是错误码。
在本示例CL程序中,指定使用SSTS0200系统状态信息结构。该结构中53-57位存放的就是% system ASP used。该值除上10000,就是正常百分比。在程序中先是提取QSTGLOWLMT系统值,指定100-QSTGLOWLMT-2为程序警告线,比如 QSTGLOWLMT如果设为5,那么当系统ASP到93%的时候,程序会向用户发出一个消息。同时把ASP状态返回值设为1,以供其他程序调用,当调用程序判断ASP状态返回值为1的时候,就知道系统ASP空间利用率到了警告线,需要执行一些安全动作了。
/*===================================================================*/ /*      */ /*-----------------------------------------------------------------------------------------------------------------*/ /* PROGRAM NAME : MONASP */ /* CREATED BY : BLOG LIOU */ /* CREATED DATE :
*/ /* DESCRIPTION : Monitor ASP Used */ /* MonASPPer: (100-STGLOWLMT)-2 */ /*===================================================================*/ PGM PARM(&ASPFLAG) DCL VAR(&ASPFLAG) TYPE(*CHAR) LEN(1) DCL VAR(&FORMAT) TYPE(*CHAR) LEN( + VALUE('SSTS0200') DCL VAR(&LENFLD) TYPE(*CHAR) LEN(4) + VALUE(X'') DCL VAR(&SYSNAM) TYPE(*CHAR) LEN( DCL VAR(&SYSUSEC) TYPE(*CHAR) LEN(4) DCL VAR(&SYSUSE) TYPE(*DEC) LEN(9 2) DCL VAR(&SYSINFO) TYPE(*CHAR) LEN(6 DCL VAR(&ERRCODE) TYPE(*CHAR) LEN( + VALUE(X'0000') DCL VAR(&RESETSY) TYPE(*CHAR) LEN(10) VALUE(*YES) DCL VAR(&QMNPER) TYPE(*DEC) LEN(9 2) VALUE(1000000) DCL VAR(&QALARM) TYPE(*DEC) LEN(9 2) VALUE(20000) DCL VAR(&STGLOWLMT) TYPE(*DEC) LEN(9 2) DCL VAR(&SNDMSG) TYPE(*CHAR) LEN(10)
CHGVAR VAR(&ASPFLAG) VALUE('0') RTVSYSVAL SYSVAL(QSTGLOWLMT) RTNVAR(&STGLOWLMT) CHGVAR VAR(&STGLOWLMT) VALUE(&STGLOWLMT * 10000) CHGVAR VAR(&QMNPER) VALUE(&QMNPER - &STGLOWLMT) CHGVAR VAR(&QMNPER) VALUE(&QMNPER - &QALARM)
CALL PGM(QWCRSSTS) PARM(&SYSINFO &LENFLD &FORMAT + &RESETSY &ERRCODE) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERREND)) CHGVAR VAR(&SYSUSEC) VALUE(%SST(&SYSINFO 53 4)) CHGVAR VAR(&SYSUSE) VALUE(%BINARY(&SYSUSEC)) CHGVAR VAR(&SYSNAM) VALUE(%SST(&SYSINFO 17 ) IF COND(&SYSUSE > &QMNPER) THEN(DO) CHGVAR VAR(&SNDMSG) VALUE(&SYSUSE) SNDPGMMSG MSG(&SYSNAM *BCAT ' - (ASP USED + PERCENT)*10000 = ' *BCAT &SNDMSG) + TOMSGQ(SMDOB) SNDPGMMSG MSG('*****SYSTEM OVER MonASP !!! ') + TOMSGQ(MYUSER) MSGTYPE(*INFO) CHGVAR VAR(&ASPFLAG) VALUE('1') ENDDO GOTO CMDLBL(END)
ERREND: SNDPGMMSG MSG(' ERROR ON QWCRSSTS CALL') + TOMSGQ(MYUSER) MSGTYPE(*INFO) END: ENDPGM
该程序也可以与某些报警程序连起来使用,比如当系统ASP空间达到警告线后,程序调用某些拨号程序,就可以给系统管理员手机发短信息等。
如果再设计一个显示文件,把QWCRSSTS获取到的系统状态信息,比如系统ASP使用率、CPU使用率、系统出现Message进程数,都显示出来,我们就实现了一个系统状态信息的监视工具。 
深渊野鱼 阅读(56) |
一 如何在CL程序自动回复询问类消息(Inquiry Message)
在AS/400系统开发中,经常要与各种各样的消息打交道。有一类叫“Escape Message”的消息,是当程序出现错误后,会强迫程序异常结束,并告诉错误类型和原因。但经常时候我们不希望因为这些错误而使程序异常停止,在CL程序中,通常做法是用MONMSG命令来监视这些消息,而后采取相应的正确动作,或者引导程序结束。MONMSG一样还可以监视“Status Message”和“Notify Message”。
但是有一类“Inquiry Message”,MONMSG还是无法监视,这类消息通常有多个回复选择项,要求用户必须给一个选择答复,因而通常会暂停程序运行,而显示一个要求用户给消息进行回复的画面。那么如何在程序中让程序自动选择一个正确的回复项回复呢?如能自动答复,就不需要手工再回复了。
在作业JOBD 里,有INQMSGRPY选择项,有三个选择:*RQD,*DFT,*SYSRPYL,这个INQMSGRPY就是表示指定Inquiry Message的答复方式,通常创建JOBD的时候INQMSGRPY项缺省是*RQD,这就表示需要操作员手工答复方式。而*DFT和*SYSRPYL 就表示了两种程序可以自动答复的方式。
1. 消息答复缺省值法
如果在作业JOBD里INQMSGRPY选项指定为*DFT方式,则程序会自动使用消息的缺省答复项,询问消息就不会再在屏幕上显示。消息的缺省答复项,可以用CHGMSGD命令事先手工改好,也可以在程序中加入。比如下面的命令可以先在程序中设定:
CHGMSGD MSGID(CPA3E01) MSGF(QCPFMSG) DFT(G)
此语句表示修改QCPFMSG消息文件中的CPA3E01消息的缺省答复为’G’(表示继续执行)。
2. 系统答复列表法
如果在作业JOBD里INQMSGRPY选项指定为*SYSRPYL方式,则程序会自动使用系统答复列表中定义的答复项。AS/400系统有一系统答复列表 (System Reply List)。System Reply List允许用户指定某已定义在列表中消息的答复方式。System Reply List包含有序号、消息表示符、答复值、选择比较数据等。可以用WRKRPYLE命令查看System Reply List的所有内容。下面就是用WRKRPYLE命令查看到的内容:
2=Change 4=Delete
Sequence Message Opt Number ID Reply Compare Value - 10 CPA0700 D *NONE - 20 RPG0000 D *NONE - 30 CBE0000 D *NONE - 40 PLI0000 D *NONE - 50 CPF7025 I *NONE - 60 CPA3E01 G *NONE - 1111 CPA3708 G *NONE
可以用ADDRPYLE命令把你自己要定义的消息及缺省答复值加入。注意加入的时候Sequence Number项不能跟System Reply List已存在的重复。
但是用系统答复列表法有个缺陷,那就是把ADDRPYLE命令加入到程序中不方便,因为System Reply List里的Sequence Number要求唯一,所以不能重复加入。而且当程序移到不同机器运行时,还必须把消息缺省答复重新加入 System Reply List。
除了在JOBD可以指定消息答复方式外,还可以用BCHJOB和SBMJOB提交作业时在INQMSGRPY选择项里指定消息回复类别。BCHJOB和 SBMJOB命令将会覆盖JOBD的答复方式。如果使用缺省答复方式和SBMJOB命令结合,可以先编一CL程序,就可以做到自动回复与机器和JOBD无关性,例子如下:
CHGMSGD MSGID(CPA3E01) MSGF(QCPFMSG) DFT(G) SBMJOB CMD(CALL PGM(SMCRTRDBCL)) JOB(SMCRTRDBCL) + INQMSGRPY(*DFT)
深渊野鱼 阅读(29) |
有时候无法通过TELNET、PC5250登录到AS/400,在这中情况下,在FTP命令行执行AS/400命令变得非常有用。具体步骤如下: 解答 1.启动FTP会话窗口,输入用户名、口令。2.在FTP会话的命令行输入QUOTE RCMD 'command',就可以向OS/400 FTP服务器服务发送命令。
例如:想要AS/400执行CHGCURLIB TESTLIB命令,只要在FTP会话的命令行输入QUOTE RCMD CHGCURLIB TESTLIB 就可以完成操作
深渊野鱼 阅读(86) |
用户在删除IFS中的文件时,系统返回错误信息:CPFA0A9 - Object not found,检查后发现文件名含不可读的无效字符,无法正常删除。 解答 此时可利用文件通配符-‘*’,其代表任何数量的任何字符。 例在 /TESTUNI 下有文件abnorm&&(&&代表不可读的无效字符),可用下述命令:RMVLNK OBJLNK('/TESTUNI/abnorm*')
以abnorm带头的文件名的文件即被删除。
深渊野鱼 阅读(125) |
/*------------------------------------------------------------*//* *//* List all members in a source file and Read through *//* the list using CLP. Then count them-why ask why???? *//* *//*------------------------------------------------------------*/PGM
/*----------------------------------------*//* Declare vaiable count and the file *//* we use IBM supplied file QAFDMBRL *//* because our file *//* will only exist in QTEMP and when you *//* go to recompile this later you will *//* need it. *//*----------------------------------------*/DCL VAR(&COUNT) TYPE(*DEC) LEN(5 0)DCL VAR(&CHRCOUNT) TYPE(*CHAR) LEN(5)DCLF FILE(QAFDMBRL)
/*----------------------------------------*//* List all members in the IBM source *//* file QSYSINC/QRPGLESRC. *//*----------------------------------------*/DSPFD FILE(QSYSINC/QRPGLESRC) TYPE(*MBRLIST) +OUTPUT(*OUTFILE) OUTFILE(QTEMP/WORKFILE)
/*----------------------------------------*//* Override to our file in QTEMP *//*----------------------------------------*/OVRDBF FILE(QAFDMBRL) TOFILE(QTEMP/WORKFILE)
/*----------------------------------------*//* RCVF = Read *//* Monitor for end of file message. *//*----------------------------------------*/LOOP: RCVFMONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(EXIT))
CHGVAR VAR(&COUNT) VALUE(&COUNT + 1)CHGVAR VAR(&CHRCOUNT) VALUE(&COUNT)
/*----------------------------------------*//* Go back and read another record *//*----------------------------------------*/GOTO CMDLBL(LOOP)
/*----------------------------------------*//* Display the final count and leave *//*----------------------------------------*/EXIT: SNDPGMMSG MSG('The total members in source file +QSYSINC/QRPGLESR is :' || &CHRCOUNT)DLTOVR FILE(*ALL)ENDPGM
深渊野鱼 阅读(23) |
The substring built-in function (%SUBSTRING or%SST) produces a character stringthat is a subset of an existing character string and can only be used within a CLprocedure. In a CHGVAR command, the %SST function can be specified in place ofthe variable (VAR parameter) to be changed or the value (VALUE parameter) towhich the variable is to be changed. In an IF command, the %SST function can bespecified in the expression.The format of the substring built-in function is:%SUBSTRING(character-variable-name starting-position length)or%SST(character-variable-name starting-position length)
The following are examples of the substring built-in function:If the first two positions in the character variable &NAME are IN, the programINV210 is called. The entire value of &NAME is passed to INV210 and the valueof &ERRCODE is unchanged. Otherwise, the value of &ERRCODE is set to 99.
DCL &NAME *CHAR VALUE(INVOICE)DCL &ERRCODE *DEC (2 0)IF (%SST(&NAME 1 2) *EQ 扞N? +THEN(CALL INV210 &NAME)ELSE CHGVAR &ERRCODE 99
If the first two positions of &A match the first two positions of &B, the programCUS210 is called.
DCL &A *CHAR VALUE(ABC)DCL &B *CHAR VALUE(DEF)IF (%SST(&A 1 2) *EQ %SUBSTRING(&B 1 2)) +CALL CUS210
Position and length can also be variables: This example changes the value of &Xbeginning at position &Y for the length &Z to 123.
CHGVAR %SST(&X &Y &Z)&
If &A is ABCDEFG before this CHGVAR command is run, &A is
CHGVAR %SST(&A 2 3)&
深渊野鱼 阅读(32) |
用CONTROL LANGUAGE实现:根据给定的日期生成星期几。 解答 源代码如下:程序名:WEEK2类型:CLP
PGM (&Date)
DCL --&Date ------*Char -10DCL --&LDateB ----*Char --4 --/* Binary */DCL --&LDateN ----*Dec --15 0 /* Decimal*/DCL --&DAYARRAY --*CHAR -63 +------- --('Sunday Monday Tuesday +------- --WednesdayThursday Friday Saturday ')DCL --&IndexB ----*Char --4 --/* Binary */DCL --&IndexN ----*Dec --15 0 /* Decimal*/DCL --&Start -- --*Dec --15 0 /* Decimal*/DCL --&DayOfWeek -*Char --9DCL --&Msg -------*Char 100
DCL --&msgid -----*CHAR 7DCL --&msgf ------*CHAR 10DCL --&msgflib -- *CHAR 10DCL --&msgdta ----*CHAR 100
MONMSG -CEE0000 -EXEC(GOTO ERROR)MONMSG -CPF0000 -EXEC(GOTO ERROR)
CALLPRC 'CEEDAYS' (&Date ------+------------------'MM/DD/YYYY' +------------------&LDateB -----+------------------*OMIT)
CALLPRC 'CEEDYWK' (&LDateB +------------------&IndexB -+------------------*OMIT)
CHGVAR &IndexN ---%BIN(&IndexB)CHGVAR &Start ----(&IndexN * 9 - 8)CHGVAR &DayOfWeek %SST(&DayArray &Start 9)
SNDPGMMSG MSG(&DATE > 'Falls on' > &DAYOFWEEK < +------------'.') TOPGMQ(*PRV *PGMBDY)
/* Error processing routine ------------*/
ERROR: RCVMSG MSGTYPE(*LAST) -------- +--------------MSGDTA(&msgdta) ------- +--------------MSGID(&msgid) ---- ---- +--------------MSGF(&msgf) ----------- +--------------SNDMSGFLIB(&msgflib)----/* Prevent loop, just in case */-------MONMSG ----CPF0000------ SNDPGMMSG -MSGID(&msgid) -- -- +------------------MSGF(&msgflib/&msgf)+------------------MSGDTA(&msgdta) ----+------------------MSGTYPE(*ESCAPE)----/* Prevent loop, just in case */-------MONMSG CPF0000
------ ENDPGM
执行结果:CALL WEEK2 '09/05/2003'
09/05/2003 Falls on FRIDAY.
深渊野鱼 阅读(34) |
IF (&A=&B) THEN(CALLPRC PROCA)ELSE CMD(CALLPRC PROCB)CHGVAR &C 8
IF ... THEN ...IF ...THEN(DO)IF ...THEN(DO)...ENDDOELSE DOIF ...THEN(DO)...ENDDOELSE DO...ENDDOENDDOELSE IF ... THEN ...IF ... THEN ...IF ... THEN ...
深渊野鱼 阅读(12) |
可用RTOBJD命令取某个目标的描述返回给CL过程,用变量来返回描述,也可以用这些描述帮助你确定没有用的目标。也可以用QUSRJOBD API来返回目标描述也是用变量返回的。DSPOBJDDCL &LIB TYPE(*CHAR) LEN(10)DCL &CRTDATE TYPE(*CHAR) LEN(13)DCL &USEDATE TYPE(*CHAR) LEN(13)DCL &USECNT TYPE(*DEC) LEN(5 0)DCL &RESET TYPE(*CHAR) LEN(13)...RTVOBJD OBJ(MYLIB/MOBJ) OBJTYPE(*FILE) RTNLIB(&LIB)CRTDATE(&CRTDATE) USEDATE(&USEDATE)USECOUNT(&USECNT) RESETDATE(&RESET)The following information is returned to the program:v The current library name (MYLIB) is placed into the CL variable name &LIB.v The creation date of MOBJ is placed into the CL variable called &CRTDATE.v The date that MOBJ was last used is placed into the CL variable called&USEDATE.v The number of days that MOBJ has been used is placed into the CL variablecalled &USECNT. The start date of this count is the value placed into the CLvariable called &RESET.
深渊野鱼 阅读(11) |
RTVNET可以取得网络属性,这些属性可以在CHGNETA修改,用DSPNETA显示PGM DCL VAR(&OUTQNAME) TYPE(*CHAR) LEN(10)DCL VAR(&OUTQLIB) TYPE(*CHAR) LEN(10)RTVNETA OUTQ(&OUTQNAME) OUTQLIB(&OUTQLIB)CHGNETA OUTQ(QGPL/QPRINT)..............CHGNETA OUTQ(&OLIB/&OUTQNAME)ENDPGM
深渊野鱼 阅读(10) |
In the following CL procedure, a RTVMBRD command retrieves the description of aspecific member. Assume a database file called MFILE exists in the current library(MYLIB) and contains 3 members (AMEMBER, BMEMBER, and CMEMBER).DCL &LIB TYPE(*CHAR) LEN(10)DCL &MBR TYPE(*CHAR) LEN(10)DCL &SYS TYPE(*CHAR) LEN(4)DCL &MTYPE TYPE(*CHAR) LEN(5)DCL &CRTDATE TYPE(*CHAR) LEN(13)DCL &CHGDATE TYPE(*CHAR) LEN(13)DCL &TEXT TYPE(*CHAR) LEN(50)DCL &NBRRCD TYPE(*DEC) LEN(10 0)DCL &SIZE TYPE(*DEC) LEN(10 0)DCL &USEDATE TYPE(*CHAR) LEN(13)DCL &USECNT TYPE(*DEC) LEN(5 0)DCL &RESET TYPE(*CHAR) LEN(13)...RTVMBRD FILE(*CURLIB/MYFILE) MBR(AMEMBER *NEXT) +RTNLIB(&LIB) RTNSYSTEM(&SYS) RTNMBR(&MBR) +FILEATR(&MTYPE) CRTDATE(&CRTDATE) TEXT(&TEXT) +NBRCURRCD(&NBRRCD) DTASPCSIZ(&SIZE) USEDATE(&USEDATE) +USECOUNT(&USECNT) RESETDATE(&RESET)The following information is returned to the procedure:v The current library name (MYLIB) is placed into the CL variable name &LIBv The system that MYFILE was found on is placed into the CL variable name&SYS (*LCL means the file was found on the local system, and *RMT means thefile was found on a remote system.)v The member name (BMEMBER), since BMEMBER is the member immediatelyafter AMEMBER in a name ordered member list (*NEXT), is placed into the CLvariable named &MBRv The file attribute of MYFILE is placed into the CL variable named &MTYPE(*DATA means the member is a data member, and *SRC means the file is asource member.)v
深渊野鱼 阅读(26) |
用RTVUSRPRF命令来取得用户配置文件的属性,把他们放在CL变量中来控制应用程序。可在命令中规定10个字符的用户配置文件名或者用*CURRENT。在运行RTVUSRPRF后可监控逃逸信息DCL &USR *CHAR 10DCL &USRMSGQ *CHAR 10DCL &USRMSGQLIB *CHAR 10...RTVUSRPRF USRPRF(*CURRENT) RTNUSRPRF(&USR) +MGSQ(&USRMSGQ) MSGQLIB(&USRMSGQLIB)
The following information is returned to the procedure:v &USR contains the user profile name of the user who called the program.v &USRMSGQ contains the name of the message queue specified in the userprofile.v &USRMSGQLIB contains the name of the library containing the message queueassociated with the user profile.
深渊野鱼 阅读(28) |
停止锁住指定文件的所有相关作业 解答 1、生成CL命令DLTJOB
*******************************CMD: DLTJOBLANGUAGE: CL COMMAND SOURCE*******************************
CMD PROMPT('DELETE JOBS LOCKING PF')PARM KWD(OBJNAME) +TYPE(QUAL1) +MIN(1) +PROMPT('OBJECT NAME:')PARM KWD(MEMBER) +TYPE(SNAME) + LEN(10) +MIN(1) PROMPT('Object Member:')QUAL1: QUAL TYPE(NAME) LEN(10) SPCVAL(ALL)QUAL TYPE(NAME) LEN(10) SPCVAL(LIBL CURLIB ' ') +PROMPT('Library Name:')
2、处理主程序#include
#include #include #include
#include #include #include #include
#include #include
#pragma linkage(CLDLT00,OS)void CLDLT00 ( char job_name[10],---------------char usr_name[10],---------------char job_number[6] );
Qus_Generic_Header_0100_char list_Qwc_OBJL0100_List_T entry_
***********************************PARMS FOR CLDLT***********************************
char job_nm[10]; / jobname/username/jobnumber /char usr[10];char job_nmbr[6];
**********************************PARMS FOR QWCLOBJL **********************************
char frmt[8];char usr[10];char qal_obj_name[20];char obj_type[10];char mem_name[10];
**********************************PARMS FOR QUSCRTUS **********************************
char spc_name[20];char ext_atr[10];int initial_char initial_value[1];char auth[10];char desc[50];char replace[10];
**********************************MISCELLANEOUS VARIABLES **********************************
int api_Qus_EC_t err_ /错误代码/
*********************************START OF MAINLINE *********************************
main(argc,argv)char argv[];{
***************************************************************Read in and assign the command-line arguments to respective variables/***************************************************************
strncpy(qal_obj_name,argv[1],20); strncpy(mem_name,argv[2],10);
******************************************************Assign value to specific variables in the program ******************************************************
strcpy(spc_name,"DLTOLDSPLFQTEMP ");memset(ext_atr,' ',10);initial_size = 1024; strcpy(initial_value," ");strcpy(auth,"CHANGE ");memset(desc,' ',50); strcpy(frmt,"OBJL0100"); strcpy(replace,"YES ");strcpy(obj_type,"FILE ");
***********************************************Call external program to create a user space ***********************************************
err_code.Bytes_Provided = 0;api_code = 1;QUSCRTUS(spc_name,ext_atr,initial_size,initial_value,auth,desc,replace,&err_code);
********************************************************Call external program to list job names into user space ********************************************************
api_code = 2;QWCLOBJL(spc_name,frmt,qal_obj_name,obj_type,mem_name,&err_code);
**********************************************************Call external program to get a pointer to the user space and get addressability to the list data section. **********************************************************
api_code = 3;QUSPTRUS(spc_name,&space,&err_code);list_section = (char )list_section = list_section + space->Offset_List_Dentry_list = (Qwc_OBJL0100_List_T ) list_count = 1;
*********************************************************Loop through the entry list and delete old spooled files *********************************************************
while (count Number_List_Entries) {
********************************************************** Call external program to retrieve more spool information**********************************************************
api_code = 4;strncpy(job_nm,entry_list->Job_Name,10);strncpy(job_nmbr,entry_list->Job_Number,6);strncpy(usr,entry_list->Job_User_Name,10);
**************************Delete the spooled file. ************************** CLDLT00(job_nm,usr,job_nmbr);
count++;entry_list++;} /WHILE/
***********************Remove the user space *********************** api_code = 5;QUSDLTUS(spc_name, &err_code);
3、停止作业的CL程序
***************** PROGRAM: CLDLT LANGUAGE: CL*****************
PGM (&JOBNAM &USRNAM &JOBNUM)
*****************DECLARE SECTION *****************
DCL &JOBNUM CHAR 6DCL &USRNAM CHAR 10DCL &JOBNAM CHAR 10MONMSG CPF0000
*******************EXECUTABLE CODE ******************
ENDJOB JOB(&JOBNUM/&USRNAM/&JOBNAM) + OPTION(IMMED)ENDPGM
深渊野鱼 阅读(20) |
可取作业属性把它放在一个变量中来控制应用程序采用的命令是RTVJOBA 可取的所有作业的属性和他们的组合PGM
DCL &CLKNAM TYPE(*CHAR) LEN(10)DCL &NXTPGM tYPE(*CHAR) LEN(8)
RTVJOBA USER(&CLKNAM)
BEGIN:CALL ORD41052 PAR(&NXTPGM &CLKNAM)IF 9&NXTPGM *EQ 'END') THEN(RETURN)
深渊野鱼 阅读(14) |
一个批量修改文件属性的工具
AS/400上的每个文件都带有大量的属性,文件的属性是在创建文件的时候指定的。在实际应用过程中,可能会需要改变这些文件属性。以PF文件为例,我们可能需要修改文件的Member Size,Maximum Members,Maximum record wait time等等。修改物理文件(PF)属性命令是CHGPF,修改逻辑文件(LF)命令是 CHGLF,遗憾的是这些命令一次只能修改一个文件。如果假设有一个库,库下面有几千个物理文件需要一次性统一修改文件属性,那该怎么办?AS/400并没有提供这样的命令。
我做了一个工具命令,可以实现对一个库下的所有文件属性进行批量修改,下面以修改文件Reuse deleted records属性为例来介绍这个工具命令,并附带全部源码。文件Reuse deleted records属性是表示记录在文件物理空间内被插入的方式,缺省情况下Reuse deleted records属性为*NO,这表示新记录将追加到文件尾部,如果Reuse deleted records属性修改为*YES,这表示物理文件中原已删除记录物理空间可以重复使用,当有新记录要加入时,系统会优先把新记录插入到原已删除记录空间里,只有当所有被删除记录空间都被重新使用后,新加记录才会从文件尾部开始追加。这个属性对于文件记录非常多、重整所费时间很长的情况下,还是很有用的。
制作修改一个库下所有文件属性的思路是首先应把该库下的所有物理文件名取出来,然后才能循环一个个地修改。以下是主要步骤:
1. 提取某库下所有物理文件名
这主要是通过利用DSPFD来实现的。该命令是用来显示文件描述(File Description)的,它可以一次显示一个库下的一文件描述,也可以一次显示一个库下的所有文件描述。可以在OUTPUT选项里填入 *OUTFILE,并在OUTFILE选项里填入接收文件名,就可以把DSPFD的显示内容输出到一个临时PF文件中。该临时文件就包含有文件名字段 ATFILE以及库名字段ATLIB。例如下面DSPFD命令就是把定义某库下的所有物理文件名及其基本属性(*BASATR)输出到QGPL库下的 TEMPLIBF文件里:
DCL VAR(&CALIB) TYPE(*CHAR) LEN(10) /*定义一个库名变量*/
DSPFD FILE(&CALIB/*ALL) TYPE(*BASATR) + OUTPUT(*OUTFILE) FILEATR(*PF) + OUTFILE(QGPL/TEMPLIBF)
2. 对包含有文件名的临时文件进行加工
其实因为上面已经把文件名输出到了一个PF文件里,所以这一步可不要。但为了查看方便,我还是把文件名从TEMPLIBF中提出写入到一个更简单的PF文件中。先创建一个名为DTAFNAME的物理文件,如下:
A R DTANAM A FILNAM 10A /*PF文件名*/ A FILLIB 10A /*库名*/
再用CRTSRCPF命令在QGPL库下建一个CHGTEST源文件目录,在该文件下创建一个SQL脚本文本文件CHGLIBAF,其内容为:
INSERT INTO DTAFNAME SELECT ATFILE,ATLIB FROM QGPL/TEMPLIBF
然后在CL程序中,用RUNSQLSTM命令运行SQL脚本文件中的SQL语句:
RUNSQLSTM SRCFILE(QGPL/CHGTEST) SRCMBR(CHGLIBAF)
这样就把文件名及库名从复杂的TEMPLIBF文件倒入到简单的DTAFNAME文件中
3. 循环修改文件属性
循环读DTAFNAME文件,取出文件名,就可以一个个地用CHGPF命令修改文件属性了。
下面是完整的源代码:
文件名:CHGLIBFACL (CLLE) /*===================================================================*/ /* PROGRAM NAME: CHGLIBFACL */ /* DESCRIPTION : */ /* PROGRAMMER : BLOG LIOU */ /* DATE : */ /*===================================================================*/ PGM PARM(&CALIB &REUSED)
DCLF FILE(DTAFNAME) RCDFMT(DTANAM) DCL VAR(&CALIB) TYPE(*CHAR) LEN(10) DCL VAR(&REUSED) TYPE(*CHAR) LEN(4)
CHKOBJ OBJ(QGPL/TEMPLIBF) OBJTYPE(*FILE) MONMSG MSGID(CPF9801) CLRPFM FILE(QGPL/TEMPLIBF) MONMSG MSGID(CPF3142) DSPFD FILE(&CALIB/*ALL) TYPE(*BASATR) + OUTPUT(*OUTFILE) FILEATR(*PF) + OUTFILE(QGPL/TEMPLIBF) CLRPFM FILE(DTAFNAME) RUNSQLSTM SRCFILE(QGPL/CHGTEST) SRCMBR(CHGLIBAF)
LOOP: RCVF RCDFMT(DTANAM) /* Read a file record */ MONMSG MSGID(CPF0864) EXEC(GOTO EOF) CHGPF FILE(&FILLIB/&FILNAM) WAITFILE(60) + REUSEDLT(&REUSED) GOTO CMDLBL(LOOP)
EOF: ENDPGM
命令文件:CHGLIBFA (CMD)
/*===================================================================*/ /* PROGRAM NAME : CHGLIBFA */ /* DESCRIPTION : */ /* PROGRAMMER : BLOG LIOU */ /* DATE :
*/ /*===================================================================*/ CMD PROMPT('Change Database File Attribute') PARM KWD(CHGLIB) TYPE(*NAME) LEN(10) + PROMPT('Change Lib') PARM KWD(REUSEDLT) TYPE(*NAME) LEN(4) + SPCVAL((*YES) (*NO)) PROMPT('Reused + Delete Rows')
用命令CRTCMD CMD(CHGLIBFA) PGM(CHGLIBFACL)创建CHGLIBFA命令,执行CHGLIBFA,就可以输入库名修改该库下的所有文件的Reuse deleted records的属性了。只需要稍对程序进行修改就可以批量修改文件多个其他属性了。
深渊野鱼 阅读(366) |
MONMSG(MOINTER MESSAGE) EXEC(操作) 监控送往程序信息队列的逃逸,状态和通知信息RCVMSG(RECEIVE MESSAGE) 把信息从信息队列复制到CL变量中
RMVMSG(REMOVE MESSAGE) 从信息队列中取消信息RTVMSG(RETRIEVE MESSAGE) 把预先定义的信息从信息文件复制到CL变量中SNDPGMMSG 往信息队列中发送程序信息SNDRPY 给查询信息的文件发送程序信息SNDUSRMSG 给显示工作站或者系统操作员发送消息和查询信息
深渊野鱼 阅读(22) |
//获取设备名RTVJOBA JOB(&WRKSTN) //发送中断消息SNDBRKMSG MSG(&MSGS) TOMSGQ(&WRKSTN) MSGTYPE(*INFO)
深渊野鱼 阅读(19) |
1  DCLF FILE(library-name/file-name)    RCDFMT(record-format-names)2.用显示文件接收和发送数据  SNDF,与记录格式中输出和输入/输出字段相关的变量的内容有系统格式化后发送到显示设备RCVF 记录格式中输入和输入/输出字段的值放在相应的CL变量中SNDRCVF把CL变量中的内容送往显示,然后从显示中得到更新后的字段this:Operator Menu1. Accounts Payable2. Accounts Receivable90. SignoffOption:First, enter the following DDS source. The record format is MENU, and OPTION isan input-capable field. The OPTION field uses DSPATR(MDT). This causes thesystem to check this field for valid values even if the operator does not enteranything.Enter the CRTDSPF command to create the display file. In CL programming, thedisplay file name (INTMENU) can be the same as the record format name (MENU),though this is not true for some other languages, like RPG for OS/400.The display file could also be created using the Screen Design Aid (SDA) utility.Next, enter the CL source to run the menu.The CL source for this menu is:PGM /* OPERATOR MENU */DCLF INTMENUBEGIN: SNDRCVF RCDFMT(MENU)IF COND(&OPTION *EQ 1) THEN(CALL ACTSPAYMNU)IF COND(&OPTION *EQ 2) THEN(CALL ACTSRCVMNU)IF COND(&OPTION *EQ 90) THEN(SIGNOFF)GOTO BEGINENDPGM
深渊野鱼 阅读(55) |
PGMMONMSG MSGID(CPF0001) EXEC(GOTO ERROR)CALL PROGACALL PROGBRETURNERROR: SNDPGMMSG MSG(扐 CALL command failed? MSGTYPE(*ESCAPE)ENDPGM
深渊野鱼 阅读(11) |
System Function Command Command FunctionChange ProcedureControlCALL (Call) 调用一个程序CALLPRC (Call Procedure) 调用过程RETURN (Return) Returns to the command following the command that caused a program or procedure to be run
CL Procedure 界限符PGM (Program) CL程序的起始标志ENDPGM (End Program) CL程序的结束标志
CL Procedure 逻辑IF (If) Processes commands based on the value of a logical expressionELSE (Else) Defines the action to be taken for the else (false) condition of an IF commandDO (Do) Indicates the start of a Do groupENDDO (End Do) Indicates the end of a Do groupGOTO (Go To) Branches to another command
CL Procedure变量CHGVAR (Change Variable)改变CL变量DCL (Declare) 宣称一个变量Conversion CHGVAR (Change Variable) Changes the value of a CL variableCVTDAT (Convert Date) 改变一个日期变量的日期格式
数据区CHGDTAARA (Change Data Area) 改变数据区CRTDTAARA (Create Data Area) Creates a data areaDLTDTAARA (Delete Data Area) Deletes a data areaDSPDTAARA (Display Data Area) Displays a data areaRTVDTAARA (Retrieve Data Area) 拷贝数据区的内容到一个CL变量中
System Function Command Command Function文件ENDRCV (End Receive)   Cancels a request for input previously issued by a RCVF, SNDF, or SNDRCVF command to a display fileDCLF (Declare File)   Declares a display or database fileRCVF (Receive File)   Reads a record from a display or database fileRTVMBRD (Retrieve Member Description) Retrieves a description of a specific member of a database fileSNDF (Send File) Writes a record to a display fileSNDRCVF (Send/Receive File) Writes a record to a display file and reads that record after the user has repliedWAIT (Wait) Waits for data to be received from an SNDF, RCVF, or SNDRCVF command issued to a display file
消息MONMSG (Monitor Message) Monitors for escape, status, and notify messages sent to a program’s message queueRCVMSG (Receive Message) Copies a message from a message queue into CL variables in a CL procedureRMVMSG (Remove Message) Removes a specified message from a specified message queueRTVMSG (Retrieve Message) Copies a predefined message from a message file into CL procedure variablesSNDPGMMSG (Send Program Message) Sends a program message to a message queueSNDRPY (Send Reply) Sends a reply message to the sender of an inquiry messageSNDUSRMSG (Send User Message) Sends an informational or inquiry message to a display station or system operatorMiscellaneousCommandsCHKOBJ (Check Object) Checks for the existence of an object and, optionally, thenecessary authority to use the objectPRTCMDUSG (Print CommandUsage)Produces a cross-reference list for a specified group ofcommands used in a specified group of CL proceduresRTVCFGSRC (Retrieve ConfigurationSource)Generates CL command source for creating existingconfiguration objects and places the source in a sourcefile memberRTVCFGSTS (Retrieve ConfigurationStatus) 1Gives applications the capability to retrieve configurationstatus from three configuration objects: line, controller,and device.RTVJOBA (Retrieve Job Attributes) 1 Retrieves the value of one or more job attributes andplaces the values in a CL variableRTVSYSVAL (Retrieve System Value)1Retrieves a system value and places it into a CL variableRTVUSRPRF (Retrieve User Profile)1Retrieves user profile attributes and places them into CLvariablesProgram CreationCommandsCRTCLMOD (Create CL Module) Creates a CL moduleDLTMOD (Delete Module) Deletes a moduleDLTPGM (Delete Program) Deletes a programCRTBNDCL (Create Bound ControlLanguage Program)Creates a bound CL program.CRTCLPGM (Create CL Program) Creates an OPM CL program.CRTPGM (Create Program) Creates a program from one or more modules.CRTSRVPGM (Create ServiceProgram)Creates a service program from one or more modules.
深渊野鱼 阅读(53) |
在SNA网络连接中,AS/400的两块以太网卡能否实现互为备份 解答 AS/400 FTP 提供批处理功能(BATCH FTP),用户无须在FTP交互式环境单独输入FTP子命令。
整个过程包含三部分:
1、CL 程序 - Samplib/SampFile BATCHFTP2、FTP的子命令文件 - Samplib/SampFile CMDFTP3、FTP命令执行结果输出 - Samplib/SampFile OUTFTP
例:CL 程序:
************************************************************SAMPLIB/SAMPFILE BATCHFTP:----------------------PGMOVRDBF FILE(INPUT) TOFILE(SAMPLIB/SAMPFILE) MBR(BATCHFTP)OVRDBF FILE(OUTPUT) TOFILE(SAMPLIB/SAMPFILE) MBR(OUTFTP)FTP RMTSYS(SYSxxx)ENDPGM************************************************************
FTP 子命令:
************************************************************SAMPLIB/SAMPFILE CMDFTP:---------------------USERID PASSWORDCD SAMPLIBSYSCMD CHGCURLIB SAMPLIB2GET QCLSRC.BATCHFTP QCLSRC.BATCHFTP (REPLACEQUIT************************************************************
FTP 命令输出:
************************************************************FTP Output Redirected to a FileFTP Input from Overridden FileConnecting to host name SYSxxxat address x.xxx.xx.xxx using port 21.220-QTCP at SYSxxx220 Connection will close if idle more than 5 minutes.215 OS/400 is the remote operating system.The TCP/IP version is "V4R1M0"Enter login ID (USERID):> USERID PASSWORD331 Enter password.230 USERID logged on.250 Now using naming format "0".257 "QGPL" is current library.Enter an FTP subcommand.> CD SAMPLIBEnter an FTP subcommand.250 Current library changed to SAMPLIB.> SYSCMD CHGCURLIB SAMPLIB2Enter an FTP subcommand.> GET QCLSRC.BATCHFTP QCLSRC.BATCHFTP (REPLACE200 PORT subcommand request successful.150 Retrieving member BATCHFTP in file QCLSRC in library SAMPLIB.250 File transfer completed successfully.147 bytes transferred in 0.487 seconds. Transfer rate 0.302 KB/sec.Enter an FTP subcommand.> QUIT221 QUIT subcommand received.************************************************************
深渊野鱼 阅读(76) |
CRTSRCPF FILE(MLY/SRCPF) RCDLEN(212) IGCDTA(*YES)
CRTPF FILE(MLY/PF) RCDLEN(200) IGCDTA(*YES)
CPYSPLF FILE(QPUOPRTF) TOFILE(MLY/PF) JOB(123456/MLY/QPADEV0001) SPLNBR(3)
CPYF FROMFILE(MLY/PF) TOFILE(MLY/SRCPF) TOMBR(MBR003) MBROPT(*ADD) FMTOPT(*CVTSRC)
阅读(11411) | 评论(0) | 转发(4) |
下一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 人民币大写怎么写 的文章

 

随机推荐