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 :

Commande SQL de base


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 52
    Points : 31
    Points
    31
    Par défaut Commande SQL de base
    Bonjour,

    Dans la continuité des mes précédents posts, je bute encore sur des commandes SQL, et là je sais que c'est un problème où il y a un tuto dessus mais je le retrouve plus...

    Bon voila mon soucis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If MsgBox("Mettre à jour le champ [Email envoyé le] ?", vbYesNo, "Vous souhaitez...") = vbYes Then 
    DoCmd.RunSQL "UPDATE [Formulaire ouvert] SET [Formulaire ouvert].[Email envoyé le] = Date();"
    End If
    Voila je cherche la commande qui remplacerait [Formulaire ouvert] dans mon code, c'est-à-dire qui ne modifie que les enregistrement qui sont sur le formulaire.

    J'ai testé avec le me.filter et ca n'a pas marché (j'ai peut être mal fait).

    Merci d'avance!

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    Si le code s'exécute à partir du formulaire en question, voici une méthode avec recordset DAO.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim rs As DAO.Recordset
     
    If MsgBox("Mettre à jour le champ [Email envoyé le] ?", vbYesNo, "Vous souhaitez...") = vbYes Then
       Set rs = Me.RecordsetClone
       If Not rs.EOF Then rs.MoveFirst
       Do While Not rs.EOF
          rs.Edit
          rs("Nom_du_Champ") = Date   ' remplacer Nom_du_Champ par le vrai nom
          rs.Update
          rs.MoveNext
       Loop
       Set rs = Nothing
    End If
    Remplacer Nom_du_Champ par le nom du champ (voir propriété "source contrôle" du contrôle [Email envoyé le]).

    Le code met à jour les données en passant par le recordset du formulaire.
    Cela met à jour le formulaire et les données sous-jacentes de la base de données.

    A+

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    Le code met à jour les données en passant par le recordset du formulaire.
    Cela met à jour le formulaire et les données sous-jacentes de la base de données.
    WAAAH !

    Déjà cette phrase me montre que t'as totalement compris ce que je voulais faire !

    MErci de ta réponse je test et je met résolu si j'y arrive!

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Super MERCI ENORMEMENT!

    Mais ta procédure ne fonctionne que quand on vient d'ouvrir le formulaire, dès qu'on est sur un enregistrement ca marche plus...

    Bon je sais j'abuse un peu mais comme j'ai deux autres questions sur les commandes SQL je vais pas mettre résolu

    1ere question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim oDB As DAO.Database
     
    Set oDB = CurrentDb
    J'aimerais connaître les instructions qui me permettrait de prendre uniquement les enregistrements de mon formulaire et non l'ensemble de ma "currentDB"... Donc je suppose qu'il faut changer ces instructions? Et comme je fais un recordset sur le champ Email de mon formulaire, voici la deuxième question:

    2ème question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim oRst1 As DAO.Recordset
     
    Set oRst1 = oDB.OpenRecordset("SELECT * FROM InfosClients")
    Déjà, oRst1 peut il rester définit ainsi (dans l'esprit de la premiere question)? Et comment faire pour qu'au lieu de la totalité de ma base InfosClients, seul mon formulaire en cours soit pris en compte? (ca je sais que c'est vraiment une question de base, mais je retrouve pas le tuto)...

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Réponse à ta première question.
    CurrentDb représente seulement la base de données en cours, et sert à renvoyer un objet de type Database.
    Voir modèle objet DAO.

    L'objet Database permet d'accéder aux données de la base, en créant des objets Recordset, avec la méthode OpenRecordset(..).

    On peut faire un rapprochement entre un recordset (jeu de données) et une requête qui affiche des données dans une feuille de données.

    Réponse à ta deuxième question.
    Ton code ouvre un recordset sur une table ou une requete (FROM InfosClients).
    InfosClients est le nom de cette table ou de cette requête.

    Maintenant, pour savoir avec exactitude quels sont les enregistrements affichés par un formulaire, ça n'est pas si évident.
    En effet le formulaire peut être filtré.
    Il faut prendre en compte la source du formulaire (propriété source).
    Ça pourra être le nom d'une table, d'une requête, ou directement une instruction SQL.
    Et il faut prendre en compte l'éventuel filtre (propriété Filter).

    C'est pour ça que je préfère utiliser la propriété RecordsetClone du formulaire.
    Elle permet de référencer un recordset qui est déjà ouvert et qui ne contient que les données affichées par le formulaire.

    Si je devais moi-même créer un recordset identique à celui du formulaire, je devrai :
    • récupérer le contenu de sa propriété source
    • évaluer si c'est un objet table/requête ou bien une instruction SQL
      • Si c'est une table ou une requête je peux faire "SELECT * FROM NomObjet"
        Si la propriété Filter n'est pas vide, je rajoute " WHERE conditions_du_filtre" à mon "SELECT * FROM NomObjet"
      • Si c'est une instruction SQL je la garde telle quelle. Il y a déjà SELECT ... FROM
        Si la propriété Filter n'est pas vide, il faut que j'évalue si mon instruction SQL n'a pas déjà une clause WHERE.
        • S'il y a déjà un WHERE. Il faut que j'insère les critères du filtre. Pas forcément simple s'il y a des parenthèse, sans parler qu'il faut tenir compte d'un éventuel point-virgule.
        • S'il n'y a pas de WHERE, ajouter "WHERE conditions_du_filtre", toujours en faisant attention à la présence ou pas du point-virgule
    Tu vois que dans le cas où la source est une instruction SQL ça devient compliqué.

    Pour conclure
    Pour n'obtenir dans un recordset, que les enregistrements d'un formulaire, il faut recréer les mêmes restrictions que lui avec la clause SQL WHERE.

    Par exemple si je sais que mon formulaire n'affiche que les clients de l'ain :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim oDB As DAO.Database
    Dim oRst1 As DAO.Recordset
     
    Set oDB = CurrentDb
    Set oRst1 = oDB.OpenRecordset("SELECT * FROM InfosClients WHERE CodePostal LIKE '01*'")
    A+

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 52
    Points : 31
    Points
    31
    Par défaut
    Ok merci de ta réponse ca marche parfaitement, même si c'est un peu bête de devoir retaper les critères de mes requêtes je fais avec

    D'ailleurs, comment faire en SQL des requètes de date? (du style:

    Set oRst1 = oDB.OpenRecordset("SELECT * FROM InfosClients WHERE {Champs [Email envoyé le] est compris entre date d'aujourd'hui +- 6mois})

  7. #7
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Hummmm...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM InfosClients 
    WHERE [Email envoyé le] BETWEEN NOW() AND DATEADD("m", 6, now())

Discussions similaires

  1. Commande SQL pour connexion à une base de données
    Par V_inSe dans le forum Débuter
    Réponses: 1
    Dernier message: 23/04/2014, 00h06
  2. Réponses: 1
    Dernier message: 23/10/2005, 00h55
  3. Commande SQL / connaître taille d'1 base
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/04/2005, 11h38
  4. commande SQL truncate table xxx
    Par Yogy dans le forum SQL
    Réponses: 1
    Dernier message: 07/10/2004, 14h57
  5. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59

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