AWS 大型机现代化服务(托管运行时环境体验)不再向新客户开放。有关类似于 AWS 大型机现代化服务(托管运行时环境体验)的功能,请浏览 AWS 大型机现代化服务(自我管理体验)。现有客户可以继续正常使用该服务。有关更多信息,请参阅AWS 大型机现代化可用性变更。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
其他/杂项实用工具
本节涵盖了各种公用事业计划,这些计划具有其他用途,无法附加到现有类别中
在以下段落中,PICTURE应理解为 COBOL PICTURE 关键字,用于描述字段的数据类型和格式。
CBL_ _NOT AND/CBL_OR/CBL_XOR/CBL_EQ/CBL_IMP/CBL
用途
这与对数据项的按位逻辑运算的支持有关,这种运算存在于某些 COBOL 方言(Micro Focus)中。请注意,使用 AWS Transform 自动重构可以处理按位运算符用法从 Cobol MF 方言到 java 的转换(参见下面的示例用法)。为了使现代化的代码正常运行,必须同时部署实用程序应用程序。
支持的运算符:
一元运算符:
| 一元运算符 | details |
|---|---|
CBL_NOT |
按位补码(~target) |
二进制运算符:
| 二元运算符 | details |
|---|---|
CBL_AND |
按位 AND(源和目标) |
CBL_OR |
按位或(源 | 目标) |
CBL_XOR |
按位排他或(源 ^ 目标) |
CBL_EQ |
按位等价(~(源 ^ 目标)) |
CBL_IMP |
按位含义(~source | target) |
签名
除了只有一个操作数(目标)的 CBL_NOT 之外,所有其他操作都至少有两个操作数,即数据项。第一个操作数是源,第二个操作数是目标。另一个可选参数(length)给出了要处理的字节数(从左到右)。如果省略长度,则默认为源和目标大小的最小值(以字节为单位)。操作结果存储在目标中。该程序的返回码为 0(除非发生异常)。
检查/错误处理
对于每个可用的运算符,都会检查所需参数的数量。如果未满足所需参数的最小数量,则
IllegalArgumentException会抛出。检查可选的长度整数参数是否为正数。如果提供的长度为负,则日志中将显示一条消息,并且不会应用运算符。
示例用法
一元运算符示例:
以下是 CBL_NOT 的 cobol 用法:
* TARGET: 00000101 * OPERATION: NOT * EXPECTED: 11111010 = 64000 dec (2nd byte unchanged - all 0) MOVE X'0500' to TARGET CALL "CBL_NOT" USING TARGET BY VALUE 1.
以及相应的 java 现代化:
/* TARGET: 00000101 OPERATION: NOT EXPECTED: 11111010 = 64000 dec (2nd byte unchanged - all 0) */ ctx.getTarget().getTargetReference().setBytes(new byte[]{ 5, 0 }); ctrl.callSubProgram("CBL_NOT", CallBuilder.newInstance() .byReference(ctx.getTarget().getTargetReference()) .byValue(1) .getArguments(), ctx);
二进制运算符示例:
例如,参见以下使用 CBL_AND 的 COBOL 代码:
* SOURCE: 00000011 * OPERATION: AND * TARGET: 00000101 * EXPECTED: 00000001 = 256 dec (2nd byte unchanged - all 0) MOVE X'0300' to SRC MOVE X'0500' to TARGET CALL "CBL_AND" USING SRC TARGET BY VALUE 1.
以及它的 java 现代化:
/* SOURCE: 00000011 OPERATION: AND TARGET: 00000101 EXPECTED: 00000001 = 256 dec (2nd byte unchanged - all 0) */ ctx.getSrc().getSrcReference().setBytes(new byte[]{ 3, 0 }); ctx.getTarget().getTargetReference().setBytes(new byte[]{ 5, 0 }); ctrl.callSubProgram("CBL_AND", CallBuilder.newInstance() .byReference(ctx.getSrc().getSrcReference()) .byReference(ctx.getTarget().getTargetReference()) .byValue(1) .getArguments(), ctx);
CEE3ABD
用途
该实用程序模仿同名旧程序的行为,其作用是终止带有Abend(异常结束)代码和可选的清理时机的程序。AWS 转换引擎可处理对 CEE3 ABD 的调用的自动现代化。为了使现代化的代码正常运行,必须同时部署实用程序应用程序。
该程序使用提供的中止代码停止当前运行的单元。一条信息消息将打印到日志中,指定已使用给定代码调用了用户退出。目前,计时参数没有被考虑在内,但出于现代化兼容性的考虑,它被当作一个论据。
签名
该程序接受 0 或 2 个参数。这两个论点是:
Abend 代码(必须可解释为正整数值的数据项)
清理时间(必须可解释为正整数值的数据项)--忽略
如果未提供任何参数,则使用以下默认值:
晚间代码:0
清理时间:0
检查/错误处理
检查是否提供了 0 或 2 个参数,否则
IllegalArgumentException将抛出。如果提供了两个参数,请检查:abend 代码介于 0 和 4095 之间(均包括在内);时序介于 0 和 5 之间(均包括在内)
这些测试的任何失败都将触发IllegalArgumentException.
示例用法
以下是来自 Carddemo 应用程序的 COBOL 程序中的示例用法:
9999-ABEND-PROGRAM. DISPLAY 'ABENDING PROGRAM' MOVE 0 TO TIMING MOVE 999 TO ABCODE CALL 'CEE3ABD'.
以及相应的现代化 Java 代码:
public void _9999AbendProgram(final Cbtrn03cContext ctx, final ExecutionController ctrl) { DisplayUtils.display(ctx, ctrl, LOGGER, "ABENDING PROGRAM"); ctx.getTiming().setTiming(0); ctx.getAbcode().setAbcode(999); ctrl.callSubProgram("CEE3ABD", CallBuilder.newInstance() .getArguments(), ctx); }
割让
用途
CEEDATE 实用程序使用提供的格式将表示莉莲日期(自 1582 年 10 月 15 日以来的天数)的数字转换为基于字符的日期表示形式。
它模仿同名的旧系统实用程序的行为。
签名
考虑到其性质,CEEDATE 实用程序更适合从程序中调用。
它需要三个或四个参数(最后一个参数是可选的):
第一个必填参数是一个数字数据项,其值将被解释为 Lilian 日期
第二个强制参数是一个字母数字数据项,其中包含用于将日期转换为字符的
PICTURE字符串必需的第三个参数是目标字母数字数据项,它使用第二个参数作为保存第一个参数的转换结果
PICTURE第四个可选参数是用于存储来自实用程序的反馈代码的数据项
检查/错误处理
如果传递给实用程序的参数数量不是三或四个,则
BluageWrapperException会抛出 a如果提供的第一个数字参数无法正确计算为 Lilian 日期(越界),则会记录一条错误消息。可选的反馈代码持有人(如果有)将收到严重性为 3 的反馈代码和编号为 2512 的反馈代码
如果在日期转换期间由于提供的内容无效而发生异常
PICTURE,则会记录一条错误消息。可选的反馈代码持有人(如果有)将收到严重性为 3 的反馈代码和编号为 2518 的反馈代码如果由于任何原因无法正常进行转换,则输出数据项将用空白填充
如果转换成功,则将向可选的反馈代码持有者提供严重性为 0 的反馈代码(且没有消息)
示例用法
以下是来自 COBOL 程序的示例调用(反馈代码持有者 FC 的结构包含省略号,因为包含数百个未在此处显示的条件(级别 88)条目):
WORKING-STORAGE SECTION. 01 LILIANS PIC S9(9) BINARY. 01 TIMESTAMP-OUT PIC X(80). 01 MASK. 05 MASK-LEN PIC S9(4) BINARY. 05 MASK-STR. 10 MASK-CHR PIC X OCCURS 0 TO 256 DEPENDING ON MASK-LEN. 01 ROUTINE-NAMES. 05 CEESECS-ROUTINE PIC X(08) VALUE 'CEESECS '. 05 CEELOCT-ROUTINE PIC X(08) VALUE 'CEELOCT '. 05 CEEDATE-ROUTINE PIC X(08) VALUE 'CEEDATE '. 01 FC. ... * lilian date for 4 June 1990 MOVE SPACES TO MASK-STR MOVE 148887 TO LILIANS. MOVE 23 TO MASK-LEN MOVE 'YYYY-MM-DD-HH:MI:SS.999' TO MASK-STR CALL CEEDATE-ROUTINE USING LILIANS MASK TIMESTAMP-OUT FC.
CEELOCT
用途
CEELOCT 实用程序用于以三种格式返回本地数据 date/time :
莉莲日期(自 1582 年 10 月 14 日以来的天数)
Lilian seconds(自 1582 年 10 月 14 日 00:00:00 以来的秒数)
格里高利字符串(格式
YYYYMMDDHHMISS999为)
它模仿同名的旧系统实用程序的行为。
签名
考虑到其性质,CEELOCT 实用程序更适合从程序中调用。
它需要三个或四个参数(最后一个参数是可选的):
第一个必填参数是一个数据项,用于存储 Lilian 日期
第二个强制参数是一个数据项,用于存储 Lilian 秒
必填的第三个参数是一个数据项,用于使用上面给出的形式存储公历日期
可选的第四个参数是用于存储来自实用程序的反馈代码的数据项
检查/错误处理
如果传递给实用程序的参数数量不是三或四个,则
BluageWrapperException会抛出 a如果在处理从本地 date/time 到任何输出格式的转换过程中出现任何异常:第一个和第二个参数将设置为 0,第三个参数将保持不变;将记录错误消息;(可选)将向反馈代码持有者提供严重性为 3 的反馈代码和消息编号 2531
成功后,所有三个参数都将填充正确的内容,可选的反馈代码将使用严重性为 0 的代码
示例用法
以下是 COBOL 示例片段,显示了 CEELOCT 实用程序的用法。反馈代码持有人结构 FC 没有完整给出,因为它包含数百个条件(88 级)条目。
WORKING-STORAGE SECTION. 01 LILIANS PIC S9(9) BINARY. 01 GREGORN PIC X(80). 01 SECONDS COMP-2. 01 FC. ... 01 ROUTINE-NAMES. 05 CEESECS-ROUTINE PIC X(08) VALUE 'CEESECS '. 05 CEELOCT-ROUTINE PIC X(08) VALUE 'CEELOCT '. 05 CEEDATE-ROUTINE PIC X(08) VALUE 'CEEDATE '. ... CALL CEELOCT-ROUTINE USING LILIANS SECONDS GREGORN FC.
CEERAN0
用途
调用 CEERAN0 程序使用指定的种子生成介于 0.0 和 1.0 之间的伪随机数。它基于乘法同余法算法,该算法需要用户指定的种子。使用 0 作为种子会触发一种特定的模式,在这种模式下,种子实际上是根据格林威治平均时间(程序运行时)计算的。否则,将按原样使用种子。伪随机序列是可预测的。
签名
CEERAN0 程序采用三个参数:
种子(输入参数),可以解释为正整数的数据项(包括 0)
随机数(输出参数),可以解释为双精度浮点数的数据项(其值将介于 0.0 和 1.0 之间,不包括);它是程序的结果
可选的反馈码(输出参数),一个 12 字节的数据项,用于存储来自程序的有关随机数计算的反馈
检查/错误处理
如果参数的数量不是 2 或 3,则
IllegalArgumentException会抛出种子值必须介于 0 和 2147483646 之间(含)。如果种子值超出这些范围,则将记录一条错误消息,并将反馈代码设置为严重性 3,消息编号设置为 2524。生成的随机数将设置为 -1.0(与传统行为类似)
如果种子值设置为 0,但系统无法检索格林威治平均时间(出于任何原因),则将使用值 1 作为后备进行计算,反馈代码将设置为严重性 1,消息编号设置为 2523。随机数计算将继续使用后备种子值(类似于传统行为)
示例用法
这是一个 java 示例,演示了如何使用 CEERAN0 程序,使用包括反馈代码在内的所有参数,以及来自多个层(实体、服务)的位:
//Entity layer public class Randomin extends RecordEntity { private final Group root = new Group(getData()).named("RANDOMIN"); private final Elementary randomin = new Elementary(root,new BinaryIntegerType(4, true),new BigDecimal("0")).named("RANDOMIN"); ... public class Randomout extends RecordEntity { private final Group root = new Group(getData()).named("RANDOMOUT"); private final Elementary randomout = new Elementary(root,new DoubleFloatingPointType(),new BigDecimal("0")).named("RANDOMOUT"); ... public class Returncode1 extends RecordEntity { private final Group root = new Group(getData()).named("RETURNCODE"); private final Elementary returncode1 = new Elementary(root,new AlphanumericType(12)," ").named("RETURNCODE"); ... // Service layer CallHandler.newInstance(ctrl, ctx, ctx.getErrorContext()) .byReference(ctx.getRandomin().getRandominReference(), ctx.getRandomout().getRandomoutReference(), ctx.getReturncode1().getReturncode1Reference()) .call("CEERAN0");
CEESECS
用途
CEESECS 实用程序将时间戳字符串表示形式转换为 Lilian 秒(自 1582 年 10 月 14 日 00:00:00 以来的秒数)。
签名
考虑到其性质,CEESECS 实用程序更倾向于从程序中调用。
它需要三个或四个参数(最后一个参数是可选的):
第一个必填参数是一个数据项,其值将被解释为时间戳
强制性的第二个参数是一个字母数字数据项,其中包含用于指定如何解释第一个参数的
PICTURE字符串强制性的第三个参数是数据项,它保存了使用第二个参数作为第一个参数的转换结果
PICTURE第四个可选参数是用于存储来自实用程序的反馈代码的数据项
检查/错误处理
如果传递给实用程序的参数数量不是三或四个,则
BluageWrapperException会抛出 a如果作为参数传递给实用程序的时间戳无效,则将记录一条错误消息,并且可以选择向反馈代码持有者提供严重性为 3 的反馈代码和编号为 2513 的反馈代码
如果作为参数传递给实用程序的图片无效,则将记录一条错误消息,并且可以选择向反馈代码持有者提供严重性为 3 的反馈代码和编号为 2518 的反馈代码
如果出于任何原因无法计算 lilian seconds 的输出,则第三个参数(输出)将设置为 0
示例用法
以下是 COBOL 程序中对 CEESECS 实用程序的调用示例:
WORKING-STORAGE SECTION. 01 SECONDS COMP-2. 01 TIMESTAMP-IN. 05 TIMESTAMP-IN-LEN PIC S9(4) BINARY. 05 TIMESTAMP-IN-STR. 10 TIMESTAMP-IN-CHAR PIC X OCCURS 0 TO 256 DEPENDING ON TIMESTAMP-IN-LEN. 01 MASK. 05 MASK-LEN PIC S9(4) BINARY. 05 MASK-STR. 10 MASK-CHR PIC X OCCURS 0 TO 256 DEPENDING ON MASK-LEN. 01 FC. ... 01 ROUTINE-NAMES. 05 CEESECS-ROUTINE PIC X(08) VALUE 'CEESECS '. 05 CEELOCT-ROUTINE PIC X(08) VALUE 'CEELOCT '. 05 CEEDATE-ROUTINE PIC X(08) VALUE 'CEEDATE '. ... ... * date for lilian second 12,799,191,601.123 MOVE '1988-5-16-19:00:01.123' TO TIMESTAMP-IN-STR MOVE 23 TO MASK-LEN MOVE 'YYYY-MM-DD-HH:MI:SS.999' TO MASK-STR CALL CEESECS-ROUTINE USING TIMESTAMP-IN MASK SECONDS FC.
ILBOABN0
用途
ILBOABN0 程序的目的是使用用户提供的终止(异常结束)代码,以受控的方式中断当前运行的单元。通常用于错误处理专用程序。
通过投掷 a 来中断当前运行的单元StopRunUnitException。
签名
ILBOABN0 程序采用一个强制性参数,该参数是一个包含中止代码的数据项(必须可以解释为整数)。
检查/错误处理
在抛出StopRunUnitException以中断当前运行单元运行时,程序会将返回码设置为作为第一个参数提供的值。此外,还将记录一条信息消息。
示例用法
以下是 ILBOABN0 程序的 Java 示例用法,该程序源于通过 AWS 转换对 COBOL 进行现代化改造:
77 WS-ABND-CODE COMP PIC S9(4) VALUE +1234. ... ... 1970-ABNDIT. CALL 'ILBOABN0' USING WS-ABND-CODE.
以及匹配的 Java 现代化:
//Entity layer private final Group root = new Group(getData()); private final Elementary wsAbndCode = new Elementary(root,new BinaryType(4, 0, "STD", false, false, true),Short.valueOf("1234")); ... //Service layer @Override public void _1970Abndit(final MyPgmContext ctx, final ExecutionController ctrl) { ctrl.callSubProgram("ILBOABN0", CallBuilder.newInstance() .byReference(ctx.getWsAbndCode().getWsAbndCodeReference()) .getArguments(), ctx);