Oracle Forms · PL/SQL Architecture  ·  Made from ODA [Oracle Dependencies Analyzer]

Technical Analysis Report

Oracle Form DEMO001 — Transport Dispatch & Fleet Management System
Form IDDEMO001
Blocks12 (7 DB + 5 Control)
External Objects20 (demo)
Packages8
Tables / Views6 / 2
Report DateApril 2026
DEMO This is a demonstration report with fictional transport-company data. Real ODA reports contain your actual Oracle Forms dependency analysis — packages, tables, views, SQL and code contexts extracted automatically from your form source.
01

Functional Overview

Form DEMO001 is the central operations screen for FastRoute Transport Ltd, a regional freight and passenger transport company. It gives dispatch supervisors a unified interface to manage the full trip lifecycle — from initial booking and driver/vehicle assignment through to invoice generation and payment collection.

The form is structured around a selected client (block B0) and operates across three main tabs: Dispatch (live trip creation), Fleet (vehicle and driver availability), and Billing (invoices and outstanding balances).

Architecture Note
All business rules are encapsulated in domain packages (TRN_DISPATCH_PKG, TRN_BILLING_PKG, TRN_FLEET_PKG, TRN_DRIVER_PKG, TRN_ROUTE_PKG). The form is a pure UI layer with no direct DML — all writes pass through package procedures. Platform services (session sync, audit, screen guard) are handled by shared infrastructure packages.
02

Data Structure Analysis

2.1 Block Classification

BlockTypeSourceRecordsPurpose
B0Control1Client selector, session parameters, tab navigation buttons.
B_CLIENTSDB · ROTRN_CLIENTS1Selected client details and real-time debt summary.
DISPATCH_MONITORDB · ROTRN_ACTIVE_TRIPS_VW10Live in-progress trip dashboard. Read-only.
B_DISPATCHControl1New trip creation dialog: driver, vehicle, route, timing.
B_TRIPSDB · R/WTRN_TRIPS8Trip history for client. Close trip, view details.
B_DRIVERSDB · ROTRN_DRIVERS12Available driver list with licence and status info.
B_FLEETDB · ROTRN_VEHICLES12Active vehicle list, maintenance due indicator.
B_ROUTESDB · ROTRN_ROUTES15Route catalogue with distance and duration estimates.
B_INVOICESDB · R/WTRN_INVOICES10Client invoice list with payment status. Mark paid.
B_SUMMARYControl1Session totals: trips today, revenue, outstanding.
B_NOTIFControl1Notification dialog for delay/cancellation alerts.
KOT_OPControlTEMPLATE_OLB1System header: username, environment, system name.

2.2 Key Reconstructed SQL

Block B_TRIPS reads directly from the base table with an inline function call for the status description:

SELECT TRIP_ID, CLIENT_ID, DRIVER_ID, VEHICLE_ID, ROUTE_SEQ,
       DEPART_TIME, ARRIVAL_TIME,
       TRN_DISPATCH_PKG.GET_TRIP_STATUS(TRIP_ID) STATUS_DESC,
       START_KM, END_KM, (END_KM - START_KM) DISTANCE, NOTES
FROM   TRN_TRIPS
WHERE  CLIENT_ID = :B0.CLIENT_ID
ORDER BY DEPART_TIME DESC

Block DISPATCH_MONITOR queries the enriched view joining trips, drivers and vehicles:

SELECT TRIP_ID, DRIVER_FULL_NAME, PLATE_NO, VEHICLE_TYPE,
       ORIGIN_CODE, DEST_CODE, DEPART_TIME, EST_ARRIVAL,
       STATUS_DESC, EST_KM
FROM   TRN_ACTIVE_TRIPS_VW
WHERE  STATUS_CODE = 'IN_PROGRESS'
ORDER BY DEPART_TIME

Block B_CLIENTS embeds a billing function call inline in SELECT:

SELECT CLIENT_ID, COMPANY_NAME, CONTACT_NAME, PHONE,
       CONTRACT_TIER, CREDIT_LIMIT,
       TRN_BILLING_PKG.GET_OUTSTANDING(CLIENT_ID) TOTAL_DEBT
FROM   TRN_CLIENTS
ORDER BY COMPANY_NAME
03

Business Logic Analysis

3.1 Key Form Procedures

ProcedureBusiness Role
CREATE_TRIP_PROCValidates driver availability and licence, checks vehicle availability window, auto-fills route distance and ETA, creates the TRN_TRIPS record via TRN_DISPATCH_PKG.ASSIGN_DRIVER, then triggers confirmation via TRN_NOTIFY_PKG.SEND_TRIP_CONFIRM.
CLOSE_TRIP_PROCRecords end KM, calculates distance, calls TRN_DISPATCH_PKG.CLOSE_TRIP which sets status to CLOSED and triggers TRN_BILLING_PKG.CREATE_INVOICE for fare calculation and invoice generation.
CALC_FARE_PROCCalls TRN_BILLING_PKG.CALC_TRIP_FARE with trip ID and tariff, applies contract-tier discount via APPLY_DISCOUNT, updates invoice NET_AMOUNT.
ASSIGN_DRIVER_PROCValidates driver licence covers vehicle type, checks weekly hours compliance, confirms no overlapping active trips via TRN_DRIVER_PKG.CHK_DRIVER_AVAILABLE.
SCHEDULE_MAINT_PROCReads current km from TRN_VEHICLES, compares against last maintenance threshold, calls TRN_FLEET_PKG.SCHEDULE_MAINTENANCE if overdue.
DO_MANUAL_PAYMENTChecks outstanding client balance; if positive, calls DEMO002 via CALL_FORM for payment capture. Updates TRN_INVOICES.STATUS_PAY on return.

3.2 Trip Lifecycle

[Booking]
B_DISPATCH / CREATE_TRIP_PROC
[In Progress]
DISPATCH_MONITOR / TRN_ACTIVE_TRIPS_VW
[Closing]
CLOSE_TRIP_PROC / Record KM
[Invoiced]
TRN_BILLING_PKG / TRN_INVOICES
[Settled]
DO_MANUAL_PAYMENT / DEMO002
04

External Dependencies

4.1 PL/SQL Packages

PackageTypeKey CallsRole
TRN_DISPATCH_PKG PACKAGE CREATE_TRIP, GET_TRIP_STATUS, ASSIGN_DRIVER, CLOSE_TRIP, CHK_DRIVER_AVAILABLE Core dispatch business logic: trip creation, driver assignment, route validation…
TRN_BILLING_PKG PACKAGE CALC_TRIP_FARE, CREATE_INVOICE, APPLY_DISCOUNT, GET_OUTSTANDING Invoice generation, tariff calculation, payment collection and reconciliation ag…
TRN_FLEET_PKG PACKAGE IS_VEHICLE_AVAILABLE, SCHEDULE_MAINTENANCE, GET_FUEL_CONSUMPTION Vehicle fleet management: availability checks, maintenance scheduling, fuel cons…
TRN_DRIVER_PKG PACKAGE GET_DRIVER_STATUS, CHK_LICENCE_VALID, CALC_HOURS_THIS_WEEK, RECORD_INCIDENT Driver profile management: licence validation, working hours compliance, perform…
TRN_ROUTE_PKG PACKAGE GET_ROUTE_DISTANCE, GET_ESTIMATED_TIME, SUGGEST_ROUTE Route planning and distance calculation. Integrates with external mapping servic…
TRN_NOTIFY_PKG PACKAGE SEND_TRIP_CONFIRM, SEND_DELAY_ALERT Customer and driver notification engine: SMS alerts, email confirmations, delay …
PKG_FORM PACKAGE GET_SYNC, SET_CURSOR_SHARING_FORCE Platform package: multi-form synchronisation and session-level cursor sharing.…
SCREEN_GUARD_PKG PACKAGE CHECK_SCREEN_ACTIVE Screen availability guard: blocks form access during maintenance windows without…

4.2 Tables, Views & Synonyms

ObjectTypePoints ToDescription
TRN_TRIPS TABLE Master trip table. Each row is one dispatched trip with driver, vehicle, route, …
TRN_DRIVERS TABLE Driver master data: personal details, licence category, hire date, status and pe…
TRN_VEHICLES TABLE Vehicle fleet registry: plate, type, capacity, current km, last maintenance date…
TRN_CLIENTS TABLE Client company registry: contact details, contract tier, credit limit and outsta…
TRN_INVOICES TABLE Invoice records: one per trip, with calculated fare, discount applied, tax and p…
TRN_ROUTES TABLE Predefined route catalogue: origin, destination, waypoints, distance, typical du…
TRN_ACTIVE_TRIPS_VW VIEW TRN_ACTIVE_TRIPS_VW Enriched view joining TRN_TRIPS with driver and vehicle details. Shows only in-p…
TRN_TARIFFS_VW VIEW TRN_TARIFFS_VW Tariff lookup view: base rate per km, minimum charge, surcharges by vehicle type…
SYSDICT_CODES SYNONYM SYSDICT_CODES Universal system dictionary table (keyed by CODE_TABLE). Used for status codes, …
SYSDICT_PROGRAMS SYNONYM SYSDICT_PROGRAMS Form/program registry. Queried in BUILD_WINDOW_TITLE to retrieve the form displa…
05

Summary

AspectAssessment
ArchitectureClean package-per-domain separation: Dispatch, Billing, Fleet, Driver, Route each in their own package. Form is a pure UI layer — no direct DML.
Integration PointsExternal notification service (TRN_NOTIFY_PKG), sub-form DEMO002 for payment capture, system dictionary SYSDICT_CODES for all code lookups.
DML SurfaceB_TRIPS (Update via package), B_INVOICES (Update payment status). All inserts go through package procedures.
Platform ServicesPKG_FORM for multi-form sync, SCREEN_GUARD_PKG for maintenance lockout, WRITE_AUDIT_ENTRY for session compliance logging.
ExtensibilityRoute and tariff catalogues (TRN_ROUTES, TRN_TARIFFS_VW) are data-driven — new routes and pricing rules require no code changes.
Appendix A1

Raw Dependency Contexts

20 demo objects — code contexts with syntax highlighting. Object references highlighted in amber. In real reports, every context is extracted directly from your Oracle Forms source.

TRN_DISPATCH_PKGPACKAGE3 contexts
CREATE_TRIP_PROC[PROCEDURE]
rec_trip    trn_trips%ROWTYPE;
v_status    VARCHAR2(10) := TRN_DISPATCH_PKG.GET_TRIP_STATUS(:B_DISPATCH.TRIP_ID);
BEGIN
  TRN_DISPATCH_PKG.ASSIGN_DRIVER(
    IN_DRIVER_ID => :B_DISPATCH.DRIVER_ID,
    IN_TRIP_ID   => :B_DISPATCH.TRIP_ID,
    OUT_TAKIN    => v_takin);
PRE-QUERY[TRIGGER FM]
IF TRN_DISPATCH_PKG.CHK_DRIVER_AVAILABLE(:B0.DRIVER_ID) = 'N' THEN
  message_al('Driver is not available for this time slot');
  RAISE FORM_TRIGGER_FAILURE;
END IF;
CLOSE_TRIP_PROC[PROCEDURE]
TRN_DISPATCH_PKG.CLOSE_TRIP(
  IN_TRIP_ID    => :B_TRIPS.TRIP_ID,
  IN_END_KM     => :B_TRIPS.END_KM,
  OUT_DISTANCE  => v_km_total);
TRN_BILLING_PKGPACKAGE2 contexts
CALC_FARE_PROC[PROCEDURE]
v_fare := TRN_BILLING_PKG.CALC_TRIP_FARE(
  IN_TRIP_ID    => :B_TRIPS.TRIP_ID,
  IN_TARIFF_SEQ => :B_TRIPS.TARIFF_SEQ);
v_discount := TRN_BILLING_PKG.APPLY_DISCOUNT(
  IN_CLIENT_ID => :B0.CLIENT_ID,
  IN_AMOUNT    => v_fare);
POST-QUERY B_CLIENTS[TRIGGER FM]
:B_CLIENTS.TOTAL_DEBT := TRN_BILLING_PKG.GET_OUTSTANDING(
  IN_CLIENT_ID => :B_CLIENTS.CLIENT_ID);
TRN_FLEET_PKGPACKAGE1 context
B_DISPATCH WHEN-VALIDATE-ITEM[TRIGGER FM]
IF TRN_FLEET_PKG.IS_VEHICLE_AVAILABLE(
     IN_VEHICLE_ID => :B_DISPATCH.VEHICLE_ID,
     IN_FROM_DATE  => :B_DISPATCH.DEPART_TIME,
     IN_TO_DATE    => :B_DISPATCH.EST_RETURN) = 'N' THEN
  message_al('Vehicle already booked for this period');
  RAISE FORM_TRIGGER_FAILURE;
END IF;
TRN_DRIVER_PKGPACKAGE1 context
ASSIGN_DRIVER_PROC[PROCEDURE]
IF TRN_DRIVER_PKG.CHK_LICENCE_VALID(
     IN_DRIVER_ID    => :B_DISPATCH.DRIVER_ID,
     IN_VEHICLE_TYPE => :B_DISPATCH.VEHICLE_TYPE) = 'N' THEN
  message_al('Driver licence does not cover this vehicle type');
  RAISE FORM_TRIGGER_FAILURE;
END IF;
v_hours := TRN_DRIVER_PKG.CALC_HOURS_THIS_WEEK(:B_DISPATCH.DRIVER_ID);
IF v_hours > 40 THEN
  message_al('Driver exceeds weekly hours limit');
END IF;
TRN_ROUTE_PKGPACKAGE1 context
B_DISPATCH POST-QUERY[TRIGGER FM]
:B_DISPATCH.EST_KM   := TRN_ROUTE_PKG.GET_ROUTE_DISTANCE(
  IN_FROM_LOC => :B_DISPATCH.ORIGIN_CODE,
  IN_TO_LOC   => :B_DISPATCH.DEST_CODE);
:B_DISPATCH.EST_MINS := TRN_ROUTE_PKG.GET_ESTIMATED_TIME(
  IN_ROUTE_SEQ  => :B_DISPATCH.ROUTE_SEQ,
  IN_DEPART_DT  => :B_DISPATCH.DEPART_TIME);
TRN_NOTIFY_PKGPACKAGE1 context
CREATE_TRIP_PROC[PROCEDURE]
TRN_NOTIFY_PKG.SEND_TRIP_CONFIRM(
  IN_TRIP_ID    => v_new_trip_id,
  IN_CLIENT_ID  => :B0.CLIENT_ID);
PKG_FORMPACKAGE1 context
WHEN-NEW-FORM-INSTANCE[TRIGGER FM]
PKG_FORM.SET_CURSOR_SHARING_FORCE;
IF PKG_FORM.GET_SYNC = 'Y' THEN
  REFRESH_FORM;
END IF;
SCREEN_GUARD_PKGPACKAGE1 context
WHEN-NEW-FORM-INSTANCE[TRIGGER FM]
IF SCREEN_GUARD_PKG.CHECK_SCREEN_ACTIVE(:SYSTEM.CURRENT_FORM) = 'N' THEN
  message_al('System is under maintenance. Please try again later.');
  RAISE FORM_TRIGGER_FAILURE;
END IF;
TRN_TRIPSTABLE2 contexts
B_TRIPS BLOCK[BLOCK]
SELECT TRIP_ID, CLIENT_ID, DRIVER_ID, VEHICLE_ID, ROUTE_SEQ,
       DEPART_TIME, ARRIVAL_TIME, STATUS_CODE,
       START_KM, END_KM, (END_KM - START_KM) DISTANCE,
       TRN_DISPATCH_PKG.GET_TRIP_STATUS(TRIP_ID) STATUS_DESC,
       NOTES
FROM   TRN_TRIPS
ORDER BY DEPART_TIME DESC
CLOSE_TRIP_PROC[PROCEDURE]
rec_trip TRN_TRIPS%ROWTYPE;
SELECT * INTO rec_trip FROM TRN_TRIPS WHERE TRIP_ID = :B_TRIPS.TRIP_ID;
rec_trip.STATUS_CODE  := 'CLOSED';
rec_trip.ARRIVAL_TIME := SYSDATE;
rec_trip.END_KM       := :B_TRIPS.END_KM;
TRN_DISPATCH_PKG.CLOSE_TRIP(rec_trip, v_ok);
TRN_DRIVERSTABLE2 contexts
B_DRIVERS BLOCK[BLOCK]
SELECT DRIVER_ID, FULL_NAME, LICENCE_NO, LICENCE_CATEGORY,
       LICENCE_EXPIRY, STATUS_CODE, HIRE_DATE, PERF_SCORE
FROM   TRN_DRIVERS
WHERE  STATUS_CODE != 'TERMINATED'
ORDER BY FULL_NAME
ASSIGN_DRIVER_PROC[PROCEDURE]
v_lic_cat TRN_DRIVERS.LICENCE_CATEGORY%TYPE;
SELECT LICENCE_CATEGORY INTO v_lic_cat
FROM   TRN_DRIVERS WHERE DRIVER_ID = :B_DISPATCH.DRIVER_ID;
TRN_VEHICLESTABLE2 contexts
B_FLEET BLOCK[BLOCK]
SELECT VEHICLE_ID, PLATE_NO, VEHICLE_TYPE, CAPACITY_KG,
       CURRENT_KM, LAST_MAINT_DATE, FUEL_TYPE, STATUS_CODE
FROM   TRN_VEHICLES
WHERE  STATUS_CODE = 'ACTIVE'
ORDER BY PLATE_NO
SCHEDULE_MAINT_PROC[PROCEDURE]
v_km TRN_VEHICLES.CURRENT_KM%TYPE;
SELECT CURRENT_KM INTO v_km
FROM   TRN_VEHICLES WHERE VEHICLE_ID = :B_FLEET.VEHICLE_ID;
IF v_km - v_last_maint_km > 10000 THEN
  TRN_FLEET_PKG.SCHEDULE_MAINTENANCE(:B_FLEET.VEHICLE_ID);
END IF;
TRN_CLIENTSTABLE1 context
B_CLIENTS BLOCK[BLOCK]
SELECT CLIENT_ID, COMPANY_NAME, CONTACT_NAME, PHONE,
       CONTRACT_TIER, CREDIT_LIMIT,
       TRN_BILLING_PKG.GET_OUTSTANDING(CLIENT_ID) TOTAL_DEBT
FROM   TRN_CLIENTS
ORDER BY COMPANY_NAME
TRN_INVOICESTABLE2 contexts
B_INVOICES BLOCK[BLOCK]
SELECT INV_SEQ, TRIP_ID, CLIENT_ID, INV_DATE,
       GROSS_AMOUNT, DISCOUNT_AMOUNT, TAX_AMOUNT,
       NET_AMOUNT, STATUS_PAY, DUE_DATE
FROM   TRN_INVOICES
WHERE  CLIENT_ID = :B0.CLIENT_ID
ORDER BY INV_DATE DESC
CREATE_INVOICE_PROC[PROCEDURE]
rec_inv TRN_INVOICES%ROWTYPE;
rec_inv.TRIP_ID        := :B_TRIPS.TRIP_ID;
rec_inv.GROSS_AMOUNT   := v_fare;
rec_inv.DISCOUNT_AMOUNT:= v_discount;
TRN_BILLING_PKG.CREATE_INVOICE(rec_inv, v_ok);
TRN_ROUTESTABLE2 contexts
B_ROUTES BLOCK[BLOCK]
SELECT ROUTE_SEQ, ROUTE_CODE, ORIGIN_CODE, DEST_CODE,
       DISTANCE_KM, AVG_DURATION_MIN, TARIFF_SEQ, ACTIVE_IND
FROM   TRN_ROUTES
WHERE  ACTIVE_IND = 'Y'
ORDER BY ROUTE_CODE
SUGGEST_ROUTE_PROC[PROCEDURE]
v_route TRN_ROUTES.ROUTE_SEQ%TYPE;
v_route := TRN_ROUTE_PKG.SUGGEST_ROUTE(
  IN_ORIGIN => :B_DISPATCH.ORIGIN_CODE,
  IN_DEST   => :B_DISPATCH.DEST_CODE);
:B_DISPATCH.ROUTE_SEQ := v_route;
TRN_ACTIVE_TRIPS_VWVIEWTRN_ACTIVE_TRIPS_VW [VIEW]1 context
DISPATCH_MONITOR BLOCK[BLOCK]
SELECT TRIP_ID, DRIVER_FULL_NAME, PLATE_NO, VEHICLE_TYPE,
       ORIGIN_CODE, DEST_CODE, DEPART_TIME, EST_ARRIVAL,
       STATUS_DESC, EST_KM
FROM   TRN_ACTIVE_TRIPS_VW
WHERE  STATUS_CODE = 'IN_PROGRESS'
ORDER BY DEPART_TIME
TRN_TARIFFS_VWVIEWTRN_TARIFFS_VW [VIEW]1 context
B_DISPATCH POST-QUERY[TRIGGER FM]
SELECT BASE_RATE_PER_KM, MIN_CHARGE, NIGHT_SURCHARGE
INTO   v_rate, v_min, v_night
FROM   TRN_TARIFFS_VW
WHERE  TARIFF_SEQ   = :B_DISPATCH.TARIFF_SEQ
  AND  VEHICLE_TYPE = :B_DISPATCH.VEHICLE_TYPE
  AND  SYSDATE BETWEEN VALID_FROM AND NVL(VALID_TO, SYSDATE);
SYSDICT_CODESSYNONYMSYSDICT_CODES [TABLE]3 contexts
STATUS_CODE_RG RECORD GROUP[RECORD GROUP]
SELECT CODE, DESCRIPTION
FROM   SYSDICT_CODES
WHERE  CODE_TABLE = 'TRIP_STATUS'
ORDER BY SORT_ORDER
VEHICLE_TYPE_RG RECORD GROUP[RECORD GROUP]
SELECT CODE, DESCRIPTION, SADE_3 LICENCE_REQUIRED
FROM   SYSDICT_CODES
WHERE  CODE_TABLE = 'VEHICLE_TYPE'
ORDER BY CODE
CHECK_RETURN_CODE PROC[PROCEDURE]
MSG_P  SYSDICT_CODES.DESCRIPTION%TYPE;
CODE_P SYSDICT_CODES.CODE%TYPE;
SELECT DESCRIPTION INTO MSG_P
FROM   SYSDICT_CODES WHERE CODE_TABLE = 'ERROR_CODES'
AND CODE = IN_CODE;
SYSDICT_PROGRAMSSYNONYMSYSDICT_PROGRAMS [TABLE]1 context
BUILD_WINDOW_TITLE PROC[PROCEDURE]
SELECT NVL(PROGRAM_TITLE, 'Screen') INTO v_title
FROM   SYSDICT_PROGRAMS
WHERE  PROGRAM_CODE = :SYSTEM.CURRENT_FORM;
WRITE_AUDIT_ENTRYPROCEDURE1 context
WHEN-NEW-FORM-INSTANCE[TRIGGER FM]
WRITE_AUDIT_ENTRY(
  IN_USER       => USER,
  IN_VMS_USER   => :KOT_OP.VMS_USERNAME_OP,
  IN_FORM       => :SYSTEM.CURRENT_FORM,
  IN_ACTION     => 'OPEN');
DEMO002FORM1 context
DO_MANUAL_PAYMENT PROC[PROCEDURE]
IF v_outstanding_amount > 0 THEN
  CALL_FORM('DEMO002');
END IF;