Quick Summary — I provided IBM Bob with a single design document and one prompt. Using IBM i Developer Mode with the Premium Package for i (PPi), it generated a complete Order Management System in IBM i that closely followed the design. The solution included Db2 tables with referential integrity, ILE service programs, DDS display files, interactive maintenance programs, a binding directory, and sample data procedures. The IBM i capabilities available through Premium Package for i (PPi) handled source generation and compilation, allowing every source member to compile successfully. The result was a well-structured, production-ready application. An application that would typically take an experienced IBM i developer two to three weeks to build was completed in a single development session.

Building an Order Management System from a Design Document

I wanted to find out how far IBM i Developer Mode, powered by the Premium Package for i (PPi), could go when given a complete application design. Instead of asking it to generate a single program or service procedure, I challenged it to build an entire Order Management System in IBM i from a detailed design document using just one prompt.

The design document defined every aspect of the application, including the Db2 table schema with referential integrity, ILE service program architecture, procedure interfaces, DDS display file record formats, binding directory configuration, compilation sequence, and the shared ApiResult_t data structure used across the service layer. It represented the kind of detailed technical specification that IBM i development teams use to build production applications.

The objective was straightforward: determine whether IBM Bob, using IBM i Developer Mode and the IBM i capabilities provided by the Premium Package for i (PPi), could transform that design into a complete, well-structured application. I wanted to see whether it could generate the correct architecture, organize the project, respect build dependencies, and produce source members that were ready to compile with minimal manual effort.

Design document used as the single source of truth for the application build
The design document provided to IBM Bob as the single source of truth

IBM Bob Premium Package for i — What Makes This Possible

Before getting into the build, it's worth explaining what made this possible. The capabilities demonstrated throughout this blog are powered by the Premium Package for i (PPi), which extends IBM i Developer Mode with IBM i-specific capabilities, workflows, skills, and tools.

Premium Package for i (PPi) is the add-on that gives IBM Bob deep IBM i capabilities. It includes IBM i Developer Mode, IBM i Database Mode, IBM i-specific workflows, IBM i Skills, and direct access to your IBM i system through Code for IBM i. Together, these capabilities enable IBM Bob to work directly with IBM i resources while following IBM i development practices.

With IBM i Developer Mode enabled, IBM Bob can:

These capabilities allow IBM i Developer Mode to do more than generate source code. It can work directly with your IBM i environment, compile objects, analyze the results, identify issues, and continue building the application within the same development session.

The Prompt — Just One Line

With the design document already available on the IFS at /home/bob4ipgmr/Order Management.md, everything IBM Bob needed was in one place. The document defined the complete three-tier application architecture, including the Db2 table definitions, procedure interfaces, DDS display file record formats, binding directory structure, and the required compilation sequence. You can read the full specification here: IBM i Order Management System — Application Design Document →

I gave IBM Bob a single prompt:

The single prompt given to IBM Bob
The single prompt used to initiate the entire application build

That was the entire instruction. I didn't break the work into smaller tasks or guide IBM Bob through the implementation step by step. I expected it to ask for clarification or begin with a small part of the application — perhaps generating the database tables first and waiting for further instructions. Instead, it took the design document, understood the complete scope of the application, and started building it end to end.

IBM Bob's Plan — Understanding the Design Before Writing Code

Before generating any source, IBM Bob used the IFS access capabilities available through the Premium Package for i (PPi) to read the design document. Rather than immediately creating source members, it first analyzed the application and presented a structured implementation plan.

Here is the response IBM Bob generated before writing a single line of source:

IBM Bob's structured implementation plan before generating any source
IBM Bob's implementation plan, generated before writing a single line of source

What impressed me wasn't just the implementation plan — it was the order of execution. Without any additional guidance, IBM Bob correctly identified the dependency chain defined in the design document. It understood that modules needed to be created before service programs, service programs before the binding directory, and the binding directory before the interactive programs. That entire build sequence came directly from the design document.

As per the design document, the full build covered:

IBM i Skills — What IBM Bob Used and Why

One of the strengths of the Premium Package for i (PPi) is its collection of IBM i Skills. These are IBM i-specific knowledge modules that IBM Bob automatically selects based on the task it is performing. Rather than relying on generic code generation, IBM Bob applies the most appropriate IBM i Skill for each stage of the application.

For this application, IBM Bob used the following IBM i Skills:

SkillUsed For
SQL / Db2 for i Skill SQL DDL with identity columns, FK constraints, ON DELETE CASCADE, RUNSQLSTM COMMIT(*NONE) NAMING(*SYS)
ILE RPG Free Format Skill Fully free **free SQLRPGLE modules with ctl-opt nomain, correct QMHSNDPM prototype, forward dcl-pr patterns
DDS Display Files Skill Message subfile pattern (MSGSFL/MSGCTL), OVERLAY on maintenance screens, INDARA
IBM i Skills selected by IBM Bob during the application build
IBM i Skills automatically selected by IBM Bob for each stage of the build

Step 1 — Building the Database Layer with Db2 Tables

The first step was building the database layer. Using IBM i Developer Mode, IBM Bob generated all the SQL DDL source members in ORDERMGMT/QSQLSRC. Each table was created using CREATE TABLE and followed the design document exactly, including identity columns for primary keys, check constraints, and referential integrity. The design called for six tables covering every business domain of the application.

Source MemberCreates TableKey Design Points
QSQLSRC/CUSTOMERSORDERMGMT/CUSTOMERIdentity PK, unique EMAIL, STATUS check (A/I/S), audit timestamps
QSQLSRC/PRODUCTSORDERMGMT/PRODUCTIdentity PK, PRICE/COST decimals, STOCK_QTY, STATUS check (A/D/O)
QSQLSRC/ORDERSORDERMGMT/ORDERFK to CUSTOMER, STATUS check (P/C/S/X/H), SUBTOTAL/TAX/SHIP/TOTAL amounts
QSQLSRC/ORDERLINESORDERMGMT/ORDERLINEFK to ORDER (ON DELETE CASCADE), FK to PRODUCT (ON DELETE RESTRICT)
QSQLSRC/SHIPMENTSORDERMGMT/SHIPMENTFK to ORDER, CARRIER, TRACKING_NO, STATUS check (P/I/T/D/R)
QSQLSRC/INVOICESORDERMGMT/INVOICEFK to ORDER, AMOUNT_DUE/PAID, STATUS check (D/P/O/V/W)

The CUSTOMER table was the first thing I examined. I wanted to verify whether IBM Bob would generate the identity column using the recommended IBM i pattern. It did exactly that, using GENERATED ALWAYS AS IDENTITY, including the START WITH 1 INCREMENT BY 1 clause that is sometimes missing in automatically generated SQL.

CUSTOMER table DDL generated by IBM Bob
CUSTOMER table DDL with GENERATED ALWAYS AS IDENTITY, generated by IBM Bob

The ORDERLINE table also implemented the referential integrity rules defined in the design document. IBM Bob generated the foreign key constraints with ON DELETE CASCADE, ensuring that when an order is deleted, all associated order line records are automatically removed. This maintains data integrity without requiring additional application logic to handle the related line item records.

ORDERLINE table DDL with ON DELETE CASCADE referential integrity
ORDERLINE table with FK constraints and ON DELETE CASCADE, as specified in the design document

Once the DDL was generated, IBM Bob compiled each source member using RUNSQLSTM COMMIT(*NONE) NAMING(*SYS) MARGINS(200). Using the IBM i capabilities provided by the Premium Package for i (PPi), it verified the compilation results before proceeding to the next stage of the application build.

All tables — severity 00. CUSTOMER · PRODUCT · ORDER · ORDERLINE · SHIPMENT · INVOICE — all created in ORDERMGMT with constraints intact.

Step 2 — Generating Sample Data with SQL Stored Procedures

After creating the database tables, IBM Bob generated five SQL stored procedures in ORDERMGMT/QSQLSRC to populate the application with realistic sample data for development and testing. Having representative data available from the beginning made it much easier to validate the service procedures and interactive programs as the application came together.

Source MemberProcedureRecords Inserted
POPCUSTSORDERMGMT.POPCUSTS()10 customers across multiple states
POPPRODSORDERMGMT.POPPRODS()20 products with stock quantities and pricing
POPORDERSORDERMGMT.POPORDERS()15 orders with line items and calculated totals
POPSHIPSORDERMGMT.POPSHIPS()12 shipments linked to orders
POPINVCSORDERMGMT.POPINVCS()12 invoices with payment status

Each stored procedure begins with a DELETE FROM statement before inserting new data, making it safe to run repeatedly during development without creating duplicate records. IBM Bob also generated the procedures in the correct dependency order, loading customers and products first, followed by orders, and finally shipments and invoices to satisfy the foreign key relationships.

POPCUSTS stored procedure for loading sample customer data
POPCUSTS stored procedure, one of five SQL procedures generated for sample data loading

Step 3 — Building the Service Layer with SQLRPGLE Modules

This is where the application's core business logic comes together. Using IBM i Developer Mode, IBM Bob generated five fully free-format SQLRPGLE modules in ORDERMGMT/QRPGLESRC. Each module was compiled as a *MODULE using CRTSQLRPGI OBJTYPE(*MODULE), following the recommended IBM i pattern where modules contain the procedure implementations and service programs expose those procedures through bound exports.

Every module uses ctl-opt nomain, making it a library of reusable procedures rather than a runnable program. Every procedure returns the shared ApiResult_t data structure defined in QRPGLEREF/APIRESULT.

APIRESULT shared data structure used across all service procedures
The ApiResult_t shared result structure returned by every service procedure

Using a shared result structure across more than 30 service procedures was a key design decision documented in the specification, and IBM Bob implemented it consistently throughout the application. Every caller checks result.success and reads result.message, keeping the UI layer clean and avoiding scattered SQLSTATE handling across multiple programs.

CUSTOMER Module — QRPGLESRC/CUSTOMER

The CUSTOMER module exports six procedures: createCustomer, getCustomer, updateCustomer, deleteCustomer, listCustomers, and searchCustomers. Each procedure returns the shared ApiResult_t result structure, with createCustomer returning the generated identity value of the new record in the message field.

CUSTOMER SQLRPGLE service module generated by IBM Bob
CUSTOMER SQLRPGLE module with six exported procedures, compiled as *MODULE

ORDER Module — QRPGLESRC/ORDER

The ORDER module contains the most complex business logic in the application. The addOrderLine procedure inserts a new order line, updates product inventory, and recalculates the order totals within the same procedure. What impressed me was that IBM Bob generated this complete workflow directly from the design document. I didn't have to describe these steps individually — the required business logic was already defined in the specification, and IBM Bob implemented it accordingly.

ORDER SQLRPGLE module showing addOrderLine with stock update and order total recalculation
addOrderLine procedure with embedded stock decrement and order total recalculation
All service modules — severity 00. CUSTOMER · PRODUCT · ORDER · SHIPMENT · INVOICE — all compiled as *MODULE using CRTSQLRPGI OBJTYPE(*MODULE).

Step 4 — Building the Service Programs and Binding Directory

After generating the SQLRPGLE modules, IBM Bob created the service programs by linking each module into a *SRVPGM using binder source stored in ORDERMGMT/QBNDSRC2. As defined in the design document, each binder source includes a signature string that identifies the exported interface. As long as new exports are appended without removing or reordering existing ones, applications already bound to the service program continue to work without requiring recompilation.

Customer binder source in QBNDSRC2 with quoted mixed-case export symbols
QBNDSRC2/CUSTOMER binder source with quoted mixed-case procedure names

Each service program was then created using the same CRTSRVPGM pattern:

CL — CRTSRVPGM
CRTSRVPGM SRVPGM(ORDERMGMT/CUSTOMER)
          MODULE(ORDERMGMT/CUSTOMER)
          EXPORT(*SRCFILE)
          SRCFILE(ORDERMGMT/QBNDSRC2)
          SRCMBR(CUSTOMER)
          ACTGRP(*CALLER)
          AUT(*EXCLUDE)

After all five service programs were created, IBM Bob built the binding directory and added every service program as an entry:

CL — binding directory
CRTBNDDIR BNDDIR(ORDERMGMT/ORDERMGMT) AUT(*EXCLUDE)
ADDBNDDIRE BNDDIR(ORDERMGMT/ORDERMGMT) OBJ((ORDERMGMT/CUSTOMER *SRVPGM))
ADDBNDDIRE BNDDIR(ORDERMGMT/ORDERMGMT) OBJ((ORDERMGMT/PRODUCT  *SRVPGM))
ADDBNDDIRE BNDDIR(ORDERMGMT/ORDERMGMT) OBJ((ORDERMGMT/ORDER    *SRVPGM))
ADDBNDDIRE BNDDIR(ORDERMGMT/ORDERMGMT) OBJ((ORDERMGMT/SHIPMENT *SRVPGM))
ADDBNDDIRE BNDDIR(ORDERMGMT/ORDERMGMT) OBJ((ORDERMGMT/INVOICE  *SRVPGM))

Any UI program that specifies bnddir('ORDERMGMT') in its ctl-opt automatically resolves calls to any of the 30+ exported procedures across all five service programs — no library qualifier needed at call time.

Step 5 — Building the DDS Display Files

Next, IBM Bob generated all DDS display files in ORDERMGMT/QDDSSRC using the DDS Display Files Skill, one of the IBM i Skills available through the Premium Package for i (PPi). Each display file was compiled using CRTDSPF.

MAINMENU — QDDSSRC/MAINMENU

The main menu uses two record formats: MENUSCREEN (the navigation screen) and MSGBAR (an OVERLAY format on line 24 for status and error messages). The split is deliberate — writing MSGBAR separately means the message line can be updated without rewriting the entire screen.

MAINMENU DDS display file with MENUSCREEN and MSGBAR record formats
MAINMENU display file showing the MENUSCREEN and MSGBAR OVERLAY record formats

Maintenance Display Files — Message Subfile Pattern

The five maintenance display files (CUSTMNT, PRODMNT, ORDERMNT, SHIPMNT, INVMNT) all use the standard IBM i message subfile pattern — MSGSFL + MSGCTL on line 24. IBM Bob used the DDS Display Files Skill to get the indicator wiring right: indicator 90 for display, indicator 91 for clear, indicator 92 for initialise.

CUSTMNT DDS display file using the standard IBM i message subfile pattern
CUSTMNT display file using the MSGSFL/MSGCTL message subfile pattern with indicator 90/91/92 wiring
All display files — severity 00. MAINMENU · CUSTMNT · PRODMNT · ORDERMNT · SHIPMNT · INVMNT — all compiled with CRTDSPF.

Step 6 — Building the IBM i Maintenance Programs

This was the most challenging part of the application build. IBM Bob generated all the maintenance programs in ORDERMGMT/QRPGLESRC, and this is where the collaboration between me and IBM Bob became particularly interesting. Not every program compiled successfully on the first attempt. What stood out was how IBM i Developer Mode, using the IBM i capabilities provided by the Premium Package for i (PPi), analyzed each compilation failure, identified the root cause, and applied the required fix without introducing unrelated changes.

MAINMENU — QRPGLESRC/MAINMENU

The MAINMENU program acts as the application's navigation hub. It uses a dynamic EXTPGM prototype, a standard IBM i technique for late-bound program calls. The programToCall variable is assigned at runtime, allowing a single prototype to invoke all five maintenance programs. I hadn't seen this pattern generated automatically before. It eliminates the need for multiple hard-coded dcl-pr definitions and makes the menu easier to extend — adding another maintenance program simply requires another menu option.

MAINMENU RPG program using a dynamic EXTPGM prototype for late-bound program calls
MAINMENU program using the dynamic EXTPGM pattern to call all five maintenance programs

Maintenance Programs — CUSTMNT, PRODMNT, SHIPMNT, INVMNT

All maintenance programs follow the same three-mode workflow: SEARCH — locate a record by its identifier; DISPLAY — display and update the selected record; ADD — create a new record. All database operations are performed through the service layer. The UI programs contain no embedded SQL, keeping the presentation layer separate from the business logic defined in the service programs.

The following example shows the overall structure of the CUSTMNT program:

CUSTMNT RPG program showing the three-mode SEARCH / DISPLAY / ADD structure
CUSTMNT maintenance program structure with no embedded SQL, all data operations through the service layer

Resolving Compilation Issues

No IBM i application of this size compiles perfectly on the first attempt, and I wasn't expecting this one to either. What mattered was how IBM Bob responded when compilation errors occurred. Instead of regenerating entire programs, IBM i Developer Mode, using the IBM i capabilities provided by the Premium Package for i (PPi), analyzed the compiler output, identified the root cause of each failure, and applied only the changes required to resolve it. That approach preserved the existing source while making each fix precise and easy to review.

The following sections walk through each of the six compilation issues encountered during the build.

Issue 1 — DDS Record Name Matches File Name (CPD5235)

Symptom: CRTDSPF for MAINMENU failed with CPD5235 — Record name same as file name.

The original DDS named the primary record format MAINMENU — the same as the file. This is a DDS rule: a record format name cannot match its containing file name. IBM Bob read the compiler message, identified the violation, and made exactly two changes: renamed the record format from MAINMENU to MENUSCREEN in the DDS source, and updated the RPG program from exfmt MAINMENU to exfmt MENUSCREEN. Nothing else changed.

Before — DDS (fails CPD5235)
-      A          R MAINMENU
       A                                  1 28'ORDER MANAGEMENT SYSTEM'
       ...

-      exfmt MAINMENU;
After — renamed to MENUSCREEN
+      A          R MENUSCREEN
       A                                  1 28'ORDER MANAGEMENT SYSTEM'
       ...

+      exfmt MENUSCREEN;

Issue 2 — QBNDSRC Record Length Too Long for CRTSRVPGM

Symptom: CRTSRVPGM failed — binder source could not be read.

IBM Bob had initially created QBNDSRC with record length 256. The CRTSRVPGM command requires binder source with a record length of 240 or less — the standard is 92 characters. IBM Bob caught this from the error output, created a new source file QBNDSRC2 with record length 92, moved all five binder source members into it, and recompiled all five service programs using the new file.

Why this matters: This is one of those IBM i details that is rarely documented clearly. The 92-character record length for binder source is a platform convention, not something you would find easily in general RPG documentation. IBM i Developer Mode, through the IBM i capabilities available in the Premium Package for i (PPi), identified this constraint from the compiler output and applied the correct fix.

Issue 3 — Binder Symbol Names Must Be Quoted for Mixed Case

Symptom: Service programs compiled, but at runtime procedures could not be resolved — binding failures on first call.

Binder source EXPORT SYMBOL(createCustomer) without quotes causes the ILE linker to uppercase the symbol name to CREATECUSTOMER. The actual exported procedure is createCustomer in mixed case because RPG uses extproc(*dclcase) by convention. The symbol mismatch meant the binding appeared to succeed but failed silently at call time.

Before — unquoted (uppercased to CREATECUSTOMER)
-  EXPORT SYMBOL(createCustomer)
-  EXPORT SYMBOL(getCustomer)
-  EXPORT SYMBOL(updateCustomer)
After — quoted (preserves mixed case)
+  EXPORT SYMBOL('createCustomer')
+  EXPORT SYMBOL('getCustomer')
+  EXPORT SYMBOL('updateCustomer')

Issue 4 — exec sql CALL Inside a Proc Breaks RPGPPOPT(*LVL2)

Symptom: All five maintenance programs failed with RNF0256 — Specification found between procedures — 84+ errors per program.

The original showMsg procedure used exec sql CALL QSYS2.QCMDEXC(...) to send messages. With RPGPPOPT(*LVL2), the SQL precompiler injects fixed-format D-spec data structure blocks at every exec sql statement. When that injection happens inside a dcl-proc, the injected DS declarations land between procedures — which the RPG compiler treats as a fatal structure error.

IBM Bob replaced exec sql CALL QSYS2.QCMDEXC(...) in all five programs with a direct call to the QMHSNDPM API. No SQL inside showMsg — no precompiler injection — no problem.

Before — exec sql CALL inside dcl-proc
dcl-proc showMsg;
-  exec sql CALL QSYS2.QCMDEXC(
-    'SNDPGMMSG MSG(''' + msgText + ''')'
-    : 32702);
end-proc;
After — direct QMHSNDPM call (no SQL)
dcl-proc showMsg;
+  QMHSNDPM('CPF9898' : 'QCPFMSG   *LIBL     '
+           : msgDta : %len(%trimr(msgDta))
+           : mtype : '*' : 0 : msgKey : errCode);
end-proc;

Issue 5 — Main Body Code After Procedures (RNF0256)

Symptom: All five maintenance programs still failed RNF0256 even after fixing showMsg.

In fully free-format RPG, all dcl-proc blocks must come after the main-body executable code. The original structure placed the dou exitFlag; loop and variable declarations after the last dcl-proc. Code after a dcl-proc is treated as being between procedures — which is invalid.

IBM Bob restructured every program into the correct four-part layout: global declarations first, followed by forward prototypes for all local procedures, then the main executable body, and finally the procedure implementations at the end of the source member.

Correct fully free-format RPG program structure resolving RNF0256
Correct fully free-format program structure: global declarations, forward prototypes, main body, then procedure implementations
Why forward prototypes matter. In fully free-format RPG, when a local procedure is called from the main executable body but its implementation appears later in the source member, a forward dcl-pr prototype must be declared before the main body so the compiler knows the procedure's interface at the point of the call. IBM Bob added the required forward prototypes for every local procedure across all five maintenance programs without any additional guidance.

Issue 6 — ORDERMNT: Cursor Scope and Multi-Statement Lines

Symptom: ORDERMNT had two additional problems even after applying the fixes above: (a) DECLARE lineCur CURSOR was inside the loadLines procedure, breaking SQL precompiler variable resolution; (b) multiple assignments on one line like LN1LID = lc_lineId; LN1PID = lc_prodId; caused RNF5508 — End of free-format statement is not blank.

ORDERMNT is the only UI program with embedded SQL — it reads ORDERLINE rows with a cursor and must be compiled as CRTSQLRPGI OBJTYPE(*PGM). The cursor declaration was inside a procedure, which meant the SQL precompiler could not resolve the host variables at compile time.

IBM Bob applied three targeted fixes:

  1. Moved the DECLARE lineCur CURSOR to module level — outside all procedures — so the precompiler sees the host variables
  2. Inlined the OPEN/FETCH/CLOSE cursor loop directly in the main body, not inside a dcl-proc
  3. Put each assignment on its own line — no multiple statements per line
Before — cursor inside proc, multi-stmt lines
dcl-proc loadLines;
-  exec sql DECLARE lineCur CURSOR FOR
-    SELECT LINE_ID, PRODUCT_ID ...
-    WHERE ORDER_ID = :ord.orderId ;

-  LN1LID = lc_lineId; LN1PID = lc_prodId;
end-proc;
After — cursor at module level, one stmt per line
// Module level — precompiler sees host variables
+exec sql DECLARE lineCur CURSOR FOR
+  SELECT LINE_ID, PRODUCT_ID, QUANTITY,
+         UNIT_PRICE, LINE_TOTAL
+    FROM ORDERMGMT/ORDERLINE
+   WHERE ORDER_ID = :ord.orderId ;

+  LN1LID = lc_lineId;
+  LN1PID = lc_prodId;
All six issues resolved. Throughout the build, IBM i Developer Mode, using the IBM i capabilities provided by the Premium Package for i (PPi), analyzed the compiler output after each build, identified the root cause of every failure, applied only the necessary changes, and recompiled the affected source. In every case, the fixes were limited to the relevant lines of code — the programs were never regenerated from scratch.

Final Compilation Results — 32 Objects, All at Severity 00

After resolving all six issues, IBM Bob performed a final build of the entire application using IBM i Developer Mode with the IBM i capabilities provided by the Premium Package for i (PPi). The build completed successfully, with all 32 objects compiling at severity 00.

ObjectTypeLibraryCompile CommandResult
CUSTOMER*FILE (PF)ORDERMGMTRUNSQLSTM✅ 00
PRODUCT*FILE (PF)ORDERMGMTRUNSQLSTM✅ 00
ORDER*FILE (PF)ORDERMGMTRUNSQLSTM✅ 00
ORDERLINE*FILE (PF)ORDERMGMTRUNSQLSTM✅ 00
SHIPMENT*FILE (PF)ORDERMGMTRUNSQLSTM✅ 00
INVOICE*FILE (PF)ORDERMGMTRUNSQLSTM✅ 00
CUSTOMER*MODULEORDERMGMTCRTSQLRPGI OBJTYPE(*MODULE)✅ 00
PRODUCT*MODULEORDERMGMTCRTSQLRPGI OBJTYPE(*MODULE)✅ 00
ORDER*MODULEORDERMGMTCRTSQLRPGI OBJTYPE(*MODULE)✅ 00
SHIPMENT*MODULEORDERMGMTCRTSQLRPGI OBJTYPE(*MODULE)✅ 00
INVOICE*MODULEORDERMGMTCRTSQLRPGI OBJTYPE(*MODULE)✅ 00
CUSTOMER*SRVPGMORDERMGMTCRTSRVPGM✅ Created
PRODUCT*SRVPGMORDERMGMTCRTSRVPGM✅ Created
ORDER*SRVPGMORDERMGMTCRTSRVPGM✅ Created
SHIPMENT*SRVPGMORDERMGMTCRTSRVPGM✅ Created
INVOICE*SRVPGMORDERMGMTCRTSRVPGM✅ Created
ORDERMGMT*BNDDIRORDERMGMTCRTBNDDIR + ADDBNDDIRE✅ Created
MAINMENU*FILE (DSPF)ORDERMGMTCRTDSPF✅ 00
CUSTMNT*FILE (DSPF)ORDERMGMTCRTDSPF✅ 00
PRODMNT*FILE (DSPF)ORDERMGMTCRTDSPF✅ 00
ORDERMNT*FILE (DSPF)ORDERMGMTCRTDSPF✅ 00
SHIPMNT*FILE (DSPF)ORDERMGMTCRTDSPF✅ 00
INVMNT*FILE (DSPF)ORDERMGMTCRTDSPF✅ 00
MAINMENU*PGMORDERMGMTCRTSQLRPGI OBJTYPE(*PGM)✅ 00
CUSTMNT*PGMORDERMGMTCRTBNDRPG✅ 00
PRODMNT*PGMORDERMGMTCRTBNDRPG✅ 00
ORDERMNT*PGMORDERMGMTCRTSQLRPGI OBJTYPE(*PGM)✅ 00
SHIPMNT*PGMORDERMGMTCRTBNDRPG✅ 00
INVMNT*PGMORDERMGMTCRTBNDRPG✅ 00
32 IBM i Objects. All at Severity 00. All from One Prompt. All Db2 tables · All SQLRPGLE service modules · All service programs · Binding directory · All DDS display files · All IBM i maintenance programs. This wasn't a collection of isolated code samples or prototype programs. It was a complete, production-structured IBM i application generated from a single design document and one prompt.
Final compilation results showing all 32 IBM i objects at severity 00
Final build results: 32 objects, all compiled at severity 00

Productivity Comparison

Based on my experience building this application, here is my estimate of the time required to develop it manually compared with using IBM i Developer Mode, powered by the Premium Package for i (PPi):

TaskManuallyWith IBM i Developer Mode
All SQL DDL tables with constraints and FK rules 3–4 hours ~5 minutes
All SQLRPGLE service modules (CRUD + business logic) 3–4 days ~15 minutes
All binder source files + CRTSRVPGM 1 hour Included
Binding directory setup 20 minutes Included
All DDS display files (subfiles, overlays, message subfiles) 2–3 days ~10 minutes
All IBM i maintenance programs (three-mode SEARCH/DISPLAY/ADD) 3–4 days ~20 minutes
Diagnosing and fixing all 6 compile issues 2–3 days ~30 minutes
Total estimated ~2–3 weeks < 2 hours

One result stood out: the time spent diagnosing compilation issues. The six issues encountered while building this application — including DDS record format naming, binder source record length, quoted mixed-case export symbols, SQL precompiler behavior, fully free-format RPG program structure, and cursor scope — are all IBM i-specific edge cases. Even for an experienced IBM i developer, identifying and resolving some of these issues can take considerable time. Throughout the application build, IBM Bob analyzed the compiler output, identified the root cause of each failure, applied targeted fixes, and recompiled until every object compiled successfully.

What Made This Possible

Every IBM i capability used to build this application was provided by the Premium Package for i (PPi). That includes reading the design document from the IFS, creating IBM i source members, compiling objects, analyzing compiler output, diagnosing build failures, and applying targeted fixes directly on the IBM i system. The IBM i Skills — including the SQL / Db2 for i Skill, ILE RPG Free Format Skill, DDS Display Files Skill, and ILE Service Programs Skill — provided the IBM i-specific knowledge needed to generate the application's architecture and resolve platform-specific issues throughout the build. Without the Premium Package for i (PPi), this would primarily be a code generation exercise. With IBM i Developer Mode and the Premium Package for i (PPi), IBM Bob becomes a development partner, capable of building, compiling, validating, and refining an application directly on your IBM i system.

Watch It in Action

A full walkthrough of the Order Management System in IBM i running live, built using IBM i Developer Mode in IBM Bob Premium Package for i (PPi).

Next Steps

If you want to try IBM Bob and IBM Bob Premium Package for i (PPi) yourself, here are the resources to get started: