• Passa al contenuto principale
  • Passa alla barra laterale primaria
  • INIZIA QUI
  • HOME
  • CHI SONO

APPin5Minuti

Creare APP Gestionali con Oracle APEX e Low-Code

Crea Applicazioni Gestionali con Oracle APEX e gli strumenti Low-Code.

Come Salvare i Dati usando Forms e Interactive Grids in Oracle APEX

Dicembre 21, 2022

Le Forms e le Interactive Grids sono i due oggetti principali che Oracle APEX mette a disposizione per costruire applicazioni che devono essere in grado di caricare e salvare i dati nel database Oracle.

Anche se li conosci e li hai già utilizzati, ti consiglio di leggere comunque questo articolo perché ti darò qualche piccola chicca che sono sicuro ti tornerà utile.

Se invece sei alle prima armi e vuoi imparare come creare con Oracle APEX una applicazione che sia in grado di inserire, modificare e cancellare i record di una tabella del database (ovvero eseguire quelle operazioni che in informatica vengono chiamate CRUD), questo è decisamente l’articolo che fa per te!

Buona lettura.

Il mio nome è Daniele Trasarti, autore di APPin5Minuti, il sito italiano che parla di come creare applicazioni gestionali con Oracle APEX e gli strumenti Low-Code.

Se non sai di cosa sto parlando, ti consiglio di iniziare da qui.

Seguimi su Linkedin e Twitter e non dimenticare inscriverti alla Newsletter per non perderti i contenuti e i tutorial che pubblico ogni settimana.

IN QUESTO ARTICOLO

  • Prima di Iniziare
  • Crea una Form Page basata su una Tabella
  • Crea una Interactive Grid basata su una Tabella
  • Come usare le Vista o Query SQL nelle Form Page e Interactive Grid
  • Come correggere l’errore ORA-01733: virtual column not allowed here
  • Come costruire un Page Process di tipo PL-SQL
  • Come rendere le colonne di una Interactive Grid non modificabili.
  • Come attivare o disattivare i tipi di Operazioni
  • Conclusioni

Prima di Iniziare

Per fare questo esercizio ho deciso di usare un Sample Data Set disponibile direttamente in Oracle APEX.

Puoi installare il Data Set in questo modo:

  • Dall’APP Builder di Oracle APEX clicca su SQL Workshop > Utilities > Sample Dataset
  • Installa il Data Set chiamato EMP/DEPT

Alla fine dell’operazione avrai a disposizione 3 oggetti nel database

  • La tabella DEPT (Table)
  • La tabella EMP (Table)
  • La vista EMP_DEPT_V (View)

Creiamo una semplice applicazione di demo che useremo per aggiornare i dati dei dipendenti che sono salvati nella tabella EMP.

  • Dall’APP Builder clicca su Create APP e seleziona New Application
  • Dai un Nome all’applicazione e clicca Create Application

Crea una Form Page basata su una Tabella

Il primo modo che Oracle APEX mette a disposizione per modificare i dati di una tabella è attraverso una Page Form che viene utilizzata insieme ad un Interactive Report.

  • Accedi all’APP Builder e clicca Create Page
  • Seleziona Interactive Report
  • Configura le opzioni base e premi Next
    • Report Name: Employees
    • Include Form Page: Yes
    • Form Page Name: Employee Details
    • Source Type: Table
    • Table / View Name: EMP
  • Specifica la Primary Key della tabella su cui vanno salvati i dati e premi Create Page

Come risultato otterrai due pagine APEX:

  • Employees: è un Interactive Report che permette di vedere le informazioni della tabella EMP
  • Employee Details: è la Form Page che consente di modificare i dati del singolo record

Se provi ad eseguire la Page Preview, dovresti vedere una tabella che mostra tutti i record dalla tabella EMP. Per ciascun record Oracle APEX ha automaticamente creato un bottone Edit.

Cliccando sul bottone Edit di uno qualsiasi dei record si apre una Form che consente di modificare i campi. Per salvare le modifiche devi premere Apply Changes.

Crea una Interactive Grid basata su una Tabella

Una Interactive Grid è un componente di Oracle APEX che consente di modificare i dati di una tabella senza passare da una Form.

  • Accedi all’APP Builder e clicca Create Page.
  • Seleziona Interactive Grid e premi Next
  • Seleziona le opzioni di configurazione seguenti e premi Next
    • Name: Employees Table
    • Source Type: Table
    • Table / View Name: EMP
    • Editing Enabled: Yes
  • Specifica la Chiave Primaria e premi Create Page.

In questo caso Oracle APEX creerà una sola pagina con contiene un componente di tipo Interactive Grid.

Se lanci la Page Preview dovresti vedere una tabella all’interno della quale puoi modificare i dati. Quando hai fatto devi premere Save per salvare i dati nel database.

Per aggiungere un nuovo record devi premere Add Row mentre per cancellare un record devi cliccare sul menù Row Actions e poi clicca Delete Row

Premi Save per confermare la creazione o eliminazione del record.

Come usare le Vista o Query SQL nelle Form Page e Interactive Grid

Negli esempi che abbiamo visto sia la Form Page che l’Interactive Grid sono state collegate direttamente ad una tabella del database.

Ma cosa succede se invece utilizzo una Vista oppure una Query SQL?

Facciamo una prova con una Interactive Grid (il concetto è lo stesso anche per una Form).

  • Accedi all’APP Builder e clicca Create Page.
  • Seleziona Interactive Grid e premi Next.
  • Nella sezione Data Source, anziché una tabella, specifica la vista EMP_DEPT_V
  • Attiva l’opzione Editing Enabled e premi Next
  • Seleziona la Primary Key EMPNO e premi Create Page.

Fin qui, penserai, niente di diverso da quanto già visto, giusto?

Purtroppo per noi, non è così e ce ne accorgiamo subito quando proviamo a modificare un record.

Appare un messaggio abbastanza criptico che recita ORA-01733: virtual column not allowed here

Cosa sta a significare questo errore e, soprattutto, come si risolve?

Vediamolo insieme.

Come correggere l’errore ORA-01733: virtual column not allowed here

L’errore ORA-01733: virtual column not allowed here viene generato da Oracle APEX quando si verificano contemporaneamente queste due condizioni:

  • l’Origine Dati è una Vista o una Query SQL che recupera le informazioni da più tabelle contemporaneamente.
  • il salvataggio dei dati è gestito tramite un Page Process di tipo Automatic Row Processing

Questo particolare tipo di Page Process è quello che Oracle APEX utilizza di default quando crei una Form o una Interactive Grid usando la procedura guidata (esattamente quello che abbiamo fatto noi).

Puoi controllare com’è fatto questo Page Process nel modo seguente:

  • Accedi all’APP Builder ed apri il Page Builder della pagina APEX in cui hai definito l’oggetto Form o IG
  • Clicca su Page Processes
  • Seleziona il Page Process che nel caso di una IG si chiama Employees – Save Interactive Grid Data

Ti faccio notare che il Process Type è di tipo Interactive Grid – Automatic Row Processing (DML)

In maniera del tutto analoga, per una Form il Page Process creato automaticamente sarà di tipo Form – Automatic Row Processing (DML): il nome è leggermente diverso ma la sostanza non cambia.

Ebbene questi tipi di Page Process funzionano come ci aspettiamo (ovvero salvano i dati nel database) se l’Origine Dati è una tabella e nella rispettiva Form o IG è stata specificato il Page Item che rappresenta la Primary Key della tabella.

Controlliamo, ad esempio, il Page Item PX_EMPNO della Form Page che abbiamo creato pochi minuti fa.

Nella sezione Source, oltre ad aver specificato a quale colonna della tabella è collegata, è indicato che il campo è una Primary Key.

Quando l’Origine Dati, invece, è una Vista (o una Query SQL) non possiamo usare questo tipo di Page Process.

Per risolvere l’errore ORA-01733: virtual column not allowed here dobbiamo gestire il salvataggio dei dati nel database usando un Page Process di tipo PL-SQL.

Come costruire un Page Process di tipo PL-SQL

Un Page Process di tipo PL-SQL è sicuramento il modo più flessibile che hai a disposizione per eseguire nel database tutte le operazioni che servono quando l’utente preme il bottone “Salva”.

Tuttavia, per essere realizzato richiede da parte tua un po’ di dimestichezza con il PL-SQL e, in generale, con le istruzioni SQL del database Oracle.

Se non sai come sviluppare codice in PL-SQL ti consiglio di leggere questa guida che ho scritto per tutti coloro che desiderano imparare ad usarlo.

In ogni caso, non preoccuparti perché ti fornirò io tutte le istruzioni necessarie per completare questo tutorial.

Sei pronto? Iniziamo!

Lo script di base che da cui devi partire per gestire il salvataggio dei dati nel database è il seguente.

begin
    if :apex$row_status = 'D' then 
      -- DELETE the record 
  
    elsif :apex$row_status = 'U' then
   -- UPDATE the record 
    elsif :apex$row_status = 'C' then
      -- INSERT the record 
    end if;
end;

In sostanza, consiste un una concatenazione di istruzioni IF-ELSE per ciascuna delle quali viene valutata una condizione sulla variabile applicativa :apex$row_status

Senza voler scendere troppo nel dettaglio, ti basta sapere che usando questo script PL-SQL, quando premi il bottone “Salva”, Oracle APEX valorizza automaticamente la variabile :apex$row_status con uno tra i valori possibili:

  • D quando si cancella un record
  • U quando si aggiorna un record
  • C quando si crea un record

A questo punto non resta che completare lo script inserendo nei rispettivi blocchi le istruzioni SQL che servono rispettivamente per cancellare, aggiornare e creare un record nella tabella di destinazione.

Trattandosi di uno script PL-SQL puoi ovviamente aggiungere tutte le istruzioni che vuoi per aggiornare anche più tabelle in un colpo solo.

Per passare allo script PL-SQL i parametri della pagina dovrai usare la classica notazione che si usa per fare questo tipo di operazione :<PAGE_ITEM>.

Inoltre ti consiglio di convertire i campi di tipo NUMBER e DATE usando rispettivamente le istruzioni TO_NUMBER e TO_DATE.

Qui sotto trovi l’esempio completo che useremo per gestire il salvataggio dei dati.

begin
    if :apex$row_status = 'D' then 
      -- DELETE the record 
        delete from emp
        where empno = :empno;
    elsif :apex$row_status = 'U' then
   -- UPDATE the record 
        update emp
        set ename = :ename,
            job = :job,
            hiredate = to_date(:hiredate, 'DD-MON-RR'),
            sal = :sal,
            comm = :comm
        where
            empno = :empno;
    elsif :apex$row_status = 'C' then
      -- INSERT the record 
        insert into emp (
            ename, job, hiredate, sal, comm
        ) values (
            :ename, :job, to_date(:hiredate, 'DD-MON-RR'), :sal, :comm
        );
    end if;
end;

Carichiamo in Oracle APEX l’istruzione PL-SQL

  • Accedi al Page Builder della pagina APEX contenente l’Interactive Grid e seleziona il campo HIREDATE
  • Vai in Appearance e configura il formato DD-MON-RR (o quello che più ti piace, l’importante è usare lo stesso formato nell’istruzione TO_DATE dello script)
  • Vai in Processes e seleziona il Page Process Employees – Save Interactive Grid Data
  • Cambia Process Type a Execute Code ed incolla nel campo PL/SQL Code lo script PL-SQL che ti ho dato.

Adesso, se provi ad eseguire la pagina, potrai modificare e salvare i dati senza problemi.

Come rendere le colonne di una Interactive Grid non modificabili.

Talvolta è necessario far si che alcune colonne di una IG non siano modificabili dall’utente.

Per raggiungere questo obiettivo ci sono diverse opzioni, vediamone alcune.

La prima consiste nel cambiare l’Item Type del Page Item associato alla colonna che vogliamo rendere non modificabile.

Quello che devi fare è cliccare sul Page Item e cambiarne il tipo a Display Only.

Come effetto otterrai che la relativa colonna dell’Interactive Grid sarà sempre non modificabile

Un altro metodo che puoi usare si basa sulla configurazione della proprietà Read Only.

Rispetto al metodo precedente hai un maggiore grado di flessibilità perché puoi definire delle condizioni personalizzate in base alle quali far scattare o meno l’applicazione della proprietà Read Only.

Facciamo un esempio concreto.

Supponiamo di voler rendere uno specifico campo dell’Interactive Grid non modificabile se ENAME=KING. Possono configurare la proprietà Read Only in questo modo:

  • Type: Item = Value
  • Item: ENAME
  • Value: King
  • Execute: For Each Row

L’effetto finale sarà che il campo ENAME (e tutti quelli che desidero) saranno Read-Only solo per quei record che soddisfano la condizione che è stata configurata

Ricorda che le tipologie di condizione che puoi usare sono diverse; ad esempio, il tipo Expression è quella che ti permette di creare condizioni basate su espressioni PL-SQL.

Ecco come costruire la stessa condizione usando una espressione in PL-SQL

Come attivare o disattivare i tipi di Operazioni

L’ultima cosa che voglio spiegarti riguarda un metodo attraverso il quale puoi controllare il tipo di operazioni CRUD che sono ammesse dalla tua Form e, ovviamente, Interactive Grid.

Quello che andrà a spiegarti vale per entrambi gli oggetti. Per comodità userò una IG.

  • Accedi al Page Builder e seleziona l’Interactive Grid
  • Clicca su Attributes
  • Vai alla sezione Edit per attivare o disattivare la possibilità di eseguire le operazioni di INSERT, UPDATE o DELETE

Disattivando, ad esempio, l’opzione Add Row, il bottone per aggiungere una nuova riga non sarà più disponibile

In maniera del tutto analoga puoi disattivare anche la cancellazione o la modifica di un record: la cosa importante che devi sapere è che questa impostazione viene applicata a tutta la griglia.

Oltre a quello che ti ho spiegato, è possibile far si che i tipi di operazione ammessi su un record vengano gestiti dinamicamente.

Supponiamo, a tal proposito, di voler impedire che un utente possa cancellare il record KING. Possiamo costruire questo vincolo usando l’opzione Allowed Row Operations Column.

  • Accedi al Page Builder e seleziona l’Interactive Grid
  • Vai all’Origine Dati ed inserisci la seguente Query SQL che aggiunge la colonna virtuale ALLOWED_ROW_OPERATION.
    • Se il record è KING allora il valore restituito dalla query sarà U (Update)
    • In tutti gli altri casi restituisce il valore UC (Update & Create)
select EMPNO,
       ENAME,
       JOB,
       MGR,
       HIREDATE,
       SAL,
       COMM,
       DEPTNO,
       DNAME,
       LOC,
       (case when ENAME = 'KING' then 'U' else 'UD' end) allowed_row_operation
  from EMP_DEPT_V
  • Clicca su Attributes e nella sezione Edit configura la proprietà Allowed Row Operations Column come in figura

Ora esegui la pagina. Se apri il menù di riga l’opzione Delete Row sarà disabilitata su quei record per i quali il valore della colonna ALLOWED_ROW_OPERATION è U

Invece per tutti gli altri record sarà abilitata normalmente

Conclusioni

Abbiamo terminato anche questo tutorial, adesso dovresti sapere tutto quello che ti serve per gestire il salvataggio dei dati di una Form o di una Interactive Grid realizzata con Oracle APEX.

Fammi sapere nei commenti se anche tu hai qualche trucchetto nel cassetto su come gestire il salvataggio dei dati nel database, mi farebbe molto piacere.

Al prossimo articolo!

Un abbraccio,

Daniele

TI POTREBBE INTERESSARE:

  • CPQ in Oracle APEX
  • Come migrare le applicazioni da Oracle Forms ad Oracle APEX
  • Come gestire i files su Object Storage da Oracle APEX
  • Come sviluppare applicazioni sicure con Oracle APEX
  • Costruiamo un CRM con Oracle APEX
  • 5 Modi per Cercare i Dati in Oracle APEX

oracle apex, PL-SQL

Interazioni del lettore

Lascia un commento Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Barra laterale primaria

BENVENUTO!

Il mio nome è Daniele Trasarti, autore di APPin5Minuti, il blog italiano che parla di piattaforme di Oracle APEX e applicazioni low-code.

Qui troverai tantissimi tutorial e risorse per imparare a sviluppare in pochissimo tempo bellissime applicazioni per gestire i dati ed i processi della tua azienda.

Se vuoi saperne di più inizia da qui.

Seguimi sui social!

  • LinkedIn
  • Twitter

NEWSLETTER

Iscriviti anche tu per far parte della più grande community italiana di persone che amano sviluppare low-code!

api rest appsheet appsheet data sources appsheet views appsheet workflow automation autonomous database build apps cpq crm css cyber security database dynamic layout facebook flowform flows4apex google google cloud interactive grid interactive report javascript list microsoft microsoft access mobile oracle oracle apex oracle cloud oracle rest data service ords pl-sq PL-SQL power apps product configurator sales configurator security social login software gestionale sql theme roller ux woocommerce wordpress workflows

COMMENTI RECENTI

  1. Daniele Trasarti su Oracle APEX: come creare un’applicazione web in 5 minuti

    Ciao Sabatino, grazie per l'apprezzamento. Riguardo alla tua domanda ti consiglio di usare Oracle Cloud. Puoi creare un account gratis…

  2. Sabatino Iannazzo su Oracle APEX: come creare un’applicazione web in 5 minuti

    Ciao Daniele, complimenti per la guida, mi hai aperto un mondo! volevo chiederti se con Apex e Oracle Database Express…

  3. Laura su Autenticazione a 2 Fattori basata su TOTP (Time-based One-time Password) con Oracle APEX

    Ciao, trovo molto interessante il tuo articolo. Hai qualche suggerimento per l'autenticazione con spid? pensi di fare qualche guida al…

  4. Mario Volpetti su Oracle APEX: come creare un’applicazione web in 5 minuti

    Ottima spiegazione e complimenti per la semplicità che ai usato. Sono riuscito a farlo anche io con un foglio excel…

  5. Riccardo Liviabella su Google AppSheet: come creare una APP Mobile da un foglio Excel in 5 minuti

    Ciao Daniele e grazie per le tue interessanti spiegazioni. E' da un pò di anni che lavoro su Appsheet e…

  6. Daniele Trasarti su Come costruire Workflows Approvativi in Oracle APEX

    Ciao Bhavin, I think you badly copied PL-SQL because the one you provided is not correct. Fix the script and…

  7. Daniele Trasarti su Applicazione di Prenotazione Appuntamenti in Oracle APEX

    Grazie mille Franca!

Copyright © 2023 · APPin5Minuti.it · Privacy Policy · Cookie Policy