ADO: requête paramétrée

Jam

XLDnaute Accro
Salut à tous,

Bon ça faisait longtemps que j'étais pas venu faire un tour...il fait toujours beau ici ?
Moi c'est un peu gris, la faute à ADO et l'utilisation des paramètres.
Bon, ok, ok, c'est pas 100% pur Excel puisqu'en fait il s'agit d'interroger une base Access, mais c'est pour récupérer des données et les traiter sous Excel.
Bref, description du problème:
1. une base Access
2. une procédure stockée (avec 3 paramètres)
3. les paramètres: un 'champ' texte + 2 'champs' dates

La requête a cette 'gueule' là:
Code:
PARAMETERS sSite Text ( 255 ), dDebut DateTime, dFin DateTime;
SELECT TOP 10 Facturation.Titre, Facturation.Client, Sum(Facturation.[Quantité commandée]) AS Ouvrages, Sum(Facturation.[Montant HT]) AS CA
FROM Facturation
WHERE (((Facturation.Site)=[sSite]) AND ((Facturation.[Date facture])>=[dDebut] And (Facturation.[Date facture])<=[dFin]))
GROUP BY Facturation.Titre, Facturation.Client
ORDER BY Sum(Facturation.[Quantité commandée]) DESC;

quand à la macro elle a cette tête-là (c'est un peu le bazar vu que je débogue :eek: ) :
Code:
'# Définition des variables du module
Dim sPath As String '# Chemin général
Dim sConnString As String '# Chaîne de connexion
Const sDatabase As String = 'Facturation.mdb' '# Nom de la bdd (Access)

Sub test()
sPath = 'D:\\KPI\\'
Call GetData('Best10_B', 'IH', '01/04/2006', '30/04/2006', 'bdd_BSB', False)
End Sub

'=================================================================================
'= Récupère les données d'une requête stockée dans une base Access sur le réseau =
'=================================================================================
Sub GetData(sProcName As String, _
            sPara1 As String, _
            sPara2 As Date, _
            sPara3 As Date, _
            Optional sName As String, _
            Optional bField As Boolean = True)
                
Dim oCon As ADODB.Connection
Dim oRec As ADODB.Recordset
Dim oCommand As ADODB.Command
Dim oPara1 As ADODB.Parameter
Dim oPara2 As ADODB.Parameter
Dim oPara3 As ADODB.Parameter
'Dim sProcName As String 'Nom de la procédure stockée
Dim i As Integer

    Set oCon = New ADODB.Connection
    
    '# Connection à la base
    With oCon
        .Provider = 'Microsoft.Jet.OLEDB.4.0;'
        .ConnectionTimeout = 30
        .CursorLocation = adUseClient
        .Open 'Data Source=' & sPath & sDatabase
    End With
    
    '# Création lancement de la requête
    Set oCommand = New ADODB.Command
    
    With oCommand
        .CommandType = adCmdStoredProc
        .CommandText = sProcName
        .ActiveConnection = oCon
    End With
'
    Set oPara1 = New ADODB.Parameter
    With oPara1
        .Type = adDate
        .Size = 8
        .Direction = adParamInput
        .Value = sPara2
    End With
    oCommand.Parameters.Append oPara1
    
    Set oRec = oCommand.Execute
'    
    '# Récup des entêtes
    With oRec
        For i = 1 To .Fields.Count
            Worksheets('Data').Cells(1, i) = .Fields(i - 1).Name
        Next
    End With
    
    '# Récup des données + nommage plage
    With Feuil4
'        .Range('G1') = 'Nb Cahiers'
        With .Cells(2, 1)
            .CopyFromRecordset oRec
            .CurrentRegion.Name = 'Bdd_Tournees'
        End With
    End With
    Feuil4.Activate
oRec.Close
oCon.Close
Set oRec = Nothing
Set oCon = Nothing

Exit Sub
GestionErreur:

End Sub

Si quelqu'un a une petite idée (Michel ?) je suis preneur parce que sur Goog... j'ai pas trouvé grand chose (surtout sur la particularité des dates).

Merci d'avance à tous.

Oula, comme le code a une sale tête, je met en FA le code (fichier txt). [file name=modMain2.zip size=1083]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/modMain2.zip[/file]

Message édité par: jam, à: 16/05/2006 17:21
 

Pièces jointes

  • modMain2.zip
    1.1 KB · Affichages: 51

MichelXld

XLDnaute Barbatruc
bonjour cher Jam

ce n'est pas évident de répondre à froid : tu obtiens des messages d'erreur ? ou la requete ne renvoie rien ?



dans Call GetData('Best10_B', 'IH', '01/04/2006', '30/04/2006', 'bdd_BSB', False)

les dates sont au format texte .tu peux faire un essai en les modifiant :

Call GetData('Best10_B', 'IH', CDate('01/04/2006'), CDate('30/04/2006'), 'bdd_BSB', False)

ou

Call GetData('Best10_B', 'IH', #4/1/2006#, #4/30/2006#, 'bdd_BSB', False)

il restera à voir si la requete dans la base doit etre au format JJ/MM/AAAA ou MM/JJ/AAAA



bon apres midi
MichelXld
 

Jam

XLDnaute Accro
Salut Michel,

Je me doutais bien que la première réponse viendrait de toi. Merci.

En fait j'ai pas été très précis dans la description du (des) problème:

- Le problème ne semble pas venir des dates (quoique cela reste à voir). En fait, je passe un string 'transformé' en date (cf type de l'argument). Dans la fenêtre des variables locales en mode débogage, j'ai bien les dates au format date [oui, j'admet ce n'est pas très clean :) ]. J'avais bien pensé à l'inversion des JJ et MM mais en fait ce n'est pas mon problème principal.
- Le problème principal (ouf, j'y viens B) ) c'est qu'en fait j'ai une erreur concernant le nombre de paramètres passés. Il semblerait que le premier passe bien (sSite), pas les deux autres [NB.: dans la proc il n'y a qu'une seule déclaration de paramètre mais c'est parce qu'avec 3 ça marchait pas donc je teste d'abord avec 1].
- Le truc bizarre, c'est qu'a priori si je 'browse' les propriétés de l'objet Parameters, .Count me renvoi 0 (zéro), même après un .Refresh !

Bref, je nage un peu dans la semoule, car tout ce que je trouve sur le net concerne .Net ou SQLServer...

Si tu as d'autres idées, je reste preneur (à moins qu'il n'y ait un bug ou une incompatibilité mais je n'ai rien vu à ce sujet sur le net).

A+
 

MichelXld

XLDnaute Barbatruc
rebonsoir Jam

malheureusement je n'ai jamais piloté les parametres d'un requete Access depuis Excel


sinon , as tu essayé de créer directement ta requete dans Excel , dans la style


Sub requete()
Dim Cn As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim Fichier As String, rSQL As String

Fichier = 'C:\\\\\\\\Documents and Settings\\\\\\\\michel\\\\\\\\dossier\\\\\\\\dataBase.mdb'

Set Cn = New ADODB.Connection
Cn.Open 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' & Fichier & ';'

rSQL = 'SELECT Contributeurs FROM Table1 WHERE nomVille ='xldCity''

Set rsT = New ADODB.Recordset
rsT.Open rSQL, Cn, adOpenForwardOnly, adLockReadOnly, adCmdText
If Not rsT.EOF Then Range('A1').CopyFromRecordset rsT

rsT.Close
Cn.Close
End Sub





bonne soirée
MichelXld
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 182
dernier inscrit
moutassim.amine