Report in modalità Editing
copia linkTrascrizione
Abbiamo conosciuto i report sia come oggetti statici per la stampa che come oggetti dinamici con elementi cliccabili: è possibile spingersi oltre in quanto i report possono essere anche editabili.
Nel nostro esempio vorremmo poter editare il Nominativo del Cliente per sostituirlo alla prenotazione: l’operazione deve essere consentita quando la card è sbloccata con il relativo pulsante.
Rendere editabile il nominativo vorrebbe dire prevedere una combo box, in modo tale che l’utente possa scegliere tra i clienti memorizzati quello opportuno. A differenza dei pannelli dove è possibile creare Query Liste Valori direttamente in progettazione, i report non prevedono questa possibilità e bisogna creare tutto via codice.
Possiamo tornare al progetto e precisamente nella videata Situazione, Libro Situazione.
Per cominciare dobbiamo modificare il valore associato allo span Nominativo; il campo di riferimento non può essere la stringa Nominativo ma deve essere la chiave idUtente. Quindi doppio clic sul Nominativo, eliminiamo il campo Nominativo ed impostiamo il campo idUtente. Confermo.
Se non scrivessimo codice il report mostrerebbe il valore idUtente e non, ovviamente, il Nominativo: quindi è necessario scrivere del codice per decodificare ogni record in stampa con il valore corretto.
Vorrei però evitare di eseguire una query per ogni card stampata, meglio prevedere una variabile Collection che contenga l’elenco Utenti in memoria e che venga analizzata ad ogni giro di stampa.
Quindi, Videata Situazione, tasto destro, Aggiungi variabile globale.
Nome: Collection Clienti
Tipo di dati: Object
Libreria: IDCollection
Oggetti contenuti: Utente
Implementiamo, sempre a livello di videata, una procedura: tasto destro, Aggiungi Procedura.
La procedura dovrà caricare e quindi valorizzare la collection che abbiamo appena definito:
Richiameremo questa procedura nell’evento Activate di videata e non nell’evento Load. Così, ogni volta che l’utente tornerà sulla videata ricarichiamo dal database l’elenco Clienti che, nel frattempo, potrebbe anche essere cambiato.
Quindi, Videata Situazione, Eventi, Aggiungi Activate.
Dunque, la variabile CollectionClienti contiene l’elenco, elenco che useremo per implementare la decodifica del valore idUtente, o meglio, per la creazione della Lista Valori associata allo Span idUtente.
Intercettiamo, sul Report Situazione, l’evento Before Formatting della sezione Dettaglio:
Lo span idUtente dovrà essere reso editabile, a seconda, diciamo, dello stato del record corrispondente al pulsante di Lock presente nell’interfaccia.
Per fare questo, passiamo al documento Prenotazione ed aggiungiamo una proprietà che sarà una proprietà Transient. (Quindi, non collegata al database.)
Albero di progetto, Comp You Bb, documento di Prenotazione, Tasto destro, Aggiungi variabile globale.
Qui aggiungiamo quindi una nuova proprietà e impostiamo come nome Editabile, come tipo Boolean e non dimentichiamoci di impostare Transient, Visible e Public, altrimenti la proprietà non sarà utilizzabile nel modo corretto. Questa nuova proprietà indicherà lo stato di Editing del documento, quindi: TRUE = Editabile, FALSE = In sola lettura.
Torniamo al Report per includere la nuova proprietà tra le colonne della Master Query Report Situazione: doppio clic sulla Master Query ed aggiungiamo anche questa colonna, la colonna Editabile.
In quale evento dovremmo decidere se lo SPAN sarà abilitato o meno? Al solito, nell’evento Before Formatting della sezione di Dettaglio.
Come notate rendere editabile uno span del report è una operazione semplice, perchè basta impostare la proprietà enabled: se allo span è attaccata una lista valori verrà mostrata una combobox, altrimenti verrà proposta una input classica.
Ultimo step è consentire la modifica della proprietà Editabile.
Nel nostro esempio vorremmo poter editare il Nominativo del Cliente per sostituirlo alla prenotazione: l’operazione deve essere consentita quando la card è sbloccata con il relativo pulsante.
Rendere editabile il nominativo vorrebbe dire prevedere una combo box, in modo tale che l’utente possa scegliere tra i clienti memorizzati quello opportuno. A differenza dei pannelli dove è possibile creare Query Liste Valori direttamente in progettazione, i report non prevedono questa possibilità e bisogna creare tutto via codice.
Possiamo tornare al progetto e precisamente nella videata Situazione, Libro Situazione.
Per cominciare dobbiamo modificare il valore associato allo span Nominativo; il campo di riferimento non può essere la stringa Nominativo ma deve essere la chiave idUtente. Quindi doppio clic sul Nominativo, eliminiamo il campo Nominativo ed impostiamo il campo idUtente. Confermo.
Se non scrivessimo codice il report mostrerebbe il valore idUtente e non, ovviamente, il Nominativo: quindi è necessario scrivere del codice per decodificare ogni record in stampa con il valore corretto.
Vorrei però evitare di eseguire una query per ogni card stampata, meglio prevedere una variabile Collection che contenga l’elenco Utenti in memoria e che venga analizzata ad ogni giro di stampa.
Quindi, Videata Situazione, tasto destro, Aggiungi variabile globale.
Nome: Collection Clienti
Tipo di dati: Object
Libreria: IDCollection
Oggetti contenuti: Utente
Implementiamo, sempre a livello di videata, una procedura: tasto destro, Aggiungi Procedura.
La procedura dovrà caricare e quindi valorizzare la collection che abbiamo appena definito:
Void caricaClienti() {
//Variabile di Filtro
Utente docFiltro = null
docFiltro = new
CollectionClienti = new
//Carichiamo tutti i clienti
docFiltro.loadCollectionByExample(CollectionClienti)
}
Richiameremo questa procedura nell’evento Activate di videata e non nell’evento Load. Così, ogni volta che l’utente tornerà sulla videata ricarichiamo dal database l’elenco Clienti che, nel frattempo, potrebbe anche essere cambiato.
Quindi, Videata Situazione, Eventi, Aggiungi Activate.
Event Activate() {
caricaClienti();
}
Dunque, la variabile CollectionClienti contiene l’elenco, elenco che useremo per implementare la decodifica del valore idUtente, o meglio, per la creazione della Lista Valori associata allo Span idUtente.
Intercettiamo, sul Report Situazione, l’evento Before Formatting della sezione Dettaglio:
Event ReportSituazione.Dettaglio.BeforeFormatting() {
//Ricordo che il contenitore della lista valori e quindi dei valori è lo SPAN e non la BOX
idUtente.emptyValueList();
//Ciclo sulla Collection
For each UTENTE recUtente of CollectionClienti {
idUtente.setSpanValueListItem(recUtente.NOMINATIVO, recUtente.NOMINATIVO, recUtente.ID)
}
//Quando lo SPAN sarà editabile verrà mostrata la ComboBox con gli elementi, altrimenti verrà semplicemente decodificato il valore.
}
Lo span idUtente dovrà essere reso editabile, a seconda, diciamo, dello stato del record corrispondente al pulsante di Lock presente nell’interfaccia.
Per fare questo, passiamo al documento Prenotazione ed aggiungiamo una proprietà che sarà una proprietà Transient. (Quindi, non collegata al database.)
Albero di progetto, Comp You Bb, documento di Prenotazione, Tasto destro, Aggiungi variabile globale.
Qui aggiungiamo quindi una nuova proprietà e impostiamo come nome Editabile, come tipo Boolean e non dimentichiamoci di impostare Transient, Visible e Public, altrimenti la proprietà non sarà utilizzabile nel modo corretto. Questa nuova proprietà indicherà lo stato di Editing del documento, quindi: TRUE = Editabile, FALSE = In sola lettura.
Torniamo al Report per includere la nuova proprietà tra le colonne della Master Query Report Situazione: doppio clic sulla Master Query ed aggiungiamo anche questa colonna, la colonna Editabile.
In quale evento dovremmo decidere se lo SPAN sarà abilitato o meno? Al solito, nell’evento Before Formatting della sezione di Dettaglio.
Event ReportSituazione.Dettaglio.BeforeFormatting() {
//NELL’EVENTO ABILITIAMO E DISABILITIAMO LO SPAN E MODIFICHIAMO L’ICONA DEL BOTTONE LUCCHETTO
//DICHIARIAMO UNA VARIABILE CHE CONTENGA IL DOCUMENTO PRENOTAZIONE
Prenotazione docPrenotazione = ReportSituazione.document;
//DICHIARO UNA VARIABILE PER IL NOME DELL’IMMAGINE
String iconName = ‘’
if (docPrenotazione != NULL) {
if (nullvalue(docPrenotazione.EDITABILE, false) = true ) {
spanIDUtente.enabled = true
//Icona con lucchetto aperto
iconName = “my_lock_open.png”
}
Else {
//Icona con lucchetto chiuso
iconName = “my_lock_close.png”
spanIDUtente.enabled = false
}
Mylockclose.setimage(iconName);
}
}
Come notate rendere editabile uno span del report è una operazione semplice, perchè basta impostare la proprietà enabled: se allo span è attaccata una lista valori verrà mostrata una combobox, altrimenti verrà proposta una input classica.
Ultimo step è consentire la modifica della proprietà Editabile.
Tutto avverrà utilizzando la box MyLockClose che per iniziare dovrà essere Cliccabile. Quindi, doppio clic su MyLockClose e attiviamo il flag Cliccabile presente nelle proprietà Visuali.
Adesso agganciamo una procedura alla box: tasto destro, Aggiungi Procedura.
Void myLockClose() {
//Recuperiamo subito il documento del report
Prenotazione docPrenotazione = ReportSituazione.document;
if (docPrenotazione != null) {
if (nullvalue(docPrenotazione.Editabile, false) = false) {
//La card deve essere editabile
docPrenotazione.Editabile = true;
LibroSituazione.refresh(1; -1)
}
Else {
//La card è da bloccare, vediamo se posso
Boolean saveCard = docPrenotazione.saveToDb();
if (saveCard) {
docPrenotazione.Editabile = false;
LibroSituazione.refresh(1; -1)
}
Else {
Messagebox(‘Non è possibile assegnare il nominativo alla prenotazione’);
}
}
}
}
Come avrete notato la realizzazione di una interfaccia grafica è l’insieme di diversi processi e di diversi eventi: il consiglio che posso darvi è sicuramente quello di avere a priori il prototipo da realizzare e non improvvisare senza avere le idee chiare sul risultato da ottenere.
Proviamo a compilare e vediamo il risultato, col tasto F5 o col Menu Modifica, Compila.
Offerte, Situazioni, sblocco, combo box, cambio, riblocco e l’operazione sembra corretta e avvenuta nel modo in cui ci aspettavamo.
Ultima modifica: 15/06/2021 / Validità: da 21.0.8100