2

假设我有一个 02 级变量作为 cobybook (testcopy) 的一部分

02 level-1-var
   05 var-1
   05 var-2
   05 var-3
   05 var-4

我在我的程序中使用了这本字帖两次。

01  usage-1.
    copy testcopy.

01  usage-2.
    copy testcopy.

我现在只想将usage-1的2级05变量移动到usage-2 有什么办法可以避免 2 个 move 语句?

并使用类似的东西

 MOVE (var-2, var-3) of usage-1   TO 
 (var-2, var-3) of usage-2

我是 cobol 的新手,想知道是否可以这样做..这可以在我的程序中节省很多移动语句..(提高性能)

4

3 回答 3

5

不,不是在标准 COBOL 中,尽管某些实现很可能对这类事情进行了扩展。如果简洁的代码是您的要求之一,我可能不会选择 COBOL 作为理想的语言 :-)

您可能需要分两步完成:

move var-2 of usage-1 to var-2 of usage-2.
move var-3 of usage-1 to var-3 of usage-2.

如果您愿意对您的字帖做一些更改,例如(a)

02  level-1-var
    05  var-1
    05  var-2-and-3
        09  var-2
        09  var-3
    05  var-4

你可能会发现你可以这样做:

move var-2-and-3 of usage-1 to var-2-and-3 of usage-2.

(a)显然,我刚刚反映了您在问题中的内容。您几乎肯定需要pic关于该数据的子句(可能还有更多.字符)。

于 2012-04-30T13:20:06.777 回答
2

这种类型的需求由 MOVE CORRESPONDING 动词直接回答。MOVE CORRESPONDING 对其操作数采用组级别并将名称相似的基本项目从一个移动到另一个,但有几个限制,其中包括相似的数据类(即,不能混合字母数字和数字)。您实施的精细手册包含所有限制。

如果我没记错的话,MOVE CORRESPONDING 也是一个可选特性,所以有些编译器可能不支持它。

移动对应,您的请求是在 COBOL 世界中引发强烈意见的事情之一。有人说您应该使用 COPY REPLACING 来生成唯一的数据名称并对所有 MOVE 进行编码。别人说你做的很好。我的观点是“视情况而定”。如果它是一个非常简单的程序,我可能会走 MOVE CORRESPONDING 路径,但如果有重要的业务逻辑,那么我宁愿编写所有代码。

于 2012-05-01T22:03:19.070 回答
0

您最好的办法是制作您的字帖,以便您可以为每个字段设置一个“前缀”,然后使用 REPLACING 为不同的 COPY 语句提供不同的前缀。这样你就不必为所有字段编码 OF/IN,它会使程序和列表更清晰。

Paxdiablo 是做你想做的事的最巧妙的方法,尽管你想做它的原因会很有趣。

我很惊讶没有人提到“参考修改”:

MOVE usage-1 ( 3 : 5 ) TO usage-2 ( 3 : 5)

其中 3 是数据中的起始位置,5 是长度。我更喜欢 Paxdiablo 的定义。

没有人建议重命名,这并不奇怪。

   01  A-TABLE. 
       05  A-T-1 PIC XX. 
       05  A-T-2 PIC X. 
       05  A-T-3 PIC 9. 
       05  A-T-4 PIC XXX. 
       05  A-T-5 PIC X(4). 
       66 A-TABLE-EXTRA RENAMES A-T-2 THRU A-T-3. 
   01  B-TABLE. 
       05  B-T-1 PIC XX. 
       05  B-T-2 PIC X. 
       05  B-T-3 PIC 9. 
       05  B-T-4 PIC XXX. 
       05  B-T-5 PIC X(4). 
       66 B-TABLE-EXTRA RENAMES B-T-2 THRU B-T-3. 

       MOVE A-TABLE-EXTRA TO B-TABLE-EXTRA

就像 MOVE CORRESPONDING 一样,这是要避免的(与我的评论相同的原因,加上没有人使用 66 级,所以没有人知道他们在做什么)。

另一种方法是为您的每个 01 级重新定义,但为什么还要去那个麻烦。

于 2013-04-09T12:59:02.230 回答