NL035: Use of DB statements inside of Natural Copycode is discouraged

NL035: Use of DB statements inside of Natural Copycode is discouraged

type: code-smell
priority: major

#clumsy
#confusing
#bad-practice

Description

Hides implementation for XREF, because data access is shown in all INCLUDErs of the Copycode, and not just the Copycode itself. Interface is copied amongst INCLUDErs instead of being isolated. Meaning changes in interface will affect all INCLUDErs. Access modules should be isolated in Subprograms instead.

Non compliant

* COPYCODE: CUSTFIND
FIND CUSTOMER WITH NAME = #SEARCH-NAME
MOVE CUSTOMER-ID   TO #CUST-ID
MOVE CUSTOMER-ADDR TO #CUST-ADDR
END-FIND

Example program using the copycode

DEFINE DATA
LOCAL
1 #SEARCH-NAME (A30)
1 #CUST-ID     (N10)
1 #CUST-ADDR   (A50)
END-DEFINE
INPUT 'Enter customer name:' #SEARCH-NAME
INCLUDE CUSTFIND
DISPLAY #CUST-ID #CUST-ADDR
END

Compliant

Use an interface (Parameter Data Area)

DEFINE DATA
PARAMETER
1 PDACUST
2 PDACUST-IN
3 P-SEARCH-NAME (A30)
2 PDACUST-OUT
3 P-CUST-ID     (N10)
3 P-CUST-ADDR   (A50)
...
END-DEFINE

Subprogram (FINDCUST)

DEFINE DATA
PARAMETER USING PDACUST
END-DEFINE

RESET PDACUST.PDACUST-OUT
FIND CUSTOMER WITH NAME = P-SEARCH-NAME
MOVE CUSTOMER.CUSTOMER-ID   TO PDACUST.P-CUST-ID
MOVE CUSTOMER.CUSTOMER-ADDR TO PDACUST.P-CUST-ADDR
END-FIND
END

Example program using the subprogram

DEFINE DATA
LOCAL USING PDACUST
END-DEFINE
INPUT 'Enter customer name:' PDACUST.P-SEARCH-NAME
CALLNAT 'FINDCUST' USING PDACUST
DISPLAY PDACUST.PDACUST-OUT
END