操作COBOL数据结构
我想要信息来操作表格。操作COBOL数据结构,cobol,Cobol,我想要信息来操作表格。 我在下面的cobol代码中遇到了一些问题: 01 TABLE-1. 05 STRUCT-1 OCCURS 25 TIMES. 10 VALUE-1 PIC AAA. 10 VALUE-2 PIC 9(5)V999. 05 NUMBER-OF-OCCURS PIC 99. 如何更新值?(当您知道值-1时更新值-2) 如何查找值并添加新值? 非常感谢 为了填充和修改工作存储器部分表中的数据,您需要使用下标/索引,您
我在下面的cobol代码中遇到了一些问题:
01 TABLE-1.
05 STRUCT-1 OCCURS 25 TIMES.
10 VALUE-1 PIC AAA.
10 VALUE-2 PIC 9(5)V999.
05 NUMBER-OF-OCCURS PIC 99.
如何更新值?(当您知道值-1时更新值-2)如何查找值并添加新值?
非常感谢 为了填充和修改工作存储器部分表中的数据,您需要使用下标/索引,您可以在工作存储器中定义下标/索引,然后写入处理
程序部分的代码。在本例中,您可以使用perform..until.如何查找值/如何更新值 首先,您必须查找要更新的记录(行)。这通常是通过在表中搜索 给定的键值。COBOL提供了几种方法来实现这一点。我建议你从 回顾COBOL 陈述如果对
STRUCT-1
记录进行了排序,则可以使用SEARCH ALL
,否则必须使用SEARCH
或只使用code
你自己的搜索循环。为了使用这些技术中的任何一种,您需要在某处声明另一个变量
在程序中用作STRUCT-1
表的索引(偏移量)。COBOL提供了上由短语索引的
出现
子句来声明特定于给定表的索引
(见附件)
将索引设置为STRUCT-1
以指向要更新的行后,只需MOVE
值设置为该行中的相应变量,例如
将123.456移动到值2(IDX-1)
其中,IDX-1是上述索引。请注意,您可以使用整数或
索引变量
要指定要更新的行号,不限于使用索引类型变量。然而,
通常使用指数变量比使用其他类型的变量更有效,尤其是
在处理多维表时,程序会大量引用该表
如何添加新行
首先认识到STRUCT-1
正好包含25行。COBOL没有一种机制来动态地
增加或减少这个数字(我听说这在下一个ISO COBOL标准中是可能的,但不要这样做)
屏住呼吸等待它)。从技术上讲,全部25人
行在任何时候都可用。然而,一个常见的约定是从空表中“增长”表
要按顺序填充,请一次填充一行。要使用此约定,您需要为
跟踪最后使用的行号(不要忘记在程序启动时将此变量初始化为零)。
在您的示例中,变量NUMBER-OF-occurrents
执行此任务
(我没有提到它,但是,您需要这个变量来绑定上面讨论的搜索)
要“添加”一行,只需将发生次数增加1即可。注意不要超过桌子的尺寸。例子
代码可能是:
IF NUMBER-OF-OCCURS < (LENGTH OF TABLE-1 / LENGTH OF STRUCT-1 (1))
ADD +1 TO NUMBER-OF-OCCURS
ELSE
table is full, preform some error/recovery routine
END-IF
补充内容:
FOUND-IND
用于指示您要查找的行是否已找到。88级给出了具体的设置/测试值
MAX-IDX
用于设置搜索的上限。您可以在上限测试中使用NUMBER-OF-occurrents
,但这会在每个测试中强制使用数据类型converson,这不是很有效
IDX-1
用作STRUCT-1
表的索引(偏移量)
就我个人而言,我会声明NUMBER-OF-occurrents
为PICS9(4)二进制文件
,但您所拥有的将起作用
假设STRUCT-1
未排序且NUMBER-OF-occurrents
表示当前
STRUCT-1中的活动行数
是查找值“ABC”时如何对搜索进行编码的示例:
SET FOUND-NO TO TRUE
IF NUMBER-OF-OCCURS > ZERO
SET IDX-1 TO 1
SET MAX-IDX TO NUMBER-OF-OCCURS
SEARCH STRUCT-1
WHEN IDX-1 > MAX-IDX
CONTINUE
WHEN VALUE-1 (IDX-1) = 'ABC'
SET FOUND-YES TO TRUE
END-SEARCH
END-IF
IF FOUND-YES
row found, use IDX-1 to reference the row containing 'ABC'
ELSE
row not found, IDX-1 does not contain a valid index
END-IF
工作原理:
- 首先,通过将
FOUND-NO
设置为true,假设该行不在表中
- 第一个
IF
确保在开始搜索之前STRUCT-1
中至少有一个活动行(将索引设置为零是错误的,因此您需要对此加以防范)
- 当满足第一个
SEARCH when
子句时,SEARCH
终止。这就是为什么当我们没有行可供搜索时,可以使用“不做任何事情”动词CONTINUE
。另一个终止条件(查找您要查找的值)是唯一可以设置FOUND-YES
的位置
- 当
搜索完成时,测试成功或失败,然后采取相应的行动
您需要研究的一些练习:
- 为什么我不必在
SEARCH
语句的末尾编写子句
- 为什么我不必在
SEARCH
语句中编写variable
子句
- 为什么我要按照我的顺序对
WHERE
子句进行编码
希望这能让你走上正确的道路
编辑
针对您在评论中提出的问题:我们是否可以使用发生次数作为搜索的索引。这个
答案是肯定的,但您需要实施一些不同的规则。使用发生次数时
作为索引,您不能再使用它来跟踪当前包含的行数
有效数据。这意味着您需要另一种机制来识别STRUCT-1
中未使用的行。
这可以通过使用您需要的sentinal值(例如低值
)初始化未使用的行来实现
永远不会真正想把它放到桌子上。搜索变为:
SET FOUND-NO TO TRUE
MOVE 1 TO NUMBER-OF-OCCURS
SEARCH STRUCT-1 VARYING NUMBER-OF-OCCURS
WHEN VALUE-1 (NUMBER-OF-OCCURS) = 'ABC'
SET FOUND-YES TO TRUE
END-SEARCH
如果您要搜索的值为
(即,ABC
)不在表中。作为优化,您可以添加第二个WHEN
子句来终止
查找sentinal值时进行搜索:
WHEN VALUE-1 (NUMBER-OF-OCCURS) = LOW-VALUE
CONTINUE
以上假设低值用于识别未使用的ro
WHEN VALUE-1 (NUMBER-OF-OCCURS) = LOW-VALUE
CONTINUE
01 TABLE-1.
05 STRUCT-TABLE.
10 STRUCT-1 OCCURS 25 TIMES.
20 VALUE-1 PIC AAA.
20 VALUE-2 PIC 9(5)V999.
05 NUMBER-OF-OCCURS PIC 99.
IF NUMBER-OF-OCCURS < (LENGTH OF STRUCT-TABLE / LENGTH OF STRUCT-1 (1))
ADD +1 TO NUMBER-OF-OCCURS
ELSE
table is full, preform some error/recovery routine
END-IF
Move New-Value-2 to Value-2 (II)