Search Cobol搜索函数行顺序
这是我的密码Search Cobol搜索函数行顺序,search,cobol,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
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的完整记录
我的问题是我的客户文件是按顺序排列的。所以,每当我试图搜索一个特定的记录,比如C04的记录,它总是先显示C01的记录,然后是C02的,C03的,不管我在搜索函数中输入了什么。有什么方法可以进行自定义搜索吗?我不知道所有的命令,谢谢。这就是为什么您的逻辑总是在查看第一条记录后停止:在
READ-CUSTOMER-record
中,您设置了record found标志,而没有检查您是否有匹配项(在您刚刚读取的记录和您想要的客户号码之间)。您需要一直阅读,直到到达文件末尾(EOF)或找到所需的客户记录。你需要找出“我在这本书上没找到”和“我根本没找到”之间的区别
所以你想把你的逻辑变成这样。有更简洁的方法来编写代码,但这是对您已有内容的最小更改:
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
没有定义良好的值。这就是为什么我们必须在EOF-FLAG=“N”中使用来保护测试。同样,还有其他方法可以做到这一点,但我尽量保持简单
关于编码风格的一般说明:有些地方有可以简化和改进的冗余代码。您不必执行SEARCH-CUSTOMER-RECORD
然后在SEARCH-RECORDS
中显示结果,而是可以对其重新编码,以便SEARCH-RECORDS
执行搜索,然后显示结果
更新
还有一点非常重要:当您开始新的搜索时,您需要关闭并重新打开CUSTOMER-FILE
。(这样做的效果是将文件指针移回文件的开头。)如果不这样做,第二次搜索将从您离开的点或文件的结尾开始读取文件
您将了解其他一些文件组织,它们使此步骤变得不必要:它们允许您在一个行顺序文件上使用。ASTART
<代码>打开
/关闭
通常需要大量处理。有了用户输入,情况就不会那么糟了,但很多时候,我看到人们理所当然地这么做,并且想知道为什么他们的程序会花这么长时间。@BillWoodger我试着启动,但它说不允许顺序文件。@David Gorsline我明白了你的逻辑,它在其他功能方面帮助了我,但这并不能解决我的搜索功能。@BillWoodger我向@Jack011暗示要查看索引顺序
或相对
文件组织。@DavidGorsline多亏了你,我已经将文件模式改为索引。你应该在手册中查找文件状态,使用它,并在每次IO后检查它。试着组织你的程序,这样你就不必在阅读时到处乱跳。PERFORM
ed的段落应该在那些执行的段落之后。如果您不能这样安排,那么这是一条表明逻辑曲折的线索。+1建议在每次i-o后检查文件状态。