CICS 快速指南



CICS - 概述

CICS 是一个 DB/DC 系统,用于在线应用程序。CICS 的开发是因为批处理操作系统只能执行批处理程序。CICS 程序可以用 COBOL、C、C++、Java 等语言编写。如今,用户希望在几秒钟内获得实时信息。为了提供如此快速的服務,我们需要一个能够在线处理信息的系统。CICS 允许用户与后端系统通信以获取所需的信息。在线程序的示例包括网上银行系统、航班预订等。下图显示了 CICS 的组件以及它们之间是如何相互关联的:

CICS Overview

CICS 的功能

CICS 在应用程序中执行的主要功能如下:

  • CICS 管理应用程序中来自并发用户的请求。

  • 尽管多个用户正在使用 CICS 系统,但它会给用户一种他只是唯一用户的感受。

  • CICS 提供对数据文件的访问,以便在应用程序中读取或更新它们。

CICS 的特点

CICS 的特点如下:

  • CICS 本身就是一个操作系统,因为它管理自己的处理器存储,有自己的任务管理器来处理多个程序的执行,并提供自己的文件管理功能。

  • CICS 在批处理操作系统中提供在线环境。提交的作业会立即执行。

  • CICS 是一个通用的事务处理接口。

  • 可以同时拥有两个或多个 CICS 区域,因为 CICS 在后端作为批处理作业在操作系统中运行。

CICS - 环境

CICS 本身充当操作系统。它的作用是为应用程序的在线执行提供环境。CICS 在一个区域或分区或地址空间中运行。CICS 处理在其下运行的程序的调度。CICS 作为批处理作业运行,我们可以通过发出命令 PREFIX CICS* 在卷轴中查看它。CICS 提供了五项主要服务。所有这些服务共同执行一项任务。

CICS 环境

以下是我们将逐步详细讨论的服务:

  • 系统服务
  • 数据通信服务
  • 数据处理服务
  • 应用程序编程服务
  • 监控服务
  • 系统服务

CICS 保持控制功能以管理系统内资源的分配或释放,如下所示:

  • 任务控制 - 任务控制提供任务调度和多任务功能。它负责所有 CICS 任务的状态。任务控制在并发 CICS 任务之间分配处理器时间。这称为多任务处理。CICS 试图优先考虑对最重要任务的响应时间。

  • 程序控制 - 程序控制管理应用程序程序的加载和释放。一旦任务开始,就需要将任务与相应的应用程序程序关联起来。尽管许多任务可能需要使用相同的应用程序程序,但 CICS 仅将代码的一个副本加载到内存中。每个任务都独立地遍历此代码,因此许多用户都可以运行并发使用应用程序程序同一物理副本的事务。

  • 存储控制 - 存储控制管理主存储的获取和释放。存储控制获取、控制和释放动态存储。动态存储用于输入/输出区域、程序等。

  • 间隔控制 - 间隔控制提供计时器服务。

数据通信服务

数据通信服务与诸如 BTAM、VTAM 和 TCAM 等电信访问方法接口,以处理来自应用程序程序的数据通信请求。

  • CICS 通过使用基本映射支持 (BMS) 使应用程序程序免于处理终端硬件问题。

  • CICS 通过多区域操作 (MRO) 提供在同一系统中的多个 CICS 区域之间进行通信的功能。

  • CICS 通过系统间通信 (ISC) 提供一个系统中的 CICS 区域与另一个系统中的 CICS 区域进行通信的功能。

数据处理服务

数据处理服务与诸如 BDAM、VSAM 等数据访问方法接口。

  • CICS 促进为来自应用程序程序的数据处理请求提供服务。CICS 为应用程序程序员提供了一套用于处理数据集和数据库访问以及相关操作的命令。

  • 数据处理服务与诸如 IMS/DB、DB2 等数据库访问方法接口,并促进为来自应用程序程序的数据库请求提供服务。

  • CICS 通过控制同时记录更新、在任务 ABEND 时保护数据以及在系统故障时保护数据来促进数据完整性管理。

应用程序编程服务

应用程序编程服务与应用程序程序接口。CICS 的应用程序编程服务提供诸如命令级翻译、CEDF(调试功能)和 CECI(命令解释器功能)等功能。我们将在后续模块中更详细地讨论。

监控服务

监控服务监控 CICS 地址空间内的各种事件。它提供一系列统计信息,可用于系统调整。

CICS - 基本术语

我们必须了解 CICS 中使用的基本术语,才能更好地理解其工作原理。应用程序程序使用 CICS 与远程和本地终端以及子系统进行通信。

IBM 3270 终端

3270 信息显示系统是显示器和打印机终端系列。3270 终端用于通过 IBM 控制器连接到主机。如今,3270 仿真软件可用,这意味着即使是普通的 PC 也可用作 3270 终端。3270 终端是哑终端,本身不进行任何处理。所有处理都需要由应用程序程序完成。IBM 终端包含以下组件:

CRT 显示器

CRT 显示器显示应用程序程序的输出或输入字段。下面显示了 CRT 显示器 3278 型号的屏幕截图。它具有以下特点:

  • 它能够显示 1920 个字符。

  • 这 1920 个字符位置中的每一个都是可单独寻址的。

  • COBOL 应用程序程序可以将数据发送到屏幕上的所有位置。

  • 可以使用 BMS 设置字段的显示特性(如强度、受保护、不受保护),我们将在后续模块中详细讨论。

CICS CRT Monitor

键盘

IBM 键盘键分为以下两类:

  • 非辅助键 - 字母、数字、标点符号等所有其他键都是非辅助键。当用户使用非辅助键键入文本或数字时,CICS 甚至不知道用户是否正在键入任何内容。

  • 辅助键 - 辅助键称为注意力识别键。CICS 只能检测辅助键。键入所有输入后,只有当用户按下其中一个辅助键时,CICS 才会接管控制权。辅助键:ENTER、PF1 到 PF24、PA1 到 PA3、CLEAR。辅助键进一步分为两类:

    • PF 键 - PF 键称为功能键。PF 键允许将数据从终端传输到 CICS。PF 键是 ENTER 和 PF1 到 PF24。

    • PA 键 - PA 键称为程序访问键。PA 键不允许在终端和 CICS 之间传输数据。PA 键是 PA1 到 PA3 和 CLEAR。

CICS Keyboard

事务

通过事务调用 CICS 程序。CICS 事务是应用程序中一组逻辑相关的程序。整个应用程序可以逻辑地划分为多个事务。

  • 事务标识符(长度为 1 到 4 个字符)用于标识用户想要执行的事务。

  • 程序员将一个程序链接到事务标识符,该标识符用于调用该特定事务的所有应用程序程序。

任务

任务是特定于用户的单位工作。

  • 用户通过使用其中一个事务标识符来调用应用程序。CICS 查找事务标识符以找出首先调用哪个程序来执行请求的工作。它创建一个任务来执行工作,并将控制权转移到提到的程序。

  • 可以通过多个任务完成一个事务。

  • 任务可以接收来自启动它的终端的数据,并向该终端发送数据。它可以读取和写入文件,还可以启动其他任务。

任务与事务

事务和任务之间的区别在于,多个用户可以调用一个事务,但每个用户都会启动自己的任务。

LUW

LUW 代表逻辑工作单元。LUW 指出应完全完成一项工作,否则不应完成。一个任务可以在 CICS 中包含多个逻辑工作单元。我们将在后续模块中进一步讨论。

应用程序

应用程序是一系列逻辑分组的程序,用于形成多个事务,这些事务用于为最终用户完成特定任务。

a

CICS - 内核

前面描述的五个 CICS 系统组件是 CICS 系统程序的一个方便的分组,每个组件都执行其自己的专门功能。CICS 的核心称为 CICS 内核,它包含 IBM 提供的 CICS 控制程序和控制表。

控制程序

CICS 内核由控制程序和相应的控制表构成。它提供了独特的优势。它使 CICS 系统高度灵活,因此易于维护。以下是 CICS 的重要控制程序:

TCP

TCP 称为终端控制程序。

  • TCP 用于接收来自终端的消息。

  • 它维护硬件通信需求。

  • 它请求 CICS 启动任务。

KCP

KCP 称为任务控制程序。

  • KCP 用于同时控制任务及其相关属性的执行。

  • 它处理与多任务处理相关的所有问题。

PCP

PCP 称为程序控制程序。

  • PCP 用于查找和加载程序以供执行。

  • 它在程序之间传递控制,最后将控制权返回给 CICS。

FCP

FCP 称为文件控制程序。

  • FCP 用于为应用程序程序提供诸如读取、插入、更新或删除文件中的记录等服务。

  • 它对记录保持独占控制,以在记录更新期间维护数据完整性。

SCP

SCP 称为存储控制程序。它用于控制 CICS 区域内存储的分配和释放。

控制表

CICS 由 IBM 提供的 CICS 控制程序和表组成。需要根据应用程序信息相应地更新这些表,以便成功执行 CICS 应用程序程序。以下是重要的控制表:

TCT

TCT 指的是终端控制表(Terminal Control Table)。

  • 当我们登录到 CICS 终端时,会在 TCT 表中创建一个条目。

  • TCT 包含连接到当前 CICS 区域的所有终端 ID。

  • 终端控制程序以及终端控制表识别来自终端的输入数据。

PCT

PCT 指的是程序控制表(Program Control Table)。

  • 它包含事务 ID (TRANSID) 和对应的程序名称或程序 ID。

  • TRANSID 在 PCT 表中是唯一的。

PPT

PPT 指的是处理程序表(Processing Program Table)。PPT 包含程序名称或映射集名称、任务使用计数器、语言、大小、主存储地址、加载库地址等。

  • 程序或映射集名称在 PPT 表中是唯一的。

  • CICS 接收事务,并从 PCT 中分配一个相应的程序名称给该事务。它检查程序是否已加载。如果已加载,则任务使用计数器加 1。如果程序未加载,则先加载程序,并将任务使用计数器设置为 1。它从 PPT 表中获取加载库地址。

FCT

FCT 指的是文件控制表(File Control Table)。

  • 它包含文件名称、文件类型、记录长度等。

  • CICS 程序中使用的所有文件都必须在 FCT 中声明,并且由 CICS 本身打开和关闭。

事务

当在 CICS 终端上输入事务标识符 TP02 时,首先检查 PCT 表中是否存在与此事务标识符关联的程序。如果找到,则在 PPT 表中检查以查找要执行的程序的位置。

如果程序已存在于内存中,则开始执行该程序;否则,将程序从辅助存储加载到内存中,然后开始执行。

CICS Transaction

事务生命周期

事务生命周期包含以下步骤:

CICS Transaction Life Cycle

步骤 1

终端操作员通过输入 1 到 4 个字符的事务 ID 并按下 ENTER 键来启动事务。

步骤 2

TCP 定期检查所有终端的输入。当收到消息时,它会执行以下操作:

  • 指示 SCP 创建 TIOA。

  • 将消息放入 TIOA 中。

  • 将控制权传递给 KCP。

步骤 3

KCP 从 TCP 获取控制权并执行以下操作:

  • 验证事务 ID 和安全性。

  • 指示 SCP 创建任务控制区。

  • 根据终端优先级(在 TCT 中设置)、操作员优先级(在 SNT 中设置)和事务优先级(在 PCT 中设置)为任务分配优先级。

  • 将任务添加到等待程序队列中。

  • 按优先级顺序调度等待程序。

  • 将控制权传递给 PCP。

步骤 4

PCP 从 KCP 获取控制权并执行以下操作:

  • 找到程序并加载它(如果需要)。

  • 将控制权转移到应用程序。

步骤 5

应用程序从 PCP 获取控制权并执行以下操作:

  • 请求 TCP 将消息放入程序的 WORKING STORAGE 区域。

  • 请求 FCP 从文件中检索记录。

步骤 6

FCP 从应用程序获取控制权并执行以下操作:

  • 从 SCP 请求文件工作区。

  • 通知 KCP 此任务可以等待直到 I/O 完成。

步骤 7

KCP 执行以下操作:

  • 调度队列中的下一个任务。

  • 在 I/O 完成后重新调度旧任务。

  • 将控制权转移到 FCP。

步骤 8

FCP 将控制权返回给应用程序。

步骤 9

应用程序执行以下操作:

  • 处理文件数据。

  • 请求 TCP 发送 I/O 消息。

  • 将控制权返回给 PCP。

步骤 10

PCP 将控制权返回给 KCP,请求它结束任务。

步骤 11

KCP 指示 SCP 释放分配给任务的所有存储空间(TIOA 除外)。

步骤 12

TCP 执行以下操作:

  • 将输出发送到终端。

  • 请求 SCP 释放 TIOA。

CICS - 事务

CICS 事务用于在 CICS 区域中执行多个操作。我们将详细讨论 IBM 提供的重要 CICS 事务。

CESN

CESN 指的是 CICS 执行登录(CICS Execute Sign On)。

  • CESN 用于登录到 CICS 区域。

  • 我们需要提供 CICS 管理员提供的用户 ID 和密码才能登录到 CICS。以下屏幕截图显示了登录屏幕的外观:

CICS CESN

CEDA

CEDA 指的是 CICS 执行定义和管理(CICS Execute Definition and Administration)。它由 CICS 系统管理员用来定义 CICS 表条目和其他管理活动。

CEMT

CEMT 指的是 CICS 执行主终端(CICS Execute Master Terminal)。它用于查询和更新 CICS 环境的状态,以及执行其他系统操作。

  • 使用 CEMT 命令,我们可以管理事务、任务、文件、程序等。

  • 要获取所有可能的选项,请键入 CEMT 并按 ENTER 键。它将显示所有选项。

  • CEMT 主要用于将新程序加载到 CICS 中,或者在程序或映射集更改后将新程序副本加载到 CICS 中。

示例

可以覆盖显示的文件状态以更改它。以下示例显示了如何关闭文件:

CEMT 
  
** Press ENTER & Following Screen is displayed **  

STATUS: ENTER ONE OF THE FOLLOWING 
Inquire 
Perform 
Set 
 
** Command to close a file **
  
CEMT SET FILE (file-name) 
CEMT I FILE (file-name)

CECI

CECI 指的是 CICS 执行命令解释器(CICS Execute Command Interpreter)。可以使用 CECI 执行许多 CICS 命令。

  • CECI 用于检查命令的语法。只有在语法正确的情况下,它才会执行命令。

  • 登录后在空白的 CICS 屏幕上键入 CECI 选项。它会提供可用的选项列表。

示例

以下示例显示了如何将映射输出数据发送到终端。我们将在后续模块中讨论映射。

CECI SEND MAP (map-name) MAPSET (mapset-name) ERASE 

CEDF

CEDF 指的是 CICS 执行调试工具(CICS Execute Debug Facility)。它用于逐步调试程序,这有助于查找错误。

在 CICS 区域中键入 CEDF 并按 Enter 键。将显示终端处于 EDF 模式消息。现在键入事务 ID 并按 Enter 键。启动后,每次按 Enter 键都会执行一行。在执行任何 CICS 命令之前,它会显示一个屏幕,您可以在其中修改值然后再继续。

CMAC

CMAC 指的是 CICS 异常代码消息(CICS Messages for Abend Codes)。它用于查找 CICS 异常代码的解释和原因。

示例

以下示例显示了如何检查异常代码的详细信息:

CMAC abend-code

CESF

CESF 指的是 CICS 执行注销(CICS Execute Sign Off)。它用于从 CICS 区域注销。

示例

以下示例显示了如何从 CICS 区域注销:

CESF LOGOFF

CEBR

CEBR 指的是 CICS 执行临时存储浏览(CICS Execute Temporary storage Browse)。它用于显示临时存储队列或 TSQ 的内容。

在调试期间,CEBR 用于检查队列中的项目是否正在正确写入和检索。我们将在后续模块中进一步讨论 TSQ。

示例

以下示例显示了如何调用 CEBR 命令:

CEBR queue-id

CICS 概念

每个命令都可以通过执行一系列 CICS 宏来实现。我们将讨论一些基本功能,这些功能将帮助我们更好地理解这些概念:

多任务处理

此操作系统功能允许同时执行多个任务。任务可以共享相同的程序或使用不同的程序。CICS 在其自己的区域中调度任务。

多线程

此操作系统功能允许同时执行多个任务,并共享相同的程序。要实现多线程,应用程序必须是在操作系统下是**可重入程序**(re-entrant program),或在 CICS 下是**准可重入程序**(quasi-reentrant)。

可重入性

可重入程序是指不会修改自身,并且可以在中断后重新进入自身并继续处理的程序。

准可重入性

准可重入程序是在 CICS 环境下的可重入程序。CICS 通过为每个任务获取唯一的存储区域来确保可重入性。在 CICS 命令之间,CICS 拥有独占使用 CPU 资源的权利,并且可以执行其他任务的其他 CICS 命令。

有时,许多用户会同时使用同一个程序;这就是我们所说的**多线程**。例如,假设 50 个用户正在使用程序 A。在此,CICS 将为该程序提供 50 个工作存储区,但只有一个过程部分。这种技术称为**准可重入**。

CICS - COBOL 基础

CICS 程序是用 COBOL 语言在大型机上编写的。我们将讨论编写一个简单的 COBOL-CICS 程序,编译它,然后执行它。

CICS 程序

我们将编写一个简单的 COBOL-CICS 程序,它在 CICS 输出屏幕上显示一些消息。此程序用于演示执行 COBOL-CICS 程序所涉及的步骤。以下是编写简单程序的步骤:

步骤 1

登录到大型机并打开 TSO 会话。

步骤 2

创建一个新的 PDS,我们将在其中编写我们的程序。

步骤 3

在 PDS 中创建一个新成员并编写以下程序:

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 WS-MESSAGE PIC X(40).
01 WS-LENGTH  PIC S9(4) COMP.
PROCEDURE DIVISION.
A000-MAIN-PARA.
   MOVE 'Hello World' TO WS-MESSAGE
   MOVE '+12' TO WS-LENGTH
   EXEC CICS SEND TEXT 
      FROM (WS-MESSAGE)
      LENGHT(WS-LENGTH)  
   END-EXEC
   EXEC CICS RETURN
   END-EXEC.	 

步骤 4

编写程序后,我们需要对其进行编译。我们可以使用以下 JCL 编译程序:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C  
//CICSCOB  EXEC CICSCOB,                                                
//COPYLIB = ABC.XYZ.COPYLIB,                            
//LOADLIB = ABC.XYZ.LOADLIB 
//LIB        JCLLIB ORDER = CICSXXX.CICS.XXXPROC                
//CPLSTP     EXEC DFHEITVL                                
//TRN.SYSIN  DD DSN = ABC.XYZ.PDS(HELLO),DISP = SHR     
//LKED.SYSIN DD *                                        
   NAME HELLO(R)                                          
//

步骤 5

打开 CICS 会话。

步骤 6

现在,我们将使用以下命令安装程序:

CEMT SET PROG(HELLO) NEW.

步骤 7

使用关联的事务 ID 执行程序。事务 ID 由管理员提供。它将显示以下输出:

CICS Output

程序编译

以下流程图显示了编译 COBOL-CICS 程序中使用的步骤:

CICS Compilation

翻译器

翻译器的功能是检查 CICS 命令中的语法错误。它将它们翻译成等效的 COBOL 语句。

编译器

编译器的功能是扩展 COBOL 副本库。在检查源代码的语法错误后,它会编译代码。

链接编辑器

链接编辑器的功能是将不同的目标模块链接起来,创建一个单一的加载模块。

CICS - BMS

BMS被称为基本映射支持。一个应用程序由格式化的屏幕组成,充当终端和CICS程序之间的桥梁。为了在终端和CICS程序之间进行通信,我们使用CICS终端输入/输出服务。我们使用BMS创建具有适当位置和属性的屏幕设计。以下是BMS的功能:

  • BMS充当终端和CICS程序之间的接口。

  • 屏幕的设计和格式与应用程序的逻辑是分开的。

  • BMS使应用程序与硬件无关。

格式化屏幕

下面显示的屏幕是一个菜单屏幕,可以使用BMS进行设计。其要点如下:

  • 屏幕可以包含标题、日期以及需要显示的任何其他信息。

  • 选项1、2和3是未命名的字段,是屏幕的标题。

  • 在选择字段中,我们需要提供输入。然后将此输入发送到CICS程序以进行进一步处理。

  • 在屏幕底部,显示操作键。

  • 所有字段和屏幕本身都使用BMS宏定义。当整个映射定义完成后,我们可以使用JCL对其进行汇编。

CICS Screen

BMS基本术语

以下是我们将在后续模块中使用的基本术语:

映射

映射是单个屏幕格式,可以使用BMS宏进行设计。它可以具有包含1到7个字符的名称。

映射集

映射集是一组映射,它们链接在一起形成一个加载模块。它应该有一个PPT条目。它可以具有1到7个字符的名称。

BMS宏

BMS映射是用汇编语言编写的程序,用于管理屏幕。用于定义屏幕的三个宏是DFHMSD、DFHMDI和DFHMDF。

DFHMSD

DFHMSD宏生成映射集定义。它是宏标识符,表示我们正在开始一个映射集。映射集名称是加载模块名称,并且必须存在PPT表中的一个条目。下表显示了可以在DFHMSD中使用的参数列表:

序号 参数及描述
1

TYPE

TYPE用于定义映射类型。如果TYPE=
MAP - 创建物理映射
DSECT - 创建符号映射
&&SYSPARM - 创建物理和符号映射。
FINAL - 指示映射集编码的结束。

2

MODE

MODE用于指示输入/输出操作。如果MODE=
IN - 仅用于输入映射
OUT - 仅用于输出映射
INOUT - 用于输入和输出映射

3

LANG

LANG = ASM/COBOL/PL1
它决定了DSECT结构的语言,用于复制到应用程序程序中。

4

STORAGE

如果STORAGE=
AUTO - 为每个映射集获取一个单独的符号映射区域
BASE - 对来自多个映射集的符号映射具有相同的存储基地址

5

CTRL

CRTL用于定义设备控制请求。如果CTRL=
FREEKB - 解锁键盘
FRSET - 将MDT重置为零状态
ALARM - 在屏幕显示时设置警报
PRINT - 指示将映射集发送到打印机。

6

TERM

TERM = type 确保设备独立性,如果使用除3270终端之外的终端,则需要此参数。

7

TIOAPFX

TIOAPFX = YES/NO
YES - 为BMS命令保留前缀空间(12字节),以便正确访问TIOA。CICS命令级别需要此参数。

示例

以下示例显示了如何编码映射集定义:

MPST01  DFHMSD TYPE = &SYSPARM, X
   CTRL = (FREEKB,FRSET), X
   LANG = COBOL, X 
   STORAGE = AUTO, X
   TIOAPFX = YES, X
   MODE = INOUT, X
   TERM = 3270
   DFHMSD TYPE = FINAL 
END

DFHMDI

DFHMDI宏生成映射定义。它表示我们正在开始一个新的映射。映射名称后跟DFHMDI宏。映射名称用于发送或接收映射。下表显示了我们在DFHMDI宏内使用的参数:

序号 参数及描述
1

SIZE

SIZE = (行,列)
此参数给出映射的大小。BMS允许我们使用多个映射构建屏幕,当我们在单个映射集中使用多个映射时,此参数变得很重要。

2

LINE

它指示映射的起始行号。

3

COLUMN

它指示映射的起始列号。

4

JUSTIFY

它用于指定整个映射或映射字段是左对齐还是右对齐。

5

CTRL

CRTL用于定义设备控制请求。如果CTRL=
FREEKB - 解锁键盘
FRSET - 将MDT重置为零状态
ALARM - 在屏幕显示时设置警报
PRINT - 指示将映射发送到打印机

6

TIOAPFX

TIOAPFX = YES/NO

YES - 为BMS命令保留前缀空间(12字节),以便正确访问TIOA。CICS命令级别需要此参数。

示例

以下示例显示了如何编码映射定义:

MAPSTD DFHMDI SIZE = (20,80), X
   LINE = 01, X
   COLUMN = 01, X
   CTRL = (FREEKB,FRSET)

DFHMDF

DFHMDF宏用于定义字段名称。字段名称在编码DFHMDF宏时会提到。此字段名称在程序内部使用。我们不会对不想在程序内部使用的常量字段写入字段名称。下表显示了可以在DFHMDF宏内使用的参数列表:

序号 参数及描述
1

POS

这是字段应出现在屏幕上的位置。字段以其属性字节开头,因此,如果您编码POS = (1,1),则该字段的属性字节位于第1行第1列,实际数据从第2列开始。

2

LENGTH

这是字段的长度,不包括属性字节。

3

INITIAL

这是输出字段的字符数据。我们使用它来指定屏幕的标签和标题,并使它们独立于程序。例如,对于菜单屏幕中的第一个字段,我们将编码:INITIAL = 'MENU'。

4

JUSTIFY

它用于指定整个映射或映射字段是左对齐还是右对齐。

5

ATTRB

ATTRB = (ASKIP/PROT/UNPROT, NUM, BRT/NORM/DRK, IC, FSET) 它描述了字段的属性。

ASKIP - 自动跳过。无法在此字段中输入数据。光标跳到下一个字段。

PROT - 受保护字段。无法在此字段中输入数据。如果输入数据,将导致输入抑制状态。

UNPROT - 未受保护字段。可以输入数据,这用于所有输入字段。

NUM - 数字字段。仅允许数字(0到9)和特殊字符('.'和'-')。

BRT - 字段的亮显示(突出显示)。

NORM - 正常显示。

DRK - 深色显示。

IC - 插入光标。光标将定位在此字段中。如果多次指定IC,则光标将放置在最后一个字段中。

FSET - 字段集。MDT设置为打开状态,以便将字段数据从终端发送到主机计算机,而不管用户是否实际修改了该字段。

6

PICIN

PICIN适用于用作输入的数据字段,例如PICIN = 9(8)。

7

PICOUT

PICIN适用于用作输出的数据字段,例如PICOUT = Z(8)。

示例

以下示例显示了如何编码字段定义:

DFHMDF POS = (01,01), X
   LENGTH = 7, X
   INITIAL = ‘SCREEN1’, X
      ATTRB = (PROT,NORM)
      STDID DFHMDF POS = (01,70), X
      LENGTH = 08, X
      ATTRB = (PROT,NORM)

CICS - MAP

BMS接收用户输入的数据,然后将其格式化为符号映射区域。应用程序程序只能访问符号映射中存在的数据。应用程序程序处理数据,并将输出发送到符号映射。BMS将符号数据的输出与物理映射合并。

CICS MAPS

物理映射

物理映射是加载库中的加载模块,其中包含有关如何显示映射的信息。

  • 它包含有关映射中所有字段的属性及其位置的详细信息。

  • 它包含给定终端的映射的显示格式。

  • 它使用BMS宏进行编码。它被单独汇编并链接编辑到CICS库中。

符号映射

符号映射是库中的复制簿。CICS应用程序程序使用复制簿从终端发送和接收数据。

  • 它包含所有复制到程序WORKINGSTORAGE部分的可变数据。

  • 它包含所有命名字段。应用程序程序员使用这些字段读取和写入映射中的数据。

跳过字段和停止字段

对于映射中的未受保护的命名字段,如果我们指定了长度为10,则表示名称字段可以取长度不超过10的值。但是,当您使用CICS显示此映射并在屏幕上开始输入此字段的值时,我们可以输入超过10个字符,即直到屏幕末尾,我们甚至可以在下一行输入。为了防止这种情况,我们使用跳过字段或停止字段。跳过字段通常是一个长度为1的未命名字段,位于命名字段之后。

CICS Skipper & Stopper Field

跳过字段

如果我们在命名未受保护字段之后放置一个跳过字段,则在输入值时,一旦达到指定的长度,光标将自动定位到下一个未受保护字段。以下示例显示了如何添加跳过字段:

NUMBER  DFHMDF POS = (01,01), X
   LENGTH = 5, X
   ATTRB = (UNPROT,IC)
      DFHMDF POS = (01,07), X
      LENGTH = 1, X
      ATTRB = (ASKIP)

停止字段

如果我们在命名未受保护字段之后放置一个停止字段,则在输入值时,一旦达到指定的长度,光标将停止定位。以下示例显示了如何添加停止字段:

NUMBER  DFHMDF POS = (01,01), X
   LENGTH = 5, X
	ATTRB = (UNPROT,IC)
	   DFHMDF POS = (01,07), X
      LENGTH = 1, X
      ATTRB = (PROT)

属性字节

任何字段的属性字节都存储有关字段物理属性的信息。下图和表格解释了每一位的含义。

CICS Attribute Byte
位位置 描述 位设置
0 & 1   由位2到7的内容确定
2 & 3 保护和移位 00 - 未受保护的字母数字
01 - 未受保护的数字
10 - 受保护的停止
11 - 受保护的跳过
4 & 5 强度 00 - 正常
01 - 正常
10 - 亮
11 - 无显示(暗)
6   必须始终为零
7 修改数据标记 0 - 字段未被修改
1 - 字段已被修改

修改数据标记

修改数据标记 (MDT) 是属性字节中的最后一位。

  • MDT是一个保存单个位的标志。它指定是否将值传输到系统。

  • 当字段值更改时,其默认值为1。

  • 如果 MDT 为 0,则数据无法传输;如果 MDT 为 1,则数据可以传输。

发送映射

发送映射命令将格式化输出写入终端。它用于从应用程序程序将映射发送到终端。以下代码段显示了如何将映射发送到终端:

EXEC CICS SEND 
   MAP('map-name')
   MAPSET('mapset-name')
   [FROM(data-area)]
   [LENGTH(data_value)]
   [DATAONLY]
   [MAPONLY]
   [CURSOR]
   [ERASE/ERASEAUP]
   [FREEKB] 
   [FRSET]
END-EXEC   

下表列出了发送映射命令中使用的参数及其含义。

序号 参数及描述
1

映射名称

它是我们要发送的映射的名称。这是必须的。

2

映射集名称

它是包含映射名称的映射集的名称。除非映射集名称与映射名称相同,否则需要映射集名称。

3

FROM

如果我们决定使用不同的 DSECT 名称,则必须将 FROM (dsect-name) 选项与 SEND MAP 命令一起使用。

4

MAPONLY

这意味着程序中的任何数据都不会合并到映射中,并且仅传输映射中的信息。

5

DATAONLY

它是 MAPONLY 的逻辑相反。我们用它来修改已创建显示中的可变数据。只有来自程序的数据被发送到屏幕。映射中的常量不会被发送。

6

ERASE

它会导致在显示我们发送的内容之前清除整个屏幕。

7

ERASEUP

它只会擦除未受保护的字段。

8

FRSET

标志重置在您发送的内容放置到屏幕上之前,关闭屏幕上所有字段的属性字节中的修改数据标记。

9

CURSOR

它可用于在终端屏幕上定位光标。可以通过将 -1 移动到字段的 L 部分,然后发送映射来设置光标。

10

ALARM

它会导致发出警报声。

11

FREEKB。

如果我们在映射或发送命令中指定 FREEKB,则键盘将被解锁。

12

PRINT

它允许将发送命令的输出打印到打印机上。

13

FORMFEED

在输出打印之前,它会导致打印机将纸张恢复到下一页的顶部。

接收映射

当我们想要从终端接收输入时,我们使用 RECEIVE MAP 命令。MAP 和 MAPSET 参数与 SEND MAP 命令的含义完全相同。以下代码段显示了如何接收映射:

EXEC CICS RECEIVE 
   MAP('map-name')
   MAPSET('mapset-name')
   [INTO(data-area)]
   [FROM(data-area)]
   [LENGTH(data_value)]
END-EXEC

映射集执行

开发和执行映射集需要以下步骤:

  • 步骤 1 - 打开一个 TSO 会话。

  • 步骤 2 - 创建一个新的 PDS。

  • 步骤 3 - 根据需求在新成员中编写映射集。

  • 步骤 4 - 使用 CICS 管理员提供的 JCL 汇编映射集。

  • 步骤 5 - 打开一个 CICS 会话。

  • 步骤 6 - 使用以下命令安装程序:

    CEMT SET PROG(mapset-name) NEW

  • 步骤 7 - 输入以下命令将映射发送到终端:

    CECI SEND MAP(map-name) MAPSET(mapset-name) ERASE FREEKB

CICS - 接口块

任何应用程序程序都需要一个接口来与 CICS 交互。EIB(执行接口块)充当一个接口,允许应用程序程序与 CICS 通信。EIB 包含程序执行期间所需的信息。

受限的 COBOL 动词

在编写 CICS 程序时,我们不能使用将控制权直接返回给 MVS 的命令。如果我们编写这些 COBOL 动词,它不会产生任何编译错误,但我们可能会得到不可预测的结果。以下是在 CICS 程序中不应使用的 COBOL 动词:

  • 文件 I/O 语句,如 Open、Read、Write、Rewrite、Close、Delete 和 Start。CICS 中的所有文件 I/O 都由文件控制模块处理,它们有自己的一套语句,如 READ、WRITE、REWRITE 和 DELETE,我们将在后续模块中讨论。

  • 不需要文件段和环境部。

  • 调用操作系统功能的 COBOL 语句,如 Accept、Date/Time 不能使用。

  • 不要使用 DISPLAY、MERGE、STOP RUN 和 GO BACK。

执行接口块

执行接口块 (EIB) 是一个控制块,由 CICS 自动加载到每个程序中。

  • EIB 对任务是唯一的,并且在任务持续时间内存在。它包含一组与任务相对应系统相关信息。

  • 它包含有关事务标识符、时间、日期等信息,这些信息在 CICS 执行应用程序程序期间使用。

  • 作为任务一部分执行的每个程序都可以访问相同的 EIB。

  • 在运行时,可以通过在 CEDF 模式下执行程序来查看 EIB 中的数据。

EIB 字段

下表提供了 EIB 中存在的字段列表:

EIB 字段 PIC 子句 描述
EIBAID X(1) 按下的辅助键
EIBCALEN S9(4) COMP 它包含 DFHCOMMAREA 的长度
EIBDATE S9(7) COMP-3 它包含当前系统日期
EIBRCODE X(6) 它包含上次事务的返回码
EIBTASKN S9(7) COMP-3 它包含任务号
EIBTIME S9(7) COMP-3 它包含当前系统时间
EIBTRMID X(4) 终端标识符
EIBTRNID X(4) 事务标识符

CICS 程序分类

CICS 程序分为以下三类,我们将逐一讨论:

  • 非会话程序
  • 会话程序
  • 伪会话程序 - 我们将在下一模块中讨论

非会话程序

在执行非会话程序时,不需要人工干预。所有必要的输入都在程序启动时提供。

  • 它们类似于在批处理模式下运行的批处理程序。因此,在 CICS 中,它们很少被开发。

  • 我们可以说它们仅用于以固定的时间间隔显示一系列屏幕。

示例

以下示例显示了一个非会话程序,它将简单地在 CICS 终端上显示“HELLO WORLD”作为输出:

IDENTIFICATION DIVISION.                                
PROGRAM-ID. HELLO.                                      
DATA DIVISION.                                          
WORKING-STORAGE SECTION.                                
01 WS-MESSAGE          PIC X(30).                       
PROCEDURE DIVISION.                                     
********************************************************
* SENDING DATA TO SCREEN                               * 
********************************************************
   MOVE 'HELLO WORLD' TO WS-MESSAGE                
   EXEC CICS SEND TEXT                             
      FROM (WS-MESSAGE)                          
   END-EXEC                                        
********************************************************
* TASK TERMINATES WITHOUT ANY INTERACTION FROM THE USER* 
********************************************************
   EXEC CICS RETURN                                
END-EXEC.

会话程序

发送消息到终端并接收用户的响应称为会话。在线应用程序通过一对 SEND 和 RECEIVE 命令实现用户和应用程序程序之间的会话。会话程序的关键点如下:

  • 系统将消息发送到屏幕并等待用户的响应。

  • 用户响应所花费的时间称为思考时间。此时间相当长,这是会话程序的主要缺点。

  • 用户提供必要的输入并按下辅助键。

  • 应用程序处理用户的输入并发送输出。

  • 程序在开始时加载到主存储器中,并在任务结束之前保留。

CICS Conversion Program

示例

以下示例显示了一个转换程序,该程序从用户处获取输入,然后简单地在 CICS 终端上显示相同的输入作为输出:

IDENTIFICATION DIVISION.                               
PROGRAM-ID. HELLO.                                     
DATA DIVISION.                                         
WORKING-STORAGE SECTION.                               
01 WS-MESSAGE          PIC X(30) VALUE SPACES.         
PROCEDURE DIVISION.                                    
   MOVE 'ENTER MESSAGE' TO WS-MESSAGE           
********************************************************
* SENDING DATA FROM PROGRAM TO SCREEN                  * 
********************************************************
   EXEC CICS SEND TEXT                            
      FROM (WS-MESSAGE)                         
   END-EXEC                                       
********************************************************
* GETTING INPUT FROM USER                              * 
********************************************************
   EXEC CICS RECEIVE                              
      INTO(WS-MESSAGE)                          
   END-EXEC                                       
   EXEC CICS SEND TEXT                            
      FROM (WS-MESSAGE)                         
   END-EXEC                                       
********************************************************
* COMMAND TO TERMINATE THE TRANSACTION                 * 
********************************************************
   EXEC CICS RETURN                               
END-EXEC.                                       

CICS - 伪编程

到目前为止,我们已经介绍了非转换程序和转换程序。转换程序有一个主要缺点,即它们的思考时间相当长。为了克服这个问题,伪转换编程出现了。我们现在将进一步讨论伪转换程序。

伪转换程序

以下是伪转换程序中发生的事件顺序:

  • 步骤 1 - 系统将消息发送到屏幕并终止事务,指定在收到用户输入时要启动的事务。

  • 步骤 2 - 系统将此事务使用的资源分配给系统中运行的其他事务。因此,我们可以利用伪转换程序中的资源,直到用户给出输入。

  • 步骤 3 - 系统以固定的时间间隔轮询终端输入。当收到输入时,它会被处理,并且显示输出。

  • 步骤 4 - 应用程序程序在需要时加载到主存储器中,并在不使用时释放。

CICS Pseudo Conversion Program

伪转换技术

在伪转换中需要注意的重要一点是在每个任务之间传递数据。我们将讨论传递数据的方法。

COMMAREA

COMMAREA 称为通信区域。COMMAREA 用于在任务之间传递数据。以下示例显示了如何传递 COMMAREA,其中 WSCOMMAREA 和 WS-COMMAREA-LENGTH 在工作存储段中声明:

EXEC CICS RETURN
   TRANSID ('transaction-id')
   COMMAREA (WS-COMMAREA)
   LENGTH  (WS-COMMAREA-LENGTH)
END-EXEC.

DFHCOMMAREA

DFHCOMMAREA 是 CICS 为每个任务提供的特殊内存区域。

  • 它用于将数据从一个程序传递到另一个程序。程序可以存在于相同的事务中,也可以存在于不同的事务中。

  • 它在程序的连接段中以 01 级声明。

  • 它应该具有与 WS-COMMAREA 相同的图片子句。

  • 可以使用 MOVE 语句将数据从 DFHCOMMAREA 移动回 WS-COMMAREA。

MOVE DFHCOMMAREA TO WS-COMMAREA.

示例

发送映射后,任务结束并等待用户响应。在此阶段,需要保存数据,因为尽管任务已结束,但事务尚未结束。当此事务需要恢复时,它将需要任务的先前状态。用户输入输入。现在必须由 RECEIVE MAP 命令接收,然后进行验证。以下示例显示了如何声明 COMMAREA 和 DFHCOMMAREA:

WORKING-STORAGE SECTION.
01 WS-COMMAREA.
   05 WS-DATA PIC X(10).
   
LINKAGE SECTION.
01 DFHCOMMAREA.
   05 LK-DATA PIC X(10).

伪代码

以下是我们在伪编程中使用的伪代码逻辑:

MOVE DFHCOMMAREA TO WS-COMMAREA
IF EIBCALEN = 0
   STEP1: SEND MAP
   STEP2: MOVE <internal-transaction-id1> to WS-COMMAREA
   STEP3: ISSUE CONDITIONAL RETURN
ELSE
   IF WS-COMMAREA = <internal-transaction-id1> 
      STEP4: RECEIVE MAP
      STEP5: PROCESS DATA
      STEP6: SEND OUTPUT MAP
      STEP7: MOVE <internal-transaction-ID2> to WS-COMMAREA
      STEP8: ISSUE CONDITIONAL RETURN 
   END-IF
END-IF      
STEP9: REPEAT STEP3 TO STEP7 UNTIL EXIT

示例

以下示例显示了一个伪转换程序:

******************************************************************
* PROGRAM TO DEMONSTRATE PSEUDO-CONVERSATION                     *
******************************************************************
IDENTIFICATION DIVISION.                                         
PROGRAM-ID. HELLO.                                               
DATA DIVISION.                                                   
WORKING-STORAGE SECTION.                                         
01 WS-MESSAGE          PIC X(30).                                
01 WS-COMMAREA         PIC X(10) VALUE SPACES.                    
LINKAGE SECTION.                                                 
01 DFHCOMMAREA         PIC X(10).                                 
PROCEDURE DIVISION.
   MOVE DFHCOMMAREA TO WS-COMMAREA
   IF  WS-COMMAREA  =  SPACES                                   
******************************************************************
* TRANSACTION GETTING EXECUTED FOR THE FIRST TIME                *
******************************************************************
   MOVE 'HELLO' TO WS-MESSAGE                               
   EXEC CICS SEND TEXT                                      
      FROM (WS-MESSAGE)                                   
   END-EXEC                                                 
   MOVE 'FIRST' TO WS-COMMAREA                              
******************************************************************
* TASK ENDS AS A RESULT OF RETURN. IF AID KEY PRESSED, NEXT      *
* TRANSACTION SHOULD BE TP002. DATA PASSED FROM WS-COMMAREA TO   *
* DFHCOMMAREA                                                    *
******************************************************************
   EXEC CICS RETURN                                         
      TRANSID('TP002')                                      
      COMMAREA(WS-COMMAREA)                                
   END-EXEC                                                 
******************************************************************
* IF  COMMAREA IS NOT EMPTY , THEN TP002 HAS BEEN EXECUTED ONCE  *
* ALREADY, USER INTERACTION IS FACILITATED BY RECEIVE            *
******************************************************************
   ELSE                                                         
      EXEC CICS RECEIVE                                        
         INTO(WS-MESSAGE)                                    
   END-EXEC
      EXEC CICS SEND TEXT                                      
      FROM (WS-MESSAGE)                                   
   END-EXEC                                                 
******************************************************************
* TASK ENDS AS A RESULT OF RETURN, NO NEXT TRANSACTION SPECIFIED *
* TO BE EXECUTED                                                 *
******************************************************************
   EXEC CICS RETURN                                         
   END-EXEC                                                 
END-IF.       

伪转换的优点

以下是伪转换的优点:

  • 资源得到最佳利用。资源在程序暂时挂起后立即释放。

  • 它看起来像是处于会话模式。

  • 它具有更好的响应时间。

返回语句

以下是 CICS 中使用的两种类型的返回语句:

返回-1

发出以下无条件返回语句时,任务和事务(程序)将终止。

EXEC CICS RETURN 
END-EXEC.

返回-2

发出以下条件返回,即带 TRANSID 语句的返回时,控制权将返回到 CICS,并执行下一个 transid。当用户按下辅助键时,下一个事务开始。

EXEC CICS RETURN
   TRANSID ('trans-id')
   [COMMAREA(WS-COMMAREA)]
END-EXEC.

CICS - 辅助键

正如我们在之前的模块中讨论的那样,AID 键被称为注意力标识键。CICS 只能检测 AID 键。在输入完所有内容后,只有当用户按下其中一个 AID 键时,CICS 才会接管控制权。AID 键包括 ENTER、PF1 到 PF24、PA1 到 PA3 和 CLEAR。

验证 AID 键

用户按下的键通过使用 EIBAID 进行检查。

  • EIBAID 长度为一个字节,并保存 3270 输入流中使用的实际注意力标识符值。

  • CICS 为我们提供了一组预编码的变量,可以通过编写以下语句在应用程序中使用:

    COPY DFHAID

DFHAID

DFHAID 是一个复制簿,用于在应用程序中包含 CICS 预编码的变量集。DFHAID 复制簿中包含以下内容:

01    DFHAID.                             
   02  DFHNULL   PIC  X  VALUE IS ' '.     
   02  DFHENTER  PIC  X  VALUE IS ''''.    
   02  DFHCLEAR  PIC  X  VALUE IS '_'.     
   02  DFHCLRP   PIC  X  VALUE IS '¦'.     
   02  DFHPEN    PIC  X  VALUE IS '='.     
   02  DFHOPID   PIC  X  VALUE IS 'W'.     
   02  DFHMSRE   PIC  X  VALUE IS 'X'.     
   02  DFHSTRF   PIC  X  VALUE IS 'h'.     
   02  DFHTRIG   PIC  X  VALUE IS '"'.     
   02  DFHPA1    PIC  X  VALUE IS '%'.     
   02  DFHPA2    PIC  X  VALUE IS '>'.     
   02  DFHPA3    PIC  X  VALUE IS ','.     
   02  DFHPF1    PIC  X  VALUE IS '1'.     
   02  DFHPF2    PIC  X  VALUE IS '2'.     
   02  DFHPF3    PIC  X  VALUE IS '3'.     
   02  DFHPF4    PIC  X  VALUE IS '4'.     
   02  DFHPF5    PIC  X  VALUE IS '5'.     
   02  DFHPF6    PIC  X  VALUE IS '6'.     
   02  DFHPF7    PIC  X  VALUE IS '7'.     
   02  DFHPF8    PIC  X  VALUE IS '8'.     
   02  DFHPF9    PIC  X  VALUE IS '9'.     
   02  DFHPF10   PIC  X  VALUE IS ':'.     
   02  DFHPF11   PIC  X  VALUE IS '#'.     
   02  DFHPF12   PIC  X  VALUE IS '@'.     
   02  DFHPF13   PIC  X  VALUE IS 'A'.     
   02  DFHPF14   PIC  X  VALUE IS 'B'.     
   02  DFHPF15   PIC  X  VALUE IS 'C'.   
   02  DFHPF16   PIC  X  VALUE IS 'D'.   
   02  DFHPF17   PIC  X  VALUE IS 'E'.   
   02  DFHPF18   PIC  X  VALUE IS 'F'.   
   02  DFHPF19   PIC  X  VALUE IS 'G'.   
   02  DFHPF20   PIC  X  VALUE IS 'H'.   
   02  DFHPF21   PIC  X  VALUE IS 'I'.   
   02  DFHPF22   PIC  X  VALUE IS '¢'.   
   02  DFHPF23   PIC  X  VALUE IS '.'.   
   02  DFHPF24   PIC  X  VALUE IS '<'.   

示例

以下示例显示了如何在应用程序中使用 DFHAID 复制簿:

IDENTIFICATION DIVISION.                                         
PROGRAM-ID. HELLO.                                               
DATA DIVISION.   
WORKING-STORAGE SECTION.
COPY DFHAID.
PROCEDURE DIVISION.
A000-AIDKEY-PARA.
   EVALUATE EIBAID
      WHEN DFHAID
         PERFORM A000-PROCES-PARA
      WHEN DFHPF1
         PERFORM A001-HELP-PARA
      WHEN DFHPF3
         PERFORM A001-EXIT-PARA
    END-EVALUATE.

光标定位

有两种方法可以覆盖映射定义中指定的位置。

  • 一种方法是在 SEND MAP 命令的 CURSOR 选项中指定相对于行号和列号的屏幕位置。

  • 另一种方法是将 -1 移动到以 L 为后缀的符号映射变量。然后,使用 SEND MAP 中的 CURSOR 选项发送映射。

示例

以下示例显示了如何覆盖 NAME 字段的光标位置:

MOVE -1 TO NAMEL
   EXEC CICS SEND 
      MAP ('map-name')
      MAPSET ('name-field')
      ERASE
      FREEKB
      CURSOR
   END-EXEC.

动态修改属性

在发送映射时,如果我们希望某个字段具有与映射中指定的不同的属性,那么我们可以通过在程序中设置该字段来覆盖它。以下是覆盖字段属性的说明:

  • 要覆盖字段的属性,我们必须在应用程序中包含 DFHATTR。它由 CICS 提供。

  • 所需的属性可以从列表中选择,并移动到以 'A' 为后缀的符号字段变量。

DFHATTR 包含以下内容:

01  CICS-ATTRIBUTES.
   05  ATTR-UXN            PIC X(01) VALUE SPACE.
   05  ATTR-UXMN           PIC X(01) VALUE 'A'.
   05  ATTR-UXNL           PIC X(01) VALUE 'D'.
   05  ATTR-UXMNL          PIC X(01) VALUE 'E'.
   05  ATTR-UXBL           PIC X(01) VALUE 'H'.
   05  ATTR-UXMBL          PIC X(01) VALUE 'I'.
   05  ATTR-UXD            PIC X(01) VALUE '<'.
   05  ATTR-UXMD           PIC X(01) VALUE '('.
   05  ATTR-U9N            PIC X(01) VALUE '&'.
   05  ATTR-U9MN           PIC X(01) VALUE 'J'.
   05  ATTR-U9NL           PIC X(01) VALUE 'M'.
   05  ATTR-U9MNL          PIC X(01) VALUE 'N'.
   05  ATTR-U9BL           PIC X(01) VALUE 'Q'.
   05  ATTR-U9MBL          PIC X(01) VALUE 'R'.
   05  ATTR-U9D            PIC X(01) VALUE '*'.
   05  ATTR-U9MD           PIC X(01) VALUE ')'.
   05  ATTR-PXN            PIC X(01) VALUE '-'.
   05  ATTR-PXMN           PIC X(01) VALUE '/'.
   05  ATTR-PXNL           PIC X(01) VALUE 'U'.
   05  ATTR-PXMNL          PIC X(01) VALUE 'V'.
   05  ATTR-PXBL           PIC X(01) VALUE 'Y'.
   05  ATTR-PXMBL          PIC X(01) VALUE 'Z'.
   05  ATTR-PXD            PIC X(01) VALUE '%'.
   05  ATTR-PSN            PIC X(01) VALUE '0'.
   05  ATTR-PSMN           PIC X(01) VALUE '1'.
   05  ATTR-PSNL           PIC X(01) VALUE '4'.
   05  ATTR-PSMNL          PIC X(01) VALUE '5'.
   05  ATTR-PSBL           PIC X(01) VALUE '8'.
   05  ATTR-PSMBL          PIC X(01) VALUE '9'.
   05  ATTR-PSD            PIC X(01) VALUE '@'.
   05  ATTR-PSMD           PIC X(01) VALUE "'".

CICS - 文件处理

CICS 允许我们通过多种方式访问文件数据。大多数文件访问在联机系统中是随机的,因为要处理的事务不会被批处理并按任何顺序排序。因此,CICS 支持常用的直接访问方法:VSAM 和 DAM(直接访问方法)。它还允许我们使用数据库管理器访问数据。

随机访问

以下是用于随机处理的命令:

序号 命令和描述
1 READ

READ 命令使用主键从文件中读取数据。

2 WRITE

Write 命令用于向文件添加新记录。

3 REWRITE

REWRITE 命令用于修改文件中已存在的记录。

4 DELETE

DELETE 命令用于删除文件中存在的记录。

顺序访问

以下是用于顺序处理的命令:

序号 命令和描述
1 STARTBR

STARTBR 被称为开始浏览。

2 READNEXT / READPREV

当我们发出 STARTBR 命令时,它不会使记录可用。

3 RESETBR

RESETBR 命令允许我们在浏览中间重置我们的起点。

4 ENDBR

当我们完成顺序读取文件后,我们使用 ENDBR 命令终止浏览。

CICS - 错误处理

在使用 CICS 应用程序时,可能会遇到多种类型的**异常**和错误。错误可能是由于硬件或软件问题引起的。我们将在本模块中讨论错误和错误处理。

CICS 错误

以下是 CICS 应用程序执行过程中可能出现的 CICS 错误:

  • 当 CICS 系统中的条件不正常时,会发生一些预期的 CICS 错误。例如,如果我们正在读取特定记录但未找到该记录,则会收到“未找到”错误。**Mapfail** 是一个类似的错误。此类错误由程序中的显式逻辑处理。

  • 逻辑错误是由于某些原因引起的,例如除以零、数字字段中的非法字符或事务 ID 错误。

  • 与硬件或其他系统条件相关的错误超出了应用程序的控制范围。例如,在访问文件时出现输入/输出错误。

错误处理命令

CICS 提供了几种机制来识别错误并在我们的程序中处理它们。以下是用于处理预期 CICS 错误的命令:

序号 处理命令和描述
1 Handle condition

Handle condition 用于将程序的控制权转移到段落或过程标签。

2 Handle Abend

如果程序由于某些原因(如输入/输出错误)而异常终止,则可以使用 Handle Abend CICS 命令进行处理。

3 Abend

Abend 命令用于有意终止任务。

4 Ignore Condition

Ignore condition 用于当我们希望在发生 Ignore Condition 中提到的特定异常或错误时不采取任何操作。

5 Nohandle

Nohandle 可以指定给任何 CICS 命令。

CICS - 控制操作

CICS 程序控制程序 (PCP) 管理应用程序的流程。所有应用程序都必须在处理程序表中有一个条目。以下是用于程序控制服务的命令:

  • XCTL
  • Link
  • Load
  • Release
  • Return

程序逻辑级别

在 CICS 下执行的应用程序具有不同的逻辑级别。第一个直接接收控制权的程序处于最高逻辑级别,即第 1 级。链接程序位于链接程序的下一个逻辑级别。XCTL 程序在同一级别运行。当我们稍后在本模块中学习 Link 和 XCTL 时,这一点将变得清晰。下图显示了逻辑级别:

CICS Control Operations

XCTL

XCTL 的基本解释如下:

  • XCTL 命令用于将控制权从一个程序传递到同一级别的另一个程序。

  • 它不期望控制权返回。

  • 它类似于 GO TO 语句。

  • XCTL 程序可以是伪会话式的。

示例

以下示例显示了如何使用 XCTL 命令将控制权传递给另一个程序:

IDENTIFICATION DIVISION.                                         
PROGRAM-ID. PROG1.  
WORKING-STORAGE SECTION.
01 WS-COMMAREA    PIC X(100).                                             
PROCEDURE DIVISION.

EXEC CICS XCTL
   PROGRAM ('PROG2')
   COMMAREA (WS-COMMAREA)
   LENGTH (100)
END-EXEC.

此命令将控制权传递给程序 'PROG2',并传递 100 字节的数据。COMMAREA 是一个可选参数,它是包含要传递的数据或要返回结果的区域的名称。

Link

Link 命令用于将控制权传递到较低级别的另一个程序。它期望控制权返回。链接程序不能是伪会话式的。

示例

以下示例显示了如何使用 Link 命令将控制权传递给另一个程序:

IDENTIFICATION DIVISION.                                         
PROGRAM-ID. PROG1.  
WORKING-STORAGE SECTION.
01 WS-COMMAREA    PIC X(100).                                             
PROCEDURE DIVISION.

EXEC CICS LINK
   PROGRAM ('PROG2')
   COMMAREA (WS-COMMAREA)
   LENGTH (100)
END-EXEC.

Load

Load 命令用于加载程序或表。以下是 Load 命令的语法:

EXEC CICS LOAD
   PROGRAM ('name')
END-EXEC.

Release

Release 命令用于释放程序或表。以下是 Release 命令的语法:

EXEC CICS RELEASE
   PROGRAM ('name')
END-EXEC.

Return

Return 命令用于将控制权返回到下一个较高的逻辑级别。以下是 Return 命令的语法:

EXEC CICS RETURN
   PROGRAM ('name')
   COMMAREA (data-value)
   LENGTH (data-value)
END-EXEC.

间隔控制操作

间隔控制操作有以下两种类型:

ASKTIME

ASKTIME 用于请求当前时间和日期或时间戳。然后,我们将此值移动到程序内的工作存储变量。以下是 ASKTIME 命令的语法:

EXEC CICS ASKTIME
   [ABSTIME(WS-TIMESTAMP)]
END-EXEC.

FORMATTIME

FORMATTIME 根据选项将时间戳格式化为所需的格式,对于日期,可以是 YYDDD、YYMMDD 或 YYDDMM。DATESEP 指示日期的分隔符,就像 TIMESEP 变量指示时间的分隔符一样。以下是 FORMATTIME 命令的语法:

EXEC CICS FORMATTIME
   ABSTIME(WS-TIMESTAMP)
   [YYDDD(WS-DATE)]
   [YYMMDD(WS-DATE)]
   [YYDDMM(WS-DATE)]
   [DATESEP(WS-DATE-SEP)]
   [TIME(WS-TIME)]
   [TIMESEP(WS-TIME-SEP)]
END-EXEC.

CICS - 临时存储

CICS 中有不同的暂存区可用于保存数据或在事务之间传输数据。CICS 提供了五个存储区域,我们将在本模块中讨论这些区域。

COMMAREA

COMMAREA 的行为类似于暂存区,可用于将数据从一个程序传递到另一个程序,无论是在同一事务中还是在不同的事务中。它应在 LINKAGE SECTION 中使用 DFHCOMMAREA 名称进行定义。

公共工作区

CICS 区域中的任何事务都可以访问公共工作区,因此必须由系统中决定使用它的所有事务商定其格式和使用方式。整个 CICS 区域中只有一个 CWA。

事务工作区

事务工作区用于在同一事务中执行的应用程序之间传递数据。TWA 仅在事务持续期间存在。其大小在程序控制表中定义。

临时存储队列

临时存储队列 (TSQ) 是临时存储控制程序 (TSP) 提供的功能。

  • TSQ 是一个记录队列,可以在同一 CICS 区域中的不同任务或程序中创建、读取和删除。

  • 队列标识符用于标识 TSQ。

  • TSQ 中的记录由称为项目号的相对位置标识。

  • TSQ 中的记录在整个 TSQ 被显式删除之前一直可访问。

  • TSQ 中的记录可以顺序读取或直接读取。

  • TSQ 可以写入 DASD 中的主存储器或辅助存储器。

WRITEQ TS

此命令用于向现有 TSQ 添加项目。此外,我们还可以使用此命令创建新的 TSQ。以下是 WRITEQ TS 命令的语法:

语法

EXEC CICS WRITEQ TS
   QUEUE ('queue-name')
   FROM (queue-record)
   [LENGTH (queue-record-length)]
   [ITEM (item-number)]
   [REWRITE]
   [MAIN /AUXILIARY]
END-EXEC.

以下是 WRITEQ TS 命令中使用的参数的详细信息:

  • 队列由此参数中提到的名称标识。

  • FROM 和 LENGTH 选项用于指定要写入队列的记录及其长度。

  • 如果指定了 ITEM 选项,则 CICS 会为队列中的记录分配一个项目号,并将该选项中提供的的数据区域设置为项目号。如果记录启动一个新的队列,则分配的项目号为 1,后续的项目号依次递增。

  • REWRITE 选项用于更新队列中已存在的记录。

  • MAIN / AUXILIARY 选项用于将记录存储在主存储器或辅助存储器中。默认为 AUXILIARY。

READQ TS

此命令用于读取临时存储队列。以下是 READQ TS 的语法:

语法

EXEC CICS READQ TS
   QUEUE ('queue-name')
   INTO (queue-record)
   [LENGTH (queue-record-length)]
   [ITEM (item-number)]
   [NEXT]
END-EXEC.

DELETEQ TS

此命令用于删除临时存储队列。以下是 DELETEQ TS 的语法:

语法

EXEC CICS DELETEQ TS
   QUEUE ('queue-name')
END-EXEC.

瞬态数据队列

瞬态数据队列本质上是瞬态的,因为它可以快速创建和删除。它仅允许顺序访问。

  • 队列的内容只能读取一次,因为一旦执行读取操作,队列就会被销毁,因此称为瞬态队列。

  • 它不能被更新。

  • 它需要在DCT中有一个条目。

WRITEQ TD

此命令用于写入瞬态数据队列,并且它们始终写入文件。以下是WRITEQ TD命令的语法:

语法

EXEC CICS WRITEQ TD
   QUEUE ('queue-name')
   FROM (queue-record)
   [LENGTH (queue-record-length)]
END-EXEC.

READQ TD

此命令用于读取瞬态数据队列。以下是READQ TD命令的语法:

语法

EXEC CICS READQ TD
   QUEUE ('queue-name')
   INTO (queue-record)
   [LENGTH (queue-record-length)]
END-EXEC.

DELETEQ TD

此命令用于删除瞬态数据队列。以下是DELETEQ TD命令的语法:

语法

EXEC CICS DELETEQ TD
   QUEUE ('queue-name')
END-EXEC.

CICS - 互连通信

两个或多个系统之间发生的相互通信称为互连通信

互连通信的优势

互连通信的重要优势如下:

  • 我们不需要在所有系统上复制数据。

  • 用户无需保持与多个系统的连接即可访问存储在这些系统上的数据。

  • 它提高了应用程序的性能。

基本术语

必须了解CICS系统中使用的基本术语。以下是基本术语:

本地系统

本地系统是发起互连通信请求的系统。

本地资源

本地资源是位于本地系统上的资源。

远程系统

远程系统是由于互连通信请求而启动的系统。

远程资源

远程资源是位于远程系统上的资源。

MVS Sysplex

MVS Sysplex是多个MVS操作系统的配置。它们通过共享功能和程序作为一个系统工作。

CICSPlex

CICSPlex通常被描述为一组互连的CICS区域,这些区域处理客户工作负载。CICSPlex是一组互连的CICS区域,它们拥有终端、应用程序、资源等。

互连通信方法

CICS可以通过两种方式与其他系统通信:

  • MRO - 多区域操作用于当同一MVSPLEX中的两个CICS区域需要相互通信时。

  • ISC - 系统间通信用于当本地服务器中的CICS区域需要与远程服务器中的CICS区域通信时。

CICS - 状态码

在使用CICS时,您可能会遇到异常结束。以下是常见异常结束代码及其描述,这将帮助您解决问题:

序号 代码和描述
1

ASRA

程序检查异常

2

AEI0

程序ID错误

3

AEI9

映射失败条件

4

AEIO

重复键

5

AEIN

重复记录

6

AEID

已到达文件尾

7

AEIS

文件未打开

8

AEIP

无效请求条件

9

AEY7

无权使用该资源

10

APCT

未找到程序

11

AFCA

未找到数据集

12

AKCT

超时错误

13

ABM0

未找到指定的映射

14

AICA

程序处于无限循环

15

AAOW

内部逻辑错误

广告