IBM i(iSeries)View Point脚本

时间:2015-08-19 18:13:07

标签: ibm-midrange iseries-navigator

我正在尝试将当前存储在ViewPoint中的内容作为运行的脚本并将其转换为SQL和计划任务。我的问题很简单,我不知道I系列使用的脚本语言。 任何人都可以告诉我结果值是什么 & STARTS& STARTS2和& STARTS3

CHGVAR VAR(&OFFSET) VALUE(0)
CHGVAR VAR(&STARTS) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 1) Month)||'/22/'||YEAR(Current Date-(&OFFSET+1) month))))
CHGVAR VAR(&STARTS2) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 2) Month)||'/22/'||YEAR(Current Date-(&OFFSET+2) month))))
CHGVAR VAR(&STARTS3) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 3) Month)||'/22/'||YEAR(Current Date-(&OFFSET+3) month))))

2 个答案:

答案 0 :(得分:3)

关于iSeries的一个相对漂亮的事情是,它可以让你做'自然语言'日期数学:current_date - 2 months正是它听起来的样子,恰好是今天前两个月的日期。

因此,假设它实际上是按照书面形式工作的,那么这个脚本正在做的是:

  • 将变量&OFFSET设置为0.(CHGVAR命令是iSeries分配值的详细方式:在大多数语言中,您可以编写&OFFSET = 0,甚至使用iSeries你可以将它简化为CHGVAR &OFFSET 0。)
  • 将变量&STARTS设置为上个月的第22天,其中日期为CYYMMDD格式。 (它通过构建基于“使用今天之前一个月的月份,22作为日期,以及当月之前一个月的月份”构建日期,然后将其转换为CYYMMDD格式。
  • 将变量&STARTS2设置为2个月前的第22个
  • 将变量&STARTS3设置为3个月前的第22个

如果您要调整&OFFSET的值(通过更改其VALUE(0)作业),您的计算日期将会更进一步:将其设置为VALUE(4)将获得你的日期是5,6和7个月。

顺便说一句,在CYYMMDD格式中,'C'是自1900年以来几个世纪的反制者;实质上,日期是YYYYMMDD - 19000000形式的整数。 因此,YYYYMMDD格式为1/1/1999 = 19990101,CYYMMDD格式为0990101; 12/31/2011 = 20111231,YYYYMMDD格式,或1111231,CYYMMDD格式。

因此,如果您今天(2015年8月19日)运行此程序,您应该得到以下结果:

  • & STARTS = 1150722
  • & STARTS2 = 1150622
  • & STARTS3 = 1150522

顺便说一句,编写脚本的语言称为“CL”(“命令语言”的缩写),官方语言参考位于The IBM Knowledge Center

答案 1 :(得分:2)

  

任何人都可以告诉我结果值对于& STARTS   & STARTS2和& STARTS3

TL; DR:结果值将是未定义的,因为只有第一个CHGVAR命令可能会编译。其他人有很多问题。作为伪代码,语句是可以的,但当表达为实际的CL语句时,它们将扩展为大量代码。

<强>详细信息:

一个潜在的问题是将CL视为“脚本语言”。虽然它当然可以并且通常用于“脚本”,但它是系统的“控制语言”。就“脚本”而言,一个体面的C程序员用C代替CL作为“脚本”语言就差不多了。同样,我见过RPG开发人员在RPG中做了很多/大部分“脚本编写”。同样对于COBOL。

CL也是系统的“命令语言”。在当前支持的操作系统版本中,您可以找到近2000个命令。许多系统功能只能通过命令,或通过调用或调用执行命令的程序来完成。每个本地语言都可以通过将命令字符串传递给系统的命令处理API之一来交互地执行大多数命令。即使是编译语言的CL,也可以像其他语言一样以交互方式执行命令。

仍然编译CL。它也可以作为ILE语言完全参与,尤其是从操作系统的V5R4版本开始,但从技术上讲,自ILE首次引入AS / 400系列以来。

作为ILE参与者,CL可以完全访问其他母语所具有的相同功能。例如,CL可以使用C运行时函数库。因此,除了本机CL命令功能外,它基本上可以执行ILE RPG可以执行的任何操作。您甚至可以编译CL * MODULE并将它们绑定在一起以创建服务程序(想想Windows .DLL或UNIX函数库)。

但CL没有的东西是SQL预处理器。

虽然有几个命令用于执行交互式SQL语句,但是没有办法从游标执行VALUES INTO或FETCHing或从SQL函数(如DATE())获取结果。

好。从技术上讲,我想我们可以说它可以完成,因为它毕竟是“ILE CL”。因此,CL可以调用各种SQL CLI API(想想ODBC)。因此,您可以通过调用SQLAllocEnv(),SQLAllocConnect(),SQLConnect(),SQLPrepare()以及可能需要的所有其他函数来编写CL过程。

但是在CL中你不能做的就是你想在你最后三个CHGVAR命令的VALUE()参数中做的事情。您当然可以编写CL过程来执行日期计算和操作。和其他人一样,我在CL(以及其他语言)中编写了各种详细的日期数学函数,然后才能轻松访问各种日期/时间API。然后,使用API​​,大多数都被更优雅的替换。

CL可以说是系统中最复杂的语言。但它没有做SQL。至少不像C,RPG或COBOL那样。 CL旨在作为“控制”语言,而不是数据库或应用程序语言。

虽然有另一种选择。有一种本机“脚本”语言可以运行SQL - REXX。使用REXX比使用CL要容易得多。您的VALUE()子句几乎可以解除并直接粘贴到适当的REXX过程中。您可以使用CL包装器为每个复杂的VALUE()参数调用该过程,并从REXX返回结果。或者你可以让REXX一次完成这三项工作。

但是如果你想让CL做到这一切,那么还有很多编码要做。