Sitemap
Level Up Coding

Coding tutorials and news. The developer homepage gitconnected.com && skilled.dev && levelup.dev

Understanding the Internal Workflow of a Natural Batch Program

4 min readJun 4, 2025

--

Get to know how Natural batch jobs really work — step by step, with real-world insight.

Press enter or click to view image in full size
Article Banner

When we think of legacy systems, the term “batch job” often comes up — and for good reason. Batch processing is the silent engine room behind many enterprise operations. In Natural (Software AG) programming, batch jobs handle huge volumes of data quietly and reliably.

But if you’re new to the mainframe world — or transitioning from online Natural programming — you might be wondering:
“How does a Natural batch program work under the hood?”

In this guide, we’ll walk through the internal workflow of a Natural batch program—how it’s kicked off, what it does, and how to make it work efficiently. Whether you’re maintaining legacy code or writing fresh logic, this will help you understand the moving parts.

🏁 It All Starts with JCL

Every batch program begins its journey through JCL (Job Control Language). JCL defines what runs, where the inputs come from, and where the outputs go.

Here’s a simplified snippet of how JCL might invoke a Natural batch job:

//STEP01 EXEC NATBATPGM,PGM=NVX123B
//CMWKF01 DD DISP=SHR,DSN=MY.INPUT.FILE
//CMWKF02 DD DISP=NEW,DSN=MY.OUTPUT.FILE
//CMPRT01 DD SYSOUT=*

💡 Think of this as your launchpad. It’s the bridge between the mainframe scheduler and your program.

Press enter or click to view image in full size
Sample JCL file from a real-world application in Mainframe JCL editor

🔧 Step 1: Initialisations & Parameters

Once launched, the program begins by setting up its data areas. This includes:

  • LDAs/PDAs: for input parameters like date, user ID, and ranges
  • Default variables: e.g., initialising counters or flags
DEFINE DATA PARAMETER
1 P-JOB-DATE (A8)
1 P-USER-ID (A8)
END-DEFINE

MOVE *DATX TO P-JOB-DATE

This phase ensures your program has everything it needs before reading data.

📥 Step 2: Reading Input (File or Database)

Batch programs are all about input → process → output.

Get Supun Weerasekara’s stories in your inbox

Join Medium for free to get updates from this writer.

You typically read from:

  • Work files (READ WORK FILE)
  • Adabas database (READ, FIND, etc.)

Example of reading from a work file:

READ WORK FILE 1 #CUST-ID #ORDER-DATE #AMOUNT
...
END-WORK

Or from a database:

READ MY-FILE BY CUST-ID
...
END-READ

⚙️ Step 3: Main Processing Logic

Here’s where the business logic kicks in:

  • Calculations (e.g., totals, taxes)
  • Data transformation
  • Conditional logic
  • Control-break grouping
AT BREAK OF #CUST-ID
WRITE 'Subtotal for' #CUST-ID ...
END-BREAK

🔄 This step repeats for each input record until all data is processed.

🧠 Step 4: Decision Making

You’ll often see logic like:

IF #AMOUNT > 1000
PERFORM PROCESS-HIGH-VALUE
ELSE
PERFORM PROCESS-REGULAR
END-IF

This allows your batch job to treat data differently based on rules, without user interaction.

📤 Step 5: Writing Output

After processing, the results are sent out to:

  • Work files (for other jobs or systems)
  • Reports (WRITE (1))
  • Adabas database (via STORE, UPDATE, etc.)
WRITE WORK FILE 2 #CUST-ID #TOTAL-AMOUNT

Or for reports:

WRITE (1) 'Customer:' #CUST-ID 'Total:' #TOTAL-AMOUNT

📄 Good practice: structure your output clearly — it’s your primary way of debugging batch behaviour.

✅ Step 6: Cleanup & Completion

Before the job ends, include:

  • Final messages (WRITE (0))
  • Error checks
  • Totals and statistics
IF *ERROR-NR NE 0
WRITE 'ERROR:' *ERROR-TEXT
END-IF

WRITE 'Records Processed:' #COUNT

🚀 Developer Tips: Write Smarter Batch Jobs

  • ✂️ Modularise: Use PERFORM blocks to keep your logic clean and testable.
  • 📊 Use control breaks to group data processing by key fields.
  • ⚠️ Log errors and edge cases clearly to assist post-job review.
  • 🧪 Use test work files in development before running large live datasets.

🙋 Frequently Asked Questions

Q: Can I run a batch job without JCL?
No. JCL (or a shell script in UNIX-like environments) is required to start a batch process.

Q: What if the input file is missing?
You’ll hit a runtime error like NAT1500. Always check your JCL DD names and input availability.

Q: How do I debug a batch job?
Log generously using WRITE statements. Use logical checkpoints to see how far the process goes.

✍️ Wrapping Up

Natural batch programs may not be flashy, but they’re incredibly powerful. Whether you’re cleaning millions of records, transforming files, or updating systems overnight, batch jobs keep the enterprise world running smoothly.

The more you understand the internal flow, the more control you gain — and the easier it becomes to write reliable, maintainable jobs.

🧠 Want to see more mainframe content like this? Let me know in the comments📥 Don’t forget to grab the batch program template and keep it in your toolbox!

👉 Check out the Sample template: Natural_Batch_Program_Template.pdf

--

--

Supun Weerasekara
Supun Weerasekara

Written by Supun Weerasekara

Senior Software Engineer, Full Stack Mobile Developer, Mainframe Developer, MSc in IT, Specialised in Mobile Programming and Cybersecurity