Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ACCESSTOVB7 : LES FONCTIONS DCOUNT, DLOOKUP ET DSUM D'ACCESS EN VB7


Information sur la source



Description

Ce code est utile lors d'une migration du code VBA Access vers VB7
(en ne conservant que la base Access.mdb sans le code VBA)
 

Source

  • Private Sub btnTest_Click(ByVal sender As Object, ByVal e As EventArgs) _
  • Handles btnTest.Click
  • Me.Cursor = Cursors.WaitCursor
  • If bOuvrirBaseDonnees(Application.StartupPath & "\AccessToVB7.mdb") Then
  • Dim rVal1A! = DLookUp("Champ1", "Table1", "Critere1='A'")
  • Dim rVal2A! = DLookUp("Champ2", "Table1", "Critere1='A'")
  • Dim rVal1B! = DLookUp("Champ1", "Table1", "Critere1='B'")
  • Dim rSomme1! = DSum("Champ1", "Table1")
  • Dim iNbEnreg% = DCount("Champ1", "Table1")
  • Dim iNbEnregA% = DCount("Champ1", "Table1", "Critere1='A'")
  • ' Arrondi des réels, sinon il y a des décimales parasites !
  • rSomme1 = Math.Round(rSomme1, 3)
  • MsgBox( _
  • "Val1A=" & rVal1A & ", Val2A=" & rVal2A & vbLf & _
  • "Val1B=" & rVal1B & ", Somme1AB=" & rSomme1 & vbLf & _
  • "NbEnreg=" & iNbEnreg & ", NbEnregA=" & iNbEnregA, _
  • MsgBoxStyle.Information)
  • ' Exécution d'une requête mise à jour
  • Dim sSQL$ = "UPDATE Table1 SET Champ2 = Champ2+0.1 WHERE Critere1='A'"
  • If bRqAction(sSQL) Then
  • rVal2A! = DLookUp("Champ2", "Table1", "Critere1='A'")
  • MsgBox("Modification : Val2A=" & rVal2A, MsgBoxStyle.Information)
  • End If
  • FermerBaseDonnees()
  • End If
  • Me.Cursor = Cursors.Default
  • End Sub
  • Option Strict On
  • Option Explicit On
  • Module modAccessToVB7
  • Private m_sCheminBD$
  • Private m_oConn As New OleDb.OleDbConnection
  • Public Function bOuvrirBaseDonnees(ByVal sCheminBD$) As Boolean
  • ' Ouvrir la base de données
  • m_oConn.ConnectionString = _
  • "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;" & _
  • "Mode=Share Deny None;Data Source=" & sCheminBD
  • m_sCheminBD = sCheminBD
  • Try
  • m_oConn.Open()
  • bOuvrirBaseDonnees = True
  • Catch ex As Exception
  • MsgBox("Erreur lors de l'ouverture de la base :" & vbLf & _
  • sCheminBD & vbLf & Err.Description, MsgBoxStyle.Critical)
  • End Try
  • End Function
  • Public Sub FermerBaseDonnees()
  • m_oConn.Close()
  • End Sub
  • Public Function DLookUp(ByVal sChamp$, ByVal sTable$, ByVal sCritere$, _
  • Optional ByVal bPromptErr As Boolean = True) As Object
  • ' Implementation de la fonction DLookUp d'Access en VB7 :
  • ' Relever la valeur d'un champ d'une table avec un critère
  • ' si la base, la table et le critère sont inchangés depuis le dernier appel,
  • ' une mémorisation permet de gagner du temps !
  • Static ht As New Hashtable ' Conserver de la valeur des champs
  • Static sMemRq$ ' Conserver les paramètres de la requête
  • ' Si on relance la même requête, on lit directement le champ dans le ht
  • If m_sCheminBD & sTable & sCritere = sMemRq Then
  • DLookup = ht(sChamp)
  • Exit Function
  • End If
  • ' Objet commande = requête
  • Dim oCmd As New OleDb.OleDbCommand
  • oCmd.Connection = m_oConn ' La connexion doit bien sûr être ouverte avant
  • oCmd.CommandType = CommandType.Text
  • oCmd.CommandText = "Select * From " & sTable
  • If sCritere <> "" Then oCmd.CommandText &= " Where " & sCritere
  • Dim sMsgErr$ = _
  • "Erreur lors de l'exécution de la requête dans DLookUp :" & vbLf & _
  • oCmd.CommandText
  • ' Création d'un DataReader pour récupérer la valeur des champs
  • Dim dr As OleDb.OleDbDataReader
  • Try
  • dr = oCmd.ExecuteReader(CommandBehavior.SingleRow)
  • Catch ex As Exception
  • If bPromptErr Then MsgBox(sMsgErr & vbLf & Err.Description, MsgBoxStyle.Critical)
  • Exit Function
  • End Try
  • If Not dr.HasRows Then
  • ' Aucune donnée retournée : DLookUp renvoi DBNull
  • DLookUp = System.DBNull.Value
  • Else
  • ' Lire les champs
  • dr.Read()
  • ' Stocker les champs ds le ht pour les retrouver facilement
  • ' au prochain appel identique
  • If Not IsNothing(ht) Then ht.Clear()
  • Dim i% ' Nb. de champs de la requête
  • For i = 0 To dr.FieldCount - 1
  • ht.Add(dr.GetName(i), dr.GetValue(i))
  • Next i
  • sMemRq = m_sCheminBD & sTable & sCritere
  • ' Lire la valeur du champ
  • Try
  • DLookUp = dr.Item(sChamp)
  • Catch ex As IndexOutOfRangeException
  • If bPromptErr Then MsgBox( _
  • "Champ introuvable dans la requête dans DLookUp :" & vbLf & _
  • oCmd.CommandText & vbLf & Err.Description, MsgBoxStyle.Critical)
  • Catch ex As Exception
  • If bPromptErr Then MsgBox(sMsgErr & vbLf & _
  • Err.Description, MsgBoxStyle.Critical)
  • End Try
  • End If
  • dr.Close()
  • End Function
  • Public Function DSum(ByVal sChamp$, ByVal sTable$, Optional ByVal sCritere$ = "") As Object
  • ' Implementation de la fonction DSum d'Access en VB7 :
  • ' Faire un cumul d'un champ d'une table avec un critère
  • ' Objet commande
  • Dim oCmd As New OleDb.OleDbCommand
  • oCmd.Connection = m_oConn
  • oCmd.CommandType = CommandType.Text
  • oCmd.CommandText = "Select Sum(" & sChamp & ") AS SommeDeChamp From " & sTable
  • If sCritere <> "" Then oCmd.CommandText &= " Where " & sCritere
  • Try
  • DSum = oCmd.ExecuteScalar()
  • Catch ex As Exception
  • MsgBox("Erreur lors de l'exécution de DSum" & vbLf & _
  • oCmd.CommandText & vbLf & Err.Description, MsgBoxStyle.Critical)
  • End Try
  • End Function
  • Public Function DCount(ByVal sChamp$, ByVal sTable$, Optional ByVal sCritere$ = "") As Object
  • ' Implementation de la fonction DCount d'Access en VB7 :
  • ' Compter le nombre d'enregistrement (via un champ) d'une table avec un critère
  • 'objet commande
  • Dim oCmd As New OleDb.OleDbCommand
  • oCmd.Connection = m_oConn
  • oCmd.CommandType = CommandType.Text
  • oCmd.CommandText = "Select Count(*) From " & sTable
  • If sCritere <> "" Then oCmd.CommandText &= " Where " & sCritere
  • Try
  • DCount = oCmd.ExecuteScalar()
  • Catch ex As Exception
  • MsgBox("Erreur lors de l'exécution de DCount :" & vbLf & _
  • oCmd.CommandText & vbLf & Err.Description, MsgBoxStyle.Critical)
  • End Try
  • End Function
  • Public Function bRqAction(ByRef sSQL$, _
  • Optional ByRef bPromptErr As Boolean = True) As Boolean
  • ' Exécuter une requête Action (il faut la créer à la volée, on ne peut pas
  • ' modifier le code SQL d'une requête action existante dans une base Access)
  • Dim oCmd As New OleDb.OleDbCommand
  • oCmd.Connection = m_oConn
  • oCmd.CommandType = CommandType.Text
  • oCmd.CommandText = sSQL
  • Try
  • oCmd.ExecuteNonQuery()
  • bRqAction = True
  • Catch ex As Exception
  • If bPromptErr Then MsgBox("Erreur lors de l'exécution de la requête :" & vbLf & _
  • sSQL & vbLf & Err.Description, MsgBoxStyle.Critical)
  • End Try
  • End Function
  • Public Function bDefinirRequeteSelection(ByRef sNomRq$, ByRef sSQL$) As Boolean
  • ' Modifier le code SQL d'une requête sélection existante dans une base Access
  • ' (note : on ne peut pas modifier le code SQL d'une requête action
  • ' existante dans une base Access)
  • ' Suppression de la requête existante (requête sélection = vue : view)
  • Dim oCmd As New OleDb.OleDbCommand
  • oCmd.Connection = m_oConn
  • oCmd.CommandType = CommandType.Text
  • oCmd.CommandText = "drop view " & sNomRq
  • Try
  • oCmd.ExecuteNonQuery()
  • Catch ex As Exception
  • ' Pas grave si la rq n'existe pas déjà
  • End Try
  • ' Recréer la vue
  • oCmd.Connection = m_oConn
  • oCmd.CommandType = CommandType.Text
  • oCmd.CommandText = "Create view " & sNomRq & " As " & sSQL
  • ' Ne marche pas
  • 'oCmd.CommandText = "Create Or Replace view " & sNomRq & " As " & sSQL
  • ' Executer la recréation de la vue
  • Try
  • oCmd.ExecuteNonQuery()
  • bDefinirRequeteSelection = True
  • Catch ex As Exception
  • MsgBox("Erreur lors de la création de la vue dans bDefinirRequeteSelection" & vbLf & _
  • oCmd.CommandText & vbLf & Err.Description)
  • End Try
  • End Function
  • Public Function Nz(ByRef vVal As Object, Optional ByRef vDef As Object = 0) As Object
  • ' Implementation de la fonction Nz d'Access en VB7 :
  • ' Non Zero : renvoyer 0 (ou une autre valeur par défaut)
  • ' si la valeur du champ de bd est null
  • ' ou sinon renvoyer simplement la valeur
  • If IsDBNull(vVal) Then Nz = vDef : Exit Function
  • If vVal Is System.DBNull.Value Then Nz = vDef : Exit Function
  • Nz = vVal
  • End Function
  • Public Function sValeurPtDecimal$(ByRef rVal!)
  • ' Remplacer la virugle par un point pour les critères en valeur réels
  • ' car le SQL est executé en langue anglaise, avec toujours un point décimal
  • sValeurPtDecimal = CStr(rVal)
  • sValeurPtDecimal = Replace(sValeurPtDecimal, ",", ".")
  • End Function
  • End Module
Private Sub btnTest_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles btnTest.Click

    Me.Cursor = Cursors.WaitCursor
    If bOuvrirBaseDonnees(Application.StartupPath & "\AccessToVB7.mdb") Then

        Dim rVal1A! = DLookUp("Champ1", "Table1", "Critere1='A'")
        Dim rVal2A! = DLookUp("Champ2", "Table1", "Critere1='A'")
        Dim rVal1B! = DLookUp("Champ1", "Table1", "Critere1='B'")
        Dim rSomme1! = DSum("Champ1", "Table1")
        Dim iNbEnreg% = DCount("Champ1", "Table1")
        Dim iNbEnregA% = DCount("Champ1", "Table1", "Critere1='A'")
        ' Arrondi des réels, sinon il y a des décimales parasites !
        rSomme1 = Math.Round(rSomme1, 3)
        MsgBox( _
            "Val1A=" & rVal1A & ", Val2A=" & rVal2A & vbLf & _
            "Val1B=" & rVal1B & ", Somme1AB=" & rSomme1 & vbLf & _
            "NbEnreg=" & iNbEnreg & ", NbEnregA=" & iNbEnregA, _
            MsgBoxStyle.Information)

        ' Exécution d'une requête mise à jour
        Dim sSQL$ = "UPDATE Table1 SET Champ2 = Champ2+0.1 WHERE Critere1='A'"
        If bRqAction(sSQL) Then
            rVal2A! = DLookUp("Champ2", "Table1", "Critere1='A'")
            MsgBox("Modification : Val2A=" & rVal2A, MsgBoxStyle.Information)
        End If

        FermerBaseDonnees()

    End If
    Me.Cursor = Cursors.Default

End Sub

Option Strict On
Option Explicit On 

Module modAccessToVB7

Private m_sCheminBD$
Private m_oConn As New OleDb.OleDbConnection

Public Function bOuvrirBaseDonnees(ByVal sCheminBD$) As Boolean

    ' Ouvrir la base de données

    m_oConn.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;" & _
        "Mode=Share Deny None;Data Source=" & sCheminBD
    m_sCheminBD = sCheminBD

    Try
        m_oConn.Open()
        bOuvrirBaseDonnees = True
    Catch ex As Exception
        MsgBox("Erreur lors de l'ouverture de la base :" & vbLf & _
            sCheminBD & vbLf & Err.Description, MsgBoxStyle.Critical)
    End Try

End Function

Public Sub FermerBaseDonnees()

    m_oConn.Close()

End Sub

Public Function DLookUp(ByVal sChamp$, ByVal sTable$, ByVal sCritere$, _
    Optional ByVal bPromptErr As Boolean = True) As Object

    ' Implementation de la fonction DLookUp d'Access en VB7 :
    ' Relever la valeur d'un champ d'une table avec un critère
    '  si la base, la table et le critère sont inchangés depuis le dernier appel,
    '  une mémorisation permet de gagner du temps !

    Static ht As New Hashtable ' Conserver de la valeur des champs
    Static sMemRq$             ' Conserver les paramètres de la requête

    ' Si on relance la même requête, on lit directement le champ dans le ht
    If m_sCheminBD & sTable & sCritere = sMemRq Then
        DLookup = ht(sChamp)
        Exit Function
    End If

    ' Objet commande = requête
    Dim oCmd As New OleDb.OleDbCommand
    oCmd.Connection = m_oConn ' La connexion doit bien sûr être ouverte avant
    oCmd.CommandType = CommandType.Text
    oCmd.CommandText = "Select * From " & sTable
    If sCritere <> "" Then oCmd.CommandText &= " Where " & sCritere
    Dim sMsgErr$ = _
        "Erreur lors de l'exécution de la requête dans DLookUp :" & vbLf & _
        oCmd.CommandText

    ' Création d'un DataReader pour récupérer la valeur des champs
    Dim dr As OleDb.OleDbDataReader
    Try
        dr = oCmd.ExecuteReader(CommandBehavior.SingleRow)
    Catch ex As Exception
        If bPromptErr Then MsgBox(sMsgErr & vbLf & Err.Description, MsgBoxStyle.Critical)
        Exit Function
    End Try

    If Not dr.HasRows Then
        ' Aucune donnée retournée : DLookUp renvoi DBNull
        DLookUp = System.DBNull.Value
    Else

        ' Lire les champs
        dr.Read()

        ' Stocker les champs ds le ht pour les retrouver facilement 
        '  au prochain appel identique
        If Not IsNothing(ht) Then ht.Clear()
        Dim i% ' Nb. de champs de la requête
        For i = 0 To dr.FieldCount - 1
            ht.Add(dr.GetName(i), dr.GetValue(i))
        Next i
        sMemRq = m_sCheminBD & sTable & sCritere

        ' Lire la valeur du champ
        Try
            DLookUp = dr.Item(sChamp)
        Catch ex As IndexOutOfRangeException
            If bPromptErr Then MsgBox( _
                "Champ introuvable dans la requête dans DLookUp :" & vbLf & _
                oCmd.CommandText & vbLf & Err.Description, MsgBoxStyle.Critical)
        Catch ex As Exception
            If bPromptErr Then MsgBox(sMsgErr & vbLf & _
                Err.Description, MsgBoxStyle.Critical)
        End Try

    End If
    dr.Close()

End Function

Public Function DSum(ByVal sChamp$, ByVal sTable$, Optional ByVal sCritere$ = "") As Object

    ' Implementation de la fonction DSum d'Access en VB7 :
    '  Faire un cumul d'un champ d'une table avec un critère

    ' Objet commande
    Dim oCmd As New OleDb.OleDbCommand
    oCmd.Connection = m_oConn
    oCmd.CommandType = CommandType.Text
    oCmd.CommandText = "Select Sum(" & sChamp & ") AS SommeDeChamp From " & sTable
    If sCritere <> "" Then oCmd.CommandText &= " Where " & sCritere

    Try
        DSum = oCmd.ExecuteScalar()
    Catch ex As Exception
        MsgBox("Erreur lors de l'exécution de DSum" & vbLf & _
            oCmd.CommandText & vbLf & Err.Description, MsgBoxStyle.Critical)
    End Try

End Function

Public Function DCount(ByVal sChamp$, ByVal sTable$, Optional ByVal sCritere$ = "") As Object

    ' Implementation de la fonction DCount d'Access en VB7 :
    '  Compter le nombre d'enregistrement (via un champ) d'une table avec un critère

    'objet commande
    Dim oCmd As New OleDb.OleDbCommand
    oCmd.Connection = m_oConn
    oCmd.CommandType = CommandType.Text
    oCmd.CommandText = "Select Count(*) From " & sTable
    If sCritere <> "" Then oCmd.CommandText &= " Where " & sCritere

    Try
        DCount = oCmd.ExecuteScalar()
    Catch ex As Exception
        MsgBox("Erreur lors de l'exécution de DCount :" & vbLf & _
            oCmd.CommandText & vbLf & Err.Description, MsgBoxStyle.Critical)
    End Try

End Function

Public Function bRqAction(ByRef sSQL$, _
    Optional ByRef bPromptErr As Boolean = True) As Boolean

    ' Exécuter une requête Action (il faut la créer à la volée, on ne peut pas 
    '  modifier le code SQL d'une requête action existante dans une base Access)

    Dim oCmd As New OleDb.OleDbCommand
    oCmd.Connection = m_oConn
    oCmd.CommandType = CommandType.Text
    oCmd.CommandText = sSQL

    Try
        oCmd.ExecuteNonQuery()
        bRqAction = True
    Catch ex As Exception
        If bPromptErr Then MsgBox("Erreur lors de l'exécution de la requête :" & vbLf & _
            sSQL & vbLf & Err.Description, MsgBoxStyle.Critical)
    End Try

End Function

Public Function bDefinirRequeteSelection(ByRef sNomRq$, ByRef sSQL$) As Boolean

    ' Modifier le code SQL d'une requête sélection existante dans une base Access
    ' (note : on ne peut pas modifier le code SQL d'une requête action 
    '  existante dans une base Access)

    ' Suppression de la requête existante (requête sélection = vue : view)
    Dim oCmd As New OleDb.OleDbCommand
    oCmd.Connection = m_oConn
    oCmd.CommandType = CommandType.Text
    oCmd.CommandText = "drop view " & sNomRq
    Try
        oCmd.ExecuteNonQuery()
    Catch ex As Exception
        ' Pas grave si la rq n'existe pas déjà
    End Try

    ' Recréer la vue
    oCmd.Connection = m_oConn
    oCmd.CommandType = CommandType.Text
    oCmd.CommandText = "Create view " & sNomRq & " As " & sSQL
    ' Ne marche pas
    'oCmd.CommandText = "Create Or Replace view " & sNomRq & " As " & sSQL

    ' Executer la recréation de la vue
    Try
        oCmd.ExecuteNonQuery()
        bDefinirRequeteSelection = True
    Catch ex As Exception
        MsgBox("Erreur lors de la création de la vue dans bDefinirRequeteSelection" & vbLf & _
            oCmd.CommandText & vbLf & Err.Description)
    End Try

End Function

Public Function Nz(ByRef vVal As Object, Optional ByRef vDef As Object = 0) As Object

    ' Implementation de la fonction Nz d'Access en VB7 :
    ' Non Zero : renvoyer 0 (ou une autre valeur par défaut) 
    '  si la valeur du champ de bd est null
    '  ou sinon renvoyer simplement la valeur

    If IsDBNull(vVal) Then Nz = vDef : Exit Function
    If vVal Is System.DBNull.Value Then Nz = vDef : Exit Function
    Nz = vVal

End Function

Public Function sValeurPtDecimal$(ByRef rVal!)

    ' Remplacer la virugle par un point pour les critères en valeur réels
    '  car le SQL est executé en langue anglaise, avec toujours un point décimal

    sValeurPtDecimal = CStr(rVal)
    sValeurPtDecimal = Replace(sValeurPtDecimal, ",", ".")

End Function

End Module

Conclusion

Je suis parti d'une version en VB6 migrée en VB7, mais je me suis fait aider pour la réécriture en pur .Net avec OleDb (sans DAO donc)

Les fonctions DCount, DLookUp et DSum d'Access en VB6 :
www.vbfrance.com/code.aspx?id=24179
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.