APEX Processes Documentation
This document contains all 98 processes defined in the APEX application, organized by page.
Process Overview
| Process Type | Count |
|---|---|
| NATIVE_FORM_INIT | Multiple |
| NATIVE_FORM_DML | Multiple |
| NATIVE_PLSQL | Multiple |
| NATIVE_IG_DML | Multiple |
| NATIVE_SESSION_STATE | Multiple |
Shared (Application-Level) Processes
SET_USER_READONLY
Process Point: Before Header (runs on every page) Type: NATIVE_PLSQL
Sets the APP_READ_ONLY application item based on user permissions.
begin
if F_USER_IN_ROLE(:APP_USER, 'READONLY') then
:APP_READ_ONLY := 1;
else
:APP_READ_ONLY := 0;
end if;
end;
Page 3 - Articoli (Article Form)
Fetch Row from ARTICOLI
Process Point: After Header Type: NATIVE_FORM_INIT
Initializes form with article data.
Process Row of ARTICOLI
Process Point: After Submit Type: NATIVE_FORM_DML
Saves/updates article record.
Delete Image
Process Point: After Submit Type: NATIVE_PLSQL Button: Delete Image
begin
update articoli
set
raw_data = null,
last_update = null,
charset = null,
mimetype = null,
filename = null
where rowid = :P3_ROWID;
end;
Page 22 - Nuovo Evento (Main Event Form)
Page 22 is the most complex page with 32 processes.
After Header Processes
Get Event Details
Sequence: 10 Type: NATIVE_FORM_INIT
Fetches event record into form items.
Set Ospiti on load
Sequence: 20 Type: NATIVE_PLSQL
begin
EVENTI_AGGIORNA_TOT_OSPITI(:P22_EVENT_ID);
end;
Default Values
Sequence: 40 Type: NATIVE_PLSQL
begin
select trim(l.location)
into :P22_LOCATION_DESCRI
from eventi e
join location l on l.id = e.id_location
where e.id = :P22_EVENT_ID;
exception when no_data_found then
null;
end;
Normalizza dati
Sequence: 50 Type: NATIVE_PLSQL
Formats time values for display:
:P22_ORA_INI_CER := to_char(to_date(:P22_ORA_CERIMONIA, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');
:P22_ORA_INI_EVENTO := to_char(to_date(:P22_ORA_EVENTO, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');
:P22_ORA_FI_CER := to_char(to_date(:ORA_FINE_CERIMONIA, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');
:P22_ORA_FI_EVENTO := to_char(to_date(:ORA_FINE_EVENTO, 'DD-MM-YYYY HH24:MI'), 'hh24:mi');
New Template Default Data
Sequence: 60 Condition: P22_IS_TEMPLATE is not null
:P22_DATA := sysdate;
After Submit Processes
Set Date Default if Template
Sequence: 10 Condition: P22_IS_TEMPLATE is not null
:P22_DATA := sysdate;
Delete Template
Sequence: 20 Button: Delete Template Condition: P22_IS_TEMPLATE is not null
delete from eventi where id = :P22_EVENT_ID;
Genera Evento da Template
Sequence: 30 Button: Generate from Template Condition: P22_IS_TEMPLATE is not null
EVENTI_COPIA
(
ID_EVENTO_OLD => :P22_EVENT_ID,
NUOVA_VERSIONE => 0,
ID_EVENTO_NEW => :P22_EVENT_ID
);
Formatta Ore Inizio
Sequence: 40
Combines date and time for storage:
:P22_ORA_EVENTO := :P22_DATA || ' ' || :P22_ORA_INI_EVENTO;
:P22_ORA_CERIMONIA := :P22_DATA || ' ' || :P22_ORA_INI_CER;
Prepara Acconti Automatici
Sequence: 50 Condition: REQUEST in ('PREPARA_ACCONTI', 'PRINT_PREVENTIVO')
EVENTI_RICALCOLA_ACCONTI(p_event_id => :P22_EVENT_ID);
Comment: Default 3 deposits: 30%, 50%, 20%
Go Forward
Sequence: 60 Button: NEXT
Navigates to next wizard step:
declare
v_step number;
begin
begin
select min(cod_step)
into v_step
from tb_tipi_mat
where cod_step > TO_NUMBER(:P22_STEP);
end;
begin
select cod_tipo
into :P22_COD_TIPO_FILTER
from tb_tipi_mat
where cod_step = v_step;
exception when no_data_found
then raise_application_error(-20001, 'Errore sconosciuto');
end;
:P22_STEP := v_step;
end;
Go Backward
Sequence: 70 Button: PREVIOUS
Navigates to previous wizard step.
Tipo Ospiti - Save Interactive Grid Data
Sequence: 80 Region: Guest Types Grid Type: NATIVE_IG_DML Condition: APP_READ_ONLY = 0
Saves guest type records.
Tipo Ospiti - Aggiorna Lista Prelievo
Sequence: 90 Type: NATIVE_PLSQL Condition: APP_READ_ONLY = 0
Recalculates pick list quantities after guest changes:
EVENTI_AGGIORNA_QTA_LISTA(
P_ID_EVENTO => :P22_EVENT_ID
);
Degustazioni - Save Interactive Grid Data
Sequence: 100 Region: Tastings Grid Type: NATIVE_IG_DML
Delete Eventi Childs
Sequence: 110 Button: DELETE Condition: NEVER (disabled)
begin
delete from eventi_det_ospiti
where id_evento = :P22_EVENT_ID;
delete from eventi_det_prel
where id_evento = :P22_EVENT_ID;
delete from eventi_det_ris
where id_evento = :P22_EVENT_ID;
delete from eventi_det_degust
where id_evento = :P22_EVENT_ID;
end;
Set Obsoleto
Sequence: 120 Button: Set Obsolete Condition: APP_READ_ONLY = 0
Marks event as expired/cancelled:
begin
UPDATE EVENTI
SET FLG_SUPERATO = 1, STATO = 900, MAIL_ENABLED = 0
WHERE ID = :P22_EVENT_ID;
end;
Salva Evento
Sequence: 130 Condition: Complex (handles CREATE, SAVE, DELETE)
Main event save process. Full implementation handles:
- All event fields mapping
- Email validation
- Status-based logic
- Versioning support
- Soft delete
Key excerpts:
declare
r_eventi eventi%rowtype;
begin
if :REQUEST = 'PREVIOUS' or :REQUEST = 'NEXT'
then
return;
end if;
if(:P22_DATA is null)
then
raise_application_error(-20001, 'Inserire la data evento');
end if;
-- Set all row fields
r_eventi."ID" := :P22_EVENT_ID;
r_eventi.DESCRIZIONE := :P22_DESCRIZIONE;
r_eventi.COD_TIPO := :P22_COD_TIPO;
-- ... (all other fields)
-- Email validation
IF REGEXP_LIKE(:P22_CLIENTE_EMAIL, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
OR :P22_CLIENTE_EMAIL IS NULL THEN
r_eventi.CLIENTE_EMAIL := :P22_CLIENTE_EMAIL;
ELSE
RAISE_APPLICATION_ERROR(-20005, 'Formato email cliente non valido');
END IF;
-- Versioning
r_eventi.VERS_NUMBER := nvl(:P22_VERS_NUMBER, 0);
r_eventi.VERS_TOKEN := :P22_VERS_TOKEN;
case :REQUEST
when 'SAVE' then
update eventi set row = r_eventi where id = :P22_EVENT_ID;
when 'CREATE' then
insert into eventi values r_eventi returning id into :P22_EVENT_ID;
when 'DELETE' then
if r_eventi.ID_EVT_FIGLIO is not null or r_eventi.ID_EVT_PADRE is not null
then
raise_application_error(-20001, 'Impossibile eliminare un evento...');
end if;
update eventi
set deleted = 1,
deleted_by = :APP_USER,
deleted_date = sysdate
where id = r_eventi."ID";
else
null;
end case;
end;
Nuova Versione
Sequence: 140 Button: New Version
Creates a new version of the event:
EVENTI_COPIA
(
ID_EVENTO_OLD => :P22_EVENT_ID,
NUOVA_VERSIONE => 1,
ID_EVENTO_NEW => :P22_NEW_EVENT_ID
);
Lista Prelievo - Save Interactive Grid Data
Sequence: 150 Type: NATIVE_IG_DML Table: EVENTI_DET_PREL
Saves pick list records.
Continue Event
Sequence: 160 Button: Continue
Advances event to "Confermata" status (300):
declare
v_count number;
v_count_evt number;
begin
-- Check if confirmed event exists for same location/date
select count(*) into v_count
from eventi
where data = (select data from eventi where id = :P22_EVENT_ID)
and stato = 300
and id_location = (select id_location from eventi where id = :P22_EVENT_ID);
if v_count > 0 then
raise_application_error(-20001, 'Esiste un evento Confermato per la location - Impossibile proseguire');
return;
end if;
-- Update status
update eventi
set stato = 300
where id = :P22_EVENT_ID;
-- Check total confirmed events for date
select count(*) into v_count_evt
from eventi
where data = (select data from eventi where id = :P22_EVENT_ID)
and stato = 300;
if v_count_evt > 6 then
RAISE_APPLICATION_ERROR(-20000, 'Ci sono già 6 eventi Confermati per la data');
end if;
end;
Almost Continue Event
Sequence: 170 Button: Almost Continue
Sets status to "Quasi Confermato" (350):
begin
update eventi
set stato = 350
where id = :P22_EVENT_ID;
end;
Confirm Event
Sequence: 180 Button: Confirm Condition: APP_READ_ONLY = 0
Final confirmation (status 400) and cancels competing events:
begin
update eventi
set stato = 400
where id = :P22_EVENT_ID;
-- Cancel events with same date and location
p_cancel_same_location_events(
p_good_event_id => :P22_EVENT_ID
);
end;
Unconfirm Event
Sequence: 190 Button: Unconfirm
Returns event to initial status (100):
begin
update eventi
set stato = 100
where id = :P22_EVENT_ID;
end;
Reopen Event
Sequence: 200 Button: Reopen
Clears the expired flag:
begin
update eventi
set flg_superato = 0
where id = :P22_EVENT_ID;
end;
Return to Preparazione
Sequence: 210 Button: Return to Preparation
Sets status back to preparation (200):
begin
update eventi
set stato = 200
where id = :P22_EVENT_ID;
end;
Risorse - Save Interactive Grid Data
Sequence: 220 Type: NATIVE_IG_DML
Saves resource assignments.
Aggiorna QTA Lista
Sequence: 230 Condition: APP_READ_ONLY = 0 AND REQUEST = 'AGGIORNA_QTA'
Manual quantity recalculation:
EVENTI_AGGIORNA_QTA_LISTA(
P_ID_EVENTO => :P22_EVENT_ID
);
Restore Deleted Event
Sequence: 240
Restores soft-deleted event.
Event Status Workflow Summary
| Status Code | Status Name | Italian | Next Action |
|---|---|---|---|
| 100 | Preventivo | Quote | Continue Event → 300 |
| 200 | Scheda | Preparation | - |
| 300 | Confermata | Confirmed (Pending) | Almost Continue → 350 |
| 350 | Quasi | Almost Confirmed | Confirm → 400 |
| 400 | Confermato | Confirmed | - |
| 900 | Superato | Expired/Cancelled | Reopen → clears flag |
Common Process Patterns
Read-Only Check
All write processes include this condition:
:APP_READ_ONLY = 0
Error Handling
Standard error pattern:
exception when no_data_found then
raise_application_error(-20001, 'Error message in Italian');
Interactive Grid Save
Standard IG DML process:
- Type: NATIVE_IG_DML
- Attributes: REGION_SOURCE, Allow Insert (Y), Allow Update (Y), Allow Delete (Y)
Migration Notes
When migrating these processes to .NET:
- Form Initialization - Use API endpoints to fetch entity data
- Form DML - Implement CRUD endpoints with proper validation
- Custom PL/SQL - Convert to C# methods or stored procedures
- IG DML - Implement batch update endpoints for grid data
- Session State - Use application state management (Redux, Context)
- Validation - Implement in both frontend and backend
- Workflow - Consider state machine pattern for event status