IBM i (iSeries) 视点脚本

IBM i (iSeries) View Point Script

我正在尝试将当前存储在 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))))

iSeries 的一个相对巧妙的事情是它可以让您进行 'natural language' 日期数学运算:current_date - 2 months 就像它听起来的那样,一个正好比今天早两个月的日期。

所以,假设它确实如写的那样工作,这个脚本正在做的是:

  • 将变量 &OFFSET 设置为 0。(CHGVAR 命令是 iSeries 的冗长的赋值方式:在大多数语言中,您将改为 &OFFSET = 0,甚至使用iSeries,您可以将其缩短为 CHGVAR &OFFSET 0.)
  • 设置变量&STARTS为上月22日,日期格式为CYYMMDD。 (它通过构建基于 "use the month that is one month before today, 22 as the day, and the year of the month that is one month before today" 的日期,然后将其转换为 CYYMMDD 格式来实现。
  • 设置变量&STARTS2为2个月前的22号
  • 设置变量&STARTS3为3个月前的22号

如果您要调整 &OFFSET 的值(通过更改其 VALUE(0) 赋值),您计算的日期将在过去更远:将其设置为 VALUE(4)会得到 5、6 和 7 个月前的日期。

顺便说一下,在 CYYMMDD 格式中,'C' 是自 1900 年以来的世纪计数器;本质上,日期是 YYYYMMDD - 19000000 形式的整数。 因此,1/1/1999 = YYYYMMDD 格式的 19990101,或 CYYMMDD 格式的 0990101; 12/31/2011 = YYYYMMDD 格式的 20111231,或 CYYMMDD 格式的 1111231。

所以如果你今天 运行 这个,2015 年 8 月 19 日,你应该得到以下结果:

  • &开始 = 1150722
  • &STARTS2 = 1150622
  • &STARTS3 = 1150522

顺便说一下,您编写脚本所用的语言称为 "CL"("Command Language" 的缩写),官方语言参考位于 The IBM Knowledge Center.

Can anyone tell me what the resulting value will be for &STARTS &STARTS2 and &STARTS3

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

详情:

一个潜在的问题是将 CL 视为 "scripting language"。虽然它当然可以并且通常用于 "scripting",但它是系统的 "Control Language"。就 "scripting" 而言,正派的 C 程序员用 C 替换 CL 与 "scripting" 语言一样容易。同样,我见过 RPG 开发人员在 RPG 中进行 much/most 的 "scripting"。对于 COBOL 也是如此。

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

还是编译了CL。它也可以作为一种 ILE 语言完全参与,尤其是从 OS 的 V5R4 版本开始,但从技术上讲,因为 ILE 是在 AS/400 行中首次引入的。

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

但是 CL 没有的一件事是 SQL 预处理器。

虽然有几个命令可用于执行交互式 SQL 语句,但没有工具可以执行诸如 VALUES INTO 或从游标中提取或从 SQL 函数(如 DATE)中获取结果的功能().

嗯。从技术上讲,我想我们可以说它可以完成,因为它毕竟是 "ILE CL"。因此,CL 可以调用各种 SQL CLI API(想想 ODBC)。正因为如此,您可以通过调用 SQLAllocEnv()、SQLAllocConnect()、SQLConnect()、SQLPrepare() 和所有可能需要的其他功能。

但是您在 CL 中不能做的是您想在最后三个 CHGVAR 命令的 VALUE() 参数中做的任何事情。您当然可以编写 CL 过程来执行日期计算和操作。像早期的其他人一样,在可以轻松访问各种 date/time API 之前,我用 CL(以及其他语言)编写了各种详细的日期数学函数。然后,有了 API,大多数都被更优雅的 API 取代了。

CL 可以说是系统中最复杂的语言。但它不会 SQL。至少不像 C、RPG 或 COBOL 那样可以。 CL 旨在作为一种 "control" 语言,而不是数据库或应用程序语言。

不过还有一个选择。有一种本地 "scripting" 语言可以 运行 SQL -- REXX。使用 REXX 比使用 CL 更容易做到这一点。您的 VALUE() 子句几乎可以被提取并直接粘贴到适当的 REXX 过程中。您可以有一个 CL 包装器来为每个复杂的 VALUE() 参数调用过程并将结果从 REXX 拉回。或者你可以让 REXX 同时做这三件事。

但是如果你想让 CL 来做这一切,还有很多编码工作要做。