这是我的代码。
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,而不管我在搜索中放入什么功能。有什么方法可以进行自定义搜索吗?我不知道所有命令,谢谢。
答案 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。