Fabio Di Paola

Xpages , @DbColumn e limite a 64k

20 Luglio 2021 Notes Sviluppo 0

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 !