0

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

2 回答 2

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 形式的整数。因此,1/1/1999 = YYYYMMDD 格式的 19990101,或 CYYMMDD 格式的 0990101;2011 年 12 月 31 日 = YYYYMMDD 格式的 20111231,或 CYYMMDD 格式的 1111231。

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

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

顺便说一句,编写脚本所用的语言称为“CL”(“Command Language”的缩写),官方语言参考位于IBM 知识中心

于 2015-08-19T20:41:52.920 回答
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 或从游标中提取或从 SQL 函数(如 DATE())获取结果之类的操作。

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

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

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

不过还有一个选择。有一种可以运行 SQL 的本机“脚本”语言——REXX。使用 REXX 比 CL 更容易做到这一点。您的 VALUE() 子句几乎可以被提升并直接粘贴到适当的 REXX 过程中。您可以使用 CL 包装器来为每个复杂的 VALUE() 参数调用该过程并从 REXX 中拉回结果。或者您可以让 REXX 同时完成这三个操作。

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

于 2015-08-20T10:35:25.977 回答