HCL Leap : tables and services
In HCL Leap si possono usare i Servizi per recuperare dati dall’applicazione corrente o da altre applicazioni Leap o Domino esistenti , integrando così le varie fonti di dati presenti.
E’ uno strumento molto comodo anche perchè tutta la configurazione di un servizio viene fatta in modalità guidata dall’interfaccia di design di Leap e quindi non c’è bisogno di scrivere codice.
Un’altra caratteristica interessante di HCL Leap sono le tabelle , elementi di design che si possono inserire all’interno di una form per compilare dei record collegati alla form principale: pensate ai documenti response di Notes ed avrete un’idea di cosa sono le tabelle di Leap e come si possono usare.
Purtroppo però ho scoperto che i due elementi non vanno d’accordo insieme : da un record inserito tramite una tabella non è possibile agganciare un servizio per compilare i dati.
Provate a pensare ad una form che raccoglie i dati di un ordine dove le singole righe dell’ordine sono compilate appunto tramite una tabella . La logica di un’applicazione di questo tipo dovrebbe prevedere che la singola riga utilizzi un servizio per collegarsi al listino prezzi aziendali da cui prelevare i dati di un articolo (descrizione, prezzo ecc.).
Ecco, questa operazione non è attualmente possibile proprio perchè da una tabella non è possibile agganciare un servizio (e io suggerirei ad HCL di pensare a come eliminare questa limitazione).
Esiste però un modo per aggirare questa limitazione riuscendo ad avere il comportamento desiderato nella tabella.
Voglio prima di tutto ringraziare Marty Lechleider, autore di questo articolo che mi ha aiutato a risolvere il problema.
Il concetto è semplice : se una tabella di HCL Leap non può utilizzare il servizio la cosa è però possibile dalla form sottostante . Inoltre la tabella può ricavare dati dalla forma sottostante e quindi possiamo utilizzare la form come tramite per avere i dati in tabella.
Questa è la sequenza che ho seguito:
Nella form creo due campi (descrizione e prezzo) che chiamo :
F_TempDescrizione e F_TempPrezzo .
Entrambi i campi saranno poi nascosti.
Il campo F_TempDescrizione è un dropdown le cui opzioni di scelta vengono popolate tramite un servizio con l’elenco dei prodotti di listino
Sempre il campo F_TempDescrizione richiama un altro servizio collegato all’evento onItemChange che mi popola il campo F_TempPrezzo sempre dal listino in base al valore selezionato
nella descrizione.
Fin qui tutto standard e senza problemi.
Poi creo la tabella in cui ho i due campi equivalenti F_DescrizioneTabella e F_PrezzoTabella e qui applico il codice che mi gestisce i due campi nascosti nella form:
Nell’evento onShow del campo F_DescrizioneTabella leggo le opzioni (scelte) dal campo F_TempDescrizione della form sottostante:
item.setOptions( app.getForm('F_FormOrdine').getPage('P_Dettagli').F_TempDescrizione.getOptions() );
poi nell’evento onChange del campo F_DescrizioneTabella della tabella vado a scrivere prima questa riga
app.getForm('F_FormOrdine').getBO().F_TempDescrizione.setValue(BOA.getValue());
che cambia il valore di F_TempDescrizione della form al cambiare di F_Descrizione nella tabella.
Poichè il campo F_TempDescrizione ha servizio che popola il campo F_TempPrezzo questo si aggiornerà automaticamente.
L’ultima cosa che mi manca è leggere questo valore aggiornato e lo faccio tramite questo codice (sempre nell’evento onChange del campo F_Descrizione , subito sotto alla riga appena aggiunta)
var servizio = app.getForm('F_FormTicket').getServiceConfiguration('SC_ServiceConfig7'); servizio.connectEvent("onCallFinished", function(success) { if(success) { var p = app.getForm('F_FormOrdine').getPage('P_Dettagli').F_TempPrezzo.getValue(); BO.F_PrezzoTabella.setValue(p); } });
A cosa serve? Nella var servizio viene referenziato il servizio che aggiorna il prezzo, poi ho un piccolo listener onCallFinished che attenda il completamento del chiamata al servizio.
Subito dopo legge il valore nel campo F_TempPrezzo della form e lo scrive nel campo F_PrezzoTabella della tabella.
E così anche questo problema ha trovato la sua soluzione