Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Ado, bug o problema con la sintassi ?

Ho un database access 2002 con una query che richiede 2 parametri:
- Dentro Access la query "funziona" sia quando inserisco dei valori nei 
2 parametri sia quando non metto alcun valore nel primo parametro. In 
quest'ultimo caso mi restituisce tutte le righe della tabella.
- Dentro Visual Basic (richiamando il database access e useando ADO) 
succede che se metto dei valori in entrambi i parametri, "funziona", 
mentre se non metto alcun valore nel primo parametro, "non funziona" 
ovvero non mi restituisce nessuna riga della tabella.
La query e' la seguente:
SELECT tbAree.RepartoAppartenenza, tbAree.CodiceArea, 
tbAree.DescrizioneArea, tbAree.Password, tbAree.Poteri, 
tbAree.RepartoAppartenenza, tbAree.ObbligoAutentica
FROM tbAree
WHERE (((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso])) 
AND ((tbAree.Poteri)>=[AskPoteri])) OR (((tbAree.Poteri)>=[AskPoteri]) 
AND (("Or")<>IIf([AskAccesso] Is Null,"")))
ORDER BY tbAree.RepartoAppartenenza, tbAree.DescrizioneArea;
In visual basic la richiamo cosi':
Dim adoCM As ADODB.Command
Set adoCM = New ADODB.Command
Set adoCM.ActiveConnection = cnLoginADO
adoCM.CommandType = adCmdStoredProc
adoCM.CommandText = "qyCercaAccessoinElencoconPoteri"
adoCM.Parameters.Append adoCM.CreateParameter("AskAccesso", adVarChar, 
adParamInput, 255, vbNullString)
adoCM.Parameters.Append adoCM.CreateParameter("AskPoteri", adVarChar, 
adParamInput, 255, "1")
Dim adoRS As ADODB.Recordset
Set adoRS = adoCM.Execute
adoRS.MarshalOptions = adMarshalModifiedOnly
Set Me.TDBGrid1.DataSource = adoRS
Me.TDBGrid1.Refresh
In visual Basic il primo parametro e' posto a vbnullstring e in questo 
caso "non funziona", mentre se inserisco uno dei valori presenti in 
tabelle, mi viene correttamente restituita la riga corrispondente.
E' un bug, oppure in visual basic ho dimenticato qualche cosa?!!!
ciao e grazie
marco

 tabelle, mi viene correttamente restituita la riga corrispondente.
Che non trovi, appunto, la seconda scelta della IIf?

 Che non trovi, appunto, la seconda scelta della IIf?
puo' essere che in qualche modo i doppi apici creino problemi 
all'interprete SQL delle librerie ADO Visual Basic, e in access questo 
problema non esista?

[*mrcat*=
mr...@libero.it
] ha scritto:

Può essere, in quanto Access è "buono" (in termini di masturbazioni interne)
quanto e forse persino più di VB, ma non insisto, non uso i Parameter. Ti
consiglierei di scrivere la query tutta in chiaro (senza parametri, ma
passando i relativi valori nell'intera costante stringa) e, da lì, capire.
Resto comunque perplesso (Parameter o no) su come possa una IIf avere due
soli argomenti e non tre espliciti.

 soli argomenti e non tre espliciti.
grazie, ora ho scremato un pochino e la query e' la seguente:
SELECT tbAree.DescrizioneArea
FROM tbAree
WHERE (((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso]))) 
OR ((("Or")<>IIf([AskAccesso] Is Null,"")))
ORDER BY tbAree.DescrizioneArea;
ho solo un parametro e il problema permane, cioe' in access funziona e 
in Visual Basic NO!
e' una query un po particolare forse perche' ha un ("Or") come campo ma 
dico se funziona in access perche'!! perche'!!! in vb no ?

 ha scritto nel messaggio
news:3F5DF50D...@libero.it...

se non ho capito male il tuo campo si chiama Or
(a parte che eviterei questo nome visto che č un operatore relazionale e
quindi fuorviante)
se č cosě, perchč non provi a chiamarlo con le quadre come il campo
AskAccesso??
e poi, se nella composizione della stringa in vb utilizzi il doppio apice
non gli indichi che termina la stringa??
e quindi per essere certo che ti ce lo metta ne devi mettere due???

 ma dico se funziona in access perche'!! perche'!!! in vb no ?
Perchè in M$ una mano non sa (guai se lo sapesse) cosa fanno le altre "n"!
Togliti il dubbio e cambia il nome di quel campo (o testane un altro, tanto
per provare) e poi perchè il nome del campo "Or" è fra virgolette e
"tbAree.DescrizioneArea" no?
Senti, detto chiaro e tondo, non ci credo mica tanto.
Prova a fare
pippo=IIf(pluto<>0,1)
ed esegui.

Ho fatto un po' di prove e' ho scoperto qualcosa di strano:
Per testare se l'argomento askAccesso è vuoto ho provato ad usare la 
funzione LEN, ma in access non funziona, infatti avevo usato Is Null al 
suo posto.
percio ' ora ho due query che dovrebbero fare la stessa cosa in due modi 
diversi:
[query1:]
SELECT tbAree.DescrizioneArea
FROM tbAree
WHERE (((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso])))
OR ((("Or")<>IIf([AskAccesso] Is Null,"")))
[query2:]
SELECT tbAree.DescrizioneArea
FROM tbAree
WHERE (((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso]))) 
OR ((("Or")<>IIf(Len([AskAccesso])=0,"")));
La query1 ha il comportamento di cui ho già parlato nei post precedenti.
La query2 NON funziona sotto Access, ma stranamente FUNZIONA in Visual 
Basic !!!!
Ovvero se lascio il parametro vuoto mi vengono restituite nella griglia 
Tutte le righe della tabella tbAree.
Il problema e' dovuto quindi ad una errata o diversa interpretazione del 
valore nullo o "" o vbnullstring o quant'altro in access e in VB.
qualche suggerimento per risolverlo ?!

 Può essere, in quanto Access è "buono" (in termini di masturbazioni
interne)
"buono" è un eufemismo.
Opinione personale, si intende, ma se in ms la piantassero una buona volta
di fare i "giochetti per bambini scemi"... ;(
ciao
ugo


Per la Cronaca si hanno gli stessi problemi con
query1:
SELECT tbAree.DescrizioneArea
FROM tbAree
WHERE (((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso]) 
Or (tbAree.DescrizioneArea)<>IIf(IsNull([AskAccesso])=True,"")));
query2:
SELECT tbAree.DescrizioneArea
FROM tbAree
WHERE (((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso]) 
Or (tbAree.DescrizioneArea)<>IIf(Len([AskAccesso])=0,"")));
A riprova che il problema non dipende dal campo ("Or") accennato nei 
post precedenti.


Come ti scrive Lupo da un po', la IIF vuole 3 (TRE) parametri.
ciao
ugo


e' come fai ad inserire il terzo parametro???
query1:
WHERE (((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso]) 
Or (tbAree.DescrizioneArea)<>IIf(IsNull([AskAccesso])=True,"")));
potrei trasformarla in:
WHERE ((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso],"")
ma non funziona !
Ho bisogno che:
se AskAccesso contiene un valore --> selezioni solo quel valore
se AskAccesso e' vuoto --> selezioni tutti i valori della tabella

 se AskAccesso e' vuoto --> selezioni tutti i valori della tabella
Allora devi cambiare la composizione del comando e inserire la clausola
Where solo se la variabile/parametro di confronto è definita, viceversa non
devi fare la Where.
In pratica, se si dovesse comporre la stringa ignorando i Parameter, ma
considerando solo le variabili:
comando_sql="Select eccetera... From eccetera"
If Len(AskAccesso) then
    comando_sql=comando_sql & " Where tbAree.descrizioneArea='" & AskAccesso
& "'"
End If

 End If
questo lo posso fare se la stringa SQL e' dentro VB, ma la mia query si 
trova "precompilata" dentro Access


Ho introdotto il terzo parametro nella prima parte della condizione
SELECT tbAree.DescrizioneArea
FROM tbAree
WHERE 
(((tbAree.DescrizioneArea)=IIf(Len([AskAccesso])>0,[AskAccesso],"") Or 
(tbAree.DescrizioneArea)<>IIf(IsNull([AskAccesso])=True,"")));
Stessi Problemi

[*mrcat*=
mr...@libero.it
] ha scritto:

Getto la spugna. Non per cattiveria, ma non conosco l'applicativo Access e,
in ogni caso, quella query scritta in quel modo (pur composta da Access) non
mi piace per niente. Evidentemente il para-linguaggio all'interno di Access
accetta quella IIf strana, ponendo come seconda scelta non so che cosa,
forse, appunto, nessuna scelta e togliendo, di fatto, la condizione Where
corrispondente.


Grazie lo stesso, per oggi la pianto qua anche io
domani e' un altro giorno.
ciao

 Stessi Problemi
Ma certo! Perchè questo gli dice, nella prima parte, <scegli  le righe la
cui DescrizioneArea è uguale a quanto indicato o a "" se non indicato> e,
nella seconda parte, <oppure quelle la cui DescrizioneArea è Null>
Non quadra, non può quadrare con quello che vuoi ottenere (secondo quanto
hai scritto prima).
Ora la domanda è semplice: Che ti importa di "dover" utilizzare una query
già precompilata in Access? Davvero non puoi "emularla" scrivendola come si
conviene e facendo finta che non esista proprio?
Nei hai molte e ti si presenta il problema di farlo per tutte e/o non le
conosci per cui non puoi, appunto, emularle con un SQL decente (che, non so
se s'è capito, non è quell'esempio di Access)?

 se s'è capito, non è quell'esempio di Access)?
Ne ho moltissimi pre esistenti e una parte contiene questi giochetti (sigh)!


SI!!!!
sulla query1 in Visual Basic usavo la chiamata:
adoCM.Parameters.Append adoCM.CreateParameter("AskAccesso", adVarChar, 
adParamInput, 255, vbNullString)
ebbene l'errore e' nell'utilizzo di vbNullString (che equivale a ""), 
non funziona neanche con vbNull o vbEmpty, ecc. SI DEVE USARE: Null
la chiamata corretta e':
adoCM.Parameters.Append adoCM.CreateParameter("AskAccesso", adVarChar, 
adParamInput, 255, Null)
in questo modo la query1 funziona sia con Access che con Visual Basic (ADO)
col senno di poi sembra ovvio che debba essere Null!!!
ringrazio Lupo e gli altri partecipanti al 3d per i suggerimenti e la 
solidarietą ricevuta, che mi ha portato a provare e riprovare fino alla 
soluzione!

 sulla query1 in Visual Basic usavo la chiamata:
[cut]
Stavo rispondendoti, ma mi hai preceduto.
ciao
buon lavoro
ugo