<?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=Business_rules</id>
	<title>Business rules - 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=Business_rules"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business_rules&amp;action=history"/>
	<updated>2026-09-11T05:02:13Z</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=Business_rules&amp;diff=4771&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;business-rules&quot;&gt;&lt;/span&gt; = Business Rules =  &#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&lt;br /&gt; &#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&lt;br /&gt; &#039;&#039;&#039;Date:&#039;&#039;&#039; 2026-03-17   -----  &lt;span id=&quot;primality-algorithm&quot;&gt;&lt;/span&gt; == 1. Primality Algorithm ==  &lt;span id=&quot;br-algo-01-input-domain&quot;&gt;&lt;/span&gt; === BR-ALGO-01 — Input domain ===  Only odd integers are tested for primality. The sieve begins at &lt;code&gt;test-number = 3&lt;/code&gt; and advances in steps of 2 (&lt;code&gt;ADD 2 TO...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business_rules&amp;diff=4771&amp;oldid=prev"/>
		<updated>2026-03-25T16:48:56Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;business-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Business Rules =  &amp;#039;&amp;#039;&amp;#039;Project:&amp;#039;&amp;#039;&amp;#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-03-17   -----  &amp;lt;span id=&amp;quot;primality-algorithm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. Primality Algorithm ==  &amp;lt;span id=&amp;quot;br-algo-01-input-domain&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; === BR-ALGO-01 — Input domain ===  Only odd integers are tested for primality. The sieve begins at &amp;lt;code&amp;gt;test-number = 3&amp;lt;/code&amp;gt; and advances in steps of 2 (&amp;lt;code&amp;gt;ADD 2 TO...&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;business-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Business Rules =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Project:&amp;#039;&amp;#039;&amp;#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-03-17&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primality-algorithm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Primality Algorithm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-01-input-domain&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-01 — Input domain ===&lt;br /&gt;
&lt;br /&gt;
Only odd integers are tested for primality. The sieve begins at &amp;lt;code&amp;gt;test-number = 3&amp;lt;/code&amp;gt; and advances in steps of 2 (&amp;lt;code&amp;gt;ADD 2 TO test-number&amp;lt;/code&amp;gt;), implicitly excluding all even numbers. The even prime 2 is intended as a seed but is not currently inserted in the active code path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-02-upper-bound&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-02 — Upper bound ===&lt;br /&gt;
&lt;br /&gt;
Generation terminates when &amp;lt;code&amp;gt;test-number = 999,999,999&amp;lt;/code&amp;gt;. This value is the terminal condition of the PERFORM loop in primesgen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PERFORM r80-test-number UNTIL test-number = 999999999&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-03-divisibility-test&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-03 — Divisibility test ===&lt;br /&gt;
&lt;br /&gt;
A candidate is composite if the remainder of dividing it by the current trial divisor is zero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DIVIDE test-number BY test-divider&lt;br /&gt;
       GIVING test-quot REMAINDER test-rest&lt;br /&gt;
&lt;br /&gt;
WHEN test-rest = 0  →  composite; skip to next candidate&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-04-square-root-bound-trial-division-cutoff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-04 — Square-root bound (trial-division cutoff) ===&lt;br /&gt;
&lt;br /&gt;
If the current trial divisor exceeds the square root of the candidate, no factor can exist and the candidate is prime. The square root is computed using COBOL exponentiation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;COMPUTE test-number-sqr = test-number ** 0.5&lt;br /&gt;
&lt;br /&gt;
WHEN test-divider &amp;amp;gt; test-number-sqr  →  prime confirmed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;test-number-sqr&amp;lt;/code&amp;gt; is re-computed every time &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt; advances (in &amp;lt;code&amp;gt;r82-next-test-number&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-05-trial-divisors-sourced-from-the-database&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-05 — Trial divisors sourced from the database ===&lt;br /&gt;
&lt;br /&gt;
Trial divisors are not held in memory; they are fetched from the &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; table by &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; sequence:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT prime FROM primes WHERE ident = :new-ident&amp;lt;/pre&amp;gt;&lt;br /&gt;
The index &amp;lt;code&amp;gt;old-ident&amp;lt;/code&amp;gt; is initialised to 1 for each new candidate and incremented by 1 on each &amp;lt;code&amp;gt;next-divider&amp;lt;/code&amp;gt; call. This means the algorithm uses previously stored primes as divisors — a characteristic of a sieve-of-Eratosthenes variant rather than pure trial division.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-06-candidate-advance-rule&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-06 — Candidate advance rule ===&lt;br /&gt;
&lt;br /&gt;
After a composite or prime determination, the candidate advances to the next odd integer and the divisor index resets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ADD 2 TO test-number&lt;br /&gt;
COMPUTE test-number-sqr = test-number ** 0.5&lt;br /&gt;
MOVE 1 TO old-ident&lt;br /&gt;
PERFORM r89-get-next-divider   ← loads test-divider = first prime (ident 1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-validation-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Data Validation Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-01-command-line-argument&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-01 — Command-line argument ===&lt;br /&gt;
&lt;br /&gt;
The application accepts exactly one of two valid argument values:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Value&lt;br /&gt;
! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;quot;report&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Execute reporting path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;quot;generate&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Execute generation path&lt;br /&gt;
|-&lt;br /&gt;
| anything else&lt;br /&gt;
| Log error; &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt; immediately&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rule is implemented by 88-level conditions and an &amp;lt;code&amp;gt;EVALUATE TRUE&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;88 report-primes   VALUE &amp;amp;quot;report&amp;amp;quot;.&lt;br /&gt;
88 generate-primes VALUE &amp;amp;quot;generate&amp;amp;quot;.&lt;br /&gt;
...&lt;br /&gt;
WHEN OTHER&lt;br /&gt;
  LOG &amp;amp;quot;Bad parameter, program initialisation failed.&amp;amp;quot;&lt;br /&gt;
  STOP RUN&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-02-ui-initialisation-must-succeed-before-processing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-02 — UI initialisation must succeed before processing ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;ui-method-result ≠ 0&amp;lt;/code&amp;gt; on a &amp;lt;code&amp;gt;&amp;amp;quot;start&amp;amp;quot;&amp;lt;/code&amp;gt; call, the program issues an emergency console message and halts unconditionally. No database activity is attempted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF ui-method-ok THEN ...&lt;br /&gt;
ELSE&lt;br /&gt;
  DISPLAY &amp;amp;quot;Emergency console message program stops.&amp;amp;quot; UPON scherm&lt;br /&gt;
  STOP RUN&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-03-database-connection-must-succeed-before-processing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-03 — Database connection must succeed before processing ===&lt;br /&gt;
&lt;br /&gt;
In both &amp;lt;code&amp;gt;r90-start-primes-report&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;r91-start-primes-generation&amp;lt;/code&amp;gt;, a failed &amp;lt;code&amp;gt;&amp;amp;quot;connect&amp;amp;quot;&amp;lt;/code&amp;gt; call sets &amp;lt;code&amp;gt;session-result = 1&amp;lt;/code&amp;gt; and processing does not continue. The condition is checked via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF dal-method-ok THEN ...&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Database initialisation failed.&amp;amp;quot;&lt;br /&gt;
  session-result = 1&lt;br /&gt;
  (falls through to r99-close-primes)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-04-cursor-must-open-successfully-before-fetching&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-04 — Cursor must open successfully before fetching ===&lt;br /&gt;
&lt;br /&gt;
In the report path, cursor failure sets &amp;lt;code&amp;gt;session-result = 1&amp;lt;/code&amp;gt; and no fetch loop is entered. The guard is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF dal-method-ok THEN&lt;br /&gt;
  PERFORM r86-report-primes UNTIL session-method-eof&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-05-sqlcode-0-is-the-sole-sql-success-criterion&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-05 — SQLCODE = 0 is the sole SQL success criterion ===&lt;br /&gt;
&lt;br /&gt;
All SQL error handling uses &amp;lt;code&amp;gt;IF SQLCODE = 0 THEN ... ELSE ...&amp;lt;/code&amp;gt;. No other status codes (e.g., +100 NOT FOUND) are explicitly handled with named conditions; they fall into the &amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;calculations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Calculations ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-calc-01-square-root-computation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-CALC-01 — Square root computation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;COMPUTE test-number-sqr = test-number ** 0.5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;test-number-sqr&amp;lt;/code&amp;gt; is declared as &amp;lt;code&amp;gt;PIC 9(9)V9(9)&amp;lt;/code&amp;gt; — an 18-digit decimal with 9 integer and 9 fractional digits. The comparison &amp;lt;code&amp;gt;test-divider &amp;amp;gt; test-number-sqr&amp;lt;/code&amp;gt; relies on COBOL’s decimal comparison across the two fields.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-calc-02-remainder-computation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-CALC-02 — Remainder computation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DIVIDE test-number BY test-divider&lt;br /&gt;
       GIVING test-quot REMAINDER test-rest&amp;lt;/pre&amp;gt;&lt;br /&gt;
Both &amp;lt;code&amp;gt;test-quot&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;test-rest&amp;lt;/code&amp;gt; are declared &amp;lt;code&amp;gt;PIC 9(9)V9(9)&amp;lt;/code&amp;gt;. The condition &amp;lt;code&amp;gt;test-rest = 0&amp;lt;/code&amp;gt; detects exact divisibility.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;output-formatting-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Output Formatting Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-01-six-primes-per-print-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-01 — Six primes per print line ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;primes-table&amp;lt;/code&amp;gt; working-storage in primesui holds 6 cells. A line is written to the print file only when all 6 are filled (&amp;lt;code&amp;gt;primes-idx = 7&amp;lt;/code&amp;gt; after increment):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF primes-idx = 7 THEN&lt;br /&gt;
  WRITE print line&lt;br /&gt;
  SET primes-idx TO 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-02-zero-suppression&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-02 — Zero suppression ===&lt;br /&gt;
&lt;br /&gt;
Sequence numbers and prime values are formatted with &amp;lt;code&amp;gt;PIC Z(9)&amp;lt;/code&amp;gt; (leading-zero suppression) in the print cells &amp;lt;code&amp;gt;t-ident&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;t-prime&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-03-page-trigger-at-line-53&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-03 — Page trigger at line 53 ===&lt;br /&gt;
&lt;br /&gt;
End-of-page processing fires when &amp;lt;code&amp;gt;linage-counter = 53&amp;lt;/code&amp;gt; (3 lines before the 56-line page boundary), leaving room for the footing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF linage-counter = 53 THEN PERFORM r94-eop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-04-new-page-flag-controls-heading-output&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-04 — New-page flag controls heading output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;print-new-page&amp;lt;/code&amp;gt; (88 condition &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt;, VALUE 1) is the gate for writing the heading. It is set to 1 at initialisation and after each page footing; cleared to 0 after the heading is written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF new-page THEN PERFORM r93-new-page&lt;br /&gt;
...&lt;br /&gt;
r93-new-page:&lt;br /&gt;
  MOVE ZERO TO print-new-page&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-05-partial-line-flush-at-stop&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-05 — Partial line flush at stop ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; receives &amp;lt;code&amp;gt;&amp;amp;quot;stop&amp;amp;quot;&amp;lt;/code&amp;gt;, it pads the remaining cells with zeros and keeps calling &amp;lt;code&amp;gt;r92-write-primesui&amp;lt;/code&amp;gt; until &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt; triggers (i.e., until the partial line fills, writes, and a new page would be needed), ensuring the last data line is always written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE 0 TO u-sequence&lt;br /&gt;
MOVE 0 TO u-number&lt;br /&gt;
PERFORM r92-write-primesui UNTIL new-page&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;session-and-error-handling-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Session and Error-Handling Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-err-01-result-code-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ERR-01 — Result-code convention ===&lt;br /&gt;
&lt;br /&gt;
All three tier interfaces use the same pattern:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Code&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Success&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Failure / error&lt;br /&gt;
|-&lt;br /&gt;
| 9 or 99&lt;br /&gt;
| End-of-data / EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-err-02-no-retry-on-failure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ERR-02 — No retry on failure ===&lt;br /&gt;
&lt;br /&gt;
Errors at any tier cause a log message and a result code of 1. The calling tier checks the result and either skips subsequent steps or falls through to cleanup. There is no retry logic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-err-03-cleanup-always-attempted&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ERR-03 — Cleanup always attempted ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;r99-close-primes&amp;lt;/code&amp;gt; in primesgen and &amp;lt;code&amp;gt;r99-stop-session&amp;lt;/code&amp;gt; in primesmain are always performed before &amp;lt;code&amp;gt;EXIT PROGRAM&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt;, regardless of whether prior steps succeeded. This ensures the database connection and print file are always closed.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Primes_programs_specifications]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>