Newsgroup: it.comp.appl.access
Titolo: problemi con stringa SQL

ciao a tutti, ho un problema da due giorni che non riesco a risolvere.
ho una routine che filtra dei record di una tabella e li inserisce in 
un'altra, con 2 criteri (> data1 e < data2) e funziona.
adesso ho modificato il filtro aggiungendo un terzo criterio (<> "incasso") 
ma ottengo l'errore :
"3421 - il tipo di valore utilizzato dall'applicazione non � valido per 
l'operazione corrente" .
non riesco a capire perch�; potete aiutarmi?
il codice che utilizzo �:
Dim rst1 As ADODB.Recordset
Dim ctl1 As Control
Dim ctl2 As Control
Dim ctl3 As Control
int3 = Forms("SP_ProfonditaReportProgressivo").Controls.Item("testo27")
Dim prm1 As ADODB.Parameter, int1 As Date
Dim prm2 As ADODB.Parameter, int2 As Date
Dim prm3 As ADODB.Parameter
Dim par As ADODB.Parameter
Set cmd1 = New ADODB.Command
    With cmd1
        .ActiveConnection = CurrentProject.Connection
        .CommandText = "Parameters [ctl1] Date, [ctl2] Date, [ctl3] string; 
" & _
            "SELECT [vocimiste].[anno] AS Espr1, [vocimiste].[mese] AS 
Espr2, " & _
            "[vocimiste].[data] AS Espr3, [vocimiste].[persone] AS Espr4, " 
& _
            "[vocimiste].[tipo] AS Espr5, [vocimiste].[gruppo] AS Espr6, " & 
_
            "[vocimiste].[sottogruppo] AS Espr7, [vocimiste].[descrizione] 
AS Espr8, " & _
            "[vocimiste].[importo] AS Espr9, [vocimiste].[pagato] AS Espr10, 
" & _
            "[vocimiste].[modo] AS Espr11, [vocimiste].[come] AS Espr12, " & 
_
            "[vocimiste].[per] AS Espr13 " & _
            "FROM [vocimiste] " & _
            "WHERE [vocimiste].[data] >= [ctl1] AND [vocimiste].[data] <= 
[ctl2] AND [vocimiste].[tipo] <> [ctl3] " & _
            "ORDER BY [Vocimiste].[data], [Vocimiste].[tipo], 
[Vocimiste].[gruppo], [Vocimiste].[sottogruppo];"
        .CommandType = adCmdText
        'Create and define parameter.
        Set prm1 = cmd1.CreateParameter("[ctl1]", adInteger, adParamInput)
        cmd1.Parameters.Append prm1
        int1 = 
Forms("SP_ProfonditaReportProgressivo").Controls.Item("inizio")
        prm1.value = int1
        Set prm2 = cmd1.CreateParameter("[ctl2]", adInteger, adParamInput)
        cmd1.Parameters.Append prm2
        int2 = 
Forms("SP_ProfonditaReportProgressivo").Controls.Item("testo18")
        prm2.value = int2
        Set prm3 = cmd1.CreateParameter("[ctl3]", adInteger, adParamInput)
        cmd1.Parameters.Append prm3
        int3 = 
Forms("SP_ProfonditaReportProgressivo").Controls.Item("testo27")
        prm3.value = int3 
<-------------------------QUANDO ARRIVA QUI SI GENERA L'ERRORE
        .Execute
    End With
dario 

 il codice che utilizzo ï¿œ:

Se vedo bene definisci un parametro del tipo stringa ma poi nel
CreateParameter definisci un long per il "testo27". Suppongo che
devi sostituire adInteger con adVarChar.
-- 
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: 
http://www.donkarl.com
  +  Anmeldung und Info zur
Access-Entwickler-Konferenz (AEK12), Oktober 2009, Nï¿œrnberg 

 Access-Entwickler-Konferenz (AEK12), Oktober 2009, N�rnberg 

 ...
Non uso mai questi metodi ma leggo che CreateParameter
ha un argomento Size che forse devi fornire per un VarChar:
http://msdn.microsoft.com/en-us/library/ms677209(VS.85).aspx
-- 
HTH
Karl
*********
Access FAQ: 
www.donkarl.com/it
 

 ha un argomento Size che forse devi fornire per un VarChar:
ho provato ma il risultato non cambia
Sono ben lieto di conoscere nuovi metodi, percui se mi indichi un metodo 
alternativo per ottenere lo stesso risultato te ne sarei grato.
dario 


Si tratta di quale versione di Access e quale tipo di file (mdb/accdb, adp)?
Le tabelle sono di JET o di un sistema server via ODBC?
Chiedo perchï¿œ non ï¿œ chiaro se per forza devi usare ADO
o invece puoi usare DAO.
-- 
cu


 o invece puoi usare DAO.
ciao specifico che non sono un "mago"
in questo caso � un DB di access 2003 (formato 2000) con tabelle interne e 
tabelle di altri DB access collegate (.mdb)
dario 

 interne e tabelle di altri DB access collegate (.mdb)
Ok, ti rispondo dove posso citare il tuo codice.


 un'altra, con 2 criteri (> data1 e < data2) e funziona.
Per� nel tuo codice non vedo l'inserimento in una tabella.
C'� solo un SELECT cio� una query di selezione non un
SELECT INTO o INSERT INTO per inserire qualcosa in una tabella.
Allora con "funziona" vuoi solo dire che non ti d� errore?
Tradotto in DAO il tuo codice completto � circa:
Dim db As DAO.Database
Set db = CurrentDb
Dim strSQL As String
strSQL = "SELECT anno, mese, data, persone, tipo, gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" FROM vocimiste " & _
" WHERE data Between " & _
CLng(Forms!SP_ProfonditaReportProgressivo!inizio) & " AND " & _
CLng(Forms!SP_ProfonditaReportProgressivo!testo18) & " AND " & _
" tipo <> '" & Forms!SP_ProfonditaReportProgressivo!testo27 & "'" & _
" ORDER BY data, tipo, gruppo, sottogruppo"
Ma come gi� scritto con questo enunciato SQL non ancora
succede niente. Dovrebb'essere una query di azione.
P.e. l'inizio per una query di creazione tabella dev'essere:
strSQL = "SELECT anno, mese, data, persone, tipo, gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" INTO NomeDellaNuovaTabella" & _
" FROM vocimiste " & _
ecc...
ovvero per una tabella di accodamento:
strSQL = " INSERT INTO TabellaDestinazione(anno, mese, ecc.)" & _
" SELECT anno, mese, data, persone, tipo, gruppo," & _
ecc...
Poi si puo eseguire l'SQL che aggiunge i record con:
db.Execute strSQL, dbFailOnError
Gli stessi principi valgono per una versione abbastanza simile
con ADO.
-- 
HTH


 SELECT INTO o INSERT INTO per inserire qualcosa in una tabella.
l'inserimentoin tabella lo facevo un recordset.update

OK provo il tuo metodo e ti faccio sapere
grazie
dario 

Ho provato conuna routine che viene richiamata da un'altra :
Sub zxcvb()
Dim db As DAO.Database
Set db = CurrentDb
Dim strSQL As String
strSQL = "SELECT anno, mese, data, persone, tipo, gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" INTO xprovax" & _
" FROM vocimiste " & _
" WHERE data Between " & _
CLng(Forms!SP_ProfonditaReportProgressivo!inizio) & " AND " & _
CLng(Forms!SP_ProfonditaReportProgressivo!Testo18) & " AND " & _
" tipo <> '" & Forms!SP_ProfonditaReportProgressivo!Testo27 & "'" & _
" ORDER BY data, tipo, gruppo, sottogruppo"
End sub
ma ottengo errere 13 Tipo non corrispondente
nella casella di testo "testo27" inserisco tramite codice la stringa 
"incasso"
dario 

 "incasso"
?


 debug.print strSQL
nella finestra immediata non ottengo nemmeno 1 carattere

 nella finestra immediata non ottengo nemmeno 1 carattere
-- 


il riferimento a DAO3.6 � presente ma l'errore 13 si verifica quando 
nell'esecuzione del codice arriva a:
ho provato senza i parametri della data e funziona
Sub Estrai_spese_mensili_DAO2()
Dim db As DAO.Database
Set db = CurrentDb
Dim strSQL As String
strSQL = "SELECT anno, mese, data, persone, tipo, gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" INTO xprovax" & _
" FROM vocimiste " & _
" WHERE tipo <> '" & Forms!SP_ProfonditaReportProgressivo!Testo27 & "'" & _
" ORDER BY data, tipo, gruppo, sottogruppo"
Debug.Print strSQL
End Sub
percui penso dipenda dalla sintassi delle date:


 Secondo me i magi non esistono.
per� i "maghi", di access, esistono...tu ne fai parte :-)))
ciao Karl
Daniele 

scusa ho fatto confusione il messaggio corretto �
il riferimento a DAO3.6 � presente
ho provato senza i parametri della data e funziona
Sub Estrai_spese_mensili_DAO2()
Dim db As DAO.Database
Set db = CurrentDb
Dim strSQL As String
strSQL = "SELECT anno, mese, data, persone, tipo, gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" INTO xprovax" & _
" FROM vocimiste " & _
" WHERE tipo <> '" & Forms!SP_ProfonditaReportProgressivo!Testo27 & "'" & _
" ORDER BY data, tipo, gruppo, sottogruppo"
Debug.Print strSQL
End Sub
percui penso dipenda dalla sintassi delle date:
" WHERE data Between " & _


 perï¿œ i "maghi"... esistono...
Ah, come molte parole che scrivo nei miei messaggi qui. :-)
Ma diventa un po' meglio ogni anno.
-- 
un saluto da Vienna
Karl
***************
Access FAQ: 
www.donkarl.com/it
 

 il riferimento a DAO3.6 ï¿œ presente

Strano.
Prova con l'intero enunciato SQL solamente nel strSQL=... senza
eseguirlo con Execute ecc. , cioï¿œ solo questo:
Sub zxcvb()
Dim strSQL As String
strSQL = "SELECT anno, mese, data, persone, tipo, gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" INTO xprovax" & _
" FROM vocimiste " & _
" WHERE data Between " & _
CLng(Forms!SP_ProfonditaReportProgressivo!inizio) & " AND " & _
CLng(Forms!SP_ProfonditaReportProgressivo!Testo18) & " AND " & _
" tipo <> '" & Forms!SP_ProfonditaReportProgressivo!Testo27 & "'" & _
" ORDER BY data, tipo, gruppo, sottogruppo"
Debug.Print strSQL
End sub
Non potrebbe darti un errore 13 e un risultato nella finestra immediata.
-- 
cu



dario 

 CLng(Forms!SP_ProfonditaReportProgressivo!Testo18) & " AND " & _
Puo darsi che i tuoi campi inizio e/o Testo18 non sono del tipo data
e/o non contengono date?


 e/o non contengono date?
entrambi sono del tipo data in cifre e contengono date 


Strano. Cosa succede o ricevi se incolla questa riga nella finestra
immediata e premi <Return> nella riga:
?Forms!SP_ProfonditaReportProgressivo!inizio
e poi questa:
?CLng(Forms!SP_ProfonditaReportProgressivo!inizio) 


 ?CLng(Forms!SP_ProfonditaReportProgressivo!inizio)
?Forms!SP_ProfonditaReportProgressivo!inizio
17/02/2008
?CLng(Forms!SP_ProfonditaReportProgressivo!inizio)
                      (non ricevo nulla)


Forse funziona almeno questo:
?Format(Forms!SP_ProfonditaReportProgressivo!inizio, "\#yyyy\-mm\-dd\#")
Il compito ï¿œ trovare una versione della tua data che ï¿œ accetabile
per una stringa SQL. Vedi anche 
www.donkarl.com/it?FAQ6.8
.



HO TROVATO
?CDate(Forms!SP_ProfonditaReportProgressivo!inizio)
17/02/2008
 ?CDate(Forms!SP_ProfonditaReportProgressivo!testo18)
31/12/2009
?Forms!SP_ProfonditaReportProgressivo!Testo27
incasso
CDate invece di CLng
pi� tardi provo a vedere se riesco ad intergrare il tutto nelle mie routine 
e ti faccio sapere
ciao e per ora grazie

 routine e ti faccio sapere
come temevo ho qialche problema
il codice seguente non genera errore
strSQL = " SELECT anno, mese, data, persone, tipo, gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" FROM vocimiste " & _
" WHERE data Between " & _
CDate(Forms!SP_ProfonditaReportProgressivo!inizio) & " AND " & _
CDate(Forms!SP_ProfonditaReportProgressivo!Testo18) & " AND " & _
" tipo <> '" & Forms!SP_ProfonditaReportProgressivo!Testo27 & "'" & _
" ORDER BY data, tipo, gruppo, sottogruppo"
ma come faccio a inserire i record nella tabella?
ho provato a inserire nel codice SQL
strSQL = " INSERT INTO TabellaProva(anno, mese, ecc.)" & _
" SELECT anno, mese, data, persone, tipo, gruppo," & _
ecc...
ma nella cartella che indico non mi inserisce nessun record

 per una stringa SQL. Vedi anche 
www.donkarl.com/it?FAQ6.8
.
Infatti qui sta il problema
il codice cos� scritto non produce errori ma non estrae nulla (non mostra il 
messaggio)
perch�?
Dim db As DAO.Database
Dim Tabella As DAO.Recordset
Set db = CurrentDb
Set Tabella = db.OpenRecordset(" SELECT anno, mese, data, persone, tipo, 
gruppo," & _
" sottogruppo, descrizione, importo, pagato, modo, come, per" & _
" FROM vocimiste " & _
" WHERE data Between " & _
CDate(Forms!SP_ProfonditaReportProgressivo!inizio) & " AND " & _
CDate(Forms!SP_ProfonditaReportProgressivo!Testo18) & _
" ORDER BY data, tipo, gruppo, sottogruppo")
If Not Tabella.BOF Then 'se ci sono record nel recordset
  Tabella.MoveLast ' necessario per determinare l'attuale numero di record
  MsgBox Tabella.RecordCount
End If