Reputation: 21
I'm having a constant issue with the UPDATE-PRODUCT portion. I'm getting an error at Line 103:
PERFORM statement not terminated by END-PERFORM
and at Line 117:
syntax error, unexpected END-IF.
IDENTIFICATION DIVISION.
PROGRAM-ID. Inventory-Management.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRODUCT.
05 ITEM-CODE PIC X(5).
05 NAME PIC X(20).
05 PRICE PIC 9(5)V99.
05 QUANTITY PIC 9(5).
01 CHOICE PIC X.
01 ITEM-FOUND PIC X VALUE 'N'.
01 INVENTORY.
05 ITEM-CODE-LIST OCCURS 100 TIMES.
10 ITEM-CODE-ARRAY PIC X(5).
05 NAME-LIST OCCURS 100 TIMES.
10 NAME-ARRAY PIC X(20).
05 PRICE-LIST OCCURS 100 TIMES.
10 PRICE-ARRAY PIC 9(5)V99.
05 QUANTITY-LIST OCCURS 100 TIMES.
10 QUANTITY-ARRAY PIC 9(5).
05 NUM-OF-PRODUCTS PIC 99 VALUE 0.
01 ITEM-CODE-SEARCH PIC X(5).
01 NEW-PRODUCT.
05 NEW-NAME PIC X(20).
05 NEW-PRICE PIC 9(5)V99.
05 NEW-QUANTITY PIC 9(5).
01 ITEM-INDEX PIC 99.
01 DEL-ITEM-CODE PIC X(5).
PROCEDURE DIVISION.
MAIN-PROGRAM.
PERFORM WELCOME-SCREEN.
PERFORM UNTIL CHOICE = '5'
PERFORM DISPLAY-MENU
ACCEPT CHOICE
PERFORM PROCESS-CHOICE
END-PERFORM.
STOP RUN.
WELCOME-SCREEN.
DISPLAY "WELCOME TO INVENTORY LIST MANAGEMENT".
DISPLAY "1. Insert New Product".
DISPLAY "2. Search Product Info".
DISPLAY "3. Update Product".
DISPLAY "4. Delete Product".
DISPLAY "5. Exit".
DISPLAY-MENU.
DISPLAY "Please select an option:".
PROCESS-CHOICE.
EVALUATE CHOICE
WHEN '1' PERFORM INSERT-PRODUCT
WHEN '2' PERFORM SEARCH-PRODUCT
WHEN '3' PERFORM UPDATE-PRODUCT
WHEN '4' PERFORM DELETE-PRODUCT
WHEN '5' CONTINUE
WHEN OTHER DISPLAY "Invalid choice. Please select again."
END-EVALUATE.
INSERT-PRODUCT.
DISPLAY "Enter Product Name:".
ACCEPT NEW-NAME.
DISPLAY "Enter Item Code:".
ACCEPT ITEM-CODE.
DISPLAY "Enter Price:".
ACCEPT NEW-PRICE.
DISPLAY "Enter Quantity:".
ACCEPT NEW-QUANTITY.
ADD 1 TO NUM-OF-PRODUCTS
MOVE ITEM-CODE TO ITEM-CODE-LIST(NUM-OF-PRODUCTS)
MOVE NEW-NAME TO NAME-LIST(NUM-OF-PRODUCTS)
MOVE NEW-PRICE TO PRICE-LIST(NUM-OF-PRODUCTS)
MOVE NEW-QUANTITY TO QUANTITY-LIST(NUM-OF-PRODUCTS).
SEARCH-PRODUCT.
DISPLAY "Enter Item Code to search:".
ACCEPT ITEM-CODE-SEARCH.
PERFORM VARYING ITEM-INDEX FROM 1 BY 1
UNTIL ITEM-FOUND = 'Y' OR ITEM-INDEX > NUM-OF-PRODUCTS
IF ITEM-CODE-SEARCH = ITEM-CODE-LIST(ITEM-INDEX)
DISPLAY "Product Found:"
DISPLAY "Item Code: " ITEM-CODE-LIST(ITEM-INDEX)
DISPLAY "Name: " NAME-LIST(ITEM-INDEX)
DISPLAY "Price: " PRICE-LIST(ITEM-INDEX)
DISPLAY "Quantity: " QUANTITY-LIST(ITEM-INDEX)
MOVE 'Y' TO ITEM-FOUND
END-IF
END-PERFORM.
IF ITEM-FOUND = 'N'
DISPLAY "Product not found."
END-IF.
UPDATE-PRODUCT.
DISPLAY "Enter Item Code to update:".
ACCEPT ITEM-CODE-SEARCH.
PERFORM VARYING ITEM-INDEX FROM 1 BY 1
UNTIL ITEM-FOUND = 'Y' OR ITEM-INDEX > NUM-OF-PRODUCTS
IF ITEM-CODE-SEARCH = ITEM-CODE-LIST(ITEM-INDEX)
DISPLAY "Enter New Name:".
ACCEPT NEW-NAME.
DISPLAY "Enter New Price:".
ACCEPT NEW-PRICE.
DISPLAY "Enter New Quantity:".
ACCEPT NEW-QUANTITY.
MOVE NEW-NAME TO NAME-LIST(ITEM-INDEX).
MOVE NEW-PRICE TO PRICE-LIST(ITEM-INDEX).
MOVE NEW-QUANTITY TO QUANTITY-LIST(ITEM-INDEX).
DISPLAY "Product Updated."
MOVE 'Y' TO ITEM-FOUND
END-IF
END-PERFORM
IF ITEM-FOUND = 'N'
DISPLAY "Product not found."
END-IF.
DELETE-PRODUCT.
DISPLAY "Enter Item Code to delete:".
ACCEPT DEL-ITEM-CODE.
PERFORM VARYING ITEM-INDEX FROM 1 BY 1
UNTIL ITEM-FOUND = 'Y' OR ITEM-INDEX > NUM-OF-PRODUCTS
IF DEL-ITEM-CODE = ITEM-CODE-LIST(ITEM-INDEX)
MOVE SPACES TO ITEM-CODE-LIST(ITEM-INDEX)
MOVE SPACES TO NAME-LIST(ITEM-INDEX)
MOVE 0 TO PRICE-LIST(ITEM-INDEX)
MOVE 0 TO QUANTITY-LIST(ITEM-INDEX)
DISPLAY "Product Deleted."
SUBTRACT 1 FROM NUM-OF-PRODUCTS
MOVE 'Y' TO ITEM-FOUND
END-IF
END-PERFORM.
IF ITEM-FOUND = 'N'
DISPLAY "Product not found."
END-IF.
I am confused at to why it's giving me an issue there and not the other instances as the program works when taking out the update-products and WHEN '3' PERFORM UPDATE-PRODUCT
.
Upvotes: 2
Views: 120
Reputation: 11
"syntax error, unexpected END-IF." - is due to the period/periods "." placed inside the IF statement. The compiler treats the IF as terminated already by the period, so the END-IF is now a syntax error because of the missing IF on the statement.
IF ITEM-CODE-SEARCH = ITEM-CODE-LIST(ITEM-INDEX) DISPLAY "Enter New Name:".
Upvotes: 1
Reputation: 10775
An IF statement is terminated by either an END-IF explicit scope terminator or a full-stop (a period, ".").
An inline PERFORM statement is terminated by either an END-PERFORM explicit scope terminator or a full-stop (a period, ".").
The inline PERFORM in paragraph UPDATE-PRODUCT contains an IF statement which is terminated by the full-stop following DISPLAY "Enter New Name:".
I suspect this full-stop also terminates the inline PERFORM.
The remaining statements up until the END-IF are syntactically correct, but the END-IF is a surprise to the compiler because the IF statement has already been terminated. The END-PERFORM is also a surprise to the compiler because the PERFORM has already been terminated.
A common coding style is to only code full-stops in the Procedure Division to terminate labels (paragraph and section names) and the paragraphs and sections themselves, always using explicit scope terminators such as END-IF and END-PERFORM to terminate COBOL verbs.
Upvotes: 5