Dataset, TableAdapter e BindingSource...che casino!

mercoledì 10 dicembre 2008 - 09.52

Pippone Profilo | Newbie

Ciao a tutti,
siccome è il mio primo messaggio sul forum, mi presento:
Mi chiamo Luca, ho 26 anni, scrivo dalla provincia di Modena ed ho una conoscenza più che superficiale su tutto ciò che è la programmazione.

Veniamo al sodo:
per lavoro, sto realizzando un programma in visual basic .NET (con VS2008) che acquisisce dei valori da alcuni strumenti e li registra su un database.

Gra parte del programma è fatto e grazie a VS2008, internet e un minimo di conoscenze (ma proprio minimo) sono riuscito a farlo funzionare...però c'è una cosa che veramente non riesco a farmi entrare in testa: come cavolo funziona la gestione dei Dataset-Database?

Ad esempio, ora sono alle prese con la creazione di un contatore (inizialmente utilizzavo un campo ID autoincrementale nel DB di Access, ma poi proprio qui ho letto che quella no è la sua funzione): come faccio a prendere il valore della cella "contatore" del record precedente, incrementarlo e caricarlo nella cella della NewRow costituita?

Grazie a chi mi vorrà rispondere!

Teech Profilo | Expert

In Access il contatore serve ad assegnare un Intero lungo in modo automatico e progressivo... Perchè dici che non serve al tuo scopo?
L'unico ricordo che ho di un post simile è che non "riempie i buchi": se cancelli un record il valore del contatore associato al record e perso per sempre su quela tabella, ma nel 99,99% dei casi è un NON problema...

Per l'utilizzo dei Dataset e dei Database sono stati scritti libri interi, qual'è il tuo problema specifico?
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Pippone Profilo | Newbie

Il problema è proprio quello che hai citato...il contatore mi serve anche per sapere quante prove ho fatto in un determinato periodo, quindi mi serve che parta da 1 ogni anno.

Purtroppo ho delle difficoltà proprio nella creazione del contatore e pensavo di fare così: mettiamo che io abbia la tabella di access vuota, creo una riga e metto nella colonna "n_prova" il valore 1. All'inserimento di un'altra prova dovrò andare a prelevare il valore dalla colonna "n_prova" dell'ultima riga inserita, incrementarlo, inserirlo in una textbox e (al completamento dell'acquisizione dei dati dagli strumenti) caricarlo sul database nella colonna "n_prova" della riga appena creata.

A parole funziona, ma a codice come si fa? Se qualcuno fosse così gentile da buttarmi lì un paio di righe sicuramente mi aiuterebbe a capire!

Pippone Profilo | Newbie

Oppure potrei caricare un DataAdapter mediante una query che seleziona la colonna n_prova e la ordina in maniera decrescente. In tal modo avrei il numero di prova più alto all'indice 0, mi basterebbe incrementarlo e caricarlo sulla textbox...il databinding fa il resto.

Ora, la query SQL sarebbe la seguente:
Dim connstr as string
connstr = "SELECT n_prova FROM tabella_prove ORDER BY n_prova DESC"

e la sintassi:
dim nprova_da as oledb.oledbdataadapter
nprova = new oledb.oledbdatadapter(connstr, con) 'con è la mia stringa di connessione al db

ora come cavolo faccio a dirgli di prelevare il valore all'indice di riga n°0???

Teech Profilo | Expert

>Il problema è proprio quello che hai citato...il contatore mi serve anche per sapere quante prove ho fatto in un determinato periodo, quindi mi serve che >parta da 1 ogni anno.
Se il problema è solo CONTARE puoi utilizzare la funzione COUNT() nella tua query... Una cosa del tipo: SELECT Count(ID) WHERE 'Periodo' (dove in periodo metti la tua logica).

>Purtroppo ho delle difficoltà proprio nella creazione del contatore e pensavo di fare così: mettiamo che io abbia la tabella di access vuota, creo una riga >e metto nella colonna "n_prova" il valore 1. All'inserimento di un'altra prova dovrò andare a prelevare il valore dalla colonna "n_prova" dell'ultima riga >inserita, incrementarlo, inserirlo in una textbox e (al completamento dell'acquisizione dei dati dagli strumenti) caricarlo sul database nella colonna >"n_prova" della riga appena creata.
>
>A parole funziona, ma a codice come si fa? Se qualcuno fosse così gentile da buttarmi lì un paio di righe sicuramente mi aiuterebbe a capire!
Se vuoi sapere qual è il valore massimo di una colonna: SELECT MAX(ID)
Ma in questo caso se hai cancellato delle righe e "perso" un valore in mezzo, come fai? lo salti? Il valore di ritorno no ha più validità? Ed nel caso volessi "tappare i buchi" questo processo avviene sicuramente prima di un "conteggio"? Torno a dire: se il problema è contare rientri nella casistica del 99,99% per il quale non interessa quale valore viene restituito dal contatore, ma che interessa che il contatore sia univoco.
Inoltre, se usi una Textbox significa che vuoi permettere la variazione del dato (altrimenti potresti usare una Label) e quindi perchè dover mettere in piedi tutto un algoritmo?
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Pippone Profilo | Newbie

Di valori non ne perdo perchè oltre all'ID ho creato un'altra colonna (appunto n_prova) gestita in "manuale"...il mio problema è proprio gestire questa colonna per evitare di dover lasciare all'utente il lavoro di immissione di un nuovo numero di prova.

La colonna n_prova, al contrario di quella ID che serve come chiave primaria:
a) deve poter essere azzerato ogni anno
b) deve partire da 1 (mentre il mio contatore, causa prove, parte ora da 59)

ora che ho configurato il datadapter perchè prenda il valore massimo della colonna n_prova, come faccio a caricarlo in una variabile da incrementare?

Teech Profilo | Expert

Allora basta che ti crei una tabella di appoggio per i numeri prove e leggi il numero da li incrementandolo ogni volta che fai un inserimento nella tua tabella.
La tabella NumeriProve potrebbe essere formata, ad esempio, da:
Anno
Numero
DataAggiornamento

Ridordati però che ogni aggioranameto deve essere "atomico" e gestito in modo corretto per non rischiare disallineamenti
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Pippone Profilo | Newbie

Ma quindi vb.net non prevede la possibilità di prelevare il valore di una cella e metterlo in una variabile???

Teech Profilo | Expert

Certo che lo prevede, ma mi sembra controproducente effettuare una lettura su una tabella per aggiornarla: non so se conosci i gestionali, ma quello che vuoi fare è lo stesso principio che si usa per la gestione delle numerazioni dei documenti. Avendo una tabella per gestire il numeratore è anche possibile operare per sistemare eventuali errori (caso che operando su un'unica tabella diventa più complesso).

Per come vuoi agire tu puoi operare nel seguente modo:
- Ti crearti il command per leggere il dato massimo della colonna
- Restituendo il Command un valore scalare puoi usare la funzione ExecuteScalar del Command (restituisce la prima colonna del primo record del resultset, ma tu avrai un record di una colonna)
- Memorizzi il valore in una variabile e lo utilizzi

In pseudocodice puoi gestirlo come di seguito riportato:
Dim cm As New Command("SELECT MAX(Colonna) WHERE Anno=@Anno") Dim valore As Integer=cm.ExecuteScalar TextBox.Text=(valore+1).ToString

I problemi li avrai se usi il programma in multiutenza: poni il caso che l'utenteA apra la maschera per inserire un record e gli viene restituito un numero. Mentre l'utenteA lavora l'utenteB apre la maschera per inserire un record e gli viene restituito il numero successivo. L'utenteB conferma l'inserimento e l'utenteA abbandona l'inserimento... Ti trovi un buco nella numerazione...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Pippone Profilo | Newbie

Cavolo, grazie mille. Quel ".ToString" non mi veniva proprio...

Teech Profilo | Expert

Prego!!!
Ricordati di accettare una risposta per chiudere il thread se credi sia il caso
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5