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 :

UPDATE SQL prenant ses paramètres dans un formulaire


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable informatique dans une PME
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable informatique dans une PME
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut UPDATE SQL prenant ses paramètres dans un formulaire
    Bonjour,

    Cela fait 4 ans que je consulte les forums et tuttos de ce site mais ceci est ma première discussion.

    Merci à toutes et à tous pour vos participations qui m'ont déjà beaucoup aidé.

    Pour planter le décor, je travaille ici sur deux tables [DOCENTETE] et [DOCLIGNE] qui peuvent contenir la liste de nos achats approvisionnement (1 entête de commande et x lignes d'articles soit une liaison 1-n) comme nos affaires clients (initialement utilisée de la même façon mais qui a évolué vers une relation 1-1, chaque article à réparer/traiter étant traité comme une affaire à part entière. [DOCENTETE] contient plutôt des informations administratives et [DOCLIGNES] plutôt orientées sur l'objet de l'affaire en cours pour son traitement en atelier.

    Pour ces "affaires", toutes identifiées avec un numéro d'entrée, il y a l'affaire principale par exemple 20.01.003 attaché au secteur "réparation"et des sous-affaires en découlant correspondant aux différents points à traiter réparties en différents secteurs annexes comme "mécanique", "bureau d'étude", "Stock pièces détachées"... et identifiées 20.01.003-A (jusqu'à Z)

    Chacune de ces sous-affaires reprend une partie des informations de la principale affaire comme le nom du client, le numéro et le délai de commande, la présence d'un litige. Ces informations sont copiées à leur création mais elles peuvent n'être mis à mises à jour que dans un deuxième temps et c'est ici qu'intervient mon problème.

    Mon problème actuel est l'emploi d'une requête SQl Update qui doit prendre en paramètre les valeurs d'un formulaire affichant l'affaire principale que l'on viendrait de mettre à jour pour les copier sur les sous-affaires liées.

    J'ai essayé de m'inspirer du contenu des forums ainsi que du code SQL fourni par Access quand je prépare une requête sélection puis une requête mise-à-jour la plus proche de ce que je voudrais faire et où la mise à jour est une variable à passer en paramètre.

    Évidemment cela ne marche pas et semble me pointer une erreur de syntaxe à la fin de la requête SQL que je vois pas non-plus.

    Voici maintenant le code que j'ai essayé en espérant que je vous aie donné assez d'info (pardon de pas avoir mis les renvois à ligne mais vu mon problème...) :
    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
     
     
    Private Sub Commande338_Click()
    On Error GoTo Err_Commande338_Click
     
        Dim var_n_commande As String
        Dim var_delai As String
        Dim var_stock_zero As Boolean
        Dim var_urgence As Boolean
        Dim var_litige_sg As Boolean
        Dim var_moins_deux_ans As Boolean
        Dim var_delai_repar As Date
        Dim update_s_affaire As ADODB.Connection
        Dim strSQL As String
        Dim MonNumero As String
     
        'initialisation des variables liées à notre affaire (les 7 premières variables)
        MonNumero = Me.n_entree
        var_n_commande = Me.n_commande
        var_delai = Me.delai
        var_stock_zero = Me.[STOCK 0]
        var_urgence = Me.URGENCE
        var_litige_sg = Me.litige_sg
        var_moins_deux_ans = Me.retour_moins_2_ans
        var_delai_repar = Me.[DOCLIGNE].[Delai_reparation]
     
        'mise à jour de toutes les sous-affaires correspondantes - requête SQL
        Set update_s_affaire = CurrentProject.Connection
        strSQL = "UPDATE DOCENTETE INNER JOIN DOCLIGNE ON DOCENTETE.id_affaire = DOCLIGNE.id_affaire SET DOCENTETE.n_commande = [var_n_commande], DOCLIGNE.delai = [var_delai], DOCLIGNE.[STOCK 0] = [var_stock_zero], DOCLIGNE.URGENCE = [var_urgence], DOCLIGNE.litige_sg = [var_litige_sg], DOCLIGNE.[retour moins 2 ans] = [var_moins_deux_ans], [DOCLIGNE].[Delai_reparation] = [var_delai_repar] WHERE (((DOCENTETE.n_entree) Like [MonNumero] & "*") AND ((Right([DOCENTETE].[n_entree],1)) Like "*[A-Z]"));"
        update_s_affaire.Execute strSQL
     
     
    Exit_Commande338_Click:
        Exit Sub
     
    Err_Commande338_Click:
        MsgBox Err.description
        Resume Exit_Commande338_Click
    End Sub
    Merci d'avance pour votre aide !

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Bonjour.

    Quand tu mets des guillemets (") dans une chaîne de caractère il faut les doubler sinon ils sont vus comme des débuts ou fins de texte.

    Ça doit être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strSQL = "UPDATE DOCENTETE INNER JOIN DOCLIGNE ON DOCENTETE.id_affaire = DOCLIGNE.id_affaire"
    strSQl = strSQL & " SET DOCENTETE.n_commande = [var_n_commande], DOCLIGNE.delai = [var_delai], DOCLIGNE.[STOCK 0] = [var_stock_zero], DOCLIGNE.URGENCE = [var_urgence], DOCLIGNE.litige_sg = [var_litige_sg], DOCLIGNE.[retour moins 2 ans] = [var_moins_deux_ans], [DOCLIGNE].[Delai_reparation] = [var_delai_repar]"
    strSQl = strSQL & " WHERE DOCENTETE.n_entree Like [MonNumero] & ""*"" AND Right([DOCENTETE].[n_entree],1) Like ""*[A-Z]"";"
    J'ai découpé en plusieurs lignes pour rendre la chose plus digeste.
    Tu noteras les "" autours des critères Like.
    J'ai aussi supprimé les parenthèses inutiles dans la clause Where.
    Access les ajoute car c'est un automate qui génère le SQL et qu'il est plus simple à programmer comme cela mais on n'en pas réellement besoin.

    A+

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable informatique dans une PME
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable informatique dans une PME
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    @marot_r

    Merci pour la rapidité de ta réponse, je la mets en pratique dès que possible afin de valider et clôturer le fil de discussion.

    @ plus

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

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 860
    Points : 14 978
    Points
    14 978
    Par défaut
    bonjour JLBsudiste et marot_r,
    Citation Envoyé par marot_r
    Quand tu mets des guillemets (") dans une chaîne de caractère il faut les doubler sinon ils sont vus comme des débuts ou fins de texte.
    à condition de mettre les variables en dehors de ces guillemets et d'en mettre également pour les variables date:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strSQL = "UPDATE DOCENTETE INNER JOIN DOCLIGNE ON DOCENTETE.id_affaire = DOCLIGNE.id_affaire"
    strSQL = strSQL & " SET DOCENTETE.n_commande = " & [var_n_commande] & ", DOCLIGNE.delai = """ & [var_delai] & """, DOCLIGNE.[STOCK 0] =" & [var_stock_zero] & ", DOCLIGNE.URGENCE =" & [var_urgence] & ", DOCLIGNE.litige_sg =" & [var_litige_sg] & ", DOCLIGNE.[retour moins 2 ans] = " & [var_moins_deux_ans] & ", [DOCLIGNE].[Delai_reparation] =""" & [var_delai_repar] & """"
    strSQL = strSQL & " WHERE DOCENTETE.n_entree Like """ & [MonNumero] & "*"" AND Right([DOCENTETE].[n_entree],1) Like ""*[A-Z]"";"

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    à condition de mettre les variables en dehors de ces guillemets et d'en mettre également pour les variables date:
    Tout à fait tee_grandbois.

    Merci de la correction.

    J'haie cela le SQL dans le code :-(.

    A+

  6. #6
    Candidat au Club
    Homme Profil pro
    Responsable informatique dans une PME
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable informatique dans une PME
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci pour vos contributions.

    Je viens d'essayer le code corrigé de tee_grandbois avec juste une modification : la variable [var_delai] étant en réalité du type string et non date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Set update_s_affaire = CurrentProject.Connection
    	strSQL = "UPDATE DOCENTETE INNER JOIN DOCLIGNE ON DOCENTETE.id_affaire = DOCLIGNE.id_affaire"
    	strSQL = strSQL & " SET DOCENTETE.n_commande = " & [var_n_commande] & ", DOCLIGNE.delai = " & [var_delai] & ", DOCLIGNE.[STOCK 0] =" & [var_stock_zero] & ", DOCLIGNE.URGENCE =" & [var_urgence] & ", DOCLIGNE.litige_sg =" & [var_litige_sg] & ", DOCLIGNE.[retour moins 2 ans] = " & [var_moins_deux_ans] & ", [DOCLIGNE].[Delai_reparation] =""" & [var_delai_repar] & """"
    	strSQL = strSQL & " WHERE DOCENTETE.n_entree Like """ & [MonNumero] & "*"" AND Right([DOCENTETE].[n_entree],1) Like ""*[A-Z]"";"
        update_s_affaire.Execute strSQL
    J'ai un nouveau message d'erreur ce qui constitue une indéniable progression
    Nom : bug_rqt_sql.JPG
Affichages : 126
Taille : 12,6 Ko
    Je continue à chercher.

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

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 860
    Points : 14 978
    Points
    14 978
    Par défaut
    bonjour,
    Je viens d'essayer le code corrigé de tee_grandbois avec juste une modification : la variable [var_delai] étant en réalité du type string et non date :
    alors il manque des guillemets si c'est du String:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    & ", DOCLIGNE.delai = """ & [var_delai] & """, DOCLIGNE.[STOCK 0] =" &
    Ajouter l'instruction Debug.? strSQL juste avant l'exécution update_s_affaire.Execute strSQL, cela permet de visualiser le contenu de la requête et contrôler lorsqu'il y a un message d'erreur, cela s'affiche dans la fenêtre d'exécution de VBA

  8. #8
    Candidat au Club
    Homme Profil pro
    Responsable informatique dans une PME
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable informatique dans une PME
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Remerciements
    À tous ceux qui m'ont répondu dans ce fil de discussion, merci et pardon de ne pas avoir encore apporté de retour :

    Suite au déconfinement, il m'a fallu m'occuper d'autres affaires et je n'ai encore trouvé le temps de travailler à nouveau sur mes développements ACCESS mais je n'oublie pas !

  9. #9
    Candidat au Club
    Homme Profil pro
    Responsable informatique dans une PME
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable informatique dans une PME
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Suite...
    À ce jour, j'ai contourné le problème en employant une requête paramétrée de mise à jour qui prend ses paramètres via une invite.

    Ce n'est pas encore parfait puisque qu'il faut saisir successivement les différentes valeurs qui seront écrites dans les enregistrements à mettre à jour ainsi que le numéro de l'affaire principale (d'où découlent les autres, leur numéro ayant une lettre complémentaire comme index) qui constitue le critère.

    Je ne trouve pas comment appeler cette requête Access classique (pas VBA) depuis le formulaire de l'affaire principale et lui passer ces 3 fameux paramètres ainsi que le critère de sélection qui sont tous disponibles dans le formulaire alors ouvert et actif...

    Je n'ai pas non-plus trouvé le temps de me repencher sur mon problème de syntaxe SQL.

    Suivre une formation sur le VBA et le SQL sera la bienvenu !

    Merci encore pour vos contributions. Je laisse encore la discussion ouverte au cas où...

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Bonjour.

    Right([DOCENTETE].[n_entree],1) Like ""*[A-Z]"";"
    Ne sert pas à grand chose car tu dis que tous les caractères sont acceptables.

    Je pense que c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Right([DOCENTETE].[n_entree],1) Like ""[A-Z]"";"
    Pour n'accepter que des lettres.

    Bon perso j'aurais plutôt écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Right([DOCENTETE].[n_entree],1) between ""A"" and ""Z"";"
    Qui est je trouve plus direct.

    A+

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

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 860
    Points : 14 978
    Points
    14 978
    Par défaut
    bonsoir,
    Je ne trouve pas comment appeler cette requête Access classique (pas VBA) depuis le formulaire de l'affaire principale et lui passer ces 3 fameux paramètres ainsi que le critère de sélection qui sont tous disponibles dans le formulaire alors ouvert et actif...
    en relisant ton dernier code je m'aperçois que je n'avais pas remarqué les crochets autour des variables, qu'il faut enlever, bien sûr.
    Ci-joint le code corrigé incluant la modification de marot_r et en tenant compte du type de chaque variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	strSQL = "UPDATE DOCENTETE INNER JOIN DOCLIGNE ON DOCENTETE.id_affaire = DOCLIGNE.id_affaire"
    	strSQL = strSQL & " SET DOCENTETE.n_commande = """ & var_n_commande & """, DOCLIGNE.delai = """ & var_delai & """, DOCLIGNE.[STOCK 0] =" & var_stock_zero & ", DOCLIGNE.URGENCE =" & var_urgence & ", DOCLIGNE.litige_sg =" & var_litige_sg & ", DOCLIGNE.[retour moins 2 ans] = " & var_moins_deux_ans & ", [DOCLIGNE].[Delai_reparation] =#" & CDate(Format(var_delai_repar, "mm/dd/yyyy")) & "#"
    	strSQL = strSQL & " WHERE DOCENTETE.n_entree Like """ & MonNumero & "*"" AND  Right([DOCENTETE].[n_entree],1) between ""A"" and ""Z"";"

  12. #12
    Candidat au Club
    Homme Profil pro
    Responsable informatique dans une PME
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable informatique dans une PME
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.



    Ne sert pas à grand chose car tu dis que tous les caractères sont acceptables.

    Je pense que c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Right([DOCENTETE].[n_entree],1) Like ""[A-Z]"";"
    Pour n'accepter que des lettres.
    Concrètement une affaire principale portera un numéro du style 2012001 et ses sous-affaires : 2012001A, 2012001B, 2012001C... etc...
    Dans mon idée, je viens d'ouvrir un formulaire m'affichant les données de l'enregistrement 2012001 et je pensais ensuite, en cliquant sur un bouton mettre à jour les mêmes champs dans les sous-affaires qui en découle comme le délai de réalisation.
    Je souhaite donc sélectionner tous les enregistrements contenant "2012001" dans leur champs n_entree mais en excluant ceux de l'affaire dans laquelle je suis.
    À la réflexion, ce n'est peut-être pas si grave de re-écrire dans les champs en question de l'affaire principale puisque ce seront les mêmes valeurs...

Discussions similaires

  1. supprimer "entrer une valeur de paramètre" dans un formulaire
    Par Noline dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 24/08/2010, 18h19
  2. [OpenOffice][Base de données] Afficher des paramètres d'une requête paramétrée dans un formulaire
    Par ggnore dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 02/09/2009, 12h37
  3. Erreur de paramètre dans mon formulaire
    Par cdevl32 dans le forum Langage
    Réponses: 10
    Dernier message: 25/08/2009, 11h13
  4. Réponses: 18
    Dernier message: 23/05/2008, 18h03
  5. paramètre dans deux formulaires
    Par kesaro dans le forum VBA Access
    Réponses: 7
    Dernier message: 19/12/2007, 14h01

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