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 :

ADODB, requête, paramètres et opérateur IN


Sujet :

VBA Access

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 024
    Points
    2 024
    Par défaut ADODB, requête, paramètres et opérateur IN
    Bonjour,

    Je souhaite exécuter une requête UPDATE paramétré, ADO ne me signale aucune erreur mais le requête ne met à jour aucune lignes.
    Ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE  Ressource INNER JOIN Consomme
                ON Ressource.ID = Consomme.IDRessource
    SET Consomme.dDateValidation = Date(),
        Consomme.IDRessourceValidateur = @IDValidateur
    WHERE   Consomme.dDateConsomme IN (@DatesConsomme)
    AND     Ressource.vMatricule = @UID;
    Code VBA:
    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
    Dim Sql As String    '// texte de la requête, je passe sur l'initialisation
     
    Dim Cn As ADODB.Connection     '// Je passe egalement sur l'initalisation de la connection
     
    Dim Cmd As ADODB.Command
    Set Cmd = New ADODB.Command
    Set Cmd.ActiveConnection = Cn
    Cmd.CommandType = adCmdText
    Cmd.CommandText = Sql
     
    Cmd.Parameters("@IDValidateur").Value = 21
    Cmd.Parameters("@UID").Value = "AXBFCND"
    Cmd.Parameters("@DatesConsomme").Value = "#08/01/2024#, #08/02/2024#, #08/03/2024#"
     
    Dim RecordsAffected As Long
    Cmd.Execute RecordsAffected
    après execution, RecordsAffected reste à 0, ce qui confirme qu'aucune ligne n'a été mise à jour.
    Alors que si j'execute la requête dans le requêteur d'Acces en substituant les paramètres par leurs valeurs, des lignes sont mises à jour.

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 425
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Je m'interroge sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cmd.Parameters("@DatesConsomme").Value = "#08/01/2024#, #08/02/2024#, #08/03/2024#"
    tu devrais avoir comme résultat dans la clause Where du SQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    WHERE  Consomme.dDateConsomme IN ("#08/01/2024#, #08/02/2024#, #08/03/2024#")
    ...

    Alors que tu souhaiterais avoir il me semble :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    WHERE  Consomme.dDateConsomme IN (#08/01/2024#, #08/02/2024#, #08/03/2024#)
    ...

    Donc il ne renvoie rien..

    Mais dans ce cas comment passer cette liste de dates ?

    Normalement on utiliserait une chaîne SQL à la place pour insérer la valeur du paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LeSQL= "..." & _
    "WHERE  Consomme.dDateConsomme IN (" & @DatesConsomme & ")"
    Cdlt
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Membre émérite Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 504
    Points : 2 301
    Points
    2 301
    Par défaut
    Bonjour,
    Dans la mesure où il n'y a que dans Access ou on encadre les dates par de # et que dans Access on définit les paramètres dans Un requête par des ? et pas part des @champ difficile de répondre.

    Tu fais due connexion SQL serveur, Oracle, MySQL ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 024
    Points
    2 024
    Par défaut
    @user:
    Ta première remarque est surprenante, les guillemet délimitant les chaînes de caractères ne font pas partie de la valeur de ces dernières.

    Concernant ta seconde, lorsque je construit la requête par concaténation, les données sont bien mises à jour.
    Cependant, je préfèrerais éviter, l'utilisation de paramètre fait gagner en lisibilité et versatilité, et je charge toutes les requêtes dans une collection, ainsi elles restent constantes (plus facile à debugger).
    Faute de mieux, je peux faire des substitutions et mémoriser le résultat dans une nouvelle variable(bof..., traitement particulier et redondance).

    @Thumb down:
    Les paramètres nommés fonctionnent aussi avec MsAccess, mais la connection n'est pas le sujet. J'aurais les même soucis en me connectant à une base de données quelconque.

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 425
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    @user:
    Ta première remarque est surprenante, les guillemet délimitant les chaînes de caractères ne font pas partie de la valeur de ces dernières.
    La valeur de ton paramètre est de type texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cmd.Parameters("@DatesConsomme").Value = "#08/01/2024#, #08/02/2024#, #08/03/2024#"
    donc :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  Consomme.dDateConsomme IN (@DatesConsomme)

    va donner :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  Consomme.dDateConsomme IN ("#08/01/2024#, #08/02/2024#, #08/03/2024#")

    Si tu avais plusieurs paramètres de type date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cmd.Parameters("@DatesConsomme1").Value = #08/01/2024# 
    Cmd.Parameters("@DatesConsomme2").Value = #08/02/2024#
    Cmd.Parameters("@DatesConsomme3").Value = #08/03/2024#
    Alors :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  Consomme.dDateConsomme IN (@DatesConsomme1, @DatesConsomme2, @DatesConsomme3)

    te donnerais bien :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  Consomme.dDateConsomme IN (#08/01/2024#, #08/02/2024#, #08/03/2024#)

    Pour la deuxième option j'insère une sous-chaîne dans la chaîne sql principale sans encadrer la sous-chaîne de guillemets supplémaires, donc je compose simplement le code SQL un peu comme avec l'éditeur SQL.

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 024
    Points
    2 024
    Par défaut
    Ok, les types de données, ça a du sens.

    Par contre, comment affecter une liste à un paramètre (si c'est possible), le mystère est toujours aussi épais.

  7. #7
    Membre émérite Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 504
    Points : 2 301
    Points
    2 301
    Par défaut
    Les paramètres nommés fonctionnent aussi avec MsAccess, mais la connection n'est pas le sujet. J'aurais les même soucis en me connectant à une base de données quelconque.
    Bonjour,
    Tu as raison mais STRING_SPLIT n'est pas une instruction SQL Access!

    Et si tu utilises access pas besoin d'ado !

    En revanche tu peux créer cette fonction sous accès VBA mais là pas d'ado.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 024
    Points
    2 024
    Par défaut
    STRING_SPLIT ? Ou veux-tu en venir ? Je n'utilise rien de tel.

    Quand à la connection, j'aurais du préciser que l'application se connectant à la base de données n'est pas MsAcces.

  9. #9
    Membre émérite Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 504
    Points : 2 301
    Points
    2 301
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE   format(Consomme.dDateConsomme ,'yyyy-mm-dd') IN (STRING_SPLIT(@DatesConsomme,','))
    Code PostgreSQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE TO_CHAR(dDateConsomme, 'YYYY-MM-DD') IN ( string_to_array(@DatesConsomme, ','))

    après j'arête vu que la base cible est confidentielle!

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 024
    Points
    2 024
    Par défaut
    De mémoire, ce que tu proposes ne fonctionne que si le projet VBA de la base de données est chargé (je peux me tromper), je craint de ne pas avoir ce luxe avec une back-end.

    Finalement, je me suis résolu à faire des substitution avec le code SQL source, dommage ...
    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
    Dim Sql As String
    Sql = ......
    Sql = Replace(Sql, "@DatesConsomme", "#08/01/2024#, #08/02/2024#, #08/03/2024#")
     
    Dim Cn As ADODB.Connection
    Set Cn = ....
     
    Dim Cmd As ADODB.Command
    Set Cmd = New ADODB.Command
    Set Cmd.ActiveConnection = Cn
    Cmd.CommandType = adCmdText
    Cmd.CommandText = Sql
     
    Cmd.Parameters("@IDValidateur").Value = 21
    Cmd.Parameters("@UID").Value = "AXBFCND"
    Cmd.Execute

Discussions similaires

  1. Requte
    Par abdallahi dans le forum Access
    Réponses: 6
    Dernier message: 04/01/2005, 16h06
  2. erreur bigint requete Employee.fdb via AdoDb
    Par jflebegue dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 04/01/2005, 12h03
  3. [ADODB]probleme de comprehension
    Par flogreg dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 17h15
  4. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 14h51
  5. [VB6]ADODB Command, recuperer l'info d'un RollBack
    Par Mouse dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/05/2003, 17h26

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