Registrare i dati di un datagrid

giovedì 24 luglio 2014 - 16.42
Tag Elenco Tags  VB.NET

zolamia Profilo | Newbie


Ciao a tutti, ho bisogno di un vostro aiuto. Sto registrando i dati di una bolla in 2 tabelle differenti , una per i dati della bolla e l'altra il corpo con i riferimenti degli articoli del documento che vengono inseriti man mano in un datagridview.
il mio problema è registrare i dati delle riche del datagrid

Vi posto il codice
Private Sub RegistraDocumento()
Dim data As New Date
data = Date.Today
Dim AnnoRiferimento As String
AnnoRiferimento = data.Year.ToString
Dim x As Integer
Dim codArt As Integer
'inizio transazione
Using connection As New SqlConnection(My.Settings.WeaGestDBConnectionString & "xxxxxxxxx")
connection.Open()
Dim command As New SqlCommand, commandart As New SqlCommand
With command
.Connection = connection
.CommandText = "INSERT INTO MovimentiMagazzino(R_NumeroDocumento,R_AnnoDocumento,R_DataDocumento,R_DataOperazione,ID_Fornitore,R_NumeroDettagli,R_ImponibileIva,R_ImportoIva,R_TotaleDocumento) VALUES (@R_NumeroDocumento, @R_AnnoDocumento, @R_DataDocumento, @R_DataOperazione, @ID_Fornitore, @R_NumeroDettagli,@R_ImponibileIva, @R_ImportoIva,@R_TotaleDocumento)"
.Parameters.AddWithValue("@R_NumeroDocumento", TextBoxNumBolla.Text)
.Parameters.AddWithValue("@R_AnnoDocumento", AnnoRiferimento)
.Parameters.AddWithValue("@R_DataDocumento", FormatDateTime(DateTimePickerDataBolla.Value, DateFormat.ShortDate))
.Parameters.AddWithValue("@R_DataOperazione", FormatDateTime(TextBoxDataReg.Text, DateFormat.ShortDate))
.Parameters.AddWithValue("@ID_Fornitore", TextBoxIdFornitore.Text)
.Parameters.AddWithValue("@R_NumeroDettagli", TextBoxNumPezzi.Text)
.Parameters.AddWithValue("@R_ImponibileIva", TextBoxImponibileIva)
.Parameters.AddWithValue("@R_ImportoIva", TextBoxImportoIva.Text)
.Parameters.AddWithValue("@R_TotaleDocumento", TextBoxTotale.Text)

End With
With commandart
For x = 0 To DataGridViewDettagli.RowCount - 1
.Connection = connection
.CommandText = "INSERT INTO MovimentiMagazzino_Dettagli(R_CodiceArticolo) VALUES (@R_CodiceArticolo)
Next
End With

command.ExecuteNonQuery()
connection.Close()
End Using
MessageBox.Show("Ok")
End Sub

Ragazzi , non riesco ad andare avanti, non riesco a registrare nella seconda tabella i dati del datagridview.
Mi potete indirizzare ?
Grazie mille

:::...Truly madly deeply...:::

AntCiar Profilo | Expert

Ciao.

hai fatto un po di confusione con le variabili e il "quando" usarle.

In poche parole hai usato due Command (Command e CommandArt).
Il primo lo valorizzi con la connessione, l'istruzione parametrica e i comandi (e questo è corretto) ma poi invochi ExecuteNonQuery nel momento sbagliato.

Il secondo invece ne valorizzi solo la connessione e l'istruzione parametrica (ma senza valorizzare i parametri e questo è sbagliato) e poi invochi ExecuteNonQuery nel momento sbagliato.

Alla fine puoi utilizzare anche un solo command ma per non complicarti la vita aggiusto un po il tuo codice:


(ometto la parte iniziale perchè sembra andare bene)

With command
.Connection = connection
.CommandText = "INSERT INTO MovimentiMagazzino(R_NumeroDocumento,R_AnnoDocumento,R_DataDocumento,R_DataOperazione,ID_Fornitore,R_NumeroDettagli,R_ImponibileIva,R_ImportoIva,R_TotaleDocumento) VALUES (@R_NumeroDocumento, @R_AnnoDocumento, @R_DataDocumento, @R_DataOperazione, @ID_Fornitore, @R_NumeroDettagli,@R_ImponibileIva, @R_ImportoIva,@R_TotaleDocumento)"

''qui devi togliere gli eventuali parametri già presenti

.Parameters.Clear()
.Parameters.AddWithValue("@R_NumeroDocumento", TextBoxNumBolla.Text)
.Parameters.AddWithValue("@R_AnnoDocumento", AnnoRiferimento)
.Parameters.AddWithValue("@R_DataDocumento", FormatDateTime(DateTimePickerDataBolla.Value, DateFormat.ShortDate))
.Parameters.AddWithValue("@R_DataOperazione", FormatDateTime(TextBoxDataReg.Text, DateFormat.ShortDate))
.Parameters.AddWithValue("@ID_Fornitore", TextBoxIdFornitore.Text)
.Parameters.AddWithValue("@R_NumeroDettagli", TextBoxNumPezzi.Text)
.Parameters.AddWithValue("@R_ImponibileIva", TextBoxImponibileIva)
.Parameters.AddWithValue("@R_ImportoIva", TextBoxImportoIva.Text)
.Parameters.AddWithValue("@R_TotaleDocumento", TextBoxTotale.Text)

''Qui devi invocare la conferma del comando
.ExecuteNonQuery()
End With

poi passiamo alla parte del salvataggio delle righe:

With commandart
For x = 0 To DataGridViewDettagli.RowCount - 1
.Connection = connection
.CommandText = "INSERT INTO MovimentiMagazzino_Dettagli(R_CodiceArticolo) VALUES (@R_CodiceArticolo)

''qui devi togliere i vecchi parametri prima di inserire in nuovi
.Parameters.Clear()

''qui devi valorizzare il parametro (come hai fatto nel precedente command)
.Parameters.AddWithValue("@R_CodiceArticolo", ..........)

''poi qui devi invocare la conferma del command
.ExecuteNonQuery()
Next
End With

''poi chiudi la connessione
connection.Close()


Dal codice che hai scritto devo farti una domanda: come fai a legare la "testata" del documento con il "corpo" (righe del datagridview) visto che nel commandArt scrivi solo l'articolo senza nessun riferimento a qualche valore che possa ricondurre alla testata?



Cristian Barca

zolamia Profilo | Newbie

Ciao e grazie per la tua risposta.
ho fatto come dicevi tu la alla prima connessione, al .ExecuteNonQuery mi da l'errore "Nessun mapping esistente dal tipo di oggetto System.Windows.Forms.TextBox a un tipo nativo di provider gestito noto."

Cosa Vuol dire?

Poi per quanto riguarda legare le due tabelle lo faccio tramite un Id_Movimento che registrerò .

Poi volevo chiederti: Perché usi il .clear? a me non serve pulire i dati..


Grazie tante
:::...Truly madly deeply...:::

AntCiar Profilo | Expert

>Ciao e grazie per la tua risposta.
>ho fatto come dicevi tu la alla prima connessione, al .ExecuteNonQuery
>mi da l'errore "Nessun mapping esistente dal tipo di oggetto
>System.Windows.Forms.TextBox a un tipo nativo di provider gestito
>noto."
>Cosa Vuol dire?

Vuol dire che una textBox (intesa come oggetto nel suo insieme) non può essere passata come parametro.
si riferisce a questa riga:

.Parameters.AddWithValue("@R_ImponibileIva", TextBoxImponibileIva)

perchè dovrebbe essere

.Parameters.AddWithValue("@R_ImponibileIva", TextBoxImponibileIva.Text)

Alla fine non ti dava errore di compilazione perchè l'Add dei parametri prevedono come valori dei tipi Object e 'TextBoxImponibileIva' e 'TextBoxImponibileIva.Text' sono a tutti gli effetti degli object validi.


>Poi per quanto riguarda legare le due tabelle lo faccio tramite
>un Id_Movimento che registrerò .

ok.

>Poi volevo chiederti: Perché usi il .clear? a me non serve pulire
>i dati..

Non serve a pulire i dati nel database ma all'interno del commad.
Il tuo commad è dichiarato al di fuori del ciclo for.
Subito dopo la creazione del commad non vi sono parametri.

Al primo giro aggiungi N parametri con i propri valori.
Se non fai il .Clear() al secondo giro ti ritroveresti 2*N parametri con i rispettivi valori e la query ti va in errore perchè hai un numero di parametri superiori a quello richiesto (anzi non ho provato ma mi sa che nemmeno te li fa aggiungere perchè li vedrebbe già presenti).

Detto questo nel tuo ciclo al secondo giro o superiore avresti due possibilità:

1 - cercare il parametro precedentemente inserito (tramite il nome): se esiste gli cambi il valore; se non esiste lo crei (operazione lenta e sprecata)

2 - cancellare i vecchi parametri e aggiungerli sempre "a nuovo" con i rispettivi valori (cosa molto più veloce e sicura)


Cristian Barca
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5