HR application / employees-create
employees-create
Create an employee with the three LOVs and save; PRE-INSERT takes the id from EMPLOYEES_SEQ.
Three runs from a fresh database gave byte-identical diffs. Behaviour that looks odd in the migrated app but is the original's: faithful to the original and waivers. Files: scenario, golden record, target record, diff (JSON).
Scenario steps
Items are addressed by their Forms name (BLOCK.ITEM[row]), the same name in the
original and, through the mapping, in the migrated app.
| # | Step | Action | Checked on the original |
|---|---|---|---|
| 0 | Open form login | ||
| 1 | Type LOGIN.USERNAME = alice, LOGIN.PASSWORD = alice#123 | ||
| 2 | login | Click LOGIN.LOGIN | |
| 3 | employees | Click CONSOLE.EMPLOYEES | |
| 4 | create | Click BUTTONS.CREATE_BUTTON | |
| 5 | Type EMPLOYEES.FIRST_NAME[1] = Ada, EMPLOYEES.LAST_NAME[1] = Lovelace, EMPLOYEES.EMAIL[1] = ALOVELACE, EMPLOYEES.HIRE_DATE[1] = 01-10-2026 | ||
| 6 | job lov | List of values on EMPLOYEES.JOB_ID[1], pick Id = IT_PROG | |
| 7 | department lov | List of values on EMPLOYEES.DEPARTMENT_ID[1], pick Department_Name = IT | |
| 8 | manager lov | List of values on EMPLOYEES.MANAGER_ID[1], pick Id = 103 | |
| 9 | Type EMPLOYEES.SALARY[1] = 6000 | ||
| 10 | save | Click BUTTONS.SAVE_BUTTON |
Screens, step by step
Left: the original Oracle Forms application, recorded on a virtual display. Right: the migrated application in headless Chromium. Screenshots are evidence only; the comparison works on the recorded values.
Step 0: open login
Step 1: type
Step 2: login
Step 3: employees
Step 4: create
Step 5: type
Step 6: job lov
Step 7: department lov
Step 8: manager lov
Step 9: type
Step 10: save
Golden record of the original
After each step: the focus, the displayed values that changed, the message line and any alert. The full record (every item of every step, windows, lists of values) is in the JSON file.
| # | Step | Action (by name) | Focus after | Displayed values that changed | Message line | Alert | Expect |
|---|---|---|---|---|---|---|---|
| 0 | Open form login | LOGIN.USERNAME[0] | |||||
| 1 | Type LOGIN.USERNAME = alice, LOGIN.PASSWORD = alice#123 | LOGIN.PASSWORD[0] | LOGIN.PASSWORD[0] = alice#123LOGIN.USERNAME[0] = alice | ||||
| 2 | login | Click LOGIN.LOGIN | CONSOLE.EMPLOYEES[0] | CONSOLE.USERNAME[0] = alice | |||
| 3 | employees | Click CONSOLE.EMPLOYEES | EMPLOYEES.APEX[0] | DEPARTMENT.CITY[0] = SeattleDEPARTMENT.COUNTRY_NAME[0] = United States of AmericaDEPARTMENT.DEPARTMENT_ID[0] = 90DEPARTMENT.DEPARTMENT_NAME[0] = ExecutiveDEPARTMENT.REGION_NAME[0] = AmericasDEPARTMENT.STATE_PROVINCE[0] = WashingtonDEPARTMENT.STREET_ADDRESS[0] = 2004 Charade RdEMPLOYEES.DEPARTMENT_ID[0] = 90EMPLOYEES.DEPARTMENT_ID[1] = 90EMPLOYEES.DEPARTMENT_ID[2] = 90EMPLOYEES.DEPARTMENT_ID[3] = 60EMPLOYEES.DEPARTMENT_ID[4] = 60EMPLOYEES.DEPARTMENT_ID[5] = 60EMPLOYEES.DEPARTMENT_ID[6] = 60EMPLOYEES.DEPARTMENT_ID[7] = 60EMPLOYEES.DEPARTMENT_ID[8] = 100EMPLOYEES.DEPARTMENT_ID[9] = 100EMPLOYEES.EMAIL[0] = SKINGEMPLOYEES.EMAIL[1] = NYANGEMPLOYEES.EMAIL[2] = LGARCIAEMPLOYEES.EMAIL[3] = AJAMESEMPLOYEES.EMAIL[4] = BMILLEREMPLOYEES.EMAIL[5] = DWILLIAMSEMPLOYEES.EMAIL[6] = VJACKSONEMPLOYEES.EMAIL[7] = DNGUYENEMPLOYEES.EMAIL[8] = NGRUENBEEMPLOYEES.EMAIL[9] = DFAVIETEMPLOYEES.EMPLOYEE_ID[0] = 100EMPLOYEES.EMPLOYEE_ID[1] = 101EMPLOYEES.EMPLOYEE_ID[2] = 102EMPLOYEES.EMPLOYEE_ID[3] = 103EMPLOYEES.EMPLOYEE_ID[4] = 104EMPLOYEES.EMPLOYEE_ID[5] = 105EMPLOYEES.EMPLOYEE_ID[6] = 106EMPLOYEES.EMPLOYEE_ID[7] = 107EMPLOYEES.EMPLOYEE_ID[8] = 108EMPLOYEES.EMPLOYEE_ID[9] = 109EMPLOYEES.FIRST_NAME[0] = StevenEMPLOYEES.FIRST_NAME[1] = NeenaEMPLOYEES.FIRST_NAME[2] = LexEMPLOYEES.FIRST_NAME[3] = AlexanderEMPLOYEES.FIRST_NAME[4] = BruceEMPLOYEES.FIRST_NAME[5] = DavidEMPLOYEES.FIRST_NAME[6] = ValliEMPLOYEES.FIRST_NAME[7] = DianaEMPLOYEES.FIRST_NAME[8] = NancyEMPLOYEES.FIRST_NAME[9] = DanielEMPLOYEES.HIRE_DATE[0] = 17-06-2013EMPLOYEES.HIRE_DATE[1] = 21-09-2015EMPLOYEES.HIRE_DATE[2] = 13-01-2011EMPLOYEES.HIRE_DATE[3] = 03-01-2016EMPLOYEES.HIRE_DATE[4] = 21-05-2017EMPLOYEES.HIRE_DATE[5] = 25-06-2015EMPLOYEES.HIRE_DATE[6] = 05-02-2016EMPLOYEES.HIRE_DATE[7] = 07-02-2017EMPLOYEES.HIRE_DATE[8] = 17-08-2012EMPLOYEES.HIRE_DATE[9] = 16-08-2012EMPLOYEES.JOB_ID[0] = AD_PRESEMPLOYEES.JOB_ID[1] = AD_VPEMPLOYEES.JOB_ID[2] = AD_VPEMPLOYEES.JOB_ID[3] = IT_PROGEMPLOYEES.JOB_ID[4] = IT_PROGEMPLOYEES.JOB_ID[5] = IT_PROGEMPLOYEES.JOB_ID[6] = IT_PROGEMPLOYEES.JOB_ID[7] = IT_PROGEMPLOYEES.JOB_ID[8] = FI_MGREMPLOYEES.JOB_ID[9] = FI_ACCOUNTEMPLOYEES.LAST_NAME[0] = KingEMPLOYEES.LAST_NAME[1] = YangEMPLOYEES.LAST_NAME[2] = GarciaEMPLOYEES.LAST_NAME[3] = JamesEMPLOYEES.LAST_NAME[4] = MillerEMPLOYEES.LAST_NAME[5] = WilliamsEMPLOYEES.LAST_NAME[6] = JacksonEMPLOYEES.LAST_NAME[7] = NguyenEMPLOYEES.LAST_NAME[8] = GruenbergEMPLOYEES.LAST_NAME[9] = FavietEMPLOYEES.MANAGER_ID[1] = 100EMPLOYEES.MANAGER_ID[2] = 100EMPLOYEES.MANAGER_ID[3] = 102EMPLOYEES.MANAGER_ID[4] = 103EMPLOYEES.MANAGER_ID[5] = 103EMPLOYEES.MANAGER_ID[6] = 103EMPLOYEES.MANAGER_ID[7] = 103EMPLOYEES.MANAGER_ID[8] = 101EMPLOYEES.MANAGER_ID[9] = 108EMPLOYEES.PHONE_NUMBER[0] = 1.515.555.0100EMPLOYEES.PHONE_NUMBER[1] = 1.515.555.0101EMPLOYEES.PHONE_NUMBER[2] = 1.515.555.0102EMPLOYEES.PHONE_NUMBER[3] = 1.590.555.0103EMPLOYEES.PHONE_NUMBER[4] = 1.590.555.0104EMPLOYEES.PHONE_NUMBER[5] = 1.590.555.0105EMPLOYEES.PHONE_NUMBER[6] = 1.590.555.0106EMPLOYEES.PHONE_NUMBER[7] = 1.590.555.0107EMPLOYEES.PHONE_NUMBER[8] = 1.515.555.0108EMPLOYEES.PHONE_NUMBER[9] = 1.515.555.0109EMPLOYEES.SALARY[0] = 24000EMPLOYEES.SALARY[1] = 17000EMPLOYEES.SALARY[2] = 17000EMPLOYEES.SALARY[3] = 9000EMPLOYEES.SALARY[4] = 6000EMPLOYEES.SALARY[5] = 4800EMPLOYEES.SALARY[6] = 4800EMPLOYEES.SALARY[7] = 4200EMPLOYEES.SALARY[8] = 12008EMPLOYEES.SALARY[9] = 9000 | |||
| 4 | create | Click BUTTONS.CREATE_BUTTON | EMPLOYEES.APEX[1] | EMPLOYEES.DEPARTMENT_ID[3] = 90EMPLOYEES.DEPARTMENT_ID[8] = 60EMPLOYEES.EMAIL[2] = NYANGEMPLOYEES.EMAIL[3] = LGARCIAEMPLOYEES.EMAIL[4] = AJAMESEMPLOYEES.EMAIL[5] = BMILLEREMPLOYEES.EMAIL[6] = DWILLIAMSEMPLOYEES.EMAIL[7] = VJACKSONEMPLOYEES.EMAIL[8] = DNGUYENEMPLOYEES.EMAIL[9] = NGRUENBEEMPLOYEES.EMPLOYEE_ID[2] = 101EMPLOYEES.EMPLOYEE_ID[3] = 102EMPLOYEES.EMPLOYEE_ID[4] = 103EMPLOYEES.EMPLOYEE_ID[5] = 104EMPLOYEES.EMPLOYEE_ID[6] = 105EMPLOYEES.EMPLOYEE_ID[7] = 106EMPLOYEES.EMPLOYEE_ID[8] = 107EMPLOYEES.EMPLOYEE_ID[9] = 108EMPLOYEES.FIRST_NAME[2] = NeenaEMPLOYEES.FIRST_NAME[3] = LexEMPLOYEES.FIRST_NAME[4] = AlexanderEMPLOYEES.FIRST_NAME[5] = BruceEMPLOYEES.FIRST_NAME[6] = DavidEMPLOYEES.FIRST_NAME[7] = ValliEMPLOYEES.FIRST_NAME[8] = DianaEMPLOYEES.FIRST_NAME[9] = NancyEMPLOYEES.HIRE_DATE[2] = 21-09-2015EMPLOYEES.HIRE_DATE[3] = 13-01-2011EMPLOYEES.HIRE_DATE[4] = 03-01-2016EMPLOYEES.HIRE_DATE[5] = 21-05-2017EMPLOYEES.HIRE_DATE[6] = 25-06-2015EMPLOYEES.HIRE_DATE[7] = 05-02-2016EMPLOYEES.HIRE_DATE[8] = 07-02-2017EMPLOYEES.HIRE_DATE[9] = 17-08-2012EMPLOYEES.JOB_ID[3] = AD_VPEMPLOYEES.JOB_ID[8] = IT_PROGEMPLOYEES.JOB_ID[9] = FI_MGREMPLOYEES.LAST_NAME[2] = YangEMPLOYEES.LAST_NAME[3] = GarciaEMPLOYEES.LAST_NAME[4] = JamesEMPLOYEES.LAST_NAME[5] = MillerEMPLOYEES.LAST_NAME[6] = WilliamsEMPLOYEES.LAST_NAME[7] = JacksonEMPLOYEES.LAST_NAME[8] = NguyenEMPLOYEES.LAST_NAME[9] = GruenbergEMPLOYEES.MANAGER_ID[3] = 100EMPLOYEES.MANAGER_ID[4] = 102EMPLOYEES.MANAGER_ID[8] = 103EMPLOYEES.MANAGER_ID[9] = 101EMPLOYEES.PHONE_NUMBER[2] = 1.515.555.0101EMPLOYEES.PHONE_NUMBER[3] = 1.515.555.0102EMPLOYEES.PHONE_NUMBER[4] = 1.590.555.0103EMPLOYEES.PHONE_NUMBER[5] = 1.590.555.0104EMPLOYEES.PHONE_NUMBER[6] = 1.590.555.0105EMPLOYEES.PHONE_NUMBER[7] = 1.590.555.0106EMPLOYEES.PHONE_NUMBER[8] = 1.590.555.0107EMPLOYEES.PHONE_NUMBER[9] = 1.515.555.0108EMPLOYEES.SALARY[3] = 17000EMPLOYEES.SALARY[4] = 9000EMPLOYEES.SALARY[5] = 6000EMPLOYEES.SALARY[7] = 4800EMPLOYEES.SALARY[8] = 4200EMPLOYEES.SALARY[9] = 12008 | |||
| 5 | Type EMPLOYEES.FIRST_NAME[1] = Ada, EMPLOYEES.LAST_NAME[1] = Lovelace, EMPLOYEES.EMAIL[1] = ALOVELACE, EMPLOYEES.HIRE_DATE[1] = 01-10-2026 | EMPLOYEES.HIRE_DATE[1] | EMPLOYEES.EMAIL[1] = ALOVELACEEMPLOYEES.FIRST_NAME[1] = AdaEMPLOYEES.HIRE_DATE[1] = 01-10-2026EMPLOYEES.LAST_NAME[1] = Lovelace | ||||
| 6 | job lov | List of values on EMPLOYEES.JOB_ID[1], pick Id = IT_PROG | EMPLOYEES.JOB_ID[1] | EMPLOYEES.JOB_ID[1] = IT_PROG | |||
| 7 | department lov | List of values on EMPLOYEES.DEPARTMENT_ID[1], pick Department_Name = IT | EMPLOYEES.DEPARTMENT_ID[1] | EMPLOYEES.DEPARTMENT_ID[1] = 60 | |||
| 8 | manager lov | List of values on EMPLOYEES.MANAGER_ID[1], pick Id = 103 | EMPLOYEES.MANAGER_ID[1] | EMPLOYEES.MANAGER_ID[1] = 103 | |||
| 9 | Type EMPLOYEES.SALARY[1] = 6000 | EMPLOYEES.SALARY[1] | EMPLOYEES.SALARY[1] = 6000 | ||||
| 10 | save | Click BUTTONS.SAVE_BUTTON | BUTTONS.SAVE_BUTTON[0] | EMPLOYEES.EMPLOYEE_ID[1] = 207 | FRM-40400: Transaction complete: 1 records applied and saved. |
Database effects
EMPLOYEES inserted: {"EMPLOYEE_ID": 207, "FIRST_NAME": "Ada", "LAST_NAME": "Lovelace", "EMAIL": "ALOVELACE", "PHONE_NUMBER": null, "HIRE_DATE": "2026-10-01T00:00:00", "JOB_ID": "IT_PROG", "SALARY": 6000, "COMMISSION_PCT": null, "MANAGER_ID": 103, "DEPARTMENT_ID": 60}
sequence EMPLOYEES_SEQ: next 207 -> 208, drawn [207]
generated: EMPLOYEES.EMPLOYEE_ID = 207 is EMPLOYEES_SEQ#1
Classified diff against the migrated app
Diff: employees-create counts: match 1046, tolerated 3, waived 7, defect 0, unmapped 0, harness 0 generated-id pairs (source -> target): EMPLOYEES_SEQ#1 -> EMPLOYEES_SEQ#1 waivers: H1 [proposed] APEX links fail with FRM-92022 instead of opening the page: applied to 0 value(s) H2 [proposed] Department tab keeps the previous department number: applied to 7 value(s) [tolerated] ui.seen.lov.rows rule=unfetched_rows (19 of 27 source rows not fetched by the client) x1 [tolerated] ui.seen.lov.rows rule=unfetched_rows (5 of 19 source rows not fetched by the client) x1 [tolerated] ui.seen.lov.rows rule=unfetched_rows (98 of 106 source rows not fetched by the client) x1 [waived] ui.values.DEPARTMENT.DEPARTMENT_ID rule=waiver:H2 x7 step04.values.DEPARTMENT.DEPARTMENT_ID[0]: source '90' | target '' step05.values.DEPARTMENT.DEPARTMENT_ID[0]: source '90' | target '' step06.values.DEPARTMENT.DEPARTMENT_ID[0]: source '90' | target '' step07.values.DEPARTMENT.DEPARTMENT_ID[0]: source '90' | target '' step08.values.DEPARTMENT.DEPARTMENT_ID[0]: source '90' | target '' step09.values.DEPARTMENT.DEPARTMENT_ID[0]: source '90' | target '' step10.values.DEPARTMENT.DEPARTMENT_ID[0]: source '90' | target ''
Waivers
| Id | Waiver | Values | Reason |
|---|---|---|---|
| H2 | Department tab keeps the previous department number | 7 | When the current employee has no department (a new record, or Kimberely Grant, whose DEPARTMENT_ID is NULL), Forms clears the DEPARTMENT detail block, yet DEPARTMENT_ID on the Department tab keeps showing the number of the department shown before (90, Executive) while name, address, city and region are blank. The number belongs to another employee's department; the target clears the whole tab. |





















