The IN keyword represents a fundamental data qualification mechanism within COBOL programming environments, providing essential name resolution capabilities that enable precise data reference specification in complex hierarchical structures. This keyword embodies the principles of structured data access by supporting multi-level qualification, scope disambiguation, and clear data item identification while maintaining code readability, ensuring unambiguous references, and facilitating maintainable data manipulation across sophisticated enterprise applications with nested data structures, multiple naming contexts, and comprehensive business data hierarchies.
12345678910111213141516171819202122232425262728293031323334353637383940*> Basic IN qualification syntax data-name-1 IN data-name-2 data-name-1 IN data-name-2 IN data-name-3 *> Example data structure 01 CUSTOMER-RECORD. 05 CUSTOMER-INFO. 10 NAME PIC X(30). 10 ADDRESS. 15 STREET PIC X(25). 15 CITY PIC X(20). 15 STATE PIC X(2). 05 BILLING-INFO. 10 ADDRESS. 15 STREET PIC X(25). 15 CITY PIC X(20). 15 STATE PIC X(2). *> Qualification using IN MOVE "123 MAIN ST" TO STREET IN ADDRESS IN CUSTOMER-INFO MOVE "456 BILL AVE" TO STREET IN ADDRESS IN BILLING-INFO MOVE "NEW YORK" TO CITY IN ADDRESS IN CUSTOMER-INFO MOVE "CHICAGO" TO CITY IN ADDRESS IN BILLING-INFO *> Multiple levels of qualification 01 COMPANY-DATA. 05 DIVISION-A. 10 DEPARTMENT. 15 EMPLOYEE. 20 NAME PIC X(20). 20 ID PIC 9(6). 05 DIVISION-B. 10 DEPARTMENT. 15 EMPLOYEE. 20 NAME PIC X(20). 20 ID PIC 9(6). *> Precise qualification MOVE "JOHN SMITH" TO NAME IN EMPLOYEE IN DEPARTMENT IN DIVISION-A MOVE "JANE DOE" TO NAME IN EMPLOYEE IN DEPARTMENT IN DIVISION-B.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258IDENTIFICATION DIVISION. PROGRAM-ID. IN-KEYWORD-EXAMPLES. DATA DIVISION. WORKING-STORAGE SECTION. 01 ORDER-PROCESSING-DATA. 05 ORDER-HEADER. 10 ORDER-ID PIC 9(8). 10 ORDER-DATE PIC 9(8). 10 CUSTOMER-INFO. 15 CUSTOMER-ID PIC X(10). 15 CUSTOMER-NAME PIC X(30). 15 ADDRESS. 20 STREET PIC X(30). 20 CITY PIC X(20). 20 STATE PIC X(2). 20 ZIP PIC 9(5). 05 SHIPPING-INFO. 10 SHIP-TO-NAME PIC X(30). 10 ADDRESS. 15 STREET PIC X(30). 15 CITY PIC X(20). 15 STATE PIC X(2). 15 ZIP PIC 9(5). 10 SHIPPING-METHOD PIC X(15). 05 BILLING-INFO. 10 BILL-TO-NAME PIC X(30). 10 ADDRESS. 15 STREET PIC X(30). 15 CITY PIC X(20). 15 STATE PIC X(2). 15 ZIP PIC 9(5). 01 EMPLOYEE-MANAGEMENT. 05 HEADQUARTERS. 10 DEPARTMENT. 15 FINANCE. 20 MANAGER. 25 NAME PIC X(25). 25 ID PIC 9(6). 25 SALARY PIC 9(7)V99. 20 STAFF OCCURS 10 TIMES. 25 NAME PIC X(25). 25 ID PIC 9(6). 25 SALARY PIC 9(6)V99. 15 HR. 20 MANAGER. 25 NAME PIC X(25). 25 ID PIC 9(6). 25 SALARY PIC 9(7)V99. 20 STAFF OCCURS 5 TIMES. 25 NAME PIC X(25). 25 ID PIC 9(6). 25 SALARY PIC 9(6)V99. 05 BRANCH-OFFICE. 10 DEPARTMENT. 15 SALES. 20 MANAGER. 25 NAME PIC X(25). 25 ID PIC 9(6). 25 SALARY PIC 9(7)V99. 20 STAFF OCCURS 20 TIMES. 25 NAME PIC X(25). 25 ID PIC 9(6). 25 SALARY PIC 9(6)V99. 01 WS-WORK-AREAS. 05 WS-TEMP-NAME PIC X(30). 05 WS-TEMP-ADDRESS PIC X(100). 05 WS-COUNTER PIC 9(3). PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM DEMONSTRATE-BASIC-QUALIFICATION PERFORM DEMONSTRATE-COMPLEX-STRUCTURES PERFORM DEMONSTRATE-ARRAY-QUALIFICATION PERFORM DEMONSTRATE-PRACTICAL-USAGE STOP RUN. DEMONSTRATE-BASIC-QUALIFICATION. DISPLAY "=== BASIC IN QUALIFICATION EXAMPLES ===" *> Initialize order data with qualified references MOVE 12345678 TO ORDER-ID IN ORDER-HEADER MOVE 20240315 TO ORDER-DATE IN ORDER-HEADER *> Customer information MOVE "CUST001" TO CUSTOMER-ID IN CUSTOMER-INFO IN ORDER-HEADER MOVE "ACME CORPORATION" TO CUSTOMER-NAME IN CUSTOMER-INFO IN ORDER-HEADER *> Customer address (using IN for qualification) MOVE "123 BUSINESS BLVD" TO STREET IN ADDRESS IN CUSTOMER-INFO MOVE "COMMERCE CITY" TO CITY IN ADDRESS IN CUSTOMER-INFO MOVE "NY" TO STATE IN ADDRESS IN CUSTOMER-INFO MOVE 12345 TO ZIP IN ADDRESS IN CUSTOMER-INFO *> Shipping address (different from customer address) MOVE "SHIPPING DEPARTMENT" TO SHIP-TO-NAME IN SHIPPING-INFO MOVE "456 WAREHOUSE WAY" TO STREET IN ADDRESS IN SHIPPING-INFO MOVE "DISTRIBUTION CTR" TO CITY IN ADDRESS IN SHIPPING-INFO MOVE "TX" TO STATE IN ADDRESS IN SHIPPING-INFO MOVE 75201 TO ZIP IN ADDRESS IN SHIPPING-INFO *> Billing address (different from both) MOVE "ACCOUNTS PAYABLE" TO BILL-TO-NAME IN BILLING-INFO MOVE "789 FINANCE BLVD" TO STREET IN ADDRESS IN BILLING-INFO MOVE "ACCOUNTING CITY" TO CITY IN ADDRESS IN BILLING-INFO MOVE "CA" TO STATE IN ADDRESS IN BILLING-INFO MOVE 90210 TO ZIP IN ADDRESS IN BILLING-INFO DISPLAY "Order processed with qualified addresses:" DISPLAY "Customer: " CUSTOMER-NAME IN CUSTOMER-INFO IN ORDER-HEADER DISPLAY "Ship to: " STREET IN ADDRESS IN SHIPPING-INFO DISPLAY "Bill to: " STREET IN ADDRESS IN BILLING-INFO DISPLAY SPACES. DEMONSTRATE-COMPLEX-STRUCTURES. DISPLAY "=== COMPLEX HIERARCHICAL QUALIFICATION ===" *> Finance department setup at headquarters MOVE "SARAH JOHNSON" TO NAME IN MANAGER IN FINANCE IN DEPARTMENT IN HEADQUARTERS MOVE 123456 TO ID IN MANAGER IN FINANCE IN DEPARTMENT IN HEADQUARTERS MOVE 95000.00 TO SALARY IN MANAGER IN FINANCE IN DEPARTMENT IN HEADQUARTERS *> HR department setup at headquarters MOVE "MICHAEL CHEN" TO NAME IN MANAGER IN HR IN DEPARTMENT IN HEADQUARTERS MOVE 234567 TO ID IN MANAGER IN HR IN DEPARTMENT IN HEADQUARTERS MOVE 87000.00 TO SALARY IN MANAGER IN HR IN DEPARTMENT IN HEADQUARTERS *> Sales department setup at branch office MOVE "JENNIFER DAVIS" TO NAME IN MANAGER IN SALES IN DEPARTMENT IN BRANCH-OFFICE MOVE 345678 TO ID IN MANAGER IN SALES IN DEPARTMENT IN BRANCH-OFFICE MOVE 92000.00 TO SALARY IN MANAGER IN SALES IN DEPARTMENT IN BRANCH-OFFICE *> Add staff to Finance department MOVE "ROBERT WILSON" TO NAME IN STAFF(1) IN FINANCE IN DEPARTMENT IN HEADQUARTERS MOVE 456789 TO ID IN STAFF(1) IN FINANCE IN DEPARTMENT IN HEADQUARTERS MOVE 65000.00 TO SALARY IN STAFF(1) IN FINANCE IN DEPARTMENT IN HEADQUARTERS MOVE "LISA MARTINEZ" TO NAME IN STAFF(2) IN FINANCE IN DEPARTMENT IN HEADQUARTERS MOVE 567890 TO ID IN STAFF(2) IN FINANCE IN DEPARTMENT IN HEADQUARTERS MOVE 68000.00 TO SALARY IN STAFF(2) IN FINANCE IN DEPARTMENT IN HEADQUARTERS DISPLAY "Complex organization structure populated:" DISPLAY "Finance Manager: " NAME IN MANAGER IN FINANCE IN DEPARTMENT IN HEADQUARTERS DISPLAY "HR Manager: " NAME IN MANAGER IN HR IN DEPARTMENT IN HEADQUARTERS DISPLAY "Sales Manager: " NAME IN MANAGER IN SALES IN DEPARTMENT IN BRANCH-OFFICE DISPLAY "Finance Staff 1: " NAME IN STAFF(1) IN FINANCE IN DEPARTMENT IN HEADQUARTERS DISPLAY SPACES. DEMONSTRATE-ARRAY-QUALIFICATION. DISPLAY "=== ARRAY ELEMENT QUALIFICATION ===" *> Populate multiple staff members with qualified references PERFORM VARYING WS-COUNTER FROM 1 BY 1 UNTIL WS-COUNTER > 5 STRING "EMPLOYEE-" WS-COUNTER DELIMITED BY SIZE INTO NAME IN STAFF(WS-COUNTER) IN HR IN DEPARTMENT IN HEADQUARTERS COMPUTE ID IN STAFF(WS-COUNTER) IN HR IN DEPARTMENT IN HEADQUARTERS = 100000 + WS-COUNTER COMPUTE SALARY IN STAFF(WS-COUNTER) IN HR IN DEPARTMENT IN HEADQUARTERS = 45000 + (WS-COUNTER * 2000) END-PERFORM *> Display qualified array elements PERFORM VARYING WS-COUNTER FROM 1 BY 1 UNTIL WS-COUNTER > 5 DISPLAY "HR Staff " WS-COUNTER ": " NAME IN STAFF(WS-COUNTER) IN HR IN DEPARTMENT IN HEADQUARTERS " (ID: " ID IN STAFF(WS-COUNTER) IN HR IN DEPARTMENT IN HEADQUARTERS ")" END-PERFORM DISPLAY SPACES. DEMONSTRATE-PRACTICAL-USAGE. DISPLAY "=== PRACTICAL QUALIFICATION SCENARIOS ===" *> Data movement between similar structures MOVE STREET IN ADDRESS IN CUSTOMER-INFO TO WS-TEMP-ADDRESS STRING WS-TEMP-ADDRESS DELIMITED BY SPACE ", " DELIMITED BY SIZE CITY IN ADDRESS IN CUSTOMER-INFO DELIMITED BY SPACE ", " DELIMITED BY SIZE STATE IN ADDRESS IN CUSTOMER-INFO DELIMITED BY SIZE " " DELIMITED BY SIZE ZIP IN ADDRESS IN CUSTOMER-INFO DELIMITED BY SIZE INTO WS-TEMP-ADDRESS DISPLAY "Customer address: " WS-TEMP-ADDRESS *> Comparison using qualified names IF STREET IN ADDRESS IN SHIPPING-INFO = STREET IN ADDRESS IN CUSTOMER-INFO DISPLAY "Shipping and customer addresses match" ELSE DISPLAY "Different shipping address used" END-IF *> Conditional processing with qualification IF STATE IN ADDRESS IN BILLING-INFO = "CA" DISPLAY "California billing address - apply CA tax" ELSE DISPLAY "Out-of-state billing - check tax rules" END-IF *> Data validation using qualified references IF CUSTOMER-ID IN CUSTOMER-INFO IN ORDER-HEADER = SPACES DISPLAY "Error: Customer ID required" ELSE DISPLAY "Customer ID validated: " CUSTOMER-ID IN CUSTOMER-INFO IN ORDER-HEADER END-IF DISPLAY SPACES. *> Utility paragraphs demonstrating qualification usage COPY-CUSTOMER-TO-SHIPPING. *> Copy customer address to shipping when they're the same MOVE STREET IN ADDRESS IN CUSTOMER-INFO TO STREET IN ADDRESS IN SHIPPING-INFO MOVE CITY IN ADDRESS IN CUSTOMER-INFO TO CITY IN ADDRESS IN SHIPPING-INFO MOVE STATE IN ADDRESS IN CUSTOMER-INFO TO STATE IN ADDRESS IN SHIPPING-INFO MOVE ZIP IN ADDRESS IN CUSTOMER-INFO TO ZIP IN ADDRESS IN SHIPPING-INFO. VALIDATE-ALL-ADDRESSES. *> Validate customer address IF STREET IN ADDRESS IN CUSTOMER-INFO = SPACES DISPLAY "Error: Customer street address required" END-IF *> Validate shipping address IF STREET IN ADDRESS IN SHIPPING-INFO = SPACES DISPLAY "Error: Shipping street address required" END-IF *> Validate billing address IF STREET IN ADDRESS IN BILLING-INFO = SPACES DISPLAY "Error: Billing street address required" END-IF. COMPARE-MANAGER-SALARIES. *> Compare salaries across different departments IF SALARY IN MANAGER IN FINANCE IN DEPARTMENT IN HEADQUARTERS > SALARY IN MANAGER IN HR IN DEPARTMENT IN HEADQUARTERS DISPLAY "Finance manager has higher salary" ELSE DISPLAY "HR manager has higher salary" END-IF IF SALARY IN MANAGER IN SALES IN DEPARTMENT IN BRANCH-OFFICE > SALARY IN MANAGER IN FINANCE IN DEPARTMENT IN HEADQUARTERS DISPLAY "Sales manager (branch) earns more than Finance manager (HQ)" ELSE DISPLAY "Finance manager (HQ) earns more than Sales manager (branch)" END-IF.
12345678910111213141516171819*> These statements are functionally identical: MOVE "VALUE" TO FIELD-NAME IN GROUP-NAME MOVE "VALUE" TO FIELD-NAME OF GROUP-NAME *> Both work with multiple levels: MOVE "VALUE" TO ITEM IN SUB-GROUP IN MAIN-GROUP MOVE "VALUE" TO ITEM OF SUB-GROUP OF MAIN-GROUP *> Can even mix them (though not recommended): MOVE "VALUE" TO ITEM IN SUB-GROUP OF MAIN-GROUP *> Best practice - choose one and use consistently: *> Using IN throughout the program MOVE CUSTOMER-NAME IN CUSTOMER-INFO IN ORDER-HEADER TO DISPLAY-NAME MOVE ORDER-DATE IN ORDER-HEADER TO FORMATTED-DATE *> Using OF throughout the program MOVE CUSTOMER-NAME OF CUSTOMER-INFO OF ORDER-HEADER TO DISPLAY-NAME MOVE ORDER-DATE OF ORDER-HEADER TO FORMATTED-DATE.
When do you need to use the IN keyword in COBOL?
Answer: Use IN when multiple data items have the same name in different hierarchical levels or contexts, requiring qualification to specify which data item you're referencing.
How do you qualify a data item that's nested three levels deep?
Answer: Use the format: data-name IN group-name2 IN group-name1, working from the innermost to outermost level.