2

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

 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' <--- 这些是我要更改颜色的字段。

我对此进行了大量研究,但仍然找不到解决方案。希望这是有道理的,我知道它无处不在,为了进一步澄清,请询问&如果需要完整的程序代码,我可以提供。

4

1 回答 1

1

不,不可能随心所欲地做你想做的事。

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不是任何东西的一部分,除了SECTION它们属于DATA DIVISION.

所以你需要展示你完整的,实际的,MAP。

没有特别可爱的方式,所以你要做的是REDEFINES整个 MAP,其中一个OCCURS代表屏幕这一部分(或整个屏幕,取决于设计)的每个屏幕行,并在发生项目。

真正令人兴奋的是手动将所有内容排列好。

现在你的程序。

你的循环是错误的。对于外循环的每次迭代,您执行内循环五次。这意味着您进行了不必要的比较。

这很笨拙:

SUB-2 > SUB-1 - 1

对于那行代码,这会更好:

SUB-2 EQUAL TO SUB-1

根本不需要第五次外部迭代,因为除了已经比较过的值之外,没有可比较的值(所以结果将是相同的,那何必呢?)。

考虑将您用作下标的标识符(变量)的定义和您的条目总数更改为 BINARY 或 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之后编码标识符(变量)。当 OCCURS 上没有时DEPENDING ON,它本身并不重要,但既然它确实很重要,为什么不保持一致(一致性很好,因为当你在寻找问题并且发现不一致时,它会告诉你一些关于该特定代码的作者)。

不要重新定义使用 OCCURS 定义的项目。即使您使用的是旧的编译器(或者您在这里放置了不正确的代码,或者您正在这样做),它至少会给您一个警告消息。尝试一个实验。向同事展示该定义,并问他们“这实际上是做什么的?” 然后显示给另一个。第三个。如果他们都立即准确地回复了它的作用,那么您就拥有了一个知识渊博的网站。你没有,所以不要这样做。

不要对标识符进行签名,除非它们可以包含负值。然后读者可以查看定义并知道它不能包含负值。不要迷恋“哦,我们这样做是为了表现”。命名编译器并显示编译选项,我会告诉你它“获得”或失去了什么。

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

如果正在使用它,请给所有东西一个好的、描述性的名称。如果某些东西不需要名称,请使用 FILLER 来定义它(通常)。

您的定义可以这样完成:

 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 )
于 2015-03-31T07:05:07.573 回答