Newsgroup: it.comp.lang.visual-basic
Titolo: [.Net] [Lungo] Consiglio per gestione tabella Anagrafica

Ciao.
Chiedo un consiglio a chi ha tempo e voglia di darmelo.
Nel mio software ho una sezione dedicata alla gestione delle tabelle. Con il
termine "tabelle" in questo caso non intendo tabelle fisiche del database,
ma elenchi di dati che da cui l'utente potrà poi selezionare elementi
durante l'immissione di altri dati. Per esempio ho una tabella con tutte le
vie di un paese, una tabella con tutti i tipi di ufficio di una società ecc.
Ho gestito le tabelle in questo modo:
in un form ho messo a sinistra un treeview con la descrizione della tabella,
quando l'utente seleziona una tabella, nella parte destra del form vengono
visualizzati in una griglia i dati principali della tabella selezionata.
Per visualizzarli nella griglia, creo un datatable con tutti i dati della
tabella del database (SELECT * FROM nometabella).
In genere i record da gestire non sono molti, nell'ordine delle decine o in
qualche raro caso un centinaio.
Quando l'utente fa doppio click su un elemento della lista, apro un form
dove gli permetto di modificare i dati, aggiungere nuovi elementi e
(importante!) dotato di una barra di scorrimento per navigare tra i record.
Utilizzo in questo caso l'oggetto BindingManagerBase in quanto i controlli
del form sono databound.
Tutto funziona perfettamente, ma... ed è qui che mi serve il vostro aiuto.
Tra le tante tabelle che devo gestire ce n'è anche una anagrafica, in cui
sono memorizzati tutti i dati anagrafici delle persone che saranno
utilizzate nel programma. In questo caso il numero di record può essere
elevato, diciamo al massimo intorno ai 10.000 (anche se nella maggior parte
dei casi non supera i 5.000-6.000 record).
Secondo voi posso gestire anche questa tabella come le altre, cioè facendo
un SELECT * FROM Anagrafica e tirandomi tutto in memoria? A livello di
comodità sarebbe il massimo, anche perchè ho già tutto pronto, ma a livello
di prestazioni e di occupazione di memoria non mi sembra una grande scelta.
La cosa importante è che nel form di editing devo lasciare i tasti di
navigazione tra i record (nella versione attuale del programma - che ha
quasi 10 anni!!! - esiste questa possibilità, e non mi sembra il caso di
rilasciare una versione più moderna che offra meno possibilità di una ormai
obsoleta!).
Accetto qualsiasi suggerimento.
Grazie
Skysurfer

 obsoleta!).
Io ho avuto lo stesso problema convertendo un programma scritto in
Clipper. L'ho risolto con delle textbox dove l'utente può selezionare
un numero ristretto di record, ad esempio facendogli inserire le prime
lettere del cognome e/o un intervello di date ecc..., con la possibilità di
fare ordinamenti di diverso tipo.

IMHO dopo aver cliccato sopra la tabelle anagrafica, sulla sinistra, anzichè
eseguire l'istruzione SELECT * FROM Anagrafica e mostrare i record nella
parte destra,  dovresti aprire una finestra (di tipo vbModal) dove ci sono
alcuni campi come ad esempio: Ragione Sociale, Città, CAP. In pratica
useresti questa finestra come filtro creandoti una stringa del tipo:
Dim strSQL as String
    strSQL = "SELECT * FROM Anagrafica"
    If Len(txtRagSoc) > 0
        strSQL = strSQL & " WHERE RagSoc LIKE '" & txtRagSoc & "'"
    End If
    ..... ripeti la stessa cosa per gli altri campi testo
PS.: dovresti gestire, usando InStr, se è già presente WHERE all'interno
della stringa e usare AND
Alla pressione del tasto OK torni sulla tua finestra visualizzando solo una
parte dei record.
Spero di essere stato chiaro.
Ciao, Vincenzo

 ha scritto nel messaggio
news:bahufu$e7q$1...@fata.cs.interbusiness.it...

Sì, sei stato chiarissimo e ti ringrazio per il consiglio.
Valuterò la cosa e vedrò se mi conviene implementarla.
Grazie per il suggerimento
Ciao
Skysurfer

 Accetto qualsiasi suggerimento.
L'utente deve poter fare quello che vuole, quindi anche non mettere alcun
tipo di selezione che riduca il numero dei records.
Ma tu puoi ridurre i problemi conseguenti a una grande mole di dati (forse
non per il recordset, ma per quelli realmente esposti/recuperati sicuramente
sì) esponendone un po' alla volta... e usando gli stessi oggetti atti allo
scorrimento per caricare il record seguente/precedente o, se non
disponibile, ... il blocco di records seguente/precedente ...

 disponibile, ... il blocco di records seguente/precedente ...
Infatti secondo me la soluzione ideale è questa....
Ma dovrei gestire una specie di paginazione, cosa che posso fare quando sono
in fase di "editing" visualizzando un record alla volta e quindi gestendo le
frecce di scorrimento.
Ma quando sono in fase di visualizzazione della griglia, come posso gestire
una cosa simile? Mi piacerebbe fare una cosa che controlla la posizione
della barra di scorrimento verticale e preleva i record a gruppi a seconda
di dove essa si trova, ma è realizzabile una cosa simile?
E soprattutto vale la pena di spendere tempo per gestire una cosa simile
solo per avere 200Kb (ipotizzo 1K per record) occupati in memoria invece di
4Mb?
Ciao e grazie.
Skysurfer

 4Mb?
Ohibò, questo lo devi decidere tu... (però, fatto una volta è fatto per
sempre)