Newsgroup: it.comp.lang.visual-basic
Titolo: Perchè questa query SQL non funziona su Excel?

Ho perso diverse ore nella seguente funzione e non riesco a venirne fuori.
La funzione dovrebbe, dato il percorso di un file XLS composto ad un Foglio 
con nome "150" aggiornare il valore di una determinata cella considerando 
l'intero foglio come fosse un database.
Non viene emesso nessun errore, ma l'aggiornamento non viene eseguito!
Ho provato e riprovato a controllare la query ma sembra tutto giusto,
Mi viene un dubbio: devo per caso salvare in qualche modo il file XLS 
aggiornato con la seguente funzione?
Avete qualche dritta?
Function InserisciValoreCampoXLS(PercorsoFile As String, NomeFile As String)
    Dim strCnn As String
    Dim strQry As String
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim fld As ADODB.Field
    strQry = "UPDATE [150$A9:Z1000] SET [NPEZZI] = 'PROVA' WHERE DIAMETRO = 
'16'"
    Set cnn = New ADODB.Connection
    Set rst = New ADODB.Recordset
    strCnn = ";Driver={Microsoft Excel Driver (*.xls)}" _
    & ";DBQ=" & PercorsoFile & NomeFile _
    & ";ReadOnly=True;" _
    & ";DefaultDir=" & Left(PercorsoFile, Len(PercorsoFile) - 1) _
    & ";DriverId=790" _
    & ";MaxBufferSize=2048" _
    & ";PageTimeout=5" _
    & "IMEX=1" _
    & ";"
    cnn.ConnectionString = strCnn
    cnn.Open
    cnn.Execute strQry
    cnn.Close
    Set cnn = Nothing
End Function 

pincopalla ha scritto:

come ti ho gia detto non sapevo manco si potesse usare SQL su excel, xke 
teoricamente non ha il minimo senso, ma da quello che vedo l'unica cosa 
che mi pare non andare è questo
strQry = "UPDATE [150$A9:Z1000] SET [NPEZZI] = 'PROVA' WHERE DIAMETRO=16'"
ovvero NPEZZI che è un nome di colonna è tra parentesi quadre, mentre 
diametro che è anch'esso un nome di colonna non è tra quadre...
di + nn saprei vista la mia ignoranza...
saluti MVB

 diametro che è anch'esso un nome di colonna non è tra quadre...
Innanzitutto grazie per l'interessamento...
Ho già provato a togliere e mettere le parentesi d'appertutto ma non 
funziona.
La query adesso è:
strQry = "UPDATE [150$A9:Z1000] SET [NPEZZI] = 'PROVA' WHERE 
[DIAMETRO]='16'"
Per quanto riguarda il senso della cosa sta nel fatto che ho da gestire un 
bel po' di file di Excel che al loro interno hanno anche delle formule (con 
che in un database non si può fare..) e il modo più veloce è quello delle 
query SQL.
La query con il SELECT è di una praticità unica!
L'applicativo è praticamente finito mi manca solo questa cosa! e sto perdeno 
ore e ore di lavoro nella ricerca di una soluzione.
Ho provato diverse strade, questa mi sembra la più pulita ma non riesco 
capire perchè non funziona!
Speriamo che qualche anima pia possa aiutarmi.... :-( 

"pincopalla"

essendo io del tutto inesperto e excel non tipizzato non so bene come 
funziona.
ma in un db tipizzato sarebbe probabilmente
WHERE [DIAMETRO]=16
senza apici. dato che importando da excel access ogni tanto riconosce 
colonne di numeri e date, fosse mai che a ado non gli piace la stringa...
hth, ciao, a.

 formule (con che in un database non si può fare..)
che in un DB nn si possano mettere formule lo dici tu :D ad esempio in 
sql server 2005 ci sono le "colonne calcolate" e cmq è buona 
programmazione avere nel db i dati grezzi, che poi vengono 
opportunamente modificati dal programma e mostrati a video gia 
"elaborati"...x quello che riguarda il tuo problema non so davvero cosa 
dire allore :( mi spiace!
saluti MVB


wrote:

il problema sta nell'intervallo celle
questo funziona
sq = "UPDATE [150$] SET [NPEZZI] = 'PROVA' WHERE DIAMETRO = " & "16"
se devi agire su un set limitato di celle
devi dare un nome all'intervallo desiderato e poi usi quel nome al
posto di [150$] nella query
sam--

 [DIAMETRO]='16'"
Il nome del foglio credo debba essere passato nella forma [150$] posto che 
il nome del foglio sia "150" e senza indicare l'intervallo di celle.
-- 
Greg 

 posto di [150$] nella query
Non per forza, infatti l'intervallo [150$A9:Z1000] funziona .
Dopo ore e ore e ore di prove e riprove ho scoperto due cose:
- non mi lascia scrivere "PROVA" perchè è una stringa di testo, con i numeri 
è ok (anche se racchiusi tra apici)
- da errore quando deve aggiornare una cella con all'interno una formula
Se sto attento alle affermazioni di cui sopra e scrivo
sql = "UPDATE [150$A9:Z1000] SET [NPEZZI] = '8' WHERE DIAMETRO = " & "16"
Funziona, sempre che non ci siano formule nelle celle interessate 
dall'UPDATE.
Ora vi chiedo, è possibile scrivere una query che scarti tutte le celle con 
all'interno espressione?
Ho provato a controllare che il primo carattere non sia "=", ma sembra che 
faccia riferimento al risultato dell'espressione e non al contenuto vero e 
proprio della cella.
Avete qualche suggerimento?
Grazie anticipatamente.

 hth, ciao, a.
Innanzitutto ti ringrazio per la risposta
Ma gli apici sono giusti, 
vedi la mia risposta a "Sam--"
Grazie

 riguarda il tuo problema non so davvero cosa dire allore :( mi spiace!
Ti dņ ragione in tutto quello che hai detto ma purtroppo sto lavorando con 
centinaia di archivi di dati gią realizzati in Excel con una molteplicitą di 
formule da far paura e trasportare tutto in un db diventa troppo oneroso e 
rischioso.
Quindi sono costretto a lavorare come fossero dei files di excel....
Il cliente ha sempre ragione :-(
Grazie comunque per la risposta

 ha scritto nel messaggio 
news:ftdjb6$f2j$1...@tdi.cu.mi.it...

Innanzitutto ti ringrazio per la risposta
Il foglio 150 esiste e l'intervalo è corretto ed accettato dall'espressione 
SQL.
Purtroppo i problemi sono altri
Vedi la mia risposta a "Sam--"....
Grazie 

Non per forza, infatti l'intervallo [150$A9:Z1000] funziona .
A me non funziona..
Se nella query metto l'intervallo al momento di fare l'update ottengo
questo errore:
err.number: -
2147217904
err.description: [Microsoft][ODBC Excel Driver] Too few parameters.
Expected 2.
la query è
sql = "UPDATE [Foglio1$A2:B46] SET [NPEZZI] = '9999' WHERE DIAMETRO =
" & "16"
Non capisco come faccia a te a funzionare....



Ti posso assicurare che funziona.
- il foglio1 esiste?
- nel foglio1 con l'intervallo da te indicato la riga 2 deve contenere le 
intestazioni delle colonne