FormsRefresh

HR application / employees-change-department

employees-change-department

Move an employee to another department through the DEPARTMENTS LOV and raise another employee's salary, then save. UPDATE_JOB_HISTORY records the old department for the first row and finds nothing to record for the second (Forms updates every column, so the trigger fires for both). Closing EMPLOYEES ends its database session, which writes that session's PL/SQL coverage.

0defects
551values match
1tolerated by policy
0waived
0unmapped

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.

#StepActionChecked on the original
0Open form login
1Type LOGIN.USERNAME = alice, LOGIN.PASSWORD = alice#123
2loginClick LOGIN.LOGIN
3employeesClick CONSOLE.EMPLOYEES
4department lovList of values on EMPLOYEES.DEPARTMENT_ID[4], pick Department_Name = ShippingEMPLOYEES.DEPARTMENT_ID[4] = 50
5Type EMPLOYEES.SALARY[6] = 5000
6saveClick BUTTONS.SAVE_BUTTON
7close employeesClick 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

Original (Oracle Forms 14.1.2), step 00-open
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 00-open
Migrated (.NET, PostgreSQL)

Step 1: type

Original (Oracle Forms 14.1.2), step 01-type
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 01-type
Migrated (.NET, PostgreSQL)

Step 2: login

Original (Oracle Forms 14.1.2), step 02-login
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 02-login
Migrated (.NET, PostgreSQL)

Step 3: employees

Original (Oracle Forms 14.1.2), step 03-employees
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 03-employees
Migrated (.NET, PostgreSQL)

Step 4: department lov

Original (Oracle Forms 14.1.2), step 04-department-lov
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 04-department-lov
Migrated (.NET, PostgreSQL)

Step 5: type

Original (Oracle Forms 14.1.2), step 05-type
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 05-type
Migrated (.NET, PostgreSQL)

Step 6: save

Original (Oracle Forms 14.1.2), step 06-save
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 06-save
Migrated (.NET, PostgreSQL)

Step 7: close employees

Original (Oracle Forms 14.1.2), step 07-close-employees
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 07-close-employees
Migrated (.NET, PostgreSQL)

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.

#StepAction (by name)Focus afterDisplayed values that changedMessage lineAlertExpect
0Open form loginLOGIN.USERNAME[0]
1Type LOGIN.USERNAME = alice, LOGIN.PASSWORD = alice#123LOGIN.PASSWORD[0]LOGIN.PASSWORD[0] = alice#123
LOGIN.USERNAME[0] = alice
2loginClick LOGIN.LOGINCONSOLE.EMPLOYEES[0]CONSOLE.USERNAME[0] = alice
3employeesClick CONSOLE.EMPLOYEESEMPLOYEES.APEX[0]DEPARTMENT.CITY[0] = Seattle
DEPARTMENT.COUNTRY_NAME[0] = United States of America
DEPARTMENT.DEPARTMENT_ID[0] = 90
DEPARTMENT.DEPARTMENT_NAME[0] = Executive
DEPARTMENT.REGION_NAME[0] = Americas
DEPARTMENT.STATE_PROVINCE[0] = Washington
DEPARTMENT.STREET_ADDRESS[0] = 2004 Charade Rd
EMPLOYEES.DEPARTMENT_ID[0] = 90
EMPLOYEES.DEPARTMENT_ID[1] = 90
EMPLOYEES.DEPARTMENT_ID[2] = 90
EMPLOYEES.DEPARTMENT_ID[3] = 60
EMPLOYEES.DEPARTMENT_ID[4] = 60
EMPLOYEES.DEPARTMENT_ID[5] = 60
EMPLOYEES.DEPARTMENT_ID[6] = 60
EMPLOYEES.DEPARTMENT_ID[7] = 60
EMPLOYEES.DEPARTMENT_ID[8] = 100
EMPLOYEES.DEPARTMENT_ID[9] = 100
EMPLOYEES.EMAIL[0] = SKING
EMPLOYEES.EMAIL[1] = NYANG
EMPLOYEES.EMAIL[2] = LGARCIA
EMPLOYEES.EMAIL[3] = AJAMES
EMPLOYEES.EMAIL[4] = BMILLER
EMPLOYEES.EMAIL[5] = DWILLIAMS
EMPLOYEES.EMAIL[6] = VJACKSON
EMPLOYEES.EMAIL[7] = DNGUYEN
EMPLOYEES.EMAIL[8] = NGRUENBE
EMPLOYEES.EMAIL[9] = DFAVIET
EMPLOYEES.EMPLOYEE_ID[0] = 100
EMPLOYEES.EMPLOYEE_ID[1] = 101
EMPLOYEES.EMPLOYEE_ID[2] = 102
EMPLOYEES.EMPLOYEE_ID[3] = 103
EMPLOYEES.EMPLOYEE_ID[4] = 104
EMPLOYEES.EMPLOYEE_ID[5] = 105
EMPLOYEES.EMPLOYEE_ID[6] = 106
EMPLOYEES.EMPLOYEE_ID[7] = 107
EMPLOYEES.EMPLOYEE_ID[8] = 108
EMPLOYEES.EMPLOYEE_ID[9] = 109
EMPLOYEES.FIRST_NAME[0] = Steven
EMPLOYEES.FIRST_NAME[1] = Neena
EMPLOYEES.FIRST_NAME[2] = Lex
EMPLOYEES.FIRST_NAME[3] = Alexander
EMPLOYEES.FIRST_NAME[4] = Bruce
EMPLOYEES.FIRST_NAME[5] = David
EMPLOYEES.FIRST_NAME[6] = Valli
EMPLOYEES.FIRST_NAME[7] = Diana
EMPLOYEES.FIRST_NAME[8] = Nancy
EMPLOYEES.FIRST_NAME[9] = Daniel
EMPLOYEES.HIRE_DATE[0] = 17-06-2013
EMPLOYEES.HIRE_DATE[1] = 21-09-2015
EMPLOYEES.HIRE_DATE[2] = 13-01-2011
EMPLOYEES.HIRE_DATE[3] = 03-01-2016
EMPLOYEES.HIRE_DATE[4] = 21-05-2017
EMPLOYEES.HIRE_DATE[5] = 25-06-2015
EMPLOYEES.HIRE_DATE[6] = 05-02-2016
EMPLOYEES.HIRE_DATE[7] = 07-02-2017
EMPLOYEES.HIRE_DATE[8] = 17-08-2012
EMPLOYEES.HIRE_DATE[9] = 16-08-2012
EMPLOYEES.JOB_ID[0] = AD_PRES
EMPLOYEES.JOB_ID[1] = AD_VP
EMPLOYEES.JOB_ID[2] = AD_VP
EMPLOYEES.JOB_ID[3] = IT_PROG
EMPLOYEES.JOB_ID[4] = IT_PROG
EMPLOYEES.JOB_ID[5] = IT_PROG
EMPLOYEES.JOB_ID[6] = IT_PROG
EMPLOYEES.JOB_ID[7] = IT_PROG
EMPLOYEES.JOB_ID[8] = FI_MGR
EMPLOYEES.JOB_ID[9] = FI_ACCOUNT
EMPLOYEES.LAST_NAME[0] = King
EMPLOYEES.LAST_NAME[1] = Yang
EMPLOYEES.LAST_NAME[2] = Garcia
EMPLOYEES.LAST_NAME[3] = James
EMPLOYEES.LAST_NAME[4] = Miller
EMPLOYEES.LAST_NAME[5] = Williams
EMPLOYEES.LAST_NAME[6] = Jackson
EMPLOYEES.LAST_NAME[7] = Nguyen
EMPLOYEES.LAST_NAME[8] = Gruenberg
EMPLOYEES.LAST_NAME[9] = Faviet
EMPLOYEES.MANAGER_ID[1] = 100
EMPLOYEES.MANAGER_ID[2] = 100
EMPLOYEES.MANAGER_ID[3] = 102
EMPLOYEES.MANAGER_ID[4] = 103
EMPLOYEES.MANAGER_ID[5] = 103
EMPLOYEES.MANAGER_ID[6] = 103
EMPLOYEES.MANAGER_ID[7] = 103
EMPLOYEES.MANAGER_ID[8] = 101
EMPLOYEES.MANAGER_ID[9] = 108
EMPLOYEES.PHONE_NUMBER[0] = 1.515.555.0100
EMPLOYEES.PHONE_NUMBER[1] = 1.515.555.0101
EMPLOYEES.PHONE_NUMBER[2] = 1.515.555.0102
EMPLOYEES.PHONE_NUMBER[3] = 1.590.555.0103
EMPLOYEES.PHONE_NUMBER[4] = 1.590.555.0104
EMPLOYEES.PHONE_NUMBER[5] = 1.590.555.0105
EMPLOYEES.PHONE_NUMBER[6] = 1.590.555.0106
EMPLOYEES.PHONE_NUMBER[7] = 1.590.555.0107
EMPLOYEES.PHONE_NUMBER[8] = 1.515.555.0108
EMPLOYEES.PHONE_NUMBER[9] = 1.515.555.0109
EMPLOYEES.SALARY[0] = 24000
EMPLOYEES.SALARY[1] = 17000
EMPLOYEES.SALARY[2] = 17000
EMPLOYEES.SALARY[3] = 9000
EMPLOYEES.SALARY[4] = 6000
EMPLOYEES.SALARY[5] = 4800
EMPLOYEES.SALARY[6] = 4800
EMPLOYEES.SALARY[7] = 4200
EMPLOYEES.SALARY[8] = 12008
EMPLOYEES.SALARY[9] = 9000
4department lovList of values on EMPLOYEES.DEPARTMENT_ID[4], pick Department_Name = ShippingEMPLOYEES.DEPARTMENT_ID[4]DEPARTMENT.CITY[0] = Southlake
DEPARTMENT.DEPARTMENT_ID[0] = 60
DEPARTMENT.DEPARTMENT_NAME[0] = IT
DEPARTMENT.STATE_PROVINCE[0] = Texas
DEPARTMENT.STREET_ADDRESS[0] = 2014 Jabberwocky Rd
EMPLOYEES.DEPARTMENT_ID[4] = 50
pass
5Type EMPLOYEES.SALARY[6] = 5000EMPLOYEES.SALARY[6]EMPLOYEES.SALARY[6] = 5000
6saveClick BUTTONS.SAVE_BUTTONBUTTONS.SAVE_BUTTON[0]FRM-40400: Transaction complete: 2 records applied and saved.
7close employeesClick EMPLOYEES.CloseCONSOLE.EMPLOYEES[0]

Database effects

EMPLOYEES updated: {"key": {"EMPLOYEE_ID": 104}, "changed": {"DEPARTMENT_ID": {"before": 60, "after": 50}}}
EMPLOYEES updated: {"key": {"EMPLOYEE_ID": 106}, "changed": {"SALARY": {"before": 4800, "after": 5000}}}
JOB_HISTORY inserted: {"EMPLOYEE_ID": 104, "START_DATE": "2017-05-21T00:00:00", "END_DATE": "<clock>", "JOB_ID": "IT_PROG", "DEPARTMENT_ID": 60}

Classified diff against the migrated app

Diff: employees-change-department
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  (19 of 27 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.