

AWS 大型机现代化服务（托管运行时环境体验）不再向新客户开放。有关类似于 AWS 大型机现代化服务（托管运行时环境体验）的功能，请浏览 AWS 大型机现代化服务（自我管理体验）。现有客户可以继续正常使用该服务。有关更多信息，请参阅[AWS 大型机现代化可用性变更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 其他/杂项实用工具
<a name="system-misc-utilities"></a>

本节涵盖了各种公用事业计划，这些计划具有其他用途，无法附加到现有类别中

在以下段落中，`PICTURE`应理解为 COBOL `PICTURE` 关键字，用于描述字段的数据类型和格式。

## CBL\_ \_NOT AND/CBL\_OR/CBL\_XOR/CBL\_EQ/CBL\_IMP/CBL
<a name="cbl-bitwise"></a>

### 用途
<a name="cbl-bitwise-purpose"></a>

这与对数据项的按位逻辑运算的支持有关，这种运算存在于某些 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） | 

### 签名
<a name="cbl-bitwise-signature"></a>

除了只有一个操作数（目标）的 CBL\_NOT 之外，所有其他操作都至少有两个操作数，即数据项。第一个操作数是源，第二个操作数是目标。另一个可选参数（length）给出了要处理的字节数（从左到右）。如果省略长度，则默认为源和目标大小的最小值（以字节为单位）。操作结果存储在目标中。该程序的返回码为 0（除非发生异常）。

### 检查/错误处理
<a name="cbl-bitwise-error"></a>
+ 对于每个可用的运算符，都会检查所需参数的数量。如果未满足所需参数的最小数量，则`IllegalArgumentException`会抛出。
+ 检查可选的长度整数参数是否为正数。如果提供的长度为负，则日志中将显示一条消息，并且不会应用运算符。

### 示例用法
<a name="cbl-bitwise-sample"></a>
+ 一元运算符示例：

以下是 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
<a name="cee3abd"></a>

### 用途
<a name="cee3abd-purpose"></a>

该实用程序模仿同名旧程序的行为，其作用是终止带有Abend（异常结束）代码和可选的清理时机的程序。AWS 转换引擎可处理对 CEE3 ABD 的调用的自动现代化。为了使现代化的代码正常运行，必须同时部署实用程序应用程序。

该程序使用提供的中止代码停止当前运行的单元。一条信息消息将打印到日志中，指定已使用给定代码调用了用户退出。目前，计时参数没有被考虑在内，但出于现代化兼容性的考虑，它被当作一个论据。

### 签名
<a name="cee3abd-signature"></a>

该程序接受 0 或 2 个参数。这两个论点是：
+ Abend 代码（必须可解释为正整数值的数据项）
+ 清理时间（必须可解释为正整数值的数据项）--忽略

如果未提供任何参数，则使用以下默认值：
+ 晚间代码：0
+ 清理时间：0

### 检查/错误处理
<a name="cee3abd-error"></a>
+ 检查是否提供了 0 或 2 个参数，否则`IllegalArgumentException`将抛出。
+ 如果提供了两个参数，请检查：abend 代码介于 0 和 4095 之间（均包括在内）；时序介于 0 和 5 之间（均包括在内）

这些测试的任何失败都将触发`IllegalArgumentException`.

### 示例用法
<a name="cee3abd-sample"></a>

以下是来自 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);
}
```

## 割让
<a name="ceedate"></a>

### 用途
<a name="ceedate-purpose"></a>

CEEDATE 实用程序使用提供的格式将表示莉莲日期（自 1582 年 10 月 15 日以来的天数）的数字转换为基于字符的日期表示形式。

它模仿同名的旧系统实用程序的行为。

### 签名
<a name="ceedate-signature"></a>

考虑到其性质，CEEDATE 实用程序更适合从程序中调用。

它需要三个或四个参数（最后一个参数是可选的）：
+ 第一个必填参数是一个数字数据项，其值将被解释为 Lilian 日期
+ 第二个强制参数是一个字母数字数据项，其中包含用于将日期转换为字符的`PICTURE`字符串
+ 必需的第三个参数是目标字母数字数据项，它使用第二个参数作为保存第一个参数的转换结果 `PICTURE`
+ 第四个可选参数是用于存储来自实用程序的反馈代码的数据项

### 检查/错误处理
<a name="ceedate-error"></a>
+ 如果传递给实用程序的参数数量不是三或四个，则`BluageWrapperException`会抛出 a
+ 如果提供的第一个数字参数无法正确计算为 Lilian 日期（越界），则会记录一条错误消息。可选的反馈代码持有人（如果有）将收到严重性为 3 的反馈代码和编号为 2512 的反馈代码
+ 如果在日期转换期间由于提供的内容无效而发生异常`PICTURE`，则会记录一条错误消息。可选的反馈代码持有人（如果有）将收到严重性为 3 的反馈代码和编号为 2518 的反馈代码
+ 如果由于任何原因无法正常进行转换，则输出数据项将用空白填充
+ 如果转换成功，则将向可选的反馈代码持有者提供严重性为 0 的反馈代码（且没有消息）

### 示例用法
<a name="ceedate-sample"></a>

以下是来自 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
<a name="ceeloct"></a>

### 用途
<a name="ceeloct-purpose"></a>

CEELOCT 实用程序用于以三种格式返回本地数据 date/time ：
+ 莉莲日期（自 1582 年 10 月 14 日以来的天数）
+ Lilian seconds（自 1582 年 10 月 14 日 00:00:00 以来的秒数）
+ 格里高利字符串（格式`YYYYMMDDHHMISS999`为）

它模仿同名的旧系统实用程序的行为。

### 签名
<a name="ceeloct-signature"></a>

考虑到其性质，CEELOCT 实用程序更适合从程序中调用。

它需要三个或四个参数（最后一个参数是可选的）：
+ 第一个必填参数是一个数据项，用于存储 Lilian 日期
+ 第二个强制参数是一个数据项，用于存储 Lilian 秒
+ 必填的第三个参数是一个数据项，用于使用上面给出的形式存储公历日期
+ 可选的第四个参数是用于存储来自实用程序的反馈代码的数据项

### 检查/错误处理
<a name="ceeloct-error"></a>
+ 如果传递给实用程序的参数数量不是三或四个，则`BluageWrapperException`会抛出 a
+ 如果在处理从本地 date/time 到任何输出格式的转换过程中出现任何异常：第一个和第二个参数将设置为 0，第三个参数将保持不变；将记录错误消息；（可选）将向反馈代码持有者提供严重性为 3 的反馈代码和消息编号 2531
+ 成功后，所有三个参数都将填充正确的内容，可选的反馈代码将使用严重性为 0 的代码

### 示例用法
<a name="ceeloct-sample"></a>

以下是 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
<a name="ceeran0"></a>

### 用途
<a name="ceeran0-purpose"></a>

调用 CEERAN0 程序使用指定的种子生成介于 0.0 和 1.0 之间的伪随机数。它基于乘法同余法算法，该算法需要用户指定的种子。使用 0 作为种子会触发一种特定的模式，在这种模式下，种子实际上是根据格林威治平均时间（程序运行时）计算的。否则，将按原样使用种子。伪随机序列是可预测的。

### 签名
<a name="ceeran0-signature"></a>

CEERAN0 程序采用三个参数：
+ 种子（输入参数），可以解释为正整数的数据项（包括 0）
+ 随机数（输出参数），可以解释为双精度浮点数的数据项（其值将介于 0.0 和 1.0 之间，不包括）；它是程序的结果
+ 可选的反馈码（输出参数），一个 12 字节的数据项，用于存储来自程序的有关随机数计算的反馈

### 检查/错误处理
<a name="ceeran0-error"></a>
+ 如果参数的数量不是 2 或 3，则`IllegalArgumentException`会抛出
+ 种子值必须介于 0 和 2147483646 之间（含）。如果种子值超出这些范围，则将记录一条错误消息，并将反馈代码设置为严重性 3，消息编号设置为 2524。生成的随机数将设置为 -1.0（与传统行为类似）
+ 如果种子值设置为 0，但系统无法检索格林威治平均时间（出于任何原因），则将使用值 1 作为后备进行计算，反馈代码将设置为严重性 1，消息编号设置为 2523。随机数计算将继续使用后备种子值（类似于传统行为）

### 示例用法
<a name="ceeran0-sample"></a>

这是一个 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
<a name="ceesecs"></a>

### 用途
<a name="ceesecs-purpose"></a>

CEESECS 实用程序将时间戳字符串表示形式转换为 Lilian 秒（自 1582 年 10 月 14 日 00:00:00 以来的秒数）。

### 签名
<a name="ceesecs-signature"></a>

考虑到其性质，CEESECS 实用程序更倾向于从程序中调用。

它需要三个或四个参数（最后一个参数是可选的）：
+ 第一个必填参数是一个数据项，其值将被解释为时间戳
+ 强制性的第二个参数是一个字母数字数据项，其中包含用于指定如何解释第一个参数的`PICTURE`字符串
+ 强制性的第三个参数是数据项，它保存了使用第二个参数作为第一个参数的转换结果 `PICTURE`
+ 第四个可选参数是用于存储来自实用程序的反馈代码的数据项

### 检查/错误处理
<a name="ceesecs-error"></a>
+ 如果传递给实用程序的参数数量不是三或四个，则`BluageWrapperException`会抛出 a
+ 如果作为参数传递给实用程序的时间戳无效，则将记录一条错误消息，并且可以选择向反馈代码持有者提供严重性为 3 的反馈代码和编号为 2513 的反馈代码
+ 如果作为参数传递给实用程序的图片无效，则将记录一条错误消息，并且可以选择向反馈代码持有者提供严重性为 3 的反馈代码和编号为 2518 的反馈代码
+ 如果出于任何原因无法计算 lilian seconds 的输出，则第三个参数（输出）将设置为 0

### 示例用法
<a name="ceesecs-sample"></a>

以下是 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
<a name="ilboabn0"></a>

### 用途
<a name="ilboabn0-purpose"></a>

ILBOABN0 程序的目的是使用用户提供的终止（异常结束）代码，以受控的方式中断当前运行的单元。通常用于错误处理专用程序。

通过投掷 a 来中断当前运行的单元`StopRunUnitException`。

### 签名
<a name="ilboabn0-signature"></a>

ILBOABN0 程序采用一个强制性参数，该参数是一个包含中止代码的数据项（必须可以解释为整数）。

### 检查/错误处理
<a name="ilboabn0-error"></a>

在抛出`StopRunUnitException`以中断当前运行单元运行时，程序会将返回码设置为作为第一个参数提供的值。此外，还将记录一条信息消息。

### 示例用法
<a name="ilboabn0-sample"></a>

以下是 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);
```