HR application / employees-change-job
employees-change-job
Change an employee's job through the JOBS LOV and save; the UPDATE_JOB_HISTORY trigger records the old job. Closing EMPLOYEES ends its database session, which writes that session's PL/SQL coverage.
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 | job lov | List of values on EMPLOYEES.JOB_ID[5], pick Id = FI_ACCOUNT | EMPLOYEES.JOB_ID[5] = FI_ACCOUNT |
| 5 | Type EMPLOYEES.SALARY[5] = 5000 | ||
| 6 | save | Click BUTTONS.SAVE_BUTTON | |
| 7 | close employees | Click EMPLOYEES.Close |
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: job lov
Step 5: type
Step 6: save
Step 7: close employees
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 | job lov | List of values on EMPLOYEES.JOB_ID[5], pick Id = FI_ACCOUNT | EMPLOYEES.JOB_ID[5] | DEPARTMENT.CITY[0] = SouthlakeDEPARTMENT.DEPARTMENT_ID[0] = 60DEPARTMENT.DEPARTMENT_NAME[0] = ITDEPARTMENT.STATE_PROVINCE[0] = TexasDEPARTMENT.STREET_ADDRESS[0] = 2014 Jabberwocky RdEMPLOYEES.JOB_ID[5] = FI_ACCOUNT | pass | ||
| 5 | Type EMPLOYEES.SALARY[5] = 5000 | EMPLOYEES.SALARY[5] | EMPLOYEES.SALARY[5] = 5000 | ||||
| 6 | save | Click BUTTONS.SAVE_BUTTON | BUTTONS.SAVE_BUTTON[0] | FRM-40400: Transaction complete: 1 records applied and saved. | |||
| 7 | close employees | Click EMPLOYEES.Close | CONSOLE.EMPLOYEES[0] |
Database effects
EMPLOYEES updated: {"key": {"EMPLOYEE_ID": 105}, "changed": {"JOB_ID": {"before": "IT_PROG", "after": "FI_ACCOUNT"}, "SALARY": {"before": 4800, "after": 5000}}}
JOB_HISTORY inserted: {"EMPLOYEE_ID": 105, "START_DATE": "2015-06-25T00:00:00", "END_DATE": "<clock>", "JOB_ID": "IT_PROG", "DEPARTMENT_ID": 60}
Classified diff against the migrated app
Diff: employees-change-job counts: match 551, tolerated 1, waived 0, defect 0, unmapped 0, harness 0 generated-id pairs (source -> target): none 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 0 value(s) [tolerated] ui.seen.lov.rows rule=unfetched_rows (11 of 19 source rows not fetched by the client) x1
Waivers
No waiver applies to this scenario: every compared value matches or is within the tolerance policy.















