<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.webhuis.nl:443/index.php?action=history&amp;feed=atom&amp;title=Naming_and_Coding_Standards</id>
	<title>Naming and Coding Standards - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.webhuis.nl:443/index.php?action=history&amp;feed=atom&amp;title=Naming_and_Coding_Standards"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Naming_and_Coding_Standards&amp;action=history"/>
	<updated>2026-09-11T06:34:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Naming_and_Coding_Standards&amp;diff=4757&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;naming-and-coding-standard-cobol&quot;&gt;&lt;/span&gt; = Naming and Coding Standard — COBOL =  {| !width=&quot;23%&quot;| Field !width=&quot;76%&quot;| Value |- | Document ID | PGCBL-NCS-001 |- | Document Type | Naming and Coding Standard |- | System | pgcobol — Prime Numbers Application v1.0 |- | Applies to | All GnuCOBOL source files (&lt;code&gt;.cbl&lt;/code&gt;) and copybooks (&lt;code&gt;.cpy&lt;/code&gt;) |- | Version | 1.0 |- | Status | Approved |- | Owner | Lead Developer |- | Author | Derived from: IBM...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Naming_and_Coding_Standards&amp;diff=4757&amp;oldid=prev"/>
		<updated>2026-03-25T15:36:46Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;naming-and-coding-standard-cobol&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Naming and Coding Standard — COBOL =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-NCS-001 |- | Document Type | Naming and Coding Standard |- | System | pgcobol — Prime Numbers Application v1.0 |- | Applies to | All GnuCOBOL source files (&amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt;) and copybooks (&amp;lt;code&amp;gt;.cpy&amp;lt;/code&amp;gt;) |- | Version | 1.0 |- | Status | Approved |- | Owner | Lead Developer |- | Author | Derived from: IBM...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;naming-and-coding-standard-cobol&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Naming and Coding Standard — COBOL =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-NCS-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Naming and Coding Standard&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Applies to&lt;br /&gt;
| All GnuCOBOL source files (&amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt;) and copybooks (&amp;lt;code&amp;gt;.cpy&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Approved&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| Derived from: IBM Enterprise COBOL Coding Guidelines, GnuCOBOL Best Practices, Micro Focus COBOL Standards, and observation of existing pgcobol source&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Initial standard from source analysis&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Approved&lt;br /&gt;
| Baselined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;table-of-contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Table of Contents ==&lt;br /&gt;
&lt;br /&gt;
# [[#1-standards-basis|Standards Basis]]&lt;br /&gt;
# [[#2-source-file-conventions|Source File Conventions]]&lt;br /&gt;
# [[#3-division-and-section-structure|Division and Section Structure]]&lt;br /&gt;
# [[#4-data-naming-conventions|Data Naming Conventions]]&lt;br /&gt;
# [[#5-paragraph-naming-conventions|Paragraph Naming Conventions]]&lt;br /&gt;
# [[#6-procedure-division-coding-rules|Procedure Division Coding Rules]]&lt;br /&gt;
# [[#7-sql-embedding-conventions|SQL Embedding Conventions]]&lt;br /&gt;
# [[#8-commentary-standards|Commentary Standards]]&lt;br /&gt;
# [[#9-copybook-standards|Copybook Standards]]&lt;br /&gt;
# [[#10-method-dispatch-pattern-standard|Method-Dispatch Pattern Standard]]&lt;br /&gt;
# [[#11-error-handling-standard|Error Handling Standard]]&lt;br /&gt;
# [[#12-compliance-checklist|Compliance Checklist]]&lt;br /&gt;
# [[#13-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;standards-basis&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Standards Basis ==&lt;br /&gt;
&lt;br /&gt;
This standard synthesises rules from the following well-known and published sources:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Source&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| What it contributes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ISO/IEC 1989:2014&amp;#039;&amp;#039;&amp;#039; (COBOL 2014 standard)&lt;br /&gt;
| Syntax compliance baseline&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;IBM Enterprise COBOL Programming Guide (SC27-1460)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Naming conventions, data division layout, structured programming&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Micro Focus COBOL Coding Standards&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Paragraph prefixing, copybook discipline, comment headers&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;GnuCOBOL Programmer’s Guide&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| GnuCOBOL-specific extensions and limitations&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NIST COBOL Test Suite conventions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Identifier uniqueness and column discipline&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Yourdon / Constantine structured design&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Module cohesion, coupling reduction — applied to COBOL tiers&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;pgcobol source&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Existing conventions extracted and formalised&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;source-file-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Source File Conventions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-names&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 File names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;program-id&amp;amp;gt;.cbl          Main program source&lt;br /&gt;
&amp;amp;lt;copybook-name&amp;amp;gt;.cpy       Copybook source&lt;br /&gt;
&amp;amp;lt;program-id&amp;amp;gt;.cbsql        GixSQL pre-processor input (if SQL present)&lt;br /&gt;
&amp;amp;lt;program-id&amp;amp;gt;_cbsql.out    GixSQL pre-processor listing (generated; do not edit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* All lowercase.&lt;br /&gt;
* Hyphens as word separators (not underscores) for new files. Underscores are a legacy convention in this codebase (&amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt;); new files use hyphens.&lt;br /&gt;
* The &amp;lt;code&amp;gt;PROGRAM-ID&amp;lt;/code&amp;gt; in the source must match the filename exactly (case-insensitive).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;column-discipline&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Column discipline ===&lt;br /&gt;
&lt;br /&gt;
GnuCOBOL supports both fixed-format (traditional) and free-format source. This codebase uses &amp;#039;&amp;#039;&amp;#039;fixed format&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Columns 1–6    Sequence number area (blank in new code; used by legacy tools)&lt;br /&gt;
Column  7      Indicator area: space = code, * = comment, / = page eject, - = continuation&lt;br /&gt;
Columns 8–11   Area A: DIVISION, SECTION, paragraph names, 01/77-level data&lt;br /&gt;
Columns 12–72  Area B: all other code&lt;br /&gt;
Columns 73–80  Identification area (optional; ignored by compiler)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rule:&amp;#039;&amp;#039;&amp;#039; All paragraph names and top-level items begin in column 8 (Area A). All subordinate code begins at column 12 or beyond (Area B).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;division-and-section-structure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Division and Section Structure ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mandatory-division-order&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Mandatory division order ===&lt;br /&gt;
&lt;br /&gt;
Every program must contain these divisions in this order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IDENTIFICATION DIVISION.&lt;br /&gt;
  PROGRAM-ID.&lt;br /&gt;
  (AUTHOR. — optional)&lt;br /&gt;
  (DATE-WRITTEN. — optional)&lt;br /&gt;
&lt;br /&gt;
ENVIRONMENT DIVISION.&lt;br /&gt;
  CONFIGURATION SECTION.&lt;br /&gt;
    SOURCE-COMPUTER.&lt;br /&gt;
    OBJECT-COMPUTER.&lt;br /&gt;
    SPECIAL-NAMES.&lt;br /&gt;
  INPUT-OUTPUT SECTION.      (only if files are used)&lt;br /&gt;
    FILE-CONTROL.&lt;br /&gt;
&lt;br /&gt;
DATA DIVISION.&lt;br /&gt;
  FILE SECTION.              (only if files are used)&lt;br /&gt;
  WORKING-STORAGE SECTION.&lt;br /&gt;
  LINKAGE SECTION.           (only for called programs)&lt;br /&gt;
&lt;br /&gt;
PROCEDURE DIVISION [USING ...].&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;working-storage-section-order&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 Working-Storage section order ===&lt;br /&gt;
&lt;br /&gt;
Items in WORKING-STORAGE must appear in this order:&lt;br /&gt;
&lt;br /&gt;
# Debug marker filler (01 FILLER PIC X(32) VALUE “Start WS &amp;lt;program&amp;gt;”) — for memory-dump readability.&lt;br /&gt;
# File status fields (if any files).&lt;br /&gt;
# Constants (01 level, VALUE clause, no modification at runtime).&lt;br /&gt;
# Work fields grouped by function.&lt;br /&gt;
# COPY statements for local copybooks (primes-ui, primes-dal, etc.).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linkage-section&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 Linkage section ===&lt;br /&gt;
&lt;br /&gt;
The linkage section must contain only COPY statements referencing the published inter-tier copybooks. No fields should be defined directly in the LINKAGE SECTION of a standard program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-naming-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Data Naming Conventions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;general-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.1 General rules ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Rule&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Rationale&lt;br /&gt;
|-&lt;br /&gt;
| Use hyphens as word separators: &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;testNumber&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;test_number&amp;lt;/code&amp;gt;&lt;br /&gt;
| COBOL convention; underscores are non-standard in some compilers&lt;br /&gt;
|-&lt;br /&gt;
| Maximum name length: 30 characters (COBOL 85 limit)&lt;br /&gt;
| Portability&lt;br /&gt;
|-&lt;br /&gt;
| Names must be meaningful: no single-letter names except loop indexes&lt;br /&gt;
| Readability&lt;br /&gt;
|-&lt;br /&gt;
| Avoid COBOL reserved words and common abbreviations that conflict (e.g. &amp;lt;code&amp;gt;LENGTH&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SPACE&amp;lt;/code&amp;gt;)&lt;br /&gt;
| Prevents ambiguity&lt;br /&gt;
|-&lt;br /&gt;
| Prefix 88-level condition names with the purpose they test, not the field name&lt;br /&gt;
| &amp;lt;code&amp;gt;dal-method-ok&amp;lt;/code&amp;gt; not &amp;lt;code&amp;gt;dal-result-zero&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;level-number-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.2 Level number conventions ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Use&lt;br /&gt;
|-&lt;br /&gt;
| 01&lt;br /&gt;
| Group items, independent items, copybook roots&lt;br /&gt;
|-&lt;br /&gt;
| 03, 05, 07&lt;br /&gt;
| Subordinate group and elementary items (use odd numbers: 01, 03, 05, 07 …)&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| RENAMES clause (use sparingly)&lt;br /&gt;
|-&lt;br /&gt;
| 77&lt;br /&gt;
| Independent elementary items (prefer 01 unless 77 is clearly appropriate)&lt;br /&gt;
|-&lt;br /&gt;
| 88&lt;br /&gt;
| Condition names; always immediately under the field they qualify&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rule:&amp;#039;&amp;#039;&amp;#039; Use odd-numbered levels (01, 03, 05, 07, 09) to allow insertion of intermediate levels without renumbering. Never use even levels in new code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;naming-prefixes-for-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.3 Naming prefixes for scope ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Prefix&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Meaning&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Record / row field (fetched from DB)&lt;br /&gt;
| &amp;lt;code&amp;gt;r-ident&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;u-&amp;lt;/code&amp;gt;&lt;br /&gt;
| UI-layer field (in primes-ui block)&lt;br /&gt;
| &amp;lt;code&amp;gt;u-sequence&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;u-number&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;t-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Table cell / temporary print field&lt;br /&gt;
| &amp;lt;code&amp;gt;t-ident&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;f-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Formatted / print-ready field&lt;br /&gt;
| &amp;lt;code&amp;gt;f-page-number&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;w-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Work field (local computation)&lt;br /&gt;
| &amp;lt;code&amp;gt;w-remainder&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;picture-clause-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 Picture clause conventions ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Preferred PICTURE&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Notes&lt;br /&gt;
|-&lt;br /&gt;
| Positive integer, display&lt;br /&gt;
| &amp;lt;code&amp;gt;9(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| n ≤ 9 for standard arithmetic&lt;br /&gt;
|-&lt;br /&gt;
| Signed integer, display&lt;br /&gt;
| &amp;lt;code&amp;gt;S9(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Use S prefix for fields that can go negative or are SQL host variables&lt;br /&gt;
|-&lt;br /&gt;
| Packed decimal&lt;br /&gt;
| &amp;lt;code&amp;gt;S9(n) COMP-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| For high-volume arithmetic and SQL host variables&lt;br /&gt;
|-&lt;br /&gt;
| Binary integer&lt;br /&gt;
| &amp;lt;code&amp;gt;S9(n) COMP-5&amp;lt;/code&amp;gt;&lt;br /&gt;
| For SQLCA fields and counters needing maximum performance&lt;br /&gt;
|-&lt;br /&gt;
| Fixed decimal&lt;br /&gt;
| &amp;lt;code&amp;gt;9(n)V9(m)&amp;lt;/code&amp;gt;&lt;br /&gt;
| V = implied decimal point; no actual decimal character stored&lt;br /&gt;
|-&lt;br /&gt;
| Alphanumeric&lt;br /&gt;
| &amp;lt;code&amp;gt;X(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| For text, method verbs, messages&lt;br /&gt;
|-&lt;br /&gt;
| Edited numeric (print)&lt;br /&gt;
| &amp;lt;code&amp;gt;Z(n)9&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Z(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| For zero-suppressed print output only; never used in arithmetic&lt;br /&gt;
|-&lt;br /&gt;
| Boolean flag&lt;br /&gt;
| &amp;lt;code&amp;gt;9(1)&amp;lt;/code&amp;gt; with 88-levels&lt;br /&gt;
| e.g. &amp;lt;code&amp;gt;PIC 9 VALUE 1. 88 new-page VALUE 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;level-condition-names&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.5 88-level condition names ===&lt;br /&gt;
&lt;br /&gt;
* Must be named for what is &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; when the condition fires, not for the value: &amp;lt;code&amp;gt;session-method-ok&amp;lt;/code&amp;gt; not &amp;lt;code&amp;gt;result-is-zero&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Result-code 88-levels must cover all meaningful values; add a &amp;lt;code&amp;gt;88 invalid-method VALUE &amp;amp;quot;bad&amp;amp;quot;&amp;lt;/code&amp;gt; sentinel.&lt;br /&gt;
* Multiple conditions for the same field must have non-overlapping VALUES.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-field-naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.6 Copybook field naming ===&lt;br /&gt;
&lt;br /&gt;
* Fields in a copybook must be globally unique across all copybooks in the project (COBOL does not namespace copybooks).&lt;br /&gt;
* Prefix copybook fields with the copybook’s logical name: &amp;lt;code&amp;gt;dal-methods&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ui-method-result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session-result&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-naming-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Paragraph Naming Conventions ==&lt;br /&gt;
&lt;br /&gt;
This project uses a &amp;#039;&amp;#039;&amp;#039;prefix-number naming scheme&amp;#039;&amp;#039;&amp;#039; derived from IBM COBOL shop practice:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;prefix-codes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.1 Prefix codes ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Prefix&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Meaning&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;&lt;br /&gt;
| Regular processing paragraph (business logic, I/O)&lt;br /&gt;
| &amp;lt;code&amp;gt;r80-test-number&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
| System / infrastructure paragraph (DB connect, file open)&lt;br /&gt;
| &amp;lt;code&amp;gt;s00-connect&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;&lt;br /&gt;
| Error-handling paragraph&lt;br /&gt;
| &amp;lt;code&amp;gt;e10-handle-db-error&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;&lt;br /&gt;
| Exit / cleanup paragraph (always PERFORM last)&lt;br /&gt;
| &amp;lt;code&amp;gt;x99-shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Observation from existing source:&amp;#039;&amp;#039;&amp;#039; The project uses &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefixes already. The &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; prefixes are introduced here as an extension. The &amp;lt;code&amp;gt;r99&amp;lt;/code&amp;gt; convention for shutdown paragraphs is retained.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;numbering&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.2 Numbering ===&lt;br /&gt;
&lt;br /&gt;
* Two-digit sequence: &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;90&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;99&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Low numbers (00–29): initialisation / setup.&lt;br /&gt;
* Mid numbers (30–79): main processing.&lt;br /&gt;
* High numbers (80–89): sub-processing / helpers.&lt;br /&gt;
* 90–98: cleanup and close.&lt;br /&gt;
* 99: final exit / stop.&lt;br /&gt;
* Leave gaps of 10 between paragraphs to allow insertion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;name-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.3 Name format ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;&amp;amp;lt;NN&amp;amp;gt;-&amp;amp;lt;short-hyphenated-description&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
  r80-test-number&lt;br /&gt;
  r82-next-test-number&lt;br /&gt;
  r85-write-prime&lt;br /&gt;
  r89-get-next-divider&lt;br /&gt;
  r90-start-primes-report&lt;br /&gt;
  r99-close-primes&lt;br /&gt;
  s00-connect&lt;br /&gt;
  s01-cursor&lt;br /&gt;
  s02-fetch&lt;br /&gt;
  s99-disconnect&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.4 Rules ===&lt;br /&gt;
&lt;br /&gt;
* Paragraph names must be unique within the program.&lt;br /&gt;
* A paragraph must do one thing. If it needs a comment explaining “also does X”, split it.&lt;br /&gt;
* Paragraphs called only from one place may be inlined (PERFORM vs inline code) — choose consistency over micro-optimisation.&lt;br /&gt;
* Never use &amp;lt;code&amp;gt;GO TO&amp;lt;/code&amp;gt; except for the structured &amp;lt;code&amp;gt;GO TO &amp;amp;lt;paragraph&amp;amp;gt;&amp;lt;/code&amp;gt; used as a skip (an accepted COBOL idiom). Do not use &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-coding-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Procedure Division Coding Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;structured-programming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.1 Structured programming ===&lt;br /&gt;
&lt;br /&gt;
All control flow must use structured constructs:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Construct&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Use for&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PERFORM &amp;amp;lt;paragraph&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Single call to a named paragraph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PERFORM &amp;amp;lt;paragraph&amp;amp;gt; UNTIL &amp;amp;lt;condition&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Loops with pre-test condition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EVALUATE TRUE … WHEN … END-EVALUATE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Multi-way branch (preferred over nested IF)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;IF … ELSE … END-IF&amp;lt;/code&amp;gt;&lt;br /&gt;
| Two-way branch&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NEXT SENTENCE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Skip remainder of sentence (used sparingly; prefer END-IF)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Never use:&amp;#039;&amp;#039;&amp;#039; - &amp;lt;code&amp;gt;GO TO&amp;lt;/code&amp;gt; (except structured skip idiom in legacy contexts) - &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;PERFORM … THRU&amp;lt;/code&amp;gt; (couples paragraphs; prefer explicit PERFORM chains)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evaluate-true-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.2 EVALUATE TRUE convention ===&lt;br /&gt;
&lt;br /&gt;
The method-dispatch EVALUATE always takes this form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;EVALUATE TRUE&lt;br /&gt;
  WHEN &amp;lt;condition-name-1&amp;gt;&lt;br /&gt;
    PERFORM &amp;lt;paragraph&amp;gt;&lt;br /&gt;
  WHEN &amp;lt;condition-name-2&amp;gt;&lt;br /&gt;
    PERFORM &amp;lt;paragraph&amp;gt;&lt;br /&gt;
  WHEN OTHER&lt;br /&gt;
    MOVE 1 TO &amp;lt;result-field&amp;gt;&lt;br /&gt;
END-EVALUATE.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Every EVALUATE must have a &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; clause.&lt;br /&gt;
* The &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; must set a meaningful error indicator; it must never be a no-op.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;perform-until&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.3 PERFORM … UNTIL ===&lt;br /&gt;
&lt;br /&gt;
* The loop condition is checked &amp;#039;&amp;#039;&amp;#039;before&amp;#039;&amp;#039;&amp;#039; the first iteration (test-before / DO-WHILE reversed).&lt;br /&gt;
* Infinite loops are not permitted. Every PERFORM UNTIL must have a reachable exit condition.&lt;br /&gt;
* Loop termination must be tested and documented in the program logic guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;call-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.4 CALL conventions ===&lt;br /&gt;
&lt;br /&gt;
* All inter-program calls use &amp;lt;code&amp;gt;CALL &amp;amp;quot;literal&amp;amp;quot; USING &amp;amp;lt;data-block&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The called program name must be a string literal, not a data name (for static linkage and security).&lt;br /&gt;
* Always check the result field of the called program’s control block immediately after the CALL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;arithmetic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.5 Arithmetic ===&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;COMPUTE&amp;lt;/code&amp;gt; for complex expressions: &amp;lt;code&amp;gt;COMPUTE x = a ** 0.5&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Use &amp;lt;code&amp;gt;ADD … TO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUBTRACT … FROM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MULTIPLY … BY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DIVIDE … BY … GIVING … REMAINDER&amp;lt;/code&amp;gt; for simple operations.&lt;br /&gt;
* Always use &amp;lt;code&amp;gt;GIVING&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;REMAINDER&amp;lt;/code&amp;gt; clauses to avoid in-place modification of source operands.&lt;br /&gt;
* Always check for zero divisor before DIVIDE.&lt;br /&gt;
* Declare intermediate results with sufficient precision to avoid truncation: &amp;lt;code&amp;gt;PIC 9(9)V9(9)&amp;lt;/code&amp;gt; for square-root results.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sql-embedding-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. SQL Embedding Conventions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;exec-sql-block-layout&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.1 EXEC SQL block layout ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           EXEC SQL [AT &amp;lt;connection-alias&amp;gt;]&lt;br /&gt;
             &amp;lt;sql statement&amp;gt;&lt;br /&gt;
           END-EXEC.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXEC SQL&amp;lt;/code&amp;gt; on its own line, indented to Area B.&lt;br /&gt;
* SQL keywords in uppercase.&lt;br /&gt;
* Host variable prefix &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; immediately before the variable name, no space.&lt;br /&gt;
* &amp;lt;code&amp;gt;END-EXEC.&amp;lt;/code&amp;gt; on its own line, followed by a period.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;host-variable-declaration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.2 Host variable declaration ===&lt;br /&gt;
&lt;br /&gt;
* All SQL host variables must be declared via &amp;lt;code&amp;gt;EXEC SQL INCLUDE &amp;amp;lt;copybook&amp;amp;gt; END-EXEC&amp;lt;/code&amp;gt; or directly in WORKING-STORAGE.&lt;br /&gt;
* Host variables for row-level data must be grouped under a 01-level record that mirrors the table structure.&lt;br /&gt;
* Use &amp;lt;code&amp;gt;COMP-3&amp;lt;/code&amp;gt; for numeric host variables for performance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sqlcode-checking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.3 SQLCODE checking ===&lt;br /&gt;
&lt;br /&gt;
Every EXEC SQL block must be followed immediately by a SQLCODE check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           EXEC SQL ... END-EXEC.&lt;br /&gt;
&lt;br /&gt;
           IF SQLCODE = 0 THEN&lt;br /&gt;
             &amp;lt;success path&amp;gt;&lt;br /&gt;
           ELSE&lt;br /&gt;
             MOVE SQLERRMC TO program-message&lt;br /&gt;
             PERFORM e10-handle-sql-error&lt;br /&gt;
           END-IF.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Never fall through after an unchecked SQL statement.&lt;br /&gt;
* Log &amp;lt;code&amp;gt;SQLCODE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SQLERRMC&amp;lt;/code&amp;gt; on every error path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cursor-naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.4 Cursor naming ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;table-name&amp;amp;gt;cursor&lt;br /&gt;
&lt;br /&gt;
Example: primescursor (cursor on the primes table)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;connection-alias-naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.5 Connection alias naming ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;database-name&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: primes (alias for the primes database connection)&amp;lt;/pre&amp;gt;&lt;br /&gt;
The alias must be consistent across all &amp;lt;code&amp;gt;AT &amp;amp;lt;alias&amp;amp;gt;&amp;lt;/code&amp;gt; clauses and the CONNECT/RESET statements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;commentary-standards&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Commentary Standards ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-header-block&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.1 Program header block ===&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt; file must open with a standardised comment block in columns 7–72:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      *=================================================================&lt;br /&gt;
      * Program:    &amp;lt;PROGRAM-ID&amp;gt;&lt;br /&gt;
      * Document:   &amp;lt;PGCBL-PLG-NNN&amp;gt;&lt;br /&gt;
      * Purpose:    &amp;lt;one sentence&amp;gt;&lt;br /&gt;
      * Tier:       Orchestrator | Business Logic | Data Access | UI&lt;br /&gt;
      * Calls:      &amp;lt;list of programs this program calls&amp;gt;&lt;br /&gt;
      * Called by:  &amp;lt;list of programs that call this program&amp;gt;&lt;br /&gt;
      * Copybooks:  &amp;lt;list of copybooks copied&amp;gt;&lt;br /&gt;
      * Author:     &amp;lt;name&amp;gt;&lt;br /&gt;
      * Created:    YYYY-MM-DD&lt;br /&gt;
      * Modified:   YYYY-MM-DD &amp;lt;name&amp;gt; &amp;lt;change summary&amp;gt;&lt;br /&gt;
      *=================================================================&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.2 Paragraph headers ===&lt;br /&gt;
&lt;br /&gt;
Every paragraph must have a comment immediately before it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      *-----------------------------------------------------------------&lt;br /&gt;
      * r80-test-number&lt;br /&gt;
      *   Tests whether test-number is prime by trial division.&lt;br /&gt;
      *   Called by: PERFORM UNTIL test-number = 999999999&lt;br /&gt;
      *   Uses: test-number, test-divider, test-number-sqr, test-rest&lt;br /&gt;
      *-----------------------------------------------------------------&lt;br /&gt;
       r80-test-number.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;inline-comments&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.3 Inline comments ===&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;*&amp;amp;gt;&amp;lt;/code&amp;gt; (GnuCOBOL free-format inline comment) or a &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; in column 7 for a full-line comment.&lt;br /&gt;
* Comment the &amp;#039;&amp;#039;&amp;#039;why&amp;#039;&amp;#039;&amp;#039;, not the &amp;#039;&amp;#039;&amp;#039;what&amp;#039;&amp;#039;&amp;#039;: the code shows what; the comment explains why.&lt;br /&gt;
* Every EXEC SQL block must have a comment above it stating what it does and under what conditions it is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      * Fetch the next prime from the cursor.&lt;br /&gt;
      * Called after every successful report loop iteration.&lt;br /&gt;
           EXEC SQL FETCH primescursor INTO :primes-row END-EXEC.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;prohibited-comment-patterns&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.4 Prohibited comment patterns ===&lt;br /&gt;
&lt;br /&gt;
* Do not comment out code and leave it in the source permanently. Use version control instead.&lt;br /&gt;
* Do not write comments that merely restate the code: &amp;lt;code&amp;gt;* MOVE 1 TO X (moves 1 to X)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-standards&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Copybook Standards ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-name-and-content-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.1 File name and content rules ===&lt;br /&gt;
&lt;br /&gt;
* Each copybook defines exactly one logical structure (one 01-level group).&lt;br /&gt;
* The copybook file name matches the 01-level name: &amp;lt;code&amp;gt;primes-dal.cpy&amp;lt;/code&amp;gt; defines &amp;lt;code&amp;gt;01 primes-dal&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Copybooks must not contain PROCEDURE DIVISION code.&lt;br /&gt;
* Copybooks must not contain COPY statements (no nested copies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-header&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.2 Copybook header ===&lt;br /&gt;
&lt;br /&gt;
Every copybook must open with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      *=================================================================&lt;br /&gt;
      * Copybook: &amp;lt;name&amp;gt;.cpy&lt;br /&gt;
      * Purpose:  &amp;lt;one sentence&amp;gt;&lt;br /&gt;
      * Used by:  &amp;lt;list of programs&amp;gt;&lt;br /&gt;
      * Document: &amp;lt;PGCBL-DDD-001&amp;gt; §&amp;lt;section&amp;gt;&lt;br /&gt;
      *=================================================================&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;change-control&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.3 Change control ===&lt;br /&gt;
&lt;br /&gt;
* Any change to a copybook is a &amp;#039;&amp;#039;&amp;#039;breaking change&amp;#039;&amp;#039;&amp;#039; for all programs that include it.&lt;br /&gt;
* Changes must be accompanied by a recompilation of all affected programs.&lt;br /&gt;
* The copybook version history must be updated in the header comment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;canonical-copybook-rule&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.4 Canonical copybook rule ===&lt;br /&gt;
&lt;br /&gt;
Where two copybooks define the same structure (e.g. &amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt;), one must be designated canonical and the other deprecated and removed. The canonical version is documented in the Data Dictionary.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;method-dispatch-pattern-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. Method-Dispatch Pattern Standard ==&lt;br /&gt;
&lt;br /&gt;
This pattern is the core inter-tier communication mechanism. These rules ensure it is applied consistently.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;control-block-layout&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.1 Control block layout ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;       01 &amp;lt;tier&amp;gt;-&amp;lt;control-block&amp;gt;.&lt;br /&gt;
        03 &amp;lt;tier&amp;gt;-methods         PIC X(32).&lt;br /&gt;
         88 &amp;lt;verb-1&amp;gt;              VALUE &amp;quot;&amp;lt;verb-1-string&amp;gt;&amp;quot;.&lt;br /&gt;
         88 &amp;lt;verb-2&amp;gt;              VALUE &amp;quot;&amp;lt;verb-2-string&amp;gt;&amp;quot;.&lt;br /&gt;
         88 invalid-method        VALUE &amp;quot;bad&amp;quot;.&lt;br /&gt;
        03 &amp;lt;data-payload-group&amp;gt;.&lt;br /&gt;
         05 &amp;lt;field-1&amp;gt;             PIC ...&lt;br /&gt;
        03 &amp;lt;tier&amp;gt;-result          PIC 9(2)  VALUE ZERO.&lt;br /&gt;
         88 &amp;lt;tier&amp;gt;-method-ok      VALUE 0.&lt;br /&gt;
         88 &amp;lt;tier&amp;gt;-method-nok     VALUE 1.&lt;br /&gt;
         88 &amp;lt;tier&amp;gt;-method-eof     VALUE 9.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;result-code-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.2 Result code convention ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Value&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| 88-level name&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;tier&amp;amp;gt;-method-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| Operation succeeded&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;tier&amp;amp;gt;-method-nok&amp;lt;/code&amp;gt;&lt;br /&gt;
| Operation failed (error)&lt;br /&gt;
|-&lt;br /&gt;
| 9 or 99&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;tier&amp;amp;gt;-method-eof&amp;lt;/code&amp;gt;&lt;br /&gt;
| End of data (cursor exhausted, no more rows)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* All tiers must use these values consistently.&lt;br /&gt;
* No other result codes may be introduced without updating this standard and the Data Dictionary.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;caller-obligations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.3 Caller obligations ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           MOVE &amp;quot;&amp;lt;verb&amp;gt;&amp;quot; TO &amp;lt;tier&amp;gt;-methods.&lt;br /&gt;
           CALL &amp;quot;&amp;lt;program&amp;gt;&amp;quot; USING &amp;lt;control-block&amp;gt;.&lt;br /&gt;
           IF &amp;lt;tier&amp;gt;-method-ok THEN&lt;br /&gt;
             &amp;lt;success path&amp;gt;&lt;br /&gt;
           ELSE&lt;br /&gt;
             &amp;lt;error path — must not be empty&amp;gt;&lt;br /&gt;
           END-IF.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* The caller must always check the result immediately after the CALL.&lt;br /&gt;
* An unchecked result is a coding error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;callee-obligations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.4 Callee obligations ===&lt;br /&gt;
&lt;br /&gt;
* The callee must set the result field before EXIT PROGRAM on every code path.&lt;br /&gt;
* The callee must handle &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; in the EVALUATE and set result to 1 (nok).&lt;br /&gt;
* The callee must not STOP RUN (only EXIT PROGRAM); the caller decides whether to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-handling-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 11. Error Handling Standard ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sql-errors&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 11.1 SQL errors ===&lt;br /&gt;
&lt;br /&gt;
Every EXEC SQL block must check SQLCODE as specified in §7.3. On error:&lt;br /&gt;
&lt;br /&gt;
# Move &amp;lt;code&amp;gt;SQLERRMC&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;program-message&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set the tier’s result field to 1 (nok).&lt;br /&gt;
# Call primesui with &amp;lt;code&amp;gt;ui-methods = &amp;amp;quot;log-message&amp;amp;quot;&amp;lt;/code&amp;gt; to log the error.&lt;br /&gt;
# EXIT PROGRAM — do not STOP RUN from within a subprogram.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-io-errors&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 11.2 File I/O errors ===&lt;br /&gt;
&lt;br /&gt;
Every file OPEN, READ, WRITE, CLOSE must check the file-status field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           IF &amp;lt;file&amp;gt;-status = &amp;quot;00&amp;quot; THEN&lt;br /&gt;
             &amp;lt;success&amp;gt;&lt;br /&gt;
           ELSE&lt;br /&gt;
             MOVE &amp;lt;file&amp;gt;-status TO program-message&lt;br /&gt;
             PERFORM r98-message-ui&lt;br /&gt;
             MOVE 1 TO ui-method-result&lt;br /&gt;
           END-IF.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;return-code&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 11.3 Return code ===&lt;br /&gt;
&lt;br /&gt;
At the end of &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt; (the only &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt; in the system), set the process return code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           IF &amp;lt;any-error-indicator&amp;gt; THEN&lt;br /&gt;
             MOVE 1 TO RETURN-CODE&lt;br /&gt;
           ELSE&lt;br /&gt;
             MOVE 0 TO RETURN-CODE&lt;br /&gt;
           END-IF.&lt;br /&gt;
           STOP RUN.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-checklist&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 12. Compliance Checklist ==&lt;br /&gt;
&lt;br /&gt;
Use this checklist during code review:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;structure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
* ☐ Program header block present and complete.&lt;br /&gt;
* ☐ All divisions in correct order.&lt;br /&gt;
* ☐ WORKING-STORAGE follows the prescribed section order.&lt;br /&gt;
* ☐ LINKAGE SECTION contains only COPY statements.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Naming ===&lt;br /&gt;
&lt;br /&gt;
* ☐ All paragraph names follow &amp;lt;code&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;&amp;amp;lt;NN&amp;amp;gt;-&amp;amp;lt;description&amp;amp;gt;&amp;lt;/code&amp;gt; scheme.&lt;br /&gt;
* ☐ All data names use hyphens, not underscores (except legacy names).&lt;br /&gt;
* ☐ 88-level names describe the true condition, not the value.&lt;br /&gt;
* ☐ Copybook fields are globally unique and prefixed with the copybook’s logical name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Procedure Division ===&lt;br /&gt;
&lt;br /&gt;
* ☐ No GO TO (except structured skip).&lt;br /&gt;
* ☐ No PERFORM … THRU.&lt;br /&gt;
* ☐ Every EVALUATE has WHEN OTHER.&lt;br /&gt;
* ☐ Every CALL is followed by a result check.&lt;br /&gt;
* ☐ Every EXEC SQL is followed by a SQLCODE check.&lt;br /&gt;
* ☐ Every file operation is followed by a file-status check.&lt;br /&gt;
* ☐ RETURN-CODE is set before STOP RUN in primesmain.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;comments&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
* ☐ Every paragraph has a comment header.&lt;br /&gt;
* ☐ Every EXEC SQL block has a purpose comment.&lt;br /&gt;
* ☐ No commented-out code left in permanent source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybooks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Copybooks ===&lt;br /&gt;
&lt;br /&gt;
* ☐ Each copybook defines exactly one 01-level structure.&lt;br /&gt;
* ☐ Copybook file name matches the 01-level name.&lt;br /&gt;
* ☐ No nested COPY statements.&lt;br /&gt;
* ☐ Copybook header present.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 13. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt; (underscore) needs to be designated as deprecated in favour of &amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt; (hyphen)&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| No program header blocks present in current source — all four programs need retrofitting&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-03&lt;br /&gt;
| No paragraph comment headers present in current source — all paragraphs need retrofitting&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-04&lt;br /&gt;
| Direct DISPLAY statements in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; bypass the structured log format; should be replaced with calls to primesui&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-05&lt;br /&gt;
| &amp;lt;code&amp;gt;RETURN-CODE&amp;lt;/code&amp;gt; not set in &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;; needs adding before STOP RUN&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>