Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Accedere a query parametriche che utilizzano funzioni VBA

Ho scritto una query per ottenere la classifica
dei post piu' seguiti.
Nel mio database ho una tabella Messaggi con i campi ID e Oggetto,
e una tabella MessaggiGruppi con i campi IDMessaggi e IDGruppo.
Per prima cosa usando il VBA di Access ho scritto la funzione
TogliRe che fa il seguente lavoro.
TogliRe("Aiuto!") = "Aiuto!"
TogliRe("Re: Aiuto!") = "Aiuto!"
TogliRe("R: Aiuto!") = "Aiuto!"
TogliRe("Re: R: Aiuto!") = "Aiuto!"
ecc...
Quindi ho scritto la seguente query (chiamata TopPost)
PARAMETERS [@Mese] Long, [@Anno] Long;
SELECT TogliRe(Oggetto), Count(*) AS Post
FROM MessaggiDelGruppo
WHERE Month(Data) = [@Mese]
AND Year(Data) = [@Anno]
GROUP BY TogliRe(Oggetto)
ORDER BY Count(*) DESC;
Dove MessaggiDelGruppo e' a sua volta una query
PARAMETERS [@Gruppo] Long;
SELECT *
FROM Messaggi INNER JOIN MessaggiGruppi 
   ON Messaggi.ID = MessaggiGruppi.IDMessaggio
WHERE IDGruppo = [@Gruppo]
ORDER BY Data;
Ora se da Access lancio la query, questa funziona.
Se invece cerco di richiamarla da VB con DAO no!
L'apertura della query avviene con l'istruzione
Set RS = ApriQueryParam("TopTest", 7, 2001, 19882)
'7 e' il mese, 2001 l'anno, 19882 l'ID del gruppo
dove ApriQueryParam e' cosi' definita (News e' una
variabile globale di tipo Database)
Public Function ApriQueryParam(ByVal SQL As String, ParamArray ValoreParametri()) As Recordset
'Apre una query con parametri
   Dim Query As QueryDef
   Dim I As Long
   If UCase$(Left$(SQL, 6)) = "SELECT" Then
      'Se la query "tmp" esiste già (può capitare per un
      'crash del prgramma) questa viene eliminata
      On Error Resume Next
      News.QueryDefs.Delete "tmp"
      On Error GoTo 0
      Set Query = News.CreateQueryDef("tmp", SQL)
   Else
      Set Query = News.QueryDefs(SQL)
   End If
-->If UBound(ValoreParametri) + 1 <> Query.Parameters.Count Then
      Err.Raise 3061, , "Numero di parametri errato"
   Else
      For I = 0 To Query.Parameters.Count - 1
         Query.Parameters(I).Value = ValoreParametri(I)
      Next I
      Set ApriQueryParam = Query.OpenRecordset
   End If
End Function
L'errore avviene sulla riga evidenziata.
Errore di run-time '3085':
Funzione 'TogliRe' non definita nell'espressione.
Qualcuno sa come si aggira questo problema?
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/leggiminews.html


Non puoi eseguire codice vba interno ad access da una query Dao / Ado.
O aggiungi una o più clausole Where per eliminare i vari "aiuto", o peschi
tutto ed elabori il recordset da codice.
ciao
ugo


Dunque dunque...
Premesso che se lanci una query salvata che contiene una funzione vba codice
funziona, penso che forse il problema sta nel parsing della query.
Domanda: ma perchè la ricrei ogni volta? Salvala nelle query e te la
richiami con
currentdb().openrecordset("Nome query",dbOpenDynaset). In questo modo
dovresti eliminare anche l'errore su toglire (credo).
Avrebbe senso ricrearla ogni volta per eliminare i parametri:
se nella funzione hai passato 8 e 2001 ti crei la query con questi valori al
posto di @MESE e @ANNO e poi la salvi.
Tieni presente che se non hai un motivo paricolare non c'è neanche bisogno
di salvarla, puoi passare la stringa Sql a openrecordset.
Inoltre non mi pare che ci sia bisogno di una query di query, ad occhio si
può fare con una query sola.
ciao
alfonso

Alfonso Moscato ha scritto:

Diciamo che quello e' il metodo generale che uso
per chiamare una query con parametri.
Potrei benissimo richiamarla direttamente da codice come dici tu,
ma visto che in acces gia' ce l'ho perche' riscrivermela.
Comunque il problema non si risolve.
Se ad esempio lancio la semplice istruzione
Set Rs = News.OpenRecordset("Query")
Dove query e' in Access
SELECT TogliRe(Oggetto) FROM Messaggi
mi da' lo stesso errore.


Ugo Mangini ha scritto:

Immaginavo fosse cosi'. Speravo di non ricevere questa risposta.
