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

VBA Access Discussion :

modifier une instruction SQL en VBA


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut modifier une instruction SQL en VBA
    Bonjour,

    Toujours dans le cas de réaliser une application pour associations qui gèrent un projet de distribution d'eau potable Voir là :
    https://www.developpez.net/forums/d1.../#post10351033
    et là
    https://www.developpez.net/forums/d1...ble-reflexive/
    Voici ma question: comment écrire cette instruction SQL en VBA
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tbl_Contrat.PK_Contrat, tbl_Releve.PK_Releve, tbl_Facture.PK_Facture, tbl_Facture.Date_Facture, tbl_Facture.Etat_Facture
    FROM (tbl_Contrat INNER JOIN tbl_Releve ON tbl_Contrat.PK_Contrat = tbl_Releve.FK_Contrat) INNER JOIN tbl_Facture ON tbl_Releve.PK_Releve = tbl_Facture.FK_Releve
    WHERE (((tbl_Facture.Etat_Facture)="En attente"));"
    sachant que j'ai une variable "m_strCurrentChars" ,
    donc il faut que j'ajoute cette ligne :
    "WHERE PK_Contrat Like '" & m_strCurrentChars & "*' ", j'ai essayé avec AND entre la clause WHERE et la deuxième WHERE variable mais ça pas marché.
    Merci d'avance.

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 040
    Par défaut
    Bonjour,
    On ne mets jamais 2 WHERE dans une même requete, essaie :
    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
     
     
    dim strSql as string, rs1 as DAO.recordset
     
    strSql = "SELECT tbl_Contrat.PK_Contrat, tbl_Releve.PK_Releve, tbl_Facture.PK_Facture, tbl_Facture.Date_Facture, tbl_Facture.Etat_Facture" _
    & " FROM (tbl_Contrat INNER JOIN tbl_Releve ON tbl_Contrat.PK_Contrat = tbl_Releve.FK_Contrat)" _
    & "  INNER JOIN tbl_Facture ON tbl_Releve.PK_Releve = tbl_Facture.FK_Releve" _
    & " WHERE (tbl_Facture.Etat_Facture = 'En attente') AND ( tbl_Contrat.PK_Contrat Like '" & m_strCurrentChars & "*' "
     
     ' que tu peux utiliser dans un recordset comme
    SET rs1= currentdb.openrecordset(strSql )
    if rs1.recordcount = 0 then exit Sub  'j'imagine que tu es dans un Sub
    rs1.movelast
    rs1.moveFirst
    while not rs1.EOF
    ' ici ligne après ligne , tu fais ce que tu souhaites avec les colonnes et leur valeur dans cette ligne
     
    'exemple :
    msgbox rs1!PK_Contrat
     
    rs1.movenext  'ligne suivante
    wend
    Ca peut peut être t'aider à démarrer ...

    Cdlt

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut
    Rebonjour,
    Merci pour la réponse, je vais vous expliquer mon but final peut être, il y a une autre issue pour ce problème.
    Le formulaire qui contient ces instructions sert à filtrer toutes les factures d'un abonné afin de les régler; d’où vient le premier filtre "en attente". pour le deuxième filtre(La variable), vient d'une zone du texte où on tape le numéro du contrat: (n° police) pour afficher dans une zone de liste les lignes des factures concernées, après on clique sur chaque ligne pour régler la facture.j'ai essayer d'imiter LITTÉRALEMENT le tuto:
    Concevoir une liste qui filtre les enregistrements selon le contenu d'une zone de texte
    Par Jean-Philippe AMBROSINO
    Date de publication : 20 septembre 2011
    Dernière mise à jour : 8 avril 2014


    Nom : 1.png
Affichages : 200
Taille : 12,7 Ko

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut
    Citation Envoyé par micniv Voir le message
    Bonjour,
    On ne mets jamais 2 WHERE dans une même requete, essaie :
    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
     
     
    dim strSql as string, rs1 as DAO.recordset
     
    strSql = "SELECT tbl_Contrat.PK_Contrat, tbl_Releve.PK_Releve, tbl_Facture.PK_Facture, tbl_Facture.Date_Facture, tbl_Facture.Etat_Facture" _
    & " FROM (tbl_Contrat INNER JOIN tbl_Releve ON tbl_Contrat.PK_Contrat = tbl_Releve.FK_Contrat)" _
    & "  INNER JOIN tbl_Facture ON tbl_Releve.PK_Releve = tbl_Facture.FK_Releve" _
    & " WHERE (tbl_Facture.Etat_Facture = 'En attente') AND ( tbl_Contrat.PK_Contrat Like '" & m_strCurrentChars & "*' "
     
     ' que tu peux utiliser dans un recordset comme
    SET rs1= currentdb.openrecordset(strSql )
    if rs1.recordcount = 0 then exit Sub  'j'imagine que tu es dans un Sub
    rs1.movelast
    rs1.moveFirst
    while not rs1.EOF
    ' ici ligne après ligne , tu fais ce que tu souhaites avec les colonnes et leur valeur dans cette ligne
     
    'exemple :
    msgbox rs1!PK_Contrat
     
    rs1.movenext  'ligne suivante
    wend
    Ca peut peut être t'aider à démarrer ...

    Cdlt
    Bonjour,

    Je reçois cette erreur :

    Nom : erreur.png
Affichages : 223
Taille : 443,4 Ko

  5. #5
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 960
    Par défaut
    bonsoir,
    les guillemets sont en trop après le signe = et entre 'En attente' et une parenthèse est manquante à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    & " WHERE (tbl_Facture.Etat_Facture = 'En attente') AND (tbl_Contrat.PK_Contrat Like '" & m_strCurrentChars & "*') "

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 040
    Par défaut
    encore un bon drive, Tee_grandbois !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonsoir,
    les guillemets sont en trop après le signe = et entre 'En attente' et une parenthèse est manquante à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    & " WHERE (tbl_Facture.Etat_Facture = 'En attente') AND (tbl_Contrat.PK_Contrat Like '" & m_strCurrentChars & "*') "
    Bonjour,

    Merci pour l'aide, l’erreur est disparue, mais j'arrive pas encore à mon but.
    Pour mieux éclaircir le problème; voici une instantanée de ma BD:
    Nom : BD.png
Affichages : 167
Taille : 46,0 Ko

    et voici le formulaire que j'ai creé

    Nom : Frm.png
Affichages : 163
Taille : 21,9 Ko


    basé sur cette requête:


    Nom : Req.png
Affichages : 158
Taille : 30,7 Ko

    Maintenant, je veux : 1-Mettre à jour la liste des factures (zone de liste) en fonction des caractères tapés dans la zone de texte.
    2- Compter le nombre de factures trouvées

    et voici le code:
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    Private Sub UpdateFactureList(KeyAscii As Integer)
    'Met à jour la liste des factures en fonction des caractères tapés dans la zone de texte
    Dim SQL                                                     As String
    Dim SQLWhere                                            As String
    Dim strFacturesCount                                   As String
     
                    Select Case KeyAscii
                    Case 8, 48 To 57
                        'Backspace ou un nombre : acceptés
                    Case Else
                        'Sinon rien
                        KeyAscii = 0
                        MsgBox "Un caractère numérique est requis ici !", vbExclamation, "Erreur de frappe"
                        m_strCurrentChars = vbNullString
                        Exit Sub
                End Select
                If KeyAscii = 8 Then
                    'Si on appuie sur Backspace alors on retire un caractère
                    On Error Resume Next
                    m_strCurrentChars = Left$(m_strCurrentChars, Len(m_strCurrentChars) - 1)
                    On Error GoTo 0
                Else
                    'Sinon la variable s'incrémente et prend le caractère tapé
                    m_strCurrentChars = m_strCurrentChars & Chr(KeyAscii)
                End If
                'On applique alors le critère à la chaîne SQL
                SQL = "SELECT tbl_Contrat.PK_Contrat, tbl_Releve.PK_Releve, tbl_Facture.PK_Facture, tbl_Facture.Date_Facture, tbl_Facture.Etat_Facture, tbl_Facture.Total_Net, tbl_Facture.Date_DernierDilai"
                SQL = SQL & "FROM tbl_Contrat INNER JOIN tbl_Releve ON tbl_Contrat.PK_Contrat = tbl_Releve.FK_Contrat INNER JOIN tbl_Facture ON tbl_Releve.PK_Releve = tbl_Facture.FK_Releve"
                SQLWhere = SQL & " WHERE (tbl_Facture.Etat_Facture = 'En attente') AND (tbl_Contrat.PK_Contrat Like '" & m_strCurrentChars & "*') "
                SQL = SQL & SQLWhere
                'Et on rafraîchit la liste selon cette clause SQL
                SetListOfFactureProperties SQL, CON_FAC_COLWIDTH
        'Et on compte le nombre de factures trouvées
        Me.lblCountFactures.Caption = CountFactureFound(SQLWhere)
        'Si la zone ne contient que * on efface la variable (cas de KeyAscii = 8)
        If Len(m_strCurrentChars) Then
            If (Asc(Left$(m_strCurrentChars, 1)) = 42) And (Len(m_strCurrentChars) = 1) Then
                m_strCurrentChars = vbNullString
            End If
        End If
    End Sub
    Private Sub SetListOfFactureProperties(ByVal Source As String, ColWidth As String)
    'Rafraîchit la liste des factures
        With lboFactures
            .ColumnCount = 7
            .BoundColumn = 7
            .RowSource = Source
            .ColumnWidths = ColWidth
        End With
    End Sub
    Private Function CountFactureFound(ByVal SQLWhere As String) As String
    'Compte le nombre de factures correspondant au critère
    Dim oRS                                                     As DAO.Recordset
    Dim SQL                                                     As String
    Dim lngRowCount                                        As Long
     
        On Error GoTo L_ErrCountFactureFound
        'On ouvre le RecordSet sur le critère en cours...
        SQL = "SELECT COUNT(PK_Facture) AS NBRows "
        SQL = SQL & "FROM tbl_Facture " & SQLWhere
        Set oRS = m_oDB.OpenRecordset(SQL, dbOpenSnapshot)
        With oRS
            lngRowCount = Nz(.Fields(0).Value, 0)
            'Si la variable est > 0
            If lngRowCount Then
                CountFactureFound = lngRowCount & " facture" & IIf(lngRowCount = 1, " ", "s ") & "trouvée" & _
                                 IIf(lngRowCount = 1, " ", "s ")
            Else
                CountFactureFound = "Aucune facture trouvée..."
            End If
            .Close
        End With
     
        On Error GoTo 0
    L_ExCountFactureFound:
        'Libère l'objet de la mémoire
        Set oRS = Nothing
        Exit Function
     
    L_ErrCountFactureFound:
        MsgBox Err.Description, vbExclamation, Err.Source
        Resume 'L_ExCountFactureFound
    End Function
    Je suis désolé pour la longueur de ce topic.
    A+

  8. #8
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 960
    Par défaut
    Merci pour l'aide, l’erreur est disparue, mais j'arrive pas encore à mon but.
    c'est donc une autre question que celle d'origine:
    Voici ma question: comment écrire cette instruction SQL en VBA
    poster le code n'est pas suffisant si on n'a pas quelques pistes (messages d'erreur, dysfonctionnement ...)

Discussions similaires

  1. [XL-2007] Le "&" d'une instruction sql vba
    Par ALEX80800 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/11/2016, 10h50
  2. 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, 16h29
  3. Remplacer l'instruction GO par une instruction SQL
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 06/04/2006, 09h28
  4. 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, 17h33
  5. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44

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