操作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)