Caselle combinate, maschere continue e sfarfallio

di il
10 risposte

Caselle combinate, maschere continue e sfarfallio

Buongiorno a tutti.

Sto ultimando un database che fungerà da gestionale per lo studio veterinario presso il quale lavoro.
Il progetto è in fase avanzata di sviluppo e ho incominciato a popolare la tabelle con i dati che serviranno al suo funzionamento.
Ho cominciato a notare alcuni problemi di cui vorrei discutere con voi e magari riuscire a trovare soluzioni alternative a quelle che ho scelto io.

Il problema maggiore lo riscontro in una maschera che serve all'immissione di dati per la preparazione del conto da presentare al cliente. Nella maschera l'utente deve scegliere il cliente (il proprietario dell'animale portato in visita), il paziente (l'animale, che può essere uno o più di uno visto che capita sovente che i proprietari portino diversi animali in visita) e i vari prodotti e prestazioni che eroghiamo al paziente.

Le relative tabelle contengono numerosi record. Una volta immessi tutti i clienti, arriveranno probabilmente nell'ordine del migliaio. I prodotti e prestazioni sono sicuramente più numerosi, in quanto (a differenza di ciò che avviene in Italia), in Svizzera, dove risiedo, i veterinari vendono direttamente medicinali e cibo. Quindi il nostro catalogo è molto ampio.

Al momento attuale sto gestendo l'immissione dei dati in maschera attraverso combobox. Quindi una combobox per la scelta del cliente, una per la scelta del paziente ed una per la scelta del prodotto/prestazione.
Ad alcune di queste ho associato all'evento "su modifica" del codice, come questo:
Private Sub cboIDProdotto1_Change()
Application.Echo False
Dim strR As String
Dim strsql As String

Me!cboIDProdotto1.SetFocus
strR = Me!cboIDProdotto1.Text
If Not IsNull(Me!cboIDProdotto1.Text) Then
    strsql = "SELECT tabProdotti.IDProdotto, tabProdotti.Descrizione" & _
            " FROM tabProdotti" & _
            " WHERE (tabProdotti.Descrizione LIKE " & Chr$(34) & "*" & strR & "*" & Chr$(34) & ")" & _
            " ORDER BY tabProdotti.Descrizione; "
    Me!cboIDProdotto1.RowSource = strsql
    Me.cboIDProdotto1.Dropdown
End If
Application.Echo True
End Sub
che serve alla ricerca dei nomi dei prodotti che contengono la stringa digitata e non solo quelli che iniziano con quella particolare stringa.

Uso inoltre diverse suform in modalità maschera continua ( ad esempio quella che visualizza l'elenco dei prodotti immessi.

Ecco uno screen per farvi un'idea.



Dal punto di vista tecnico la cosa funziona ma ci sono diversi problemi.
Il maggiore è la presenza di fastidiosi sfarfallii, soprattutto durante la digitazione della stringa nelle combobox a cui ho provato a porre rimedio (senza riuscirci) con
Application.Echo False
come mostrato prima. Non so se avete alternative.
Stavo inoltre riflettendo sulla scelta di utilizzare combobox che contengono elenchi così ampi. Ho paura che una volta popolate le tabelle access faccia fatica a caricare la maschera e a gestire tutti i dati.
Ho pensato che potrei sostituirle con listbox ma non so se la cosa potrebbe risolvere il problema.
Mi sembra anche di aver capito che la maschere continue siano abbastanza problematiche. Ad esempio quando digito del testo della combobox per la scelta del prodotto ho un continuo refresh della subform che elenca i pazienti che mi fa perdere il focus sul paziente selezionato in quel momento.
Anche in questo caso mi chiedevo se passare al foglio dati potrebbe essere una valida alternativa.

Voi cosa ne pensate? Come gestireste il tutto?

Grazie per i vostri consigli!

10 Risposte

  • Re: Caselle combinate, maschere continue e sfarfallio

    Intervengo perchè non lo sta facendo proprio nessuno.
    Io non ho chiara la struttura tabelle-relazioni. So che hai esposto tutto in altro thread, ma occorre che tu sia chiaro sempre in ogni nuovo thread, come fosse una discussione a sè.
    Personalmente non amo mettere "tutto insieme" come hai fatto tu. Da molti anni evito categoricamente la visualizzazione maschera/sottomaschera/sotto-sottomaschera su 3 livelli. Preferendo quest'ultima come "maschera collegata". Con logica e filosofia analoga tendo pure a separare nettamente ciò che è input dati (da farsi nella maniera più semplice/chiara/intuitiva possibile) da ciò che è ricerca. Quindi anche ciò che è stampa.
    Morale di quello che ho scritto: non riesco a capire cosa vuoi fare.
  • Re: Caselle combinate, maschere continue e sfarfallio

    Ciao Osvaldo.

    Intanto rimetto il link all'immagine della maschera di cui si sta discutendo, perché l'altro non funziona più



    È una maschera per la sola immissoine di nuovi record, non per la ricerca.
    Come vedi ci sono tre combobox. Una per la scelta del cliente, una per la scelta del o dei pazienti, una per la scelta del prodotto.

    Tabelle:
    -tabPrestazioni: IDPrestazione (PK), IDCliente, più vari campi che fanno riferimento alla prestazione e al suo pagamento (tipo di carta, dasaldare, ecc).
    -tabIntestazioniPrestazioni: IDIntestazionePrestazione (PK), IDPrestazione, IDPaziente. In relazione Uno a Molti con tabPrestazioni. Mi serve per poter associare più pazienti alla stessa prestazione (vale a dire quando un cliente porta più animali contemporaneamente in visita).
    - tabDettagliPrestazioni: IDDettaglioPrestazione, IDIntestazionePrestazione, IDProdotto, Descrizione, PrezzoUnitarioDef, Quantità, SubTotale, Sconto, IDTipoIva. In relazione Uno a Molti con tabIntestazioniPrestazioni, riporta i vari prodotti associati alla visita di uno specifico animale.

    Ecco qui le relazioni



    Problemi:
    - Gestione de combobox con lunghi menu (tantissimi record da visualizzare). Meglio le listbox?
    - Sfarfallio durante la digitazione della stringa da ricercare nelle combobox
    - Perdita del focus sulla sottomaschera che elenca l'animale al quale si stanno caricando le prestazioni. Meglio i fogli dati rispetto alle maschere continue?
  • Re: Caselle combinate, maschere continue e sfarfallio

    Osservando la Finestra Relazioni vedo:
    1. Campi non omogenei in tblPrestazioni. Cosa hanno a che fare i campi Cognome, Nome, Indirizzo, IDComune tipicamente anagrafici con le Prestazioni?
    2. tblIntestazioniPrestazioni è inutile. Ti basterebbe tblPrestazioni uno-a-molti tblDettagliPrestazioni.

    Per me ha senso parlare di:
    Pazienti uno-a-molti Prestazioni
    Prestazioni uno-a-molti DettagliPrestazioni
    TipiPrestazioni uno-a-molti DettagliPrestazioni
  • Re: Caselle combinate, maschere continue e sfarfallio

    Temevo che la discussione andasse a finire in questa direzione.

    1. La risposta rapida è che ho i miei buoni motivi. Se ne è discusso lungamente e sono giunto a questa conclusione. Ti faccio una domanda: se il cliente cambia indirizzo che succede alle vecchie transazioni? Io voglio che le vecchie transazioni risultino al vecchio indirizzo e quelle nuove a quello nuovo. Quindi due possibilità: o si gesticono gli indirizzi con date di inizio e fine validità (cosa che faccio ad esempio per i prezzi) o la tabella clienti (con di campi anagrafici) serve unicamente da "stampino" per riportare gli indirizzi valevoli al momento della compilazione della transazione nella tabella prestazioni. In questo modo rendo i dati indipendenti dalla tabella clienti. Quando emetto una fattura andrò a pescare questi campi.

    2. Una cosa credo non ti sia chiara. Un cliente porta due pazienti. Voglio avere un conto unico per il cliente, ma al contempo vedere anche le singole prestazioni erogate al singolo paziente. Ci sono vari modi per gestire tutto ciò. Ho scelto questa strada dopo averne provate altre. Mi permette di avere a schermo, al momento della compilazione del conto, le prestazioni erogate ad ogni singolo paziente portato in visita, ma anche il totale che il cliente dovrà pagare. Guarda l'immagine: gatto Pippo e cane Carlo. Ognuno con il suo conto, ma un totale da saldare unico.
  • Re: Caselle combinate, maschere continue e sfarfallio

    Io strutturerei così:
    Clienti uno-a-molti IndirizziClienti
    Clienti uno-a-molti Fatture
    Fatture uno-a-molti DettagliFatture
    Pazienti uno-a-molti DettagliFatture
    TipiPrestazioni uno-a-molti DettagliFatture

    IndirizziClienti avrà, tra i tanti campi, un campo DataIndirizzo
    Fatture (ex Prestazioni) avrà DataFattura
    DettagliFatture avrà i campi:
    IDDDF(PK)
    IDPaziente (FK)
    IDTipoPrestazione (FK)
    Prezzo
    IDFattura (FK)

    Io sto provando a darti qualche risposta. Vedo che nessun altro interviene. Spesso accade per impossibilità di proseguire la discussione in ambiente progettuale NON NORMALIZZATO.

    È ovvio che hai un organigramma tabelle molto articolato. Devi trovare tu poi la strategia per ottimizzare le risposte a quelle domande che poni. Per tanto consiglio di scindere le domande (query) per piccoli passi. Sconsiglio vivamente di cercare di sapere "tutto insieme".
  • Re: Caselle combinate, maschere continue e sfarfallio

    Apprezzo molto il tuo tentativo, Osvaldo.

    Il mio database al momento attuale presenta 27 tabelle, 25 tra maschere e sottomaschere, varie query. E ho solo iniziato ad occuparmi dei report. Non so se sia tanto o poco, ma sono necessarie per affrontare gli aspetti legati alla gestione aziendale di un ambulatorio veterinario. O meglio del nostro ambulatorio.

    La costruzione delle tabelle e delle loro relazioni è un lavoro che mi ha preso mesi e sul quale ho riflettuto a lungo.
    Sono assolutamente cosciente di aver violato regole di normalizzazione, ma l'ho fatto consapevolmente, come scelta strategica per assecondare le necessità della nostra realtà operativa. Non voglio stravolgere l'impostazione di base (che ritengo funzioni bene), al limite portare correttivi.

    Capisco invece che fornire aiuto in un ambiente cosi articolato possa essere difficile e colgo il tuo consiglio. Cominciamo ad affrontare un problema per volta.
    Aprirò a breve un nuovo post, spero di ottenere più attenzione.

    Grazie comunque per gli sforzi
  • Re: Caselle combinate, maschere continue e sfarfallio

    RaoulDuke ha scritto:


    Al momento attuale sto gestendo l'immissione dei dati in maschera attraverso combobox. Quindi una combobox per la scelta del cliente, una per la scelta del paziente ed una per la scelta del prodotto/prestazione.
    Ad alcune di queste ho associato all'evento "su modifica" del codice, come questo ...
    Se ho capito bene il tuo modo di operare : sbagli evento ovvero può risultare troppo impegnativo rieseguire la query ad ogni singola digitazione di un carattere ... Se ho frainteso non considerare il mio intervento.

    Se i ComboBox fossero associati (ma non credo trattandosi di Box di ricerca) ti consiglieri di utilizzare l'evento BeforeUpdate.
    Probabilmente i ComboBox non saranno associati e quindi gli eventi preferibili sono Exit (Su Uscita) o LostFocus (Su Disattivazione).
    Ancora meglio potrebbe essere affiancare al ComboBox un pulsante Applica tramite il quale eseguire la query.
  • Re: Caselle combinate, maschere continue e sfarfallio

    Ciao e grazie per la risposta.
    Delle tre combobox, due sono non associate.
    L'unica associata è quella per la scelta del Cliente (compila il campo "IDCliente" della tabella tabPrestazioni, quindi l'ho associata a questo campo).

    Le altre due combobox non sono associate, servono unicamente alla ricerca di paziente e prodotti. Dopo aver trovato e selezionato il record dalla combobox, alla pressione del pulsante "Inserisci" parte una transazione per l'immissione dei record nelle rispettive tabelle.

    Ora effettivamente eseguo la query ad ogni digitazione di carattere. Questo mi permette un aggiornamento "as you type" del menu a tendina. Ottengo però numerosi sfarfallii. Il pulsante per applicare il filtro alla query mi pare un'ottima idea, a cui avevo peraltro già pensato.
    La mia idea originale era però quella di abbandonare del tutto le combobox e sostituirle con textbox in cui digitare la stringa di ricerca e listbox a comparsa su click di un pulsante.

    Proverò ad implementare questo metodo che mi sembra più gestibile, anche se l'idea di avere menu che si aggiornano istantaneamente mi piace di più.
  • Re: Caselle combinate, maschere continue e sfarfallio

    RaoulDuke ha scritto:


    ...
    Ora effettivamente eseguo la query ad ogni digitazione di carattere. Questo mi permette un aggiornamento "as you type" del menu a tendina. Ottengo però numerosi sfarfallii. Il pulsante per applicare il filtro alla query mi pare un'ottima idea, a cui avevo peraltro già pensato.
    La mia idea originale era però quella di abbandonare del tutto le combobox e sostituirle con textbox in cui digitare la stringa di ricerca e listbox a comparsa su click di un pulsante.

    Proverò ad implementare questo metodo che mi sembra più gestibile, anche se l'idea di avere menu che si aggiornano istantaneamente mi piace di più.
    Per una situazione simile alla tua io ho adottato questa strategia :
    - optionbox a 2 scelte -> 1-Ricerca libera (abilita una textbox), 2-Ricerca Guidata (abilita il ComboBox)
    - pulsante applica filtro
    - a livello di disegno la ComboBox è sovrapposta alla TextBox (stesse dimensioni). E' irrilevante quale dei 2 controlli è in primo piano (a runtime solo uno sarà visibile)
    - la scelta dell'opzione 1 rende visibile la Textbox e invisibile il Combobox
    - la scelta dell'opzione 2 si comporta al contrario
    - con la texbox attiva, il filtro agisce eseguendo la query con il Like
    - con il combobox attivo, il filtro agisce eseguendo la query per l'unico id selezionato

    Al di là di tutto considera le prestazioni : l'operatore LIKE è uno dei più impegnativi nell'esecuzione delle query quindi sii cauto nel suo uso.
    Potrebbe essere più conveniente avere una scelta sulla tipologia delle prestazioni e una successiva scelta delle prestazioni appartenenti a quella tipologia (non conosco espressamente il tuo settore ma penso che le prestazioni siano suddivisibili in macro categorie tali da semplificare la ricerca pagando ovviamente il prezzo di alcuni click / movimenti del mouse in più per la doppia selezione).
  • Re: Caselle combinate, maschere continue e sfarfallio

    Grazie mille!

    La tua soluzione mi piace, io penso troverò la mia strada ora che ho diverse opzioni.
    Il filtro sulle prestazioni erogate l'ho già impostato a livello di tabelle. Ho suddiviso il nostro catalogo in categorie e sottocategorie ed è possibile effettuare una scrematura attraverso combobox a cascata.
    Quello che mi interessava era poter accedere ad un prodotto in maniera rapida, senza dover scegliere tra diversi menu (cosa che trovo un po' più macchinosa) ma vista l'ampiezza del nostro catalogo dovrò fare delle scelte.
    La possibilità di far agire il filtro LIKE solo dopo aver digitato l'intera stringa, o al click di un pulsante, mi pare un ottimo compromesso.
    Sperimenterò questa possibilità senza dubbio.

    Grazie ancora per gli input!
Devi accedere o registrarti per scrivere nel forum
10 risposte