Lista valori o input libero? Una soluzione ibrida

Ciao a tutti,
vorrei condividere con voi una semplice modalità che ho utilizzato per permettere all’utente di scegliere il valore di un campo da una lista ma, se necessario, anche di inserire un valore non presente tra quelli proposti.

In questo esempio ho un oggetto Voce che contiene la proprietà ClassificazioneCausale e un pannello Voce che consente di modificare questo oggetto.

L’idea è costruire dinamicamente la lista dei valori esistenti e aggiungere una voce speciale che permetta all’utente di inserire una nuova classificazione. La soluzione richiede poche righe di codice in due punti.

Inizializzazione del campo (SendMessage)

Nel metodo SendMessage inizializzo la value list del campo:

Voce.ClassificazioneCausale.clearValueList()
boolean b = false

for each row (readonly)
{
  select distinct
     valore = ClassificazioneCausale
  from 
     Voci // master table
  where
     !(isNull(ClassificazioneCausale))
     Lista = CausaliAttività

  Voce.ClassificazioneCausale.addValueListItem(valore, valore, ...)
  b = true
}

if (b)
{
  Voce.ClassificazioneCausale.addValueListItem("#new#", "(Nuova classificazione)", ...)
}

Il piccolo “trucco” qui è aggiungere una voce fittizia: (Nuova classificazione).
Questa voce non rappresenta un valore reale, ma serve solo per intercettare il caso in cui l’utente voglia inserire una nuova classificazione.

Gestione della scelta (OnUpdatingRow)

Nel pannello, nell’evento OnUpdatingRow, intercetto la selezione della voce speciale:

if (Column = Voce.ClassificazioneCausale.me())
{
  if (FieldModified = true)
  {
     if (Voce.ClassificazioneCausale = "#new#")
     {
       Voce.ClassificazioneCausale = null
       Voce.ClassificazioneCausale.clearValueList()
       Voce.ClassificazioneCausale.setFocus(true)
     }
  }
}

Se l’utente seleziona “Nuova classificazione”, il campo viene svuotato, liberato dalla value list e rimesso in focus. A quel punto l’utente può digitare liberamente il nuovo valore.

Non è una soluzione perfetta, ma nella sua semplicità funziona bene e permette all’utente di usare classificazioni già esistenti oppure crearne di nuove al volo, senza introdurre troppa complessità nel pannello.

Sono curioso di sapere cosa ne pensate e, soprattutto, se qualcuno ha affrontato lo stesso problema in modo diverso o con una soluzione migliore :grinning_face_with_smiling_eyes:

4 Mi Piace

Ho usato un giro diverso:
. Il campo di lookup blocca la scelta sui valori presenti in tabella. Preferisco una smart lookup perché ottimizza il caricamento con grande popolosità e se basata su classe permette di ottimizzare le qry per ogni record visualizzato.
. Sulla dx del campo di lookup un bottone che apre una modale che permette l’inserimento di un nuovo valore in tabella. In questo modo posso permettere l’inserimento solo a chi è autorizzato e gestirne la validazione.
. Al close con conferma della modale: aggiungo il nuovo valore ed eseguo un refresh delle lookup.

In generale, credo che la differenza stia nella presenza o meno di un vincolo su fk a livello db.
La soluzione che ho adottato è più macchinosa per l’utente, ma così riesco a rispettare i vincoli di integrità su db.

3 Mi Piace