<?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=Program_Logic</id>
	<title>Program Logic - 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=Program_Logic"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Program_Logic&amp;action=history"/>
	<updated>2026-09-11T04:18:08Z</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=Program_Logic&amp;diff=4770&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;program-logic&quot;&gt;&lt;/span&gt; = Program Logic =  &#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;primesmain-step-by-step-logic&quot;&gt;&lt;/span&gt; == 1. primesmain — Step-by-Step Logic ==  &#039;&#039;&#039;Source:&#039;&#039;&#039; &lt;code&gt;primesmain.cbl&lt;/code&gt;&lt;br /&gt; &#039;&#039;&#039;Role:&#039;&#039;&#039; Entry point. Parses command-line argument, initialises UI, dispatches to processing, shuts down.  &lt;span id=&quot;procedure-division-main-i...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Program_Logic&amp;diff=4770&amp;oldid=prev"/>
		<updated>2026-03-25T16:47:57Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;program-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Program Logic =  &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;primesmain-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. primesmain — Step-by-Step Logic ==  &amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Role:&amp;#039;&amp;#039;&amp;#039; Entry point. Parses command-line argument, initialises UI, dispatches to processing, shuts down.  &amp;lt;span id=&amp;quot;procedure-division-main-i...&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;program-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Program Logic =&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;primesmain-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. primesmain — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Role:&amp;#039;&amp;#039;&amp;#039; Entry point. Parses command-line argument, initialises UI, dispatches to processing, shuts down.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-main-inline-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PROCEDURE DIVISION (main inline logic) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Step 1  ACCEPT commandline-args FROM COMMAND-LINE&lt;br /&gt;
        → reads first token of the OS command line into commandline-args (PIC X(32))&lt;br /&gt;
&lt;br /&gt;
Step 2  MOVE commandline-args TO methods&lt;br /&gt;
        MOVE &amp;#039;primesmain&amp;#039;    TO program-name&lt;br /&gt;
        → loads session control block ready for dispatch&lt;br /&gt;
        → sets log identity for subsequent messages&lt;br /&gt;
&lt;br /&gt;
Step 3  PERFORM r90-start-session&lt;br /&gt;
        → opens primes.prt and verifies UI layer is ready (see §1.1)&lt;br /&gt;
&lt;br /&gt;
Step 4  EVALUATE TRUE&lt;br /&gt;
          WHEN report-primes   (commandline-args = &amp;amp;quot;report&amp;amp;quot;)&lt;br /&gt;
            LOG &amp;amp;quot;Primes report generation starts.&amp;amp;quot;&lt;br /&gt;
            SET methods = &amp;amp;quot;report&amp;amp;quot;&lt;br /&gt;
            PERFORM r92-generate-primes   → CALL primesgen&lt;br /&gt;
&lt;br /&gt;
          WHEN generate-primes (commandline-args = &amp;amp;quot;generate&amp;amp;quot;)&lt;br /&gt;
            LOG &amp;amp;quot;Primes generation starts.&amp;amp;quot;&lt;br /&gt;
            SET methods = &amp;amp;quot;generate&amp;amp;quot;&lt;br /&gt;
            *** PERFORM r92-generate-primes is COMMENTED OUT ***&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;
            PERFORM r99-stop-session&lt;br /&gt;
            STOP RUN&lt;br /&gt;
&lt;br /&gt;
Step 5  LOG &amp;amp;quot;Primes run complete, program stops.&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Step 6  PERFORM r99-stop-session&lt;br /&gt;
&lt;br /&gt;
Step 7  STOP RUN&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r90-start-session&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.1 Paragraph: r90-start-session ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;start-session&amp;#039; TO program-paragraph&lt;br /&gt;
MOVE &amp;#039;start&amp;#039;         TO ui-methods&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui&lt;br /&gt;
&lt;br /&gt;
IF ui-method-ok (result = 0) THEN&lt;br /&gt;
  LOG &amp;amp;quot;UI initialisation succeeded.&amp;amp;quot;&lt;br /&gt;
  LOG commandline-args value&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                ← hard abort; no graceful close&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r92-generate-primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.2 Paragraph: r92-generate-primes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CALL &amp;amp;quot;primesgen&amp;amp;quot; USING primes-session&lt;br /&gt;
← passes entire session control block by reference&lt;br /&gt;
← primesgen reads methods to determine its path&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r99-stop-session&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.3 Paragraph: r99-stop-session ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;stop&amp;#039; TO ui-methods&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui&lt;br /&gt;
← primesui flushes print buffer and closes primes.prt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesgen-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. primesgen — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Role:&amp;#039;&amp;#039;&amp;#039; Implements both the sieve algorithm (generate) and the cursor read-loop (report). Receives control via &amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt; linkage; uses &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt; locally.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-main-inline-logic-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PROCEDURE DIVISION (main inline logic) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Step 1  EVALUATE TRUE on methods (from primes-session)&lt;br /&gt;
&lt;br /&gt;
          WHEN report-primes&lt;br /&gt;
            PERFORM r90-start-primes-report&lt;br /&gt;
            IF session-method-ok THEN&lt;br /&gt;
              PERFORM r86-report-primes UNTIL session-method-eof&lt;br /&gt;
&lt;br /&gt;
          WHEN generate-primes&lt;br /&gt;
            PERFORM r91-start-primes-generation&lt;br /&gt;
            IF session-method-ok THEN&lt;br /&gt;
              PERFORM r80-test-number UNTIL test-number = 999999999&lt;br /&gt;
&lt;br /&gt;
          WHEN OTHER&lt;br /&gt;
            SET program-name = &amp;amp;quot;primesgen&amp;amp;quot;, program-paragraph = &amp;amp;quot;main&amp;amp;quot;&lt;br /&gt;
            LOG &amp;amp;quot;Bad method, primes process failed.&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Step 2  PERFORM r99-close-primes&lt;br /&gt;
&lt;br /&gt;
Step 3  EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r90-start-primes-report&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 Paragraph: r90-start-primes-report ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CALL primes &amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
IF dal-method-ok THEN LOG &amp;amp;quot;DB init succeeded.&amp;amp;quot; ELSE LOG &amp;amp;quot;DB init failed.&amp;amp;quot; + session-result=1&lt;br /&gt;
&lt;br /&gt;
CALL primes &amp;amp;quot;cursor&amp;amp;quot;&lt;br /&gt;
  → START TRANSACTION&lt;br /&gt;
  → OPEN primescursor (SELECT * FROM primes)&lt;br /&gt;
IF dal-method-ok THEN LOG &amp;amp;quot;Cursor init succeeded.&amp;amp;quot; ELSE LOG &amp;amp;quot;Cursor init failed.&amp;amp;quot; + session-result=1&lt;br /&gt;
&lt;br /&gt;
IF dal-method-ok THEN PERFORM r94-fetch (fetch first row)&lt;br /&gt;
&lt;br /&gt;
IF dal-method-ok THEN&lt;br /&gt;
  LOG &amp;amp;quot;Fetch first row ok.&amp;amp;quot; + dal-result=0&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Fetch first row nok.&amp;amp;quot; + dal-result=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r91-start-primes-generation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Paragraph: r91-start-primes-generation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CALL primes &amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
IF dal-method-ok THEN&lt;br /&gt;
  test-divider   = 2&lt;br /&gt;
  old-ident      = 1&lt;br /&gt;
  test-number    = 3&lt;br /&gt;
  test-number-sqr = COMPUTE test-number ** 0.5   (= SQRT(3) ≈ 1.732)&lt;br /&gt;
  LOG &amp;amp;quot;DB init succeeded.&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;DB init failed.&amp;amp;quot;&lt;br /&gt;
  session-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r80-test-number-sieve-main-loop-body&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.3 Paragraph: r80-test-number &amp;#039;&amp;#039;(sieve main loop body)&amp;#039;&amp;#039; ===&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;
EVALUATE TRUE&lt;br /&gt;
  WHEN test-rest = 0&lt;br /&gt;
    → test-number is divisible; it is composite&lt;br /&gt;
    PERFORM r82-next-test-number&lt;br /&gt;
&lt;br /&gt;
  WHEN test-divider &amp;amp;gt; test-number-sqr&lt;br /&gt;
    → no factor ≤ √test-number found; test-number IS PRIME&lt;br /&gt;
    PERFORM r85-write-prime&lt;br /&gt;
    PERFORM r82-next-test-number&lt;br /&gt;
&lt;br /&gt;
  WHEN OTHER&lt;br /&gt;
    → keep trying; get next trial divisor from DB&lt;br /&gt;
    PERFORM r89-get-next-divider&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r82-next-test-number&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.4 Paragraph: r82-next-test-number ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ADD 2 TO test-number                          ← advance to next odd integer&lt;br /&gt;
COMPUTE test-number-sqr = test-number ** 0.5  ← recompute √&lt;br /&gt;
MOVE 1 TO old-ident                           ← reset divider index to first prime&lt;br /&gt;
PERFORM r89-get-next-divider                  ← load test-divider = prime[2]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r85-write-prime&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.5 Paragraph: r85-write-prime ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;write&amp;#039; TO ui-methods&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot;   USING primes-dal    ← INSERT INTO primes (prime) VALUES (prime-number)&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui     ← add to print buffer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r86-report-primes-report-loop-body&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.6 Paragraph: r86-report-primes &amp;#039;&amp;#039;(report loop body)&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;write&amp;#039;     TO ui-methods&lt;br /&gt;
MOVE primes-data TO u-primes        ← copy sequence + value into UI block&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui     ← accumulate into 6-column print buffer&lt;br /&gt;
PERFORM r94-fetch                   ← advance cursor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r89-get-next-divider&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.7 Paragraph: r89-get-next-divider ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;get&amp;#039; TO gen-methods           ← note: uses local &amp;amp;quot;primes&amp;amp;quot; group, not primes-dal&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot; USING primes          ← DAL selects prime WHERE ident = old-ident+1&lt;br /&gt;
                                      sets test-divider&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r94-fetch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.8 Paragraph: r94-fetch ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;next-prime&amp;#039; TO dal-methods&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot; USING primes-dal      ← FETCH primescursor INTO primes-row&lt;br /&gt;
IF dal-method-ok THEN&lt;br /&gt;
  next sentence&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Fetch failed.&amp;amp;quot;&lt;br /&gt;
  session-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r99-close-primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.9 Paragraph: r99-close-primes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;disconnect&amp;#039; TO dal-methods&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot; USING primes          ← note: passes local &amp;amp;quot;primes&amp;amp;quot; group, not primes-dal&lt;br /&gt;
IF dal-method-ok THEN LOG &amp;amp;quot;DB close succeeded.&amp;amp;quot;&lt;br /&gt;
ELSE LOG &amp;amp;quot;DB close failed.&amp;amp;quot; + session-result=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primes-dal-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. primes (DAL) — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Role:&amp;#039;&amp;#039;&amp;#039; Data access layer. All SQL is here. Receives control via &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt; linkage.&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;
&amp;lt;pre&amp;gt;EVALUATE TRUE on dal-methods&lt;br /&gt;
  WHEN next-prime      → PERFORM r80-get-next-prime&lt;br /&gt;
  WHEN next-divider    → PERFORM r81-get-next-divider&lt;br /&gt;
  WHEN write-prime     → PERFORM r83-write-prime&lt;br /&gt;
  WHEN db-connect      → PERFORM s00-connect&lt;br /&gt;
  WHEN db-cursor       → PERFORM s01-cursor&lt;br /&gt;
  WHEN db-disconnect   → PERFORM s99-disconnect&lt;br /&gt;
  WHEN OTHER           → dal-result = 1&lt;br /&gt;
EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s00-connect&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Paragraph: s00-connect ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;CONNECT&amp;#039; TO CUR-STEP&lt;br /&gt;
EXEC SQL&lt;br /&gt;
  CONNECT TO :DATASRC AS primes USER :DBUSR USING :DBPWD&lt;br /&gt;
END-EXEC&lt;br /&gt;
IF SQLCODE = 0 THEN&lt;br /&gt;
  dal-result = 0&lt;br /&gt;
  LOG &amp;amp;quot;Database initialisation ok.&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Database initialisation failed, terminating program.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s01-cursor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 Paragraph: s01-cursor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EXEC SQL AT primes START TRANSACTION END-EXEC&lt;br /&gt;
IF SQLCODE = 0 THEN LOG &amp;amp;quot;Start transaction ok.&amp;amp;quot;&lt;br /&gt;
ELSE LOG &amp;amp;quot;Start transaction nok.&amp;amp;quot; + dal-result = 1&lt;br /&gt;
&lt;br /&gt;
IF dal-method-ok THEN&lt;br /&gt;
  EXEC SQL OPEN primescursor END-EXEC&lt;br /&gt;
  IF SQLCODE = 0 THEN LOG &amp;amp;quot;Start primescursor ok.&amp;amp;quot;&lt;br /&gt;
  ELSE LOG &amp;amp;quot;Start primescursor nok.&amp;amp;quot; + dal-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s02-fetch-called-by-r80-get-next-prime&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 Paragraph: s02-fetch &amp;#039;&amp;#039;(called by r80-get-next-prime)&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EXEC SQL FETCH primescursor INTO :primes-row END-EXEC&lt;br /&gt;
IF SQLCODE = 0 THEN&lt;br /&gt;
  primes-sequence = r-ident&lt;br /&gt;
  prime-number    = r-prime&lt;br /&gt;
  dal-result = 0&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Fetch row nok.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
  LOG from program-name / program-paragraph context&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r81-get-next-divider&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.4 Paragraph: r81-get-next-divider ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;new-ident = old-ident + 1&lt;br /&gt;
&lt;br /&gt;
EXEC SQL AT primes&lt;br /&gt;
  SELECT prime INTO :test-divider&lt;br /&gt;
  FROM primes WHERE ident = :new-ident&lt;br /&gt;
END-EXEC&lt;br /&gt;
&lt;br /&gt;
IF SQLCODE = 0 THEN next sentence&lt;br /&gt;
ELSE DISPLAY SQLCODE + &amp;amp;quot;select new-divider nok&amp;amp;quot; on console&lt;br /&gt;
&lt;br /&gt;
MOVE new-ident TO old-ident&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r83-write-prime&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.5 Paragraph: r83-write-prime ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EXEC SQL AT primes&lt;br /&gt;
  INSERT INTO primes (prime) VALUES (:prime)&lt;br /&gt;
END-EXEC&lt;br /&gt;
&lt;br /&gt;
IF SQLCODE = 0 THEN next sentence&lt;br /&gt;
ELSE&lt;br /&gt;
  DISPLAY SQLCODE on console&lt;br /&gt;
  DISPLAY &amp;amp;quot;primes.cbl insert next prime nok: &amp;amp;quot; prime-number on console&lt;br /&gt;
&lt;br /&gt;
*** EXEC SQL AT primes COMMIT END-EXEC   ← COMMENTED OUT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s99-disconnect&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.6 Paragraph: s99-disconnect ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;DISCONNECT&amp;#039; TO CUR-STEP&lt;br /&gt;
EXEC SQL CONNECT RESET primes END-EXEC&lt;br /&gt;
IF SQLCODE = 0 THEN&lt;br /&gt;
  dal-result = 0&lt;br /&gt;
  LOG &amp;amp;quot;Close database ok.&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Database initialisation failed, ending program.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
DISPLAY &amp;amp;quot;s99 disconnect from database&amp;amp;quot; on console&lt;br /&gt;
DISPLAY SQLCODE on console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesui-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. primesui — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Role:&amp;#039;&amp;#039;&amp;#039; All output. Manages the &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; print file and writes to the system console.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PROCEDURE DIVISION ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EVALUATE TRUE on ui-methods&lt;br /&gt;
  WHEN start-ui    → PERFORM r90-start-primesui&lt;br /&gt;
  WHEN write-ui    → PERFORM r92-write-primesui&lt;br /&gt;
  WHEN stop-ui     → PERFORM r99-stop-primesui&lt;br /&gt;
  WHEN message-ui  → PERFORM r98-message-ui&lt;br /&gt;
  WHEN OTHER       → ui-method-result = 1&lt;br /&gt;
EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r90-start-primesui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.1 Paragraph: r90-start-primesui ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &amp;#039;start-primesui&amp;#039; TO program-paragraph&lt;br /&gt;
MOVE &amp;#039;start-printer&amp;#039;  TO program-message&lt;br /&gt;
&lt;br /&gt;
OPEN OUTPUT fprinter   (primes.prt)&lt;br /&gt;
&lt;br /&gt;
IF primes-prt-status = &amp;#039;00&amp;#039; THEN&lt;br /&gt;
  ui-method-result = 0&lt;br /&gt;
  SET primes-idx TO 1       ← initialise table column index&lt;br /&gt;
  LOG &amp;amp;quot;Open printer Ok&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  ui-method-result = 1&lt;br /&gt;
  DISPLAY primes-prt-status on console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r92-write-primesui-called-for-every-prime-row&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.2 Paragraph: r92-write-primesui &amp;#039;&amp;#039;(called for every prime row)&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;t-ident(primes-idx) = u-sequence   ← load sequence into current cell&lt;br /&gt;
t-prime(primes-idx) = u-number     ← load prime value into current cell&lt;br /&gt;
SET primes-idx UP BY 1             ← advance to next cell&lt;br /&gt;
&lt;br /&gt;
IF new-page (print-new-page = 1) THEN&lt;br /&gt;
  PERFORM r93-new-page             ← write heading + column header&lt;br /&gt;
&lt;br /&gt;
IF primes-idx = 7 THEN             ← 6 entries filled (index is post-increment)&lt;br /&gt;
  MOVE primes-table TO print-buffer&lt;br /&gt;
  WRITE file-buffer FROM print-buffer   ← write the 132-char data line&lt;br /&gt;
  SET primes-idx TO 1&lt;br /&gt;
&lt;br /&gt;
IF linage-counter = 53 THEN        ← within 3 lines of page end&lt;br /&gt;
  PERFORM r94-eop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r93-new-page&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.3 Paragraph: r93-new-page ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE primes-heading TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← &amp;amp;quot;primes overview&amp;amp;quot;&lt;br /&gt;
MOVE table-header  TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← &amp;amp;quot;Sequence  Prime &amp;amp;quot; × 6&lt;br /&gt;
MOVE ZERO TO print-new-page           ← clear new-page flag&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r94-eop-end-of-page&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 Paragraph: r94-eop &amp;#039;&amp;#039;(end-of-page)&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE page-number    TO f-page-number&lt;br /&gt;
MOVE &amp;#039; &amp;#039;            TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← blank separator line&lt;br /&gt;
MOVE primes-footing TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← &amp;amp;quot;                    page: NNN&amp;amp;quot;&lt;br /&gt;
ADD 1 TO page-number&lt;br /&gt;
MOVE 1 TO print-new-page              ← trigger new heading on next write&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r98-message-ui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.5 Paragraph: r98-message-ui ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DISPLAY process-message UPON scherm   ← writes program-name + paragraph + message to console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r99-stop-primesui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.6 Paragraph: r99-stop-primesui ===&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   ← pad remaining cells to trigger line flush&lt;br /&gt;
&lt;br /&gt;
MOVE &amp;#039;stop-primesui&amp;#039; TO program-paragraph&lt;br /&gt;
MOVE &amp;#039;close printer&amp;#039; TO program-message&lt;br /&gt;
PERFORM r98-message-ui&lt;br /&gt;
&lt;br /&gt;
CLOSE fprinter&lt;br /&gt;
&lt;br /&gt;
MOVE primes-prt-status TO ui-method-result&lt;br /&gt;
IF primes-prt-status = &amp;#039;00&amp;#039; THEN next sentence&lt;br /&gt;
ELSE DISPLAY primes-prt-status on console&amp;lt;/pre&amp;gt;&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>