Cobol 是否可以移动到运行时创建的变量名?

Cobol 是否可以移动到运行时创建的变量名?,cobol,mainframe,cics,Cobol,Mainframe,Cics,我正在写一个程序,如果它是一个重复的记录,它会改变字段的颜色。为此,我使用嵌套的perform来比较每个项目。当它发现一个重复的时候,我想把DFHRED移到那个特定的字段,例如CRS1AC。我的问题是,我不知道如何引用我试图改变颜色的字段,一旦我发现它是重复的,我该怎么做?以下是地图文件中的字段,如果存在副本,我将尝试将颜色移动到这些字段 01 CRS1AC PIC X. 01 CRS1BC PIC X. 01

我正在写一个程序,如果它是一个重复的记录,它会改变字段的颜色。为此,我使用嵌套的perform来比较每个项目。当它发现一个重复的时候,我想把DFHRED移到那个特定的字段,例如CRS1AC。我的问题是,我不知道如何引用我试图改变颜色的字段,一旦我发现它是重复的,我该怎么做?以下是地图文件中的字段,如果存在副本,我将尝试将颜色移动到这些字段

 01     CRS1AC                PIC X.
 01     CRS1BC                PIC X.

 01     CRS2AC                PIC X.
 01     CRS2BC                PIC X.

 01     CRS3AC                PIC X.
 01     CRS3BC                PIC X.

 01     CRS4AC                PIC X.
 01     CRS4BC                PIC X.

 01     CRS5AC                PIC X.
 01     CRS5BC                PIC X.
这是我的桌子设置

     01  TABLES.
       05  TBL-CRS-ENTRIES        PIC S9(3) COMP-3  VALUE 5.
       05  TBL-CRS-VALUES         PIC X(4)  OCCURS 10 TIMES. 

       05  CRS-TBL REDEFINES TBL-CRS-VALUES  
                      PIC X(8)  OCCURS 5 TIMES.
       05  SUB-1          PIC S9(3) COMP-3 VALUE 1.
       05  SUB-2          PIC S9(3) COMP-3 VALUE 1.
&下面是检查重复项的代码

   PERFORM VARYING SUB-1 FROM 1 BY 1 UNTIL SUB-1 > TBL-CRS-ENTRIES
     PERFORM VARYING SUB-2 FROM 1 BY 1 UNTIL SUB-2 > SUB-1 - 1
      IF CRS-TBL(SUB-1) = CRS-TBL(SUB-2)
  *if there is a match it should change the colour to red.
  * for example a match at CRS1AC & CRS1BC match CRS3AC & CRS3BC

  *this is my attempt at trying make the variable name.
        MOVE DFHRED TO CRS(SUB-1)AC
        MOVE DFHRED TO CRS(SUB-1)BC

        MOVE DFHRED TO CRS(SUB-2)AC
        MOVE DFHRED TO CRS(SUB-2)BC
        PERFORM 999-DUPLICATE-RECORD 
      END-IF
     END-PERFORM
   END-PERFORM.
   GOBACK.
因此,如果'PSYC 1000'='PSYC 1000'&这些字段的名称是。。
“CRS1AC+CRS1BC=CRS3AC+CRS3BC”不,不可能按照自己的意愿去做

COBOL是一种编译语言。与此相关的是,您不能在运行时编写标识符(变量)的名称。一旦编译了COBOL程序,也就是说,就不再对该可执行版本的源代码进行更改

那去哪里呢

你说这是你地图的一部分

 01     CRS1AC                PIC X.
 01     CRS1BC                PIC X.

 01     CRS2AC                PIC X.
 01     CRS2BC                PIC X.

 01     CRS3AC                PIC X.
 01     CRS3BC                PIC X.

 01     CRS4AC                PIC X.
 01     CRS4BC                PIC X.

 01     CRS5AC                PIC X.
 01     CRS5BC                PIC X.
但是,由于
01
的级别号,它们不属于任何内容,除了
部分
之外,它们属于
数据区

因此,您需要显示完整、真实的地图

没有一种特别可爱的方法,因此您需要做的是
重新定义整个映射,使用
发生
表示该部分屏幕(或整个屏幕,取决于设计)的每个屏幕行,并在发生项中定义这些属性字节

这件事真正令人兴奋的是,用手把它全部排好

现在你的程序

你的循环是错误的。对于外部循环的每次迭代,您将执行内部循环五次。这意味着你所做的比较远远超出了必要的范围

这很难处理:

SUB-2 > SUB-1 - 1
对于这一行代码,这会更好:

SUB-2 EQUAL TO SUB-1
第五次外部迭代根本不需要,因为除了已经比较过的值之外,没有其他值可以比较(因此结果将是相同的,为什么要麻烦呢?)

考虑将用作下标的标识符(变量)的定义以及条目总数更改为二进制、COMP或COMP-4(它们都表示相同的含义)

考虑给他们比SUB-1、SUB-2更有意义的名字。它将使代码“读”得更好,这总是有帮助的

以下是您的数据定义:

 01  TABLES.
   05  TBL-CRS-ENTRIES        PIC S9(3) COMP-3  VALUE 5.
   05  TBL-CRS-VALUES         PIC X(4)  OCCURS 10 TIMES. 

   05  CRS-TBL REDEFINES TBL-CRS-VALUES  
                  PIC X(8)  OCCURS 5 TIMES.
   05  SUB-1          PIC S9(3) COMP-3 VALUE 1.
   05  SUB-2          PIC S9(3) COMP-3 VALUE 1.
其他一些让你自己更容易的事情:

发生错误后,不要对标识符(变量)进行编码。当不存在取决于发生时间的
时,它本身并不重要,但既然它确实重要,为什么不保持一致性呢(一致性很好,因为当您查找问题时,发现不一致性,它会告诉您关于特定代码位的编写者的一些信息)

不要重新定义使用OCCURS定义的项。即使您正在使用一个旧的编译器(或者您在这里输入了错误的代码,或者您正在这样做),这至少会给您一个警告信息。尝试一个实验。向同事展示这一定义,并问他们“这实际上是做什么的?”然后向另一位同事展示。还有第三个。如果他们都立即回答,准确地说,它做了什么,那么你就有了一个具有卓越知识的网站。你没有,所以不要那样做

不要对标识符进行签名,除非它们可能包含负值。然后读者可以查看定义,知道它不能包含负值。不要沉迷于“哦,我们这样做是为了表现”。命名编译器并显示编译选项,我将向您显示它的“收益”或“损失”

不要对用作下标的标识符的初始值使用VALUE子句。在使用它们之前,将它们设置为初始值。除非您的代码在当前处理结束时设置了值,以便为下一个处理做好准备,否则您所做的一切都会让读者感到困惑。如果有VALUE子句,则应该是必需的

如果正在使用,一定要给每件东西起一个好的、描述性的名字。如果某物不需要名称,请使用填充词来定义它(通常)

您可以这样定义:

 01  some-meaningful-name
     05  TBL-CRS-ENTRIES           BINARY PIC 9(4) VALUE 5.
     05  also-meaningful           BINARY PIC 9(4).
     05  meaningful-also           BINARY PIC 9(4).
     05  another-meaningful-name.
         10  FILLER OCCURS 10 TIMES.
             15  TBL-CRS-VALUES           PIC X(4). 

     05  FILLER REDEFINES another-meaningful-name.  
         10  FILLER OCCURS 5 TIMES.
             15  CRS-TBL                  PIC X(8).
源代码用于两件事:将编译器转换为可执行代码;让人类读者理解编码的内容。编译器不关心格式化代码。因此,为人类读者格式化代码。即使是小事情也有帮助:

  IF CRS-TBL(SUB-1) = CRS-TBL(SUB-2)
Vs

  IF CRS-TBL ( W-ORIGINAL-ITEM ) 
    EQUAL TO CRS-TBL ( W-NEW-ITEM )