Cobol搜索功能行顺序

时间:2014-08-07 16:44:03

标签: search cobol

这是我的代码。

   SEARCH-RECORD.
       PERFORM SEARCH-OPENING-PROCEDURE.
       PERFORM SEARCH-CUSTOMER-RECORD.
       PERFORM SEARCH-RECORDS
           UNTIL CUST-NO = "0".
       PERFORM SEARCH-CLOSING-PROCEDURE.

   SEARCH-OPENING-PROCEDURE.
       OPEN INPUT CUSTOMER-FILE.

   SEARCH-CLOSING-PROCEDURE.
       CLOSE CUSTOMER-FILE.

   SEARCH-RECORDS.
       PERFORM DISPLAY-ALL-FIELDS.
       PERFORM SEARCH-CUSTOMER-RECORD.

   ENTER-CUSTOMER-NO.
       PERFORM ACCEPT-CUSTOMER-NO.
       PERFORM RE-ACCEPT-CUSTOMER-NO
           UNTIL CUST-NO NOT = SPACE.

   ACCEPT-CUSTOMER-NO.
       DISPLAY "ENTER CUSTOMER NO. (EX. C01)".
       DISPLAY "ENTER 0 TO STOP".
       ACCEPT CUST-NO.
       INSPECT CUST-NO
           CONVERTING LOWER-ALPHA
           TO UPPER-ALPHA.

   RE-ACCEPT-CUSTOMER-NO.
       DISPLAY "CUSTOMER NO. MUST BE ENTERED!".
       PERFORM ACCEPT-CUSTOMER-NO.

   SEARCH-CUSTOMER-RECORD.
       PERFORM ENTER-CUSTOMER-NO.
       MOVE "N" TO RECORD-FOUND.
       PERFORM FIND-CUSTOMER-NO
           UNTIL RECORD-FOUND = "Y" OR CUST-NO = "0".

   FIND-CUSTOMER-NO.
       PERFORM READ-CUSTOMER-RECORD.
       IF RECORD-FOUND = "N"
           DISPLAY "CUSTOMER RECORD NOT FOUND"
           PERFORM ENTER-CUSTOMER-NO.

   READ-CUSTOMER-RECORD.
       MOVE "Y" TO RECORD-FOUND.
       READ CUSTOMER-FILE RECORD.

   DISPLAY-ALL-FIELDS.
       DISPLAY " ".
       PERFORM DISPLAY-CUSTOMER-RECORD.
       DISPLAY " ".

   DISPLAY-CUSTOMER-RECORD.
       DISPLAY " CUSTOMER NO.: " CUSTOMER-NO.
       DISPLAY "1. CUSTOMER ID: " CUSTOMER-ID.
       DISPLAY "2. CUSTOMER NAME: " CUSTOMER-NAME.
       DISPLAY "3. CUSTOMER PRODUCT: " CUSTOMER-PRODUCT.
       DISPLAY "4. CUSTOMER QUANTITY: " CUSTOMER-QUANTITY.
       DISPLAY "5. CUSTOMER DATE: " CUSTOMER-DATE.

假设我有完整的C01,C02,C03,C04,C05记录。

我的问题是我的CUSTOMER-FILE是按顺序排列的。因此,每当我尝试搜索特定记录(如C04的记录)时,它总是首先显示C01的记录,然后是C02' s,而不管我在搜索中放入什么功能。有什么方法可以进行自定义搜索吗?我不知道所有命令,谢谢。

1 个答案:

答案 0 :(得分:2)

这就是为什么你的逻辑在查看第一条记录后总是停止的原因:在READ-CUSTOMER-RECORD中,你设置你的记录发现标志,而不检查你是否有匹配(在你刚刚阅读的记录和客户编号之间)你要)。您需要继续阅读,直到您到达文件末尾(EOF)或找到所需的客户记录。你需要检测“我在这个READ上找不到它”和“我根本没找到它”之间的区别。

所以你想把你的逻辑改成这样的东西。有更简洁的方法可以对此进行编码,但这是对您已有的最小变化:

SEARCH-CUSTOMER-RECORD.
    PERFORM ENTER-CUSTOMER-NO.
    MOVE "N" TO RECORD-FOUND.
    MOVE "N" TO EOF-FLAG.
    PERFORM FIND-CUSTOMER-NO
        UNTIL RECORD-FOUND = "Y" OR CUST-NO = "0".

FIND-CUSTOMER-NO.
    PERFORM READ-CUSTOMER-RECORD
        UNTIL EOF-FLAG = "Y" OR RECORD-FOUND = "Y".
    IF RECORD-FOUND = "N"
        DISPLAY "CUSTOMER RECORD NOT FOUND"
        PERFORM ENTER-CUSTOMER-NO.

READ-CUSTOMER-RECORD.
    READ CUSTOMER-FILE RECORD
        AT END
            MOVE "Y" TO EOF-FLAG.
    IF EOF-FLAG = "N"
        IF CUSTOMER-NO = CUST-NO
            MOVE "Y" TO RECORD-FOUND.

如果到达文件末尾,CUSTOMER-NUMBER没有明确定义的值。这就是我们必须用IF EOF-FLAG = "N"来保护测试的原因。同样,还有其他方法可以做到这一点,但我试图保持简单。

关于编码风格的一般说明:有些地方您可以简化和改进冗余代码。您可以重新编码SEARCH-CUSTOMER-RECORD而不是执行SEARCH-RECORDS然后在SEARCH-RECORDS中显示结果,以便CUSTOMER-FILE执行搜索,然后显示。

<强>更新

还有一点非常重要:当您开始新的搜索时,您需要关闭并重新打开{{1}}。 (这具有将文件指针移回文件开头的效果。)如果不这样做,第二次搜索将从您离开的位置或文件末尾开始读取文件。 / p>

您还将了解其他文件组织,这使得此步骤变得不必要:它们允许您使用START statement