[VBA] Compter les lignes d'une requête SQL

Résolu
eXqO Messages postés 54 Statut Membre -  
 parpins -
Bonjour,

Je cherche à récupérer le nombre de lignes d'une requête SQL, le tout en VBA.
J'ai essayé d'utiliser un RecordCount, cependant il me renvoie systématiquement -1...

En espérant avoir une lumière sur ce RecordCount qui me pose un problème...:?

Sub CompleteTableauCommandeProvisoire()

    'Déclaration des variables
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset

    'Instanciation des variables
    Set cnx = New ADODB.Connection
    Set rst = New ADODB.Recordset
    
    Dim sql1 As String
    Dim debutperiode As Date
    Dim ddeb As String
    Dim dfin As String
    Dim Ligne As Integer
    Dim j As Integer
    Dim result_sql
    Dim Col
    Dim cptLigne As Integer
    
    cnx.ConnectionString = "DSN=Stats;UID=***;PWD=***;"
    cnx.Open
    
    cptLigne = 6
    
    'Changer la date de début d'année
    For cptLigne = 6 To 263
        For debutperiode = DateSerial(2008, 12, 29) To Now() - 6 Step 7
            ddeb = Format(debutperiode, "dd/mm/yyyy")
            dfin = Format(debutperiode + 6, "dd/mm/yyyy")
            'Nombre total d'envois périodique (courrier ):
             sql1 = "select m.mp_l, count(*), sum(c.cde_tot_ttc)" + _
                " from   e_cde c, e_mode_paiement m" + _
                " where  c.cde_ty_se_c = 'WV2'" + _
                " and    c.cde_mp_c in ('KM','KI','KW','KT', 'KA','KC', 'CA')" + _
                " and    c.cde_mp_c = m.mp_c" + _
                " and    c.cde_d between" + _
                " to_date('" + ddeb + " 00:00:00' , 'dd/mm/yyyy hh24:mi:ss')" + _
                " and to_date('" + dfin + " 23:59:59', 'dd/mm/yyyy hh24:mi:ss') " + _
                " group by m.mp_l" + _
                " order by 1"

            rst.Open sql1, cnx
            rst.MoveFirst
            j = 0

            result = rst.RecordCount
            

            Do
                For Ligne = cptLigne To cptLigne + result
                    For Col = 65 To 67
                    'Lecture en ligne
                    Range(Chr(Col) & Ligne).Select
                    'Récupère résultat
                    result_sql = rst.Fields(j).Value
                    'Transfert le résultat dans la cellule
                    ActiveCell.FormulaR1C1 = result_sql
                    j = j + 1
                    Next
                j = 0
                rst.MoveNext
                Next
            Loop While rst.BOF
            cptLigne = cptLigne + 12
            rst.Close
            
        Next
    Next
End Sub


Cordialement,
Clément.
Configuration: Windows XP
Firefox 3.0.11

5 réponses

  1. Anouar
     
    Essayez ceci :

    Dim i As Integer
    Dim maCmd As New SqlCommand("VOTRE_REQUETE_ICI", Conn)
    Conn.Open()
    Dim monRead As SqlDataReader = maCmd.ExecuteReader() 'execution de la requete
    While monRead.Read()
    i = i + 1
    End While
    Conn.Close() 'fermeture de la connexion a la base


    Et voila , maintenant i contient le nombre des lignes de votre requête ...
    1
  2. parpins
     
    Bonjour

    je cherche aussi la solution à ce problème

    j'utilise vba sous excel pour me connecter à Oracle.

    voici mon code (mon objet connection appartient déjà à ma classe):

    'Déclaration des variables
    Dim cmd As ADODB.Command
    Dim rst As ADODB.Recordset

    'Instanciation des variables
    Set cmd = New ADODB.Command
    Set rst = New ADODB.Recordset

    'Préparation de l'objet Command
    cmd.CommandText = "SELECT * FROM MA_TABLE"
    cmd.ActiveConnection = mobjCon 'attribut de classe

    'Exécution de la requête
    Set rst = cmd.Execute

    rst.MoveLast 'renvoi l'erreur "L'ensemble des lignes ne prend pas en charge les récupérations arrière"

    rst.RecordCount 'renvoi toujours -1

    Visiblement le problème viendrait du parametrage du recordset.
    certains recordset n'acceptent pas cette méthode
    d'ou ma question comment avoir le bon recordset?

    merci d'avance
    1
  3. eXqO Messages postés 54 Statut Membre 2
     
    Up !
    0
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    J'aurai plutôt fait un rst.MoveLast avant le RecordCount et ensuite le MoveFirst.

    D'autre part, il faut remplacer le "+" de ta requête par "&". Le signe "+" est l'opérateur de l'addition et non de la concaténation. Il peut être mal interprété dans la requête.

    ;o)

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eXqO Messages postés 54 Statut Membre 2
     
    J'ai essayé ta technique avec le MoveLast auparavant mais j me suis pas attardé dessus car il me renvoie un message d'erreur : "L'ensemble des lignes ne prend pas en charge les récupérations arrière"...
    0