Newsgroup: it.comp.appl.access
Titolo: [Access & SQL Server] Stored Procedure come RecordSource

Ciao a tutti...
ho creato una SP parametrica (parametro multiplo) sul mio Server SQL che
richiamo ed eseguo da codice VBA (sotto allegato)... l'unico problema è che
non riesco a utilizzare direttamente il risultato della SP come Recordsource
di una mia Form, per cui (per arrangiare - sono napoletano lo sapete :-D - )
scorro i risultati della SP e accodo i singoli campi in una tab di
appoggio... aggiungendo per ottenere i dati filtrati i relativi tempi di
esecuzione dell'accodamento... chi sa darmi qualche dritta per ovviare a ciò
e tenere direttamente il Rst della SP come source?
----
Ciao
Pablitomf (Maurizio Facciuti)
Web master 
www.accessgroup.it
===============================
Codice VBA :
    Dim Xstart As Date
    Xstart = Now()
    Dim x As Integer
    x = 0
    DoCmd.SetWarnings False
        DoCmd.RunSQL "DELETE * from Tbl_Appoggio"
    DoCmd.SetWarnings True
    Dim objConn, objCmd, objRs
    Set objConn = CreateObject("ADODB.Connection")
    Set objCmd = CreateObject("ADODB.Command")
    Dim strCONNESSIONE As String
    strCONNESSIONE = "driver={SQL Server};" & _
                     "Server=mioServer; " & _
                     "Database=mioDb; " & _
                     "Uid=mioUid;" & _
                     "Pwd=miaPwd;"
    objConn.ConnectionString = strCONNESSIONE
    Call objConn.Open
    Set objCmd.ActiveConnection = objConn
    objCmd.CommandType = 4 'Che è la stored, 1 invece è la normale select...
    objCmd.CommandText = "Nome_miaStoredProcedure"
    objCmd.Parameters("@strFiltro") = "comune in
('Milano','CICCIO','Murizio')"
    Set objRs = objCmd.Execute
    '=======================================================
    ' Apri recordset per inserire i risultati
    ' in Tbl_Appoggio
    Dim db As DAO.Database
    Set db = CurrentDb
    Dim rs As DAO.Recordset
    Set rs = db.OpenRecordset("Tbl_Appoggio")
    Do While Not objRs.EOF
        With objRs
            With rs
                .AddNew
                !ChiaveSQL = objRs("ChiaveSQL")
                !Comune = objRs("Comune")
                .Update
            End With
            objRs.MoveNext
        End With
        x = x + 1
    Loop
    Set rs = Nothing
    Set db = Nothing
    ' Chiudi
    '=======================================================
    SubFrm.Requery
    Dim Xstop As Date
    Xstop = Now()
    MsgBox "Totale record filtrati : " & x & vbCrLf & "in " & DateDiff("s",
Xstart, Xstop) & " sec."
-- 
---
Ciao
Pablitomf (Maurizio Facciuti)
Web Master 
www.accessgroup.it


Non so se possa esservi utile, ma nel caso vi allego anche la SP del server 
:
USE [ProvaSQL]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[FNC_FILTRO] (@strFiltro varchar(500))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @v varchar(1000)
SET @v = 'SELECT * from dbo.Tbl_Comuni'
SET @v = @v + ' WHERE '
SET @v = @v + @strFiltro
EXEC (@v)
END


Non mi fucilare se è una osservazione stupida, ma non potresti usare una 
Funzione definita dall'utente?
La SP deve fare delle operazioni sui dati o deve solo eseguire delle select?

 END
Una cosa così fa schifo...?
ALTER PROCEDURE [dbo].[FNC_FILTRO] (@strFiltro varchar(500))
AS
IF @strFiltro=''
    SELECT * from dbo.Tbl_Comuni
ELSE
    SELECT * from dbo.Tbl_Comuni
    WHERE @strFiltro
RETURN
La chiami come ti dissi a suo tempo... e restituisce il Recordset che puoi
associare
ad una FORM oppure ad una LISTBOX.
' Dichiari a livello di FORM
Private RunSP as DAO.Recordset
' Dichiari nella funzione:
    Dim qdf As DAO.QueryDef
    Set qdf = DBEngine(0)(0).CreateQueryDef("")
    With qdf
        .Connect = CNNSTR
        .ReturnsRecords = true
        .SQL = strSQL
    End With
    Set RunSPT = qdf.OpenRecordset(dbOpenSnapshot)
    Set Me.Recordset=RunSPT
    ' Anulla solo qdf.... il RECORDSET DEVE RIMANERE APERTO... FINCHE' la
FORM
    ' è aperta... lo chiudi su UNLOAD.
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

Ho forse abbreviato un pò... troppo...?
CNNSTR è la stringa di connessione al SERVER SQL per la Query PassTrought
TEMPORANEA
mentre :
.SQL = strSQL
dove strSQL è la chiamata alla SP
strSQL = "EXEC FNC_FILTRO '" & strCONDIZIONE & "'
a sua volta strCONDIZIONE sarà la tua struttura...!
Speriamo bene...
;-)


 select?
Ti lascio scegliere... Baionetta o canna mozza? :-D 

> Non mi fucilare se č una osservazione stupida, ma non potresti usare una

Perche' non una atomica tattica?
-- 
ac
y-1=x

 ha scritto nel messaggio 
news:CXk5j.656$8j3...@tornado.fastwebnet.it...

Xkč siam vicini a Natale ;) 

 
Appunto.
Hai visto il film di De Crescenzo (non mi ricordo il titolo, e tratto 
comunque da un suo libro) nell'episodio di quel tuo conterraneo che fa 
appunto scoppiare una quasi "atomica tattica" dopo capodanno. Mi ha 
fatto piegare in due dalle risate.
-- 
ac
y-1=x

> Speriamo bene...
ci avevo già provato...
forse sbaglio qualcosa?
Private RunSP As DAO.Recordset
Private Sub cmdAlex_Click()
    On Error GoTo Err_RunSPT
    Dim strCONDIZIONE As String
    strCONDIZIONE = "comune in ('napoli','milano')"
    Dim strSql As String
    strSql = "EXEC dbo.FNC_FILTRO " & Chr(34) & strCONDIZIONE & Chr(34)
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Set db = DBEngine(0)(0)
    Set qdf = db.CreateQueryDef("")
    Dim CNNSTR As String
    CNNSTR = 
"ODBC;DSN=ProvaDB;Description=ProvaDB;UID=sa;PWD=sys64738raq;DATABASE=ProvaSQL"
    With qdf
        .Connect = CNNSTR
        .ReturnsRecords = fReturnRecords
        .SQL = strSql
    End With
    If fReturnRecords = True Then
        Set RunSPT = qdf.OpenRecordset(dbOpenSnapshot)
        Set Me.Recordset = RunSPT
    Else
        DoCmd.SetWarnings False
        qdf.Execute
        DoCmd.SetWarnings True
        RunSPT = True
    End If
Exit_RunSPT:
    Exit Sub
Err_RunSPT:
    MsgBox Err.Description
    Resume Exit_RunSPT
End Sub

strSql = "EXEC dbo.FNC_FILTRO '" & strCONDIZIONE & "'"
mi sa errore di connessione ODBC : 

    strSql = "EXEC dbo.FNC_FILTRO " & Chr(34) & strCONDIZIONE & Chr(34)
[CUT]
Ciao Maurizio,
Come scriveresti la EXEC in Management Studio ?
Così giusto ?
----
EXEC dbo.FNC_FILTRO 'comune in (''napoli'',''milano'')'
----
quindi per comporre la stringa equivalente da VBA....
----
 strSql = "EXEC dbo.FNC_FILTRO '" & Replace(strCONDIZIONE,"'","''")  & "'"
----
:-)
--
Giorgio Rancati
[Office Access MVP] 

 fatto piegare in due dalle risate.
32 dicembre
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

 ha scritto nel 
messaggio news:4755e5fa$0$21196$5fc...@news.tiscali.it...

Maròòò mi ero perso in un bicchiere d'acqua! :-D
l'ora tarda che fa fare! :-D
DENGHIU a all around...
-- 
---
Ciao
Pablitomf (Maurizio Facciuti)
Web Master 
www.accessgroup.it
 

 ha scritto nel messaggio

Bene sono pure contento che ci ho preso...!
Ciao
@Alex

>Bene sono pure contento che ci ho preso...!
sai invece cosa non riesco ad ottenere ? il numero dei record restituiti 
della SP... ho provato ad inserire una variabile di outpup che calcolasse il 
@@ROWCOUNT ma poi non va + la chiamata ODBC...
ho provato per cui ad eseguire nella SP una seconda select (uguale alla 
prima ma con raggruppamento conteggio) sul filtro generico... bene, funzia 
sta cosa se la eseguo dal Manager tool, nel senso che dati i parametri, mi 
visualizza come risultato 2 qry.. 1 con tutti i record, e l'altra con il 
conteggio degli stessi... con il metodo usato, il Set me.recordset si piazza 
sulla prima select effettuata... la seconda, come la richiamo per avere il 
conteggio dei records?
Ovviamente se c'è un modo migliore, che ben venga
-- 
---
Ciao
Pablitomf (Maurizio Facciuti)
Web Master 
www.accessgroup.it
 


fai un'altra SP e calcoli solo quello


 il @@ROWCOUNT ma poi non va + la chiamata ODBC...
[CUT]
scusa, ma visto che popoli un recordset, ti basta leggere la proprietą 
recordcount.
no ?


 no ?
in teoria č quello che pensavo anche io... ma in pratica non funge 

>fai un'altra SP e calcoli solo quello
sarebbe risolutiva ma DONGIPIACE... fare 2 chiamate al server per fare un 
operazione comune che di fatto dovrebbe già esserci non è un 
ottimizzazione... devo per forza fare diversamente 

> deve fungere, hai fatto un movelast prima di leggere recordcount ?
certo! 


Aspč--- ma tu č di questa che parli? (perchč č questa che mi popola il 
form... + precisamente Set Me.Recordset = RunSPT)
    Set db = DBEngine(0)(0)
    Set qdf = db.CreateQueryDef("")
    Dim CNNSTR As String
    CNNSTR = "mia stringa"
    With qdf
        .Connect = CNNSTR
        .ReturnsRecords = fReturnRecords
        .SQL = strSQL


 form... + precisamente Set Me.Recordset = RunSPT)
non ha importanza cosa usi, un DAO recordset è sempre un DAO recordset.
Puoi anche fare
Me.RecordsetClone.Movelast
MsgBox Me.RecordsetClone.RecordCount
Ciao


 MsgBox Me.RecordsetClone.RecordCount
si in effetti avevo già fatto così... infatti così va... ma mi sembrava 
strano che il recordcount diretto non andasse e non va 

 strano che il recordcount diretto non andasse e non va
mha.. a me funziona anche cosě, pur collegandomi a Db remoti via VPN.
----
   ...
   ...
   If fReturnRecords = True Then
        Set RunSPT = qdf.OpenRecordset(dbOpenSnapshot)
        RunSPT.MoveLast
        MsgBox RunSPT.RecordCount
        Set Me.Recordset = RunSPT
    Else
        ecc ecc
    End If
----
