Query di accodamento

giovedì 17 maggio 2007 - 15.15

jekisi Profilo | Senior Member

Salve a tutto il forum, avrei il seguente problema:
Ho 2 Datagridview, nella prima mi spuntano tutti i DDT di un determinato Cliente che come campo Fatturata hanno N.
Passando una riga di queste in una seconda Datagridview il campo Fatturata cambia in S e il campo Fattura prende il valore riportato in una text eseguendo questa query:

sql = "UPDATE TDDT SET FATTURATA='S', fattura=" & TextBox3.Text & " WHERE DDT=" & DDTTextBox.Text


adesso ho una terza Datagridview che mi dovrebbe riflettere tutte le righe dei documenti che passo nella seconda Datagridview

ho provato a fare la seguente cosa:


Public Sub ImpostaRecordSourceData4()
Dim strsqlddt As String
Dim strsql As String
strsqlddt = "(SELECT DDT FROM tddt WHERE cliente=" & TextBox1.Text & " AND fattura='" & TextBox3.Text & "' and fatturata='S')"
strsql = "SELECT * FROM RDDT WHERE DDT IN " & strsqlddt
Dim CmqRDDT As New OleDb.OleDbCommand(strsql, Cn)
Dim DARDDT As New OleDb.OleDbDataAdapter(CmqRDDT)
Cn.Open()
DARDDT.Fill(Me.AziendaleDataSet21.RDDT)
Cn.Close()
End Sub


quando passo una riga dalla prima alla seconda faccio:


Cn.Open()

'sql = "UPDATE TDDT SET FATTURATA='S', fattura=" & TextBox3.Text
sql = "UPDATE TDDT SET FATTURATA='S', fattura=" & TextBox3.Text & " WHERE DDT=" & DDTTextBox.Text

cmd = New OleDb.OleDbCommand(sql, Cn)
dr = cmd.ExecuteReader

Cn.Close()
Me.TDDTTableAdapter.FillBy(Me.AziendaleDataSet18.TDDT, New System.Nullable(Of Integer)(CType(TextBox1.Text, Integer)), TextBox4.Text)
TDDTDataGridView.Refresh()
Me.TDDTTableAdapter1.FillBy(Me.AziendaleDataSet20.TDDT, New System.Nullable(Of Integer)(CType(TextBox1.Text, Integer)), TextBox5.Text, TextBox3.Text)
TDDTDataGridView1.Refresh()
ImpostaRecordSourceData4()



ma appena vado per aprire la form mi da errore, cioè:

Tipi di dati non corrispondenti nell'espressione criterio.
evidenziandomi

DARDDT.Fill(Me.AziendaleDataSet21.RDDT)

della Public Sub ImpostaRecordSourceData4()


qualcuno sa dirmi dove sbaglio?



Distinti Saluti Fabio Messina

Cteniza Profilo | Guru

Certamente che non si può utilizzare il comando che genera un datareader con un comando sql diverso da select.
Per gli aggiornamenti del database si esegue con la modalità "executenonquery".
Stendo un velo pietoso sul fatto che non utilizzi i parametri e che potrebbe essere il motivo del tuo errore.

jekisi Profilo | Senior Member

Ma scusa, come dovrei risolvere allora?

the_follet Profilo | Newbie

Ciao,
se il campo CLIENTE del database è di tipo testo (come presumo) allora vale la risposta che ti ho dato in un altro tuo post ( http://www.dotnethell.it/Forum/messages.aspx?ThreadID=15709 ): non hai messo gli apici singoli prima e dopo l'inserimento di textbox1.text nell'istruzione SQL.

Se invece CLIENTE è un campo numerico allora non ne ho idea

Ciao.
Luca

jekisi Profilo | Senior Member

strsqlddt = "(SELECT DDT FROM tddt WHERE cliente='" & TextBox1.Text & "' AND fattura='" & TextBox3.Text & "' and fatturata='S')"


così da errore, sempre se parli di questa query.
Mi seleziona DARDDT.Fill(Me.AziendaleDataSet6.RDDT)
e mi dice:
Tipi di dati non corrispondenti nell'espressione criterio.

potresti farmi la cortesia di scrivermela correttamente? sempre se non chiedo troppo?



Distinti Saluti Fabio Messina

the_follet Profilo | Newbie

Innanzitutto confermami se i tipi di dato dei campi del database sono quelli che immagino io, così poi costruiamo la stringa SQL

Cliente = testo(?)
Fattura = testo(?)
Fatturata = testo
DDT = numerico

A giudicare dalla istruzione SQL di Update che hai messo all'inizio del post, sembrerebbe che il campo Fattura sia numerico. Quindi ci sono comunque dati contraddittori...

Aspetto che mi rispondi e poi creiamo la stringa esatta.
Ciao.
Luca

jekisi Profilo | Senior Member

Ciao, inanzitutto ti ringrazio per l' interesse.
I campi sono:

Cliente = Numerico(Codice Cliente)
Fattura = testo
Fatturata = testo
DDT = numerico

A me da questo errore:
Errore di sintassi nella stringa nell'espressione della query 'DDT IN (SELECT DDT FROM tddt WHERE cliente='2 AND fattura='1' and fatturata='S')'.

Nella sub Public Sub ImpostaRecordSourceData4()

Ti allego la bozza e ti spiego i passaggi:

All' avvio premo Button1 -> Ddt -> Carica
Adesso, quando premo Button1, passo una riga da sinistra a destra e modifico il campo Fatturata da N a S e il campo Fattura prende il valore riportato nella text3.text

Sotto, invece, a questo punto, mi sovrebbero spuntare le righe che fanno parte del documento che passo a destra. La tabella delle righe è RDDT.
Se passo 2 righe o +, sotto mi dovrebbero spuntare le righe di tutte e 2 i documenti o +.

Se invece passo una righa da destra a sinistra. il campo Fatturata si modifica da S a N e il campo Fattura diventa null.
Sotto invece, si dovrebbero togliere le righe del documento che tolgo, cioè, che passo da destra a sinistra.

Spero che mi puoi essere di aiuto.


Distinti Saluti Fabio Messina

the_follet Profilo | Newbie

Ciao,
ti posso aiutare con la stringa SQL, che, in base ai campi che mi riporti, va fatta così:

strsqlddt = “(SELECT DDT FROM tddt WHERE cliente = “ & TextBox1.Text & “ AND fattura = ‘” & TextBox3.Text & “’ and fatturata = ‘S’)”


Inoltre, devi modificare anche la stringa SQL di update che hai messo in cima al tuo primo post o avrai gli stessi problemi: se il campo Fattura è di tipo testo, ci vogliono gli apici semplici.
La stringa risultante è questa:

sql = “UPDATE TDDT SET FATTURATA = ‘S’, fattura = ‘” & TextBox3.Text & “’ WHERE DDT = “ & DDTTextBox.Text


In ogni caso, fermo restando che è giusto spratichirsi e prendere dimestichezza con il linguaggio SQL come fai tu, non sottovalutare il fatto che usare la concatenazione di stringhe per creare istruzioni SQL è decisamente pericoloso, per cui sarebbe meglio cominciare a studiare un pò le query parametriche come ti ha consigliato Cteniza, anche se in maniera alquanto "rude" (Cteniza, la maggior parte di noi -me per primo- è su questo forum per apprendere, non siamo tutti professori o "nati imparati"...).

Per farti un'idea di quanto possa essere pericolosa un'istruzione SQL generata da una concatenazione di stringhe, puoi dare un'occhiata qua:
http://www.microsoft.com/italy/msdn/risorsemsdn/security/editoriale/sql_injection.mspx

Saluti.
Luca

Cteniza Profilo | Guru

Io sono sempre un pò brusco, anche con i miei sottoposti al lavoro, lo faccio perchè le parole suadenti in genere non hanno nessun effetto. Sono capace di fare una strigliata a qualcuno che si comporta male, di solito si tratta di "ardore giovanile" di ragazzi che prima ancora di avere capito quello che debbono realizzare si mettono a scrivere del codice perchè "scrivere codice" è una cosa creativa.
Nulla di più falso, la creazione avviene nel trovare la soluzione ottimale e, quando l'algoritmo "funziona" allora si scrive del codice.
Per quanto riguarda la gestione dei parametri ho scritto parecchi posts sul mio blog, questo è l'ultimo:
http://community.visual-basic.it/lucianob/archive/2007/03/30/18945.aspx

jekisi Profilo | Senior Member

A me qui da errore

Cn.Open()

''sql = "UPDATE TDDT SET FATTURATA='S', fattura=" & TextBox3.Text
'sql = "UPDATE TDDT SET FATTURATA='S', fattura=" & TextBox3.Text & " WHERE DDT=" & DDTTextBox.Text
sql = "UPDATE TDDT SET FATTURATA = ‘S’, fattura = ‘" & TextBox3.Text & "’ WHERE DDT = " & DDTTextBox.Text

cmd = New OleDb.OleDbCommand(sql, Cn)
dr = cmd.ExecuteReader

Cn.Close()
Nessun valore specificato per alcuni parametri necessari.

i dati nelle text le mette.

L' altra query l' ho modificata pure
strsqlddt = "(SELECT DDT FROM tddt WHERE cliente = " & TextBox1.Text & " AND fattura = ‘" & TextBox3.Text & "’ and fatturata = ‘S’)"



Puoi inviarmi la bozza corretta?

the_follet Profilo | Newbie

X Cteniza:
bè... anche tu hai ragione, parole sacrosante


X Jekisi:
"Nessun valore specificato per alcuni parametri necessari."
Non conosco la struttura del tuo DB, quindi non posso aiutarti ulteriormente.
Prova a postare il valore che ha la stringa <sql> nel momento in cui si verifica l'eccezione, magari da li si riesce a vedere l'errore.

Cteniza Profilo | Guru

Dò alcuni consigli:
- quando si posta una domanda si deve fare in modo di farsi comprendere
- il miglior modo per farsi comprendere è mettere un esempio allegato oppure di dare indicazioni in modo da poter riprodurre l'errore o far capire la questione
- si devono mettere anche i dati (esempio di database / tabelle) in modo tale che la prova deve essere effettiva
- spesso è consigliabile ricondurre gli esempi al database di northwind
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