Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search Cobol搜索函数行顺序_Search_Cobol - Fatal编程技术网

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
。(这样做的效果是将文件指针移回文件的开头。)如果不这样做,第二次搜索将从您离开的点或文件的结尾开始读取文件


您将了解其他一些文件组织,它们使此步骤变得不必要:它们允许您在一个行顺序文件上使用。

A
START
<代码>打开
/
关闭
通常需要大量处理。有了用户输入,情况就不会那么糟了,但很多时候,我看到人们理所当然地这么做,并且想知道为什么他们的程序会花这么长时间。@BillWoodger我试着启动,但它说不允许顺序文件。@David Gorsline我明白了你的逻辑,它在其他功能方面帮助了我,但这并不能解决我的搜索功能。@BillWoodger我向@Jack011暗示要查看
索引顺序
相对
文件组织。@DavidGorsline多亏了你,我已经将文件模式改为索引。你应该在手册中查找文件状态,使用它,并在每次IO后检查它。试着组织你的程序,这样你就不必在阅读时到处乱跳。
PERFORM
ed的段落应该在那些
执行的段落之后。如果您不能这样安排,那么这是一条表明逻辑曲折的线索。+1建议在每次i-o后检查文件状态。