Home / Oracle stays, Forms becomes APEX
Oracle stays, Forms becomes APEX
All four demo apps rebuilt as Oracle APEX applications from native APEX components, on their original Oracle schemas and PL/SQL, and checked with the same recorded scenarios as every other target.
The pages are made of the components an APEX developer would choose, not a Forms emulation: the original database code runs unchanged, called from APEX processes. Where native APEX behaves differently from Forms and a customer would expect the Forms behaviour, the app keeps it; where the Forms behaviour is an artefact of the client (MDI windows, query mode, alerts on fetch), the difference is a proposed waiver with its reason.
The pages are laid out like the Forms canvases, with declarative settings: each item where the canvas puts it on APEX's 12-column grid, labels on the left, slim padding, grids as tall as the Forms block and columns as wide as its items, in a compact theme style.
| App | Scenarios, 0 defects | Three runs identical | Waivers | APEX export |
|---|---|---|---|---|
| Retail order system | 17 of 17 | 17 of 17 | 18 | f1100.sql |
| HR application | 17 of 17 | 17 of 17 | 10 | f1200.sql f1201.sql |
| CareWell clinic | 22 of 22 | 22 of 22 | 17 | f1300.sql |
| Student forms | 15 of 15 | 15 of 15 | 6 | f1400.sql |
From Forms to APEX components
| Forms | APEX |
|---|---|
| Multi-record block | Interactive Grid (editable where the block allows changes; master-detail grids for relations) |
| Single-record block | Form region on the table with Automatic Row Processing (fetch, insert, update, delete) |
| List of values | Popup LOV (with its title and return columns) or select list |
| Item validation, required items | Declarative validations (not null, exists, PL/SQL returning an error text) |
| WHEN-* triggers | Dynamic actions (Set Value, Refresh, Confirm, Alert, Execute Server-side Code) |
| Program units and database PL/SQL | Processes and Execute Server-side Code calling the original packages and procedures, unchanged |
| Called form, window, alert | Modal dialog page; alerts as APEX alerts and confirmations |
| Menu, CALL_FORM / OPEN_FORM navigation | Buttons, branches and breadcrumbs |
| Canvas layout | Items on the 12-column grid in the canvas's rows and order, side by side where the canvas has them; left labels; grids sized like the block (displayed records, item widths); theme style Iris - Compact |
| Look and the unsaved-changes question | Universal Theme with the page's warn-on-unsaved-changes |
Custom JavaScript
Only where APEX has no declarative answer. Retail has none.
| App | Place | Why |
|---|---|---|
| HR, CareWell, student | The cursor in a grid's first record when a page opens or a query returns | Set Focus cannot target an Interactive Grid cell, and an Interactive Grid raises no After Refresh event |
| CareWell, student | The cursor where Forms puts it when a dialog closes | APEX gives the focus back to the dialog's opener after the close event, undoing a Set Focus action |
| HR, CareWell | Discard the grid's changes when the save question is answered No | refreshing a grid with changes asks APEX's own question again |
| HR, CareWell | Conditions and values from the grid (its changes, the selected record's columns) | dynamic actions have no declarative test for a grid's changes or its current row |
| HR | Close with unsaved changes asks first | APEX cancels its unsaved-changes warning when a dialog closes |
| CareWell | Clinic > Home from a dialog opened by another dialog redirects the top page | a redirect from a nested dialog navigates its opener's frame, not the page |
| Student | A double click on an instructor's zip opens the Zip Codes list | a Popup LOV has no action that opens it |
| Student | The Student Count button's condition | dynamic actions test an item's value, not whether it is shown |
Retail order system: 17 of 17

Export: f1100.sql, installable on APEX 26.2. Waivers: waivers.yaml (18, the app's shared ones included). Entry-by-entry comparison with the Oracle trail: parity.md.
| Scenario | match | tolerated | waived | defect | unmapped | Three runs |
|---|---|---|---|---|---|---|
| categories-add-delete | 63 | 0 | 1 | 0 | 12 | identical |
| categories-browse | 52 | 0 | 5 | 0 | 14 | identical |
| customers-add-delete | 67 | 4 | 1 | 0 | 12 | identical |
| customers-browse | 57 | 0 | 5 | 0 | 14 | identical |
| employees-add-delete | 81 | 0 | 1 | 0 | 12 | identical |
| employees-browse | 59 | 0 | 13 | 0 | 14 | identical |
| main-menu-exit | 21 | 0 | 1 | 0 | 4 | identical |
| main-menu-orders | 36 | 22 | 3 | 0 | 11 | identical |
| order-two-lines | 274 | 252 | 23 | 0 | 93 | identical |
| orders-add-new | 120 | 167 | 45 | 0 | 56 | identical |
| orders-browse | 134 | 122 | 32 | 0 | 49 | identical |
| orders-delete-empty | 104 | 87 | 29 | 0 | 35 | identical |
| orders-delete-refused | 99 | 82 | 30 | 0 | 37 | identical |
| orders-navigate-unsaved | 166 | 132 | 31 | 0 | 60 | identical |
| orders-save-fails | 137 | 176 | 16 | 0 | 57 | identical |
| products-add-delete | 109 | 0 | 1 | 0 | 17 | identical |
| products-browse | 67 | 0 | 5 | 0 | 14 | identical |
HR application: 17 of 17

Export: f1200.sql f1201.sql, installable on APEX 26.2. Waivers: waivers.yaml (10, the app's shared ones included). Entry-by-entry comparison with the Oracle trail: parity.md.
| Scenario | match | tolerated | waived | defect | unmapped | Three runs |
|---|---|---|---|---|---|---|
| console-apex | 35 | 0 | 4 | 0 | 4 | identical |
| console-logout | 40 | 0 | 0 | 0 | 4 | identical |
| employees-apex | 637 | 0 | 24 | 0 | 2459 | identical |
| employees-change-department | 541 | 1 | 2 | 0 | 1968 | identical |
| employees-change-job | 541 | 1 | 2 | 0 | 1968 | identical |
| employees-clear | 911 | 0 | 0 | 0 | 4040 | identical |
| employees-close | 415 | 0 | 6 | 0 | 1478 | identical |
| employees-create | 990 | 3 | 52 | 0 | 4015 | identical |
| employees-delete-refused | 786 | 0 | 3 | 0 | 2949 | identical |
| employees-delete | 538 | 0 | 7 | 0 | 1967 | identical |
| employees-details | 777 | 12 | 0 | 0 | 2949 | identical |
| employees-open | 157 | 0 | 0 | 0 | 494 | identical |
| employees-search | 558 | 88 | 7 | 0 | 3170 | identical |
| login-close | 24 | 0 | 0 | 0 | 2 | identical |
| login-fail | 44 | 0 | 2 | 0 | 4 | identical |
| login-ok | 33 | 0 | 0 | 0 | 3 | identical |
| login-open | 19 | 0 | 0 | 0 | 1 | identical |
CareWell clinic: 22 of 22

Export: f1300.sql, installable on APEX 26.2. Waivers: waivers.yaml (17, the app's shared ones included). Entry-by-entry comparison with the Oracle trail: parity.md.
| Scenario | match | tolerated | waived | defect | unmapped | Three runs |
|---|---|---|---|---|---|---|
| appointments-book | 825 | 19 | 20 | 0 | 2062 | identical |
| appointments-cancel | 816 | 18 | 21 | 0 | 2032 | identical |
| appointments-delete-refused | 508 | 12 | 15 | 0 | 1258 | identical |
| appointments-department | 584 | 45 | 17 | 0 | 1518 | identical |
| appointments-double-booking | 816 | 19 | 20 | 0 | 2062 | identical |
| appointments-invalid-duration | 817 | 19 | 20 | 0 | 2062 | identical |
| appointments-no-patient | 49 | 35 | 5 | 0 | 8 | identical |
| appointments-return | 371 | 10 | 48 | 0 | 1010 | identical |
| billing-delete-refused | 174 | 56 | 10 | 0 | 822 | identical |
| billing-patient | 246 | 34 | 205 | 0 | 512 | identical |
| billing-pay | 420 | 164 | 60 | 0 | 4254 | identical |
| billing-return | 129 | 62 | 49 | 0 | 552 | identical |
| billing-unsaved | 255 | 92 | 26 | 0 | 1366 | identical |
| login-billing | 102 | 4 | 5 | 0 | 254 | identical |
| login-fail | 39 | 0 | 5 | 0 | 8 | identical |
| login-lov | 105 | 4 | 4 | 0 | 254 | identical |
| login-ok | 37 | 2 | 3 | 0 | 6 | identical |
| main-about | 44 | 4 | 4 | 0 | 8 | identical |
| main-print-schedule | 46 | 4 | 4 | 0 | 8 | identical |
| navigation | 549 | 24 | 281 | 0 | 1750 | identical |
| patients-find | 427 | 150 | 19 | 0 | 514 | identical |
| patients-query | 151 | 12 | 165 | 0 | 1300 | identical |
Student forms: 15 of 15

Export: f1400.sql, installable on APEX 26.2. Waivers: waivers.yaml (6, the app's shared ones included). Entry-by-entry comparison with the Oracle trail: parity.md.
| Scenario | match | tolerated | waived | defect | unmapped | Three runs |
|---|---|---|---|---|---|---|
| form1-browse | 54 | 0 | 0 | 0 | 8 | identical |
| form1-insert | 60 | 2 | 1 | 0 | 8 | identical |
| form1-update | 43 | 1 | 1 | 0 | 6 | identical |
| form2-course-delete-refused | 114 | 236 | 4 | 0 | 128 | identical |
| form2-courses | 184 | 381 | 5 | 0 | 202 | identical |
| form2-instructor-insert | 129 | 240 | 5 | 0 | 22 | identical |
| form2-student-insert | 389 | 60 | 2 | 0 | 1002 | identical |
| form2-student-no-first-name | 388 | 60 | 2 | 0 | 984 | identical |
| form2-student-update | 301 | 60 | 2 | 0 | 739 | identical |
| form2-students | 153 | 60 | 1 | 0 | 253 | identical |
| form2-zip-lov | 147 | 301 | 6 | 0 | 20 | identical |
| form3-browse | 61 | 220 | 4 | 0 | 9 | identical |
| form3-cost-invalid | 74 | 275 | 6 | 0 | 10 | identical |
| form3-section-course | 256 | 165 | 3 | 0 | 17 | identical |
| form3-sections | 84 | 77 | 1 | 0 | 7 | identical |