IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

D'une requête SQL au VBA


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut D'une requête SQL au VBA
    Bonjour à tous,

    À partir d'une requête que je nommerai X, j'ai écrit le code SQL ci-dessous qui me permet de n'afficher que les 4 derniers enregistrements de ma requête en fonction des dernières dates et heures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT TOP 4 [rqt X].Date, [rqt X].Heure
    FROM [rqt X]
    ORDER BY [rqt X].Date DESC , [rqt X].Heure DESC;
    J'ai décidé de construire un formulaire à partir de ma requête X et de lui associer un bouton relié à une procédure événementielle et qui sur un clic n'afficherait que les 4 derniers enregistrement comme avec mon code SQL.

    Mais voilà, j'ai presque honte de le dire, mais je ne sais pas traduire mon code SQL en langage VBA.

    Je pense que cela doit être très simple mais je ne sais pas quoi écrire dans mon éditeur VBA.

    Merci d'avance pour le coup de main donné au néophyte que je suis.

    Fabrice.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonsoir

    Je ne suis pas certain d'avoir compris.

    Si tu appuies ton formulaire sur la requête telle que définie, tu n'affiches que les 4 premières valeurs, et je ne comprends donc pas l'utilité du bouton...

    J'ai peut-être mal dormi la nuit dernière, et ai donc peut-être le cerveau un peu lent...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Je me suis sans doute mal exprimé.

    Le formulaire s'appuie sur la requête X ne comprenant pas mon code SQL puisque je veux l'intégrer en VBA.

    À l'ouverture de mon formulaire, tous les enregistrements de ma requête apparaîtront et un clic sur le bouton ne me donnera que les 4 derniers enregistrements.

    En fait, je veux avoir le choix entre l'affichage de tous les enregistrements ou les 4 derniers.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 350
    Points
    34 350
    Par défaut
    bonjour,
    si j'ai le cerveau un peu moins pire que celui de pierre, je partirai sur les propriétés (Row)Source que tu alimentes avec la requete.
    Une mise à jour du resultat de la requete avec Requery devrait faire l'affaire...
    Est-ce bien cela, ou dois aller me prendre aussi un verre de vitamines

  5. #5
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Merci pour vos réponses mais cette fois c'est moi qui ne comprends pas très bien, n'étant pas, loin sans faut, un expert en VBA.

    Si je te suis bien je dois intégrer dans mon code VBA les propriétés (Row)Source et Requery, c'est ça ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Voici la transcription en code vba de la solution de jpCheck.
    Pour cet exemple, j'ai créé une table, deux requêtes et un formulaire
    La requête "rTous" reprend tous les enregistrements, la requête "RTop4" reprend les quatre premiers.
    Sur le formulaire, j'ai placé deux boutons, "cmdTous" pour visualiser tous les enregistrements et "cmd4Premiers" pour visualiser les quatre premiers.

    Voici le code sur clic pour les deux boutons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub cmd4Premiers_Click()
        Me.RecordSource = "rTop4"
    End Sub
     
    Private Sub cmdTous_Click()
        Me.RecordSource = "rTous"
    End Sub
    Ok?

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonjour,

    Ton sql d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 4 Ta_Table.Ta_Date, Ta_Table.Ton_Heure
    FROM Ta_Table
    ORDER BY Ta_Table.Ta_Date DESC , Ta_Table.Ton_Heure DESC;
    Devient en VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim StrSql As String
    StrSql = "SELECT TOP 4 Ta_Table.Ta_Date, Ta_Table.Ton_Heure " & _
             "FROM Ta_Table " & _
             "ORDER BY Ta_Table.Ta_Date DESC " & _
             ", Ta_Table.Ton_Heure DESC;
    Cordialement.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    D'abord, merci pour vos réponses.

    Pour la solution de Pierre Fauconnier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub cmd4Premiers_Click()
        Me.RecordSource = "rTop4"
    End Sub
     
    Private Sub cmdTous_Click()
        Me.RecordSource = "rTous"
    End Sub
    Cela fonctionne super bien et ça a le mérite d'être très simple à mettre en pratique.
    Le seul petit bémol (tout petit) est au point de vue "esthétique" de ma base de données car cela me force à créer une nouvelle requête (rTop4).
    Pour la maintenance, si je décide plus tard d'afficher les 5, 6, 7 derniers enregistrements, il me faudra créer autant de requête.
    Mais vu le temps que j'aie cherché pour trouver une solution, M. Pierre Fauconnier fait déjà mon bonheur (et c'est peu dire).

    En ce qui concerne la solution de francishop, elle répond parfaitement à ma question d'origine qui était de transformer du code SQL en VBA.

    Malheureusement, après avoir écrit le code ci-dessous relié à la procédure évènementielle d'un bouton de mon formulaire, cela n'a donné aucun résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub cmd4Premiers_Click()
    Dim strSQL As String
    strSQL = " SELECT TOP 4 [Ma_Table].Date, [Ma_Table].Heure " & _
             " FROM [Ma_Table]" & _
             " ORDER BY [Ma_Table].Date DESC " & _
             ", [Ma_Table].Heure DESC;"
     
    End Sub
    Il doit manquer des lignes de code quelque part, mais je ne sais pas lesquelles, ni où.
    Quoi qu'il en soit merci quand même pour ta réponse. Je vais essayer de fouiller encore un peu.

    Cordialement à vous, Fabrice.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonsoir,

    On peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub cmdExemple_Click()
     
     Me.RecordSource = "SELECT TOP 4 Ta_Table.Ta_Date, Ta_Table.Ton_Heure " & _
                "FROM Ta_Table " & _
                "ORDER BY Ta_Table.Ta_Date DESC " & _
                ", Ta_Table.Ton_Heure DESC;"
    End Sub
    Cordialement.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Alors là génial ! Merci infiniment francishop, c'est exactement ce que je cherchais.

    Avec toute ma reconnaissance, Fabrice.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonsoir,

    Je vais me faire "taper sur les doigts" si je ne montre pas l'exemple Académique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub cmdExemple_Click()
     Dim StrSql As String
    StrSql = "SELECT TOP 4 Ta_Table.Ta_Date, Ta_Table.Ton_Heure " & _
             "FROM Ta_Table " & _
             "ORDER BY Ta_Table.Ta_Date DESC " & _
             ", Ta_Table.Ton_Heure DESC;"
    Me.RecordSource = StrSql
    End Sub
    Cordialement.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Comme je suis novice en VBA, je suis évidemment preneur du langage académique.

    À plus et encore merci.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    14 ans, vraiment ?

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Re Bonsoir,

    Non... Qui parle de 14 ans ans? Quelqu'un qui veut me faire plaisir? Quelqu'un qui veut me laisser croire qu'il a mordu à mon hameçon? Que dis-je : Hameçon. Parlons d'harpon!
    Encore quelques jours et j'incrémente le compteur d'un pour dans quatre.

    Cordialement.

    Ps :
    Citation Envoyé par Fabrice7627 Voir le message
    Mais voilà, j'ai presque honte de le dire, mais je ne sais pas traduire mon code SQL en langage VBA.
    J'en profite pour relever. Quelle honte? De venir sur un forum ou des personnes se font plaisir de donner ce quelles n'ont pas reçu... Pour la bonne et simple raison que ce forum n'existait pas.
    Heureux que nous sommes d'aider ceux qui sont derrière nous.
    En contre partie ceux qui sont devant, nous aident.

    Par contre, honte à toi si plus tard tu n'aides pas ceux qui sont derrière..
    Regarde bien, des demandes se profilent déjà pour toi.

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Le "14 ans", c'est en rapport à la localisation mentionnée sur ton profil...

  16. #16
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonjour,
    Citation Envoyé par Pierre Fauconnier Voir le message
    Le "14 ans", c'est en rapport à la localisation mentionnée sur ton profil...
    Ha!.. Si les "costauds" se mettent eux aussi à me "chatouiller" je ne joue plus. Déjà Vodiem a rallié Philben pour me "chambrer" alors je capitule.

    Mais avant, je voudrais tout de même essayer, de faire en sorte que ce sujet sur les dates, puisse servir à quelque débutant.

    On crée une table promptement baptisée : tbl_Naissance
    2 champs (1 seul est suffisant mais le gout du luxe…)
    ....Id_Naissance-->NuméroAuto -->Clé primaire
    ....dteNaissance-->Date/Heure-->Format-->Date, abrégé
    Ce qui peut, aprés saisie donner ceci :
    Id_Naissance ...dteNaissance
    1...................01/01/1955
    2...................28/02/1939
    3...................29/02/1948
    4...................25/01/1950
    5...................30/06/1964
    6...................27/02/1975
    7...................30/12/1984
    8...................01/01/1956
    9...................27/11/1998
    10.................17/05/2002
    11.................20/01/2007

    Dans un module tout neuf on inscrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Option Compare Database
    Function CalculAge(dateNaissance As Date, Optional dateReference As Date)
    If dateReference = 0 Then dateReference = Date
    CalculAge = Year(dateReference) - Year(dateNaissance) + _
    (Format(dateNaissance, "mmdd") > Format(dateReference, "mmdd"))
    If CalculAge > 1 Then
    CalculAge = CalculAge & " ans"
    Else
    CalculAge = CalculAge & " an"
    End If
     
    End Function
     
    Function CalculAge1(dateNaissance As Date, Optional dateReference As Date)
    If dateReference = 0 Then dateReference = Date
    CalculAge1 = Year(dateReference) - Year(dateNaissance) + _
    (Format(dateNaissance, "mmdd") > Format(dateReference, "mmdd"))
    End Function
     
    Function DernierJourDuMois(Optional dteDate As Date) As Date
    ' Cette fonction calcule le dernier jour du mois d'après une date donnée.
    ' Si aucune date n'est transmise, elle utilise la date du jour.
        If CLng(dteDate) = 0 Then
            dteDate = Date
        End If
        ' Recherche le premier jour du mois suivant, puis soustrait un jour.
        DernierJourDuMois = DateSerial(Year(dteDate), Month(dteDate) + 1, 1) - 1
    End Function
    '********************************************
    'De notre ami PHILBEN
    '**********************************************
    Public Function RoundUp(vValeur As Variant, Optional byNbDec As Byte) As Variant
       RoundUp = -Int(-vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
    End Function
     '********************************************
    'Toujours de notre ami PHILBEN
    '**********************************************
    Public Function RoundDown(vValeur As Variant, Optional byNbDec As Byte) As Variant
       RoundDown = Int(vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
    End Function
    On crée une requête répondant au joli surnom de-->qry_Naissance avec pour données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT tbl_Naissance.Id_Naissance, tbl_Naissance.dteNaissance, 
    CalculAge([dteNaissance]) AS Age, 
    CalculAge1([dteNaissance]) AS Compteur,
     IIf(Day(DernierJourDuMois([dteNaissance]))=29,
    RoundDown([Compteur]/4),[Compteur]) AS Anniversaires
    FROM tbl_Naissance;
    Un formulaire avec pour source cette remarquable requête .
    Et si on veut affiner : un champ supplémentaire dont le contenu peut être, si aucune objection ne se manifeste à cette hardie initiative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    =VraiFaux([Anniversaires]>1;[Anniversaires] & " anniversaires";
    [Anniversaires] & " anniversaire")
    Et si on ne veut pas travailler :AnniversairesEtAnnées.zip

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec une requète SQL en vba
    Par mephistomauvis dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/12/2008, 20h41
  2. écriture d'une requête SQL en VBA, pb lié à '
    Par Marie_2116 dans le forum VBA Access
    Réponses: 6
    Dernier message: 20/08/2007, 16h43
  3. Réponses: 6
    Dernier message: 15/02/2007, 14h46
  4. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 17h29
  5. Conversion d'une requête SQL en VBA
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/10/2004, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo