PDA

View Full Version : [VB6-ADO-ACCESS]-Problema Stored Query E Operatore LIKE...


MarcoGG
31-01-2007, 14:27
Il problema è semplicissimo all'apparenza... All'atto pratico invece... :muro:

Devo eseguire una query parametrica da VB, passando un parametro stringa ad una Stored Query di Access 2003 che utilizza l'operatore LIKE.
In pratica il RecordSet risultante deve contenere tutti i prodotti della tabella Prodotti, che cominciano con un numero imprecisato di caratteri stabiliti dall'utente...

Qui il codice del Criterio di Access su Nome_Prodotto :
Like [Input Iniziali Nome_Prodotto] & "*"

Faccio notare che ovviamente la query, lanciata da Access funziona perfettamente, e funziona allo stesso modo se il Criterio è :
Like [Input Iniziali Nome_Prodotto] + "*"
Oppure
Like [Input Iniziali Nome_Prodotto] & '*'
Oppure
Like [Input Iniziali Nome_Prodotto] + '*'

Qui invece il codice VB che chiama ed esegue la Stored Query :


...
...
Dim CMD As ADODB.Command
Set CMD = New ADODB.Command
With CMD
Set .ActiveConnection = dbConnection
.CommandText = nomeQuery
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter(nomeCriterio, adVarChar, adParamInput, Len(valoreCriterio), valoreCriterio)
End With

Set RS = New ADODB.Recordset
RS.CursorType = adOpenKeyset
RS.LockType = adLockOptimistic
RS.CursorLocation = adUseClient
RS.Open CMD

MsgBox RS.RecordCount

Dopo l'operazione il Recordcount mi ritorna sempre '0' e ovviamente ogni successivo tentativo di leggere il Recordset produce un errore...

Faccio notare che il codice VB riguardo all'uso del Command è lo stesso medesimo di un'altra procedura che NON usa l'operatore LIKE di Access, ma cerca direttamente il Nome_Prodotto, e che FUNZIONA.

E' proprio l'operatore LIKE di Access che crea problemi ? Come risolvere ?
So benissimo che ci sono molti altri modi, come passare tutta la stringa della Select da VB6 ecc..., ma voglio cmq usare la query già costruita in Access, passandole un parametro.

Spero di essere stato abbastanza chiaro, e perdonate la lunghezza della domanda...

GRAZIE a chiunque abbia un idea ! :)

akyra
31-01-2007, 14:36
se hai estrema necessità di usare quel sistema provo ad analizzare come mai il tuo codice sbaglia, altrimenti se è il risultato che ti interessa la soluzione ce l'ho già, fatta con query "già costruita" ma senza usare i parametri...ora vedo

MarcoGG
31-01-2007, 14:44
se hai estrema necessità di usare quel sistema provo ad analizzare come mai il tuo codice sbaglia, altrimenti se è il risultato che ti interessa la soluzione ce l'ho già, fatta con query "già costruita" ma senza usare i parametri...ora vedo

Ti ringrazio. :)
In effetti vorrei proprio usare questo metodo. Da VB6 avevo già risolto. ;)

akyra
31-01-2007, 16:00
allora, il codice corretto è il seguente:

Dim Cmd As ADODB.Command
Dim Param As ADODB.Parameter
Dim Rs As ADODB.Recordset

Set Cmd = New ADODB.Command
Cmd.ActiveConnection = CurrentProject.Connection
Cmd.CommandType = adCmdStoredProc
Cmd.CommandText = "Query1"

Set Param = Cmd.CreateParameter("cercaNome", adVarChar, adParamInput, Len("pippo"))
Param.Value = "pippo"
Cmd.Parameters.Append Param
Set Rs = Cmd.Execute()

'due righe per testarne il corretto funzionamento:
Rs.MoveFirst
MsgBox "Il valore ritornato dalla ricerca è: " & Rs![Nome]


non che il tuo non sia corretto, ma non ho avuto tempo di analizzarlo, per cui non so dire se hai scritto qualcosa di errato, anche se a prima vista mi sembra sia giusto (scusa l'eccesso di zelo :stordita: ma sono al lavoro per cui preferisco risolverli i problemi invece che cercare di capirli :) ). Comunque, cambia la query che esegue la ricerca creando un NUOVO CAMPO , nella query stessa, che ha come dati la seguente dicitura (il codice sottostante lo devi inserire nella testata "Campo", non in "Criterio"):

Verifica: InStr(Left([Nome];Len([cercaNome]));[cercaNome])


[Nome] = campo su cui eseguire la ricerca (stringa).
[cercaNome] = PARAMETRO passato alla query.
come "Criterio" per questo nuovo campo, scrivi soltanto >0
In questo modo verrà creato un nuovo campo calcolato, denominato "Verifica", che potrà assumere valori interi >=0 a seconda che la stringa passata come argomento corrisponda all'inizio del campo in cui si sta cercando.

puoi cambiare i nomi di questi campi con i nomi, rispettivamente, del campo su cui devi fare la ricerca, e del parametro che la query accetta.

Ti posto anche un database di esempio su cui è implementato tutto il discorso.
Se ci son problemi chiedi pure.
(cerco di essere dettagliato in maniera quasi maniacali così da non far sorgere dubbi...)

MarcoGG
31-01-2007, 18:52
Sì, in effetti è un escamotage piuttosto macchinoso per aggirare l'operatore LIKE che a quanto pare è proprio la causa dell'intoppo.

Ho provato a snellire un po' la tua soluzione:

1. Il mio codice VB ha un suo perchè in effetti :
Set RS = New ADODB.Recordset
RS.CursorType = adOpenKeyset
RS.LockType = adLockOptimistic
RS.CursorLocation = adUseClient
RS.Open CMD
Mi permette di modificare a piacere i parametri di RS PRIMA che lo stesso venga aperto, mentre la procedura
Set Rs = Cmd.Execute()
istanzia ed apre in un colpo solo e i parametri di default di RS non mi vanno bene...

2. Non ho creato nessun campo aggiuntivo, ma mi sono limitato ad aggiungere in "Campo" la tua stringa, ossia :
InStr(Left([Nome];Len([cercaNome]));[cercaNome])

- Checkbox "Mostra" NON selezionata.
- Criterio : >0

3. L'istruzione SQL risultante è molto pulita :
SELECT *
FROM T_Prodotti
WHERE (((InStr(Left([Nome_Prodotto],Len([Iniziali_NomeProd])),[Iniziali_NomeProd]))>0));

Funziona perfettamente in Access, e anche con il mio codice VB !

Ti ringrazio ancora per l'utile suggerimento :) , anche se resto un po' di stucco davanti ad una limitazione del genere... In pratica il LIKE di Access è inutilizzabile per via parametrica !

Ovviamente chiunque fosse interessato all'argomento, se ce la fa con LIKE, sarei proprio curioso di sapere COME !

akyra
01-02-2007, 01:36
2. Non ho creato nessun campo aggiuntivo, ma mi sono limitato ad aggiungere in "Campo" la tua stringa, ossia :
InStr(Left([Nome];Len([cercaNome]));[cercaNome])

- Checkbox "Mostra" NON selezionata.
- Criterio : >0


forse mi sono espresso male, ma era proprio quello che intendevo io, cioè che mettessi nell'espressione "Campo" l'istruzione che avevo fatto, in modo, appunto, di creare un nuovo campo calcolato nella query (non nella tabella di partenza, tanto per capirci).

Per quanto riguarda il resto, bisognerebbe un po' sbatterci su la testa per capire come mai il codice VB non riesce a far girare correttamente la query...in tutta sincerità, su due piedi, non lo saprei....ci dovrei ragionare...comunque se va bene lo stesso così, sono felice di esserti stato utile :)

MarcoGG
02-02-2007, 09:11
forse mi sono espresso male, ma era proprio quello che intendevo io, cioè che mettessi nell'espressione "Campo" l'istruzione che avevo fatto, in modo, appunto, di creare un nuovo campo calcolato nella query (non nella tabella di partenza, tanto per capirci).


No no, ti eri espresso bene. :)
Intendevo "Aggiungere un campo" nel senso dell'uso della "AS", e quindi ritrovarsi poi un Field aggiuntivo e inutile anche nel RS...
- Il tuo codice SQL era :
PARAMETERS cercaNome Text ( 255 );
SELECT Tabella1.Codice, Tabella1.Nome, InStr(Left([Nome],Len ([cercaNome])),[cercaNome]) AS Verifica FROM Tabella1
WHERE (((InStr(Left([Nome],Len([cercaNome])),[cercaNome]))>0));

Nessuno che sappia come farcela con LIKE ?