Xpages , @DbColumn e limite a 64k
Il famigerato limite dei 64k quando si usa un @DBColumn in Notes
è ormai ben noto a tutti quanti ed il famoso messaggio
“The specified database lookup generated more than 65,000 bytes of results,
which is too large for Notes to handle in this context.”
è prima o poi comparso a tutti.
Nelle Xpages il problema non è scomparso in quanto comunque c’è la possibilità di usare la funzione @DbColumn anche in questo contesto ma il problema è leggermente più subdolo in quanto , in alcuni casi, non riceverete nessun messaggio di errore come quello sopra ma semplicemente quanto avete implementato smette di funzionare.
E’ quello che mi è appena successo mentre sviluppavo una semplice funzione di typeahead che doveva restituirmi una serie di codici prodotto presi da un’altra vista con questa formula: @DbColumn(@DbName() , “prodotti” , 1).
Al momento in cui la lista dei codici prodotto è divenuta troppo corposa la funzionalità di typeahead ha semplicemnet smesso di funzionare. In aggiunta avevo anche una validation basata sullo stesso criterio
@IsMember(getComponent(“codArt”).getSubmittedValue() , @DbColumn(@DbName() , “prodotti” , 1) )
ed anche questa non restituiva un errore ma continuava a rispondere che la validazione falliva, come se avessi inserito un valore errato.
Per fortuna, almeno nelle XPages, la soluzione c’è ed è possibile andare a prendere tutti i valori di una colonna in una vista specificata senza ricorrere ad un @DBColumn:
var lookupView:NotesView = database.getView("codpro"); var lista = lookupView.getColumnValues(0);
in pratica istanzio una vista come base di partenza per recuperare i dati che voglio (nella prima colonna) e poi mi creo una var lista (che sarà ovviamente un’array) prendendo tutti i valori presenti nella prima colonna. E’ esattamente come fare un @DBColumn ma ne aggira il limite.
Quindi l’ho inserita come lista di suggestions nella typeahead :
e poi l’ho riutilizzata anche nella validation:
var lookupView:NotesView = database.getView("codpro"); var lista = lookupView.getColumnValues(0); @IsMember(getComponent("codArt").getSubmittedValue() , lista )
Ovvio che tutto questo può generare una problema di performances , specialmente se la funzionalità di typeahead ritorna un’array molto grande nel calcolo delle suggestions, ma è un prezzo da pagare…
Un grazie a questo post che mi ha messo sulla strada giusta in modo veloce !