|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
[VB6-ADO-ACCESS]-Problema Stored Query E Operatore LIKE...
Il problema è semplicissimo all'apparenza... All'atto pratico invece...
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 ! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
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
__________________
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
In effetti vorrei proprio usare questo metodo. Da VB6 avevo già risolto. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
allora, il codice corretto è il seguente:
Codice:
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]
ma sono al lavoro per cui preferisco risolverli i problemi invece che cercare di capirli Codice:
Verifica: InStr(Left([Nome];Len([cercaNome]));[cercaNome]) [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...)
__________________
Ultima modifica di akyra : 31-01-2007 alle 16:04. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
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 Ovviamente chiunque fosse interessato all'argomento, se ce la fa con LIKE, sarei proprio curioso di sapere COME ! |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
Quote:
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
__________________
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
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 ? |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:40.











ma sono al lavoro per cui preferisco risolverli i problemi invece che cercare di capirli








