处理cobol

时间:2016-03-30 15:56:07

标签: cobol

ws-var1属于pic x(3)ws-var2也是pic x(3)

我在表ws-var1 = "1 "中有一个字段,我想将其值移到另一个字段ws-var2,该字段应包含" 1"的值。 ws-var1ws-var2都是字母数字字段。请提出合适的方法来实现这一目标。

3 个答案:

答案 0 :(得分:1)

假设您通常要对字符串进行右对齐(不包含中间空格),可以使用:

INSPECT ws-var1 TALLYING num-chars FOR CHARACTERS BEFORE SPACE
MOVE ws-var1 (1:num-chars) TO ws-var2 (3 - num-chars + 1:)

其中num-chars是初始值为0的数字数据项。

(或者,如果您有幸使用具有TRIM内在函数的编译器,则可以将ws-var2声明为JUSTIFIED RIGHT并简单地MOVE FUNCTION TRIM(ws-var1) TO ws-var2。)

答案 1 :(得分:0)

你当然可以用循环来做。问题是,你只有三个字节。对于三个字节长的东西,除了基本的东西之外做任何其他事情都是过度的,因为超出合理范围的资源被消耗掉了。如果没有支付资源,并且在每天使用的许多程序中传播效率低下的代码并不担心任何人,那么还有其他方法可以做到这一点。

   01  A-MEANINGFUL-NAME. 
       88  AMN-NO-ACTUAL-DATA              VALUE SPACE. 
       05  AMN-FIRST-TWO-BYTES-OF-DATA. 
           10  AMN-FIRST-BYTE              PIC X. 
           10  FILLER                      PIC X. 
               88  AMN-ONE-BYTE-OF-DATA    VALUE SPACE. 
       05  FILLER                          PIC X. 
           88  AMN-TWO-BYTES-OF-DATA       VALUE SPACE. 

   01  B-MEANINGFUL-NAME. 
       05  BMN-FIRST-BYTE                  PIC X. 
       05  BMN-SECOND-TWO-BYTES. 
           10  FILLER                      PIC X. 
           10  BMN-THIRD-BYTE              PIC X. 

       MOVE SPACE                   TO B-MEANINGFUL-NAME 
       EVALUATE TRUE 
         WHEN AMN-NO-ACTUAL-DATA 
           CONTINUE 
         WHEN AMN-ONE-BYTE-OF-DATA 
           MOVE AMN-FIRST-BYTE      TO BMN-THIRD-BYTE 
         WHEN AMN-TWO-BYTES-OF-DATA 
           MOVE AMN-FIRST-TWO-BYTES-OF-DATA 
                                    TO BMN-SECOND-TWO-BYTES
         WHEN OTHER 
           MOVE A-MEANINGFUL-NAME   TO B-MEANINGFUL-NAME 
       END-EVALUATE 

这是一种有效而清晰的方法。对于许多人来说可能打字太多了,但那些人并不认为需要一个容易理解和维护的程序。只需在目标中消隐需要它的那些字节,就可以提高效率,但你可以自己尝试一下。

赢得工作"原样"具有嵌入式空间,但可以轻松更改。

另外,因为你使用了编辑器的强大功能,所以打字并不多。

或者

   01  A-MEANINGFUL-NAME                   PIC XXX. 
   01  B-MEANINGFUL-NAME                   PIC XXX. 
   01  FILLER 
       REDEFINES B-MEANINGFUL-NAME. 
       05  C-MEANINGFUL-NAME               PIC XXX JUST RIGHT.

       UNSTRING A-MEANINGFUL-NAME 
         DELIMITED BY SPACE 
         INTO                       C-MEANINGFUL-NAME

没有那么多打字。效率较低。还是很清楚。

无法使用嵌入式空间,但可以轻松地包含代码以使其完成(仅限条件使用)。

或者

   01  A-MEANINGFUL-NAME                   PIC XXX. 
   01  B-MEANINGFUL-NAME                   PIC XXX. 

   01  C-MEANINGFUL-NAME 
       REDEFINES B-MEANINGFUL-NAME         PIC ZZ9. 

       COMPUTE C-MEANINGFUL-NAME    = FUNCTION NUMVAL 
                                       ( A-MEANINGFUL-NAME )

不是那么多打字,可能效率更低,可能不太清楚,并且依赖于源是格式良好的数字。

不能使用嵌入式空间,因为这不是一个格式正确的数字。

正如Edward H的回答所示,可以使用参考修改。这是第一个重写的示例,作为通过引用修改可以丢失清晰度的示例:

       MOVE SPACE TO B-MEANINGFUL-NAME 
       EVALUATE TRUE 
         WHEN A-MEANINGFUL-NAME = SPACES
           CONTINUE 
         WHEN A-MEANINGFUL-NAME (2:1) = SPACES
           MOVE A-MEANINGFUL-NAME (1:1) 
             TO B-MEANINGFUL-NAME (3:1) 
         WHEN A-MEANINGFUL-NAME (3:1) = SPACES
           MOVE A-MEANINGFUL-NAME (1:2) 
             TO B-MEANINGFUL-NAME (2:) 
         WHEN OTHER 
           MOVE A-MEANINGFUL-NAME TO B-MEANINGFUL-NAME 
       END-EVALUATE 

为此生成的可执行代码将(应该)与原始示例相同,因此效率很高,但有希望承认它更难以阅读。 (当然,如果我要对其进行编码,我会以不同的方式对其进行格式化,至少使其更容易阅读,但我怀疑" VAR1" -person甚至不会输入更多空白)。

答案 2 :(得分:0)

01  WS-VAR-1.
    88 FL-VAR1-999         VALUE SPACES.
    03 WS-VAR1-999         PIC 9(03).
01  FILLER 
      REDEFINES WS-VAR-1.
    03 WS-VAR1-99           PIC 9(02).
    03 FILLER               PIC X(01).
       88 FL-VAR1-99        VALUE SPACES.
01  FILLER 
      REDEFINES WS-VAR-1.
    03 WS-VAR1-9            PIC 9(01).
    03 FILLER               PIC X(02).
       88 FL-VAR1-9         VALUE SPACES.

01  WS-VAR-2.
    03 WS-VAR1-ZZ9          PIC Z(02)9(01).



    IF FL-VAR1-999          MOVE ZERO       TO WS-VAR1-ZZ9
      ELSE
      IF FL-VAR1-9          MOVE WS-VAR1-99 TO WS-VAR1-ZZ9
        ELSE
        IF FL-VAR1-99       MOVE WS-VAR1-9  TO WS-VAR1-ZZ9
          ELSE              MOVE WS-VAR1    TO WS-VAR2.

这都是重新定义的问题......