我正在编写一个程序,如果它是一个重复的记录,它会改变字段的颜色。为此,我使用嵌套的执行来比较每个项目。当它找到重复时,我想将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' < ---这些是我想改变颜色的字段。
我已经对此进行了大量的研究和研究。仍然找不到解决方案。 希望这是有道理的我知道它的所有地方,为了进一步澄清,请询问&如果需要完整的程序代码,我可以提供。
答案 0 :(得分:1)
不,不可能按照你想要的方式做你想做的事。
COBOL是一种编译语言。与此相关的是,您无法在运行时组成标识符(变量)的名称。一旦编译了COBOL程序,也就是说,不再对该可执行版本的源进行更改。
那么去哪儿?
你说这是你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
的那些级别数量不属于部分,除了SECTION
属于DATA DIVISION
之外的REDEFINES
}。
因此,您需要显示完整的,实际的MAP。
没有一种特别可爱的方式,所以您需要做的是OCCURS
整个MAP,SUB-2 > SUB-1 - 1
代表屏幕这一部分(或整个屏幕)的每个屏幕行,取决于设计)并在OCCURS项目中定义那些属性字节。
真正令人兴奋的是,手动将这一切都排好。
现在你的程序。
你的循环错了。对于外循环的每次迭代,您执行内部循环五次。这意味着你进行了比必要更多的比较。
这很笨重:
SUB-2 EQUAL TO SUB-1
对于那行代码,这会更好:
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.
根本不需要第五次外部迭代,因为除了那些已经比较的值之外没有值可以比较(所以结果会相同,所以为什么要这么麻烦?)。
考虑将您正在使用的标识符(变量)的定义更改为BIDARY或COMP或COMP-4(它们都意味着同样的事情)。
考虑给他们提供比SUB-1,SUB-2更有意义的名字。它将使代码"读取"更好,这总是有帮助。
这是您的数据定义:
DEPENDING ON
其他一些让自己更轻松的事情:
在 OCCURS之后不要编码标识符(变量)。当OCCURS上没有 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).
时,它本身并不重要,但因为它确实很重要,为什么不一致(一致性很好,因为当你在寻找问题而你找到不一致的地方,它讲述了那段特定代码的作者。
不要重新定义使用OCCURS定义的项目。即使您使用的是旧的编译器(或者您在此处输入了错误的代码,或者您正在执行此操作),它至少会为您提供一条警告消息。尝试一下实验。向同事展示这个定义,然后问他们"这实际上做了什么?"然后向另一个人展示。还有第三个。如果他们都立即回复,准确地回答它的作用,那么你就拥有一个知识渊博的网站。你没有,所以不要这样做。
不要对标识符进行签名,除非它们包含负值。然后读者可以查看定义并知道它不能包含负值。不要因为性能而摔倒#哦;我们这样做是为了表现"。命名编译器并显示编译选项,我将向您展示它是什么"获得"或丢失。
不要将VALUE子句用作用作下标的标识符的初始值。在使用它们之前将它们设置为初始值。除非你有曲折的代码在当前处理结束时设置值,以便它可以进行下一次处理,所以你所做的一切都让人类读者感到困惑。如果有VALUE子句,则应该是必要的。
如果正在使用所有,请提供一个好的,描述性的名称。如果某些东西不需要名称,请使用FILLER来定义它(通常)。
您的定义可以这样做:
IF CRS-TBL(SUB-1) = CRS-TBL(SUB-2)
源代码用于两件事:用于编译器转换为可执行代码;让读者理解已编码的内容。编译器不关心格式化代码。因此,格式化人类阅读器的代码。即便是小事也有帮助:
IF CRS-TBL ( W-ORIGINAL-ITEM )
EQUAL TO CRS-TBL ( W-NEW-ITEM )
Vs的
{{1}}