Newsgroup: it.comp.appl.access
Titolo: MDB STORED PROCEDURE CON PARAMETRI

Salve,
in un file mdb il seguente codice funziona correttamente per lanciare
una stored procedure su sql :
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
Dim strCon As String
strCon = "Provider=Microsoft.Access.OLEDB.10.0" & _
         ";Data Provider=SQLOLEDB" & _
         ";Data Source=NAMESERVER\SQLEXPRESS" & _
         ";Initial Catalog=PIPPO" & _
         ";User Id=sa" & _
         ";Password=password"
cn.Open strCon
cn.Execute "EXEC [dbo].[QUERY_1]"
Avrei bisogno di lanciare una stored procedure di nome QUERY_2  che ha
il parametro ORD
Il risultato di questa query vorrei metterlo in un recordset.
Riesco in un file ADP ma non MDB
In un file ADP sarebbe così:
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
Dim strCon As String
strCon = "Provider=Microsoft.Access.OLEDB.10.0" & _
         ";Data Provider=SQLOLEDB" & _
         ";Data Source=NAMESERVER\SQLEXPRESS" & _
         ";Initial Catalog=PIPPO" & _
         ";User Id=sa" & _
         ";Password=password"
cn.Open strCon
Set RSADO = New ADODB.Recordset
RSADO.Open "Exec [dbo].[QUERY_2] @ORD = '" & ORD & "'", cn,
adOpenKeyset, adLockOptimistic
Come posso risolvere il problema?
Grazie


Con un MDB devi usare una Query PassTrought per eseguire una Stored,
ma devi definire la proprietà ReturnRecord
Function ExecuteSPT (sqltext As String, connectstring As String)
' Purpose: Esegue una temporanea query pass-through.
' Accepts: sqltext: Stringa SQL da eseguire.
' connectstring: Connection string, deve seguire il predicato "ODBC;".
' Returns: nothing.
Dim mydb As DAO.Database, myq As DAO.QueryDef
Set mydb = DBEngine.Workspaces(0).Databases(0)
' Create a temporary QueryDef object that is not saved.
Set myq = mydb.CreateQueryDef("")
' Set the ReturnsRecords property to False in order to use the
' Execute method.
myq.returnsrecords = False
myq.connect = connectstring
myq.sql = sqltext
myq.Execute
myq.Close
End Function
Se vuoi che restituisca dei Records imposta la proprietà
ReturnRecords=True ed assegna all'oggetto Function l'oggetto Recordset
derivante...
@Alex

 @Alex
Ciao Alex,
ho seguito le tue spiegazioni ma non ho capito completamente.
Ho creato  la funzione che hai scritto poi ho chiamato la funzione con
un pulsante nel seguente modo:
Private Sub Comando8_Click()
Dim parametro1 As String
Dim parametro2 As Integer
parametro1 = "MESSO1"
parametro2 = 1
Call executeSPT("EXEC [dbo].[ORD_SPE_POSIZ] " & parametro1 & "," &
parametro2,
"ODBC;DSN=SQL_DL;Description=INDUSTRIALE;UID=sa;PWD=pippo;DATABASE=IND;")
End Sub
Se metto
myq.returnsrecords = true
compare l'errore : impossibile eseguire una query di selezione.
se lo imposto a false il pulsante non dà errore.
Cosa intendi per assegnare all'oggetto function l'oggetto recordset?
Se dichiaro un recordset
dim rs as dao.recordset
Come posso dire che il recorset sarà  uguale alle righe restituite
dalla stored procedure?
Grazie per l'attenzione


Se vuoi che vengano restituiti Records come ti ho detto oltre a
mettere a TRUE la proprietà ReturnRecords
devi anche aprire la Query per ottenere il Recordset....
Function ExecuteSPT (sqltext As String, connectstring As String)  As
DAO.Recordset
Dim myq As DAO.QueryDef
Set myq =  DBEngine.Workspaces(0).Databases(0).CreateQueryDef("")
myq .Connect = connectstring
myq .ReturnsRecords = True
myq .SQL = sqltext
Set ExecuteSPT = myq .OpenRecordset(dbOpenSnapshot)
Set myq = Nothing
End Function
Chiaramente questa funzione restituisce un Recordset quindi l'oggetto
di assegnazione dovrà essere assegnato con SET...
GESTIONE ERRORI... mancata volutamente ma doverosa...
@Alex

Grazie Alex!,
più o meno dopo il tuo primo aiuto  dopo un sacco di prove sono
riuscito.
Ora leggendo il tuo ultimo intervento sono riuscito ad utilizzare la
funzione.
Starò attento alla gestione degli errori, in particolare controllo se
il recodset ha record prima di proseguire ..
Non so se aprire un nuovo post.. ma  questo metodo funziona solo con
le stored procedure?
Con le funzioni mi dà errore.
Sbaglio qualche cosa oppure il modo di chiamare una funzione è
differente?
Grazie!


Non ho mai usato una chiamata a UDF ma ho trovato questo
suggerimento... da provare...!
Devi ovviamente sempre usare una QueryPT in quanto JET non sa
interpretare la UDF...
 Dim strSQL As String
    strSQL = "SELECT dbo.fn_TimeValue('1/1/2008 6:30 am') As MyTime"
    With CurrentDb.CreateQueryDef("~" & Int(Timer), strSQL)
        .Connect = "<valid ODBC connect string>"
        runFunDAO = .OpenRecordset.Fields(0)
    End With
Ho trovato in questo articolo
http://www.access-programmers.co.uk/forums/showthread.php?t=153390
@Alex