View Full Version : [vb+access] query annidata
DarkSiDE
16-02-2005, 18:00
sSql = sSql & "INSERT INTO scheda (cliente, giorno, esercizio)" & vbCrLf
sSql = sSql & "VALUES ('" & clienteA & "'+ SELECT giorno, esercizio FROM scheda where scheda.cliente='" & clienteDA & "')" & vbCrLf
mi sapete dire perchè non mi funziona? la query interna funziona perfettamente, credo che sia il concatenamento che non va
grazie
DarkSiDE
17-02-2005, 16:40
qualcuno mi può aiutare? :)
Stampa la query già completata di tutti i campi su un file di testo o su una text box e verifica che funzioni veramente in Access...
DarkSiDE
18-02-2005, 08:39
Originariamente inviato da cionci
Stampa la query già completata di tutti i campi su un file di testo o su una text box e verifica che funzioni veramente in Access...
una query funziona, il problema è nella "insert", precisamente credo sia il concatenamento che non va
sSql = sSql & "VALUES ('" & clienteA & "'+
Eh sì...devi emttere uno spazio alla fine della prima o all'inzio della seconda stringa...senza vbCrLf...prova così...
Inoltre non capisco a che serve mettere una SELECT dentro VALUES...sinceramente non l'ho mai fatto...
DarkSiDE
18-02-2005, 13:14
Originariamente inviato da cionci
Eh sì...devi emttere uno spazio alla fine della prima o all'inzio della seconda stringa...senza vbCrLf...prova così...
Inoltre non capisco a che serve mettere una SELECT dentro VALUES...sinceramente non l'ho mai fatto...
meglio un ciclo?
Originariamente inviato da DarkSiDE
meglio un ciclo? Più che altro quello che mi domando è se funziona davvero ;)
DarkSiDE
18-02-2005, 16:54
Originariamente inviato da cionci
Più che altro quello che mi domando è se funziona davvero ;)
di funzionare funziona, io non conosco quali potrebbero esserele alternative
Mi fai un esempio di una query di questo tipo completa (con tutti i parametri valorizzati) ?
Mi spieghi quanti record vorresti aggiungere con quella query ?
L'idea è giusta, ma forse c'è un errore, per fare una query di quel tipo tu devi dare alla select gli STESSI IDENTICI campi che hai messo nella insert... se nn dico una cacchiata, tu li hai messo un parametro fisso ed una select da 2 valori... nn credo che questo piaccia molto sai al database!
Secondo me l'unica maniera è fregare la query, danto un parametro fisso, ma già dentro alla query, nn fuori (come avevi fatto te), così in questa maniera lui crea la sottoquery identica ai campi che ti serve per la insert!
Prova a mettere questa:
sSql = sSql & "INSERT INTO scheda (cliente, giorno, esercizio)" & vbCrLf
sSql = sSql & "VALUES (SELECT '" & clienteA & "' as cliente, giorno, esercizio FROM scheda where scheda.cliente='" & clienteDA & "')" & vbCrLf
Il risultato della variabile da passare sarà questo:
(nella mia prova cliente A e cliente DA valgono rispettivamente '123' e '456'
INSERT INTO scheda (cliente, giorno, esercizio)
VALUES (SELECT '123' as cliente, giorno, esercizio FROM scheda where scheda.cliente='456')
Così facendo, ti potreggi anche dal problema che a volte potresti tirare fuori una query maggiore di una riga!
Originariamente inviato da matpez
Così facendo, ti potreggi anche dal problema che a volte potresti tirare fuori una query maggiore di una riga!
Infatti...come ha scritto lui dovrebbe funziona solo su una riga e fa un concatenamento fra stringhe...quindi riempie un solo campo (di conseguenza la query è errata perchè ne aveva specificati 3 nella INSERT), ma bisogna capire per bene quello che ha intenzione di fare...
DarkSiDE
19-02-2005, 15:22
Originariamente inviato da cionci
Infatti...come ha scritto lui dovrebbe funziona solo su una riga e fa un concatenamento fra stringhe...quindi riempie un solo campo (di conseguenza la query è errata perchè ne aveva specificati 3 nella INSERT), ma bisogna capire per bene quello che ha intenzione di fare...
Non avevo considerato la possibilità che la query potesse restituire più righe, ecco l'errore
non capisco perchè mi ha consigliato l''"as"
cmq visto che avevo fretta di risolvere, ho fatto con un ciclo
sFile = App.Path & "\db1.mdb"
Set cn = New ADODB.Connection
Set cn1 = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sFile
cn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sFile
cn.Open
'insert into tabella2 select * from tabella1 where condizione
sSql = ""
sSql = "delete FROM Scheda WHERE Cliente='" & clienteA & "'"
cn.Execute sSql
sSql = "SELECT * FROM Scheda WHERE Cliente='" & clienteDA & "'"
Set rs = cn.Execute(sSql)
While Not (rs.EOF)
cn1.Open
sSql1 = ""
sSql1 = "INSERT INTO Scheda" & vbCrLf
sSql1 = sSql1 & "VALUES ('" & rs("Giorno") & "','" & rs("Esercizio") & "','" & rs("Ripetizioni") & "','" & rs("Note") & "','" & clienteA & "','" & rs("posizione") & "')"
cn1.Execute sSql1
cn1.Close
rs.MoveNext
Wend
sSql = "SELECT giorno, esercizio, ripetizioni, note, posizione FROM scheda where scheda.cliente='" & clienteDA & "'" & vbCrLf
Non importa fare un query per ogni ciclo...puoi fare uan cosa del genere:
INSERT INTO NomeTabella (Pippo, Pluto, Paperino)
VALUES (('1', '2', '3'), ('4', '5', '6'), ('7', '8', '9'));
In pratica ti componi la query durante il ciclo...e poi vai afare l'insert dopo il ciclo...
Ma scusa, ma se tanto il tuo campo clienteA è sempre fisso, come mai nn hai usato quella tecnica che ti ho suggerito? ti risparmiavi il ciclo :)
DarkSiDE
20-02-2005, 09:52
Originariamente inviato da cionci
Non importa fare un query per ogni ciclo...puoi fare uan cosa del genere:
INSERT INTO NomeTabella (Pippo, Pluto, Paperino)
VALUES (('1', '2', '3'), ('4', '5', '6'), ('7', '8', '9'));
In pratica ti componi la query durante il ciclo...e poi vai afare l'insert dopo il ciclo...
già,non ci avevo pensato, grazie mille,c'è da dire che quelle righe vengono richiamate molto raramente e per poche righe, quindi non mi sono posto il problema più di tanto :)
matpez se hai la pazienza di spiegarmi..non ho capito come funziona la tua query
Puoi passare una SELECT anche alla INSERT INTO... In questo modo i risultati della SELECT verranno immessi nella tabella...
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/office97/html/output/F1/D2/S5A32B.asp
Come ti ho già accennato io e cionci ti ha dato il link, se tu vuoi fare una query di quel tipo, cioè una INSERT che richiama una SELECT la puoi fare benissimo ma con un unica particolarità: tutti i campi della insert devono essere i campi della select!
Se tu noti, nella tua prima query che hai postato, metti un campo fisso (preso da una variabile) e una select (che richiama 2 valori), questo nn è possibile, perchè come detto, tu nella select devi richiamare gli stessi campi della insert, non solo 2 come hai fatto.
In più nasce un secondario problema, (dico secondario perchè già in partenza è sbagliato il metodo che hai usato tu) cioè che la select tiri fuori più di un record, a questo punto proprio sarebbe sbagliato.
Per "fregare" la query, c'è un sistema che è molto usato in questi casi, proprio quando hai un parametro fisso e dei campi riciamati da una select; il trucchetto è proprio quello che ti avevo postato io. Tutto sta nel dire che il tuo campo "cliente" (ched ate era un fisso), lo mettiamo direttamente dentro alal select, in questa maniera:
SELECT 'matteo' as cliente
naturalmente matteo è il contenuto della tua variabile, il resto della select si compone giustamente come avevi fatto te. A qeusto punto la select annidata alla insert prenderà una cosa di questo tipo:
matteo 10/10/2004 abcd
matteo 15/10/2004 efgh
matteo 18/10/2004 ilmn
cioè mettendo fisso il cliente.
Se nn ti è ancora molto chiaro, prova in sql a fare una query qlc e poi alla fine metti appunto questo: SELECT ......, 'matteo' as cliente ; e vedrai che ti tira fuori tutto quello che tu vuoi ma anche una riga con scritto sempre "matteo".
Se tu prendi la query che nn hai capito nel mio post, utilizza questo modo, questo ti risparmia tempo e velocità, perchè un for è più lento rispetto ad una query di questo tipo.
Spero di averti chiarito le idee :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.