说我有一个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.
我现在想要将仅 2级05使用-1的变量移动到usage-2。 有什么方法可以避免2个移动陈述吗?
并使用类似
的内容 MOVE (var-2, var-3) of usage-1 TO
(var-2, var-3) of usage-2
我是cobol的新手并且想知道是否可以这样做..这可以在我的程序中保存很多移动语句..(提高性能)
答案 0 :(得分: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
个关于该数据的条款(可能还有一些.
个字符。)
答案 1 :(得分:2)
这种要求直接由MOVE CORRESPONDING动词回答。 MOVE CORRESPONDING为其操作数采用组级别,并将类似命名的基本项目从一个移动到另一个,具有几个限制,包括类似数据类(即,没有混合的字母数字和数字)。您的实施的精细手册包含所有限制。
如果我没记错的话,MOVE CORRESPONDING也是一个可选功能,因此有些编译器可能不支持它。
移动对应并且您的请求是在COBOL世界中引发强烈意见的那些事情之一。有人说你应该使用COPY REPLACING生成唯一的数据名称并编码所有的MOVE。其他人说你做的很好。我认为“这取决于”。如果它是一个非常简单的程序,我可能会采用MOVE CORRESPONDING路径,但如果有重要的业务逻辑,那么我宁愿编写所有代码。
答案 2 :(得分:0)
您最好的选择是制作您的字帖,使每个字段都有一个“前缀”,然后使用REPLACING为不同的COPY语句提供不同的前缀。然后你不必为所有字段编写OF / IN代码,它将使程序和列表更清晰。
Paxdiablo是做你想做的最好的方式,虽然你想做的原因会很有趣。
我很惊讶没有人提到“参考修改”:
MOVE usage-1 ( 3 : 5 ) TO usage-2 ( 3 : 5)
其中3是数据中的起始位置,5是长度。我更喜欢Paxdiablo对此的定义。
没有人建议RENAMES,这并不奇怪。
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一样,这是应该避免的(与我的评论相同的原因,加上没有人使用Level 66,所以没有人知道他们做了什么)。
另外一种方法是通过REDEFINES为你的每个级别01,但为什么甚至去打扰。