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

VB 6 et antérieur Discussion :

Problême requête ACCESS dans VB6


Sujet :

VB 6 et antérieur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut Problême requête ACCESS dans VB6
    Bonjour à tous,

    J'ai un soucis qui parait tout simple mais dont je ne trouve pas la solution...

    J'ai 2 tables ACCESS:
    -CLIENT:
    CLI_ID
    CLI_NOM
    CLI_FAC_ID

    -FAC:
    FAC_ID
    FAC_LIB
    FAC_TARIF

    Mes 2 tables sont liés par: CLI_FAC_ID = FAC_ID dans une relation 1-1

    J'ai fait une requête dans Access toujours qui me remonte ces infos:
    CLI_ID, CLI_NOM, CLI_FAC_ID, FAC_LIB, FAC_TARIF

    Jusque la pas de problême, si je modifie dans ma requête en mode feuille de données la valeur de CLI_FAC_ID, les champs FAC_LIB et FAC_TARIF se modifient automatiquement...

    Maintenant, si je copie la même requête SQL dans une 'command' DataEnvironment de VB et que j'execute en mode conception, si je modifie la valeur de CLI_FAC_ID, rien ne se passe...Les champs FAC_LIB et FAC_TARIF ne suivent pas...

    La j'avoue que je comprends rien du tout...

    Existe 'il un moyen simple pour résoudre ce problême ???

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Peux-tu mettre la requête.

    Starec

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Voici ma requête SQL:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CLIENT.CLI_ID, CLIENT.CLI_NOM, CLIENT.CLI_FAC_ID,
    FAC.FAC_LIB, FAC.FAC_TARIF
    FROM FAC INNER JOIN CLIENT ON FAC.FAC_ID = CLIENT.CLI_FAC_ID

    Je précise que c'est ACCESS 2000, VB6 SP6
    J'ai essayé un peu toutes les formules: Client, serveur...

    Mais pas moyen d'obtenir la même chose en VB...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Salut

    Au niveau du dataenvironment comment sont organisées tes tables ?
    Tu utilise 2 commandes ou une commande + 1 commande Fille ?

    A+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Heu a vrai dire, un seul command...
    Je crée ma(mon) command puis je passe en mode SQL et je copie ma requête venant d'Access...
    Ensuite en mode Conception je fais Execution et la je modifie à la main la valeur de CLI_FAC_ID et rien ne se passe contrairement à ACCESS...

    Je comprends pas qu'un truc aussi simple soit une vrai usine à mettre en place dans VB...

    Malgré le 'Inner join', Jet semble ne pas tenir compte du tout de la 2ème table...

    J'ai aussi tenté de faire pointer le command sur la requête Access et d'utiliser des textboxs pour voir le résultat mais toujours rien. Sauf si je ferme et réouvre le form...
    Je précise aussi qu'un de.macommand.requery ne donne rien (sauf au premier coup) puisque (bug microsoft oblige), aprés le premier requery la table se vérrouille...

    Personne n'a jamais mis en place ce genre de chose sous vb ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Re

    Perso je crais 2 commandes, une principale puis une fille et je travail sur mes recordset.
    Je suis désolé de ne pas pouvoir te donner d'exemple mais mon PC a crashé (Carte Mère).
    Je vais essayer de retrouver quelque chose mais je ne te promet rien pour l'instant.

    A+

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Heu pour info
    Dans ta requette tu à déjas saisie des valeurs de sélection ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Aie...désolé pour ton PC...

    Sinon merci pour ton aide.

    Qu'appeles tu valeur de selection ?

    Je viens de tester avec une liaison mére fille...J'ai posé 2 textbox, l'une reliée à CLIENT.CLI_FAC_ID, l'autre à FAC.FAC_LIB.
    Normalement, en modifiant la valeur de CLIENT.CLI_FAC_ID, je m'attends à ce que FAC.FAC_LIB se mette à jour puisque les 2 tables sont liées...Et bien non...rien ne se passe.
    Je précise que FAC ne veut pas dire facture mais Formulaire AC. C'est un formulaire remit au client en fonction du profil du client et qui est composé d'un code (FAC_ID) d'un libelle (FAC_LIB) et d'un tarif (FAC_TARIF) . D'ou la relation 1-1 puisque chaque client ne recoit qu'un formulaire.
    L'avantage c'est qu'en modifiant le Tarif pour le formulaire XY, tous les clients qui ont ce type de formulaire se verront modifier leur tarif...
    J'avais trouvé nikel dans Access de pouvoir modifier la valeur du CLI_FAC_ID et d'avoir automatiquement dans ma requête le libellé et le tarif correspondant.
    Hors en VB, ca ne suit pas...

    Il me semblait que les recordsets hiérarchique étaient adaptés aux liaisons 1-n mais est-ce que dans mon cas ca pourrait marcher ???

    Je suis donc toujours en panne pour un truc vraiment simple...Personne n'a fait ce genre de modèle ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Re

    as tu essayé plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM FAC INNER JOIN CLIENT ON FAC.FAC_ID = CLIENT.CLI_FAC_ID
    Désolé pour ma question un peut bête, j'ais mal lu ton premier message.

    A+

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Heu ????

    Si je fais ca je vais obtenir que les champs de FAC et pas ceux de CLIENT.

    Moi je voudrais dans mon form afficher:
    CLI_ID, CLI_NOM, CLI_FAC_ID, FAC_LIB, FAC_TARIF...

    Et que quand je saisie dans ma textbox CLI_FAC_ID une nouvelle valeur, que FAC_LIB et FAC_TARIF se mettent à jour sans devoir codé une usine à gaz derrière...

    Ca me parait d'une simplicité extrème et pourtant...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Non tu auras tous les champs
    Je vient de faire un essai sur un autre PC et sa marche

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Oups pardon, tu as raison ca marche...

    Le hic c'est qu'en execution, toujours pas de mise à jour des champs...

    Ca marche que si je ré-execute la requête...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Je pense que le problème vient de ton code des textbox et non de ta requete.
    Tu peut me le montrer STP.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Non je suis sûr que celà ne vient pas de mon code (d'ailleurs j'ai pour le moment codé que des tests) mais bien du fonctionnement des requêtes dans VB.

    Fait un simple essai, dans Access tu lances cette requête (la tienne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM FAC INNER JOIN CLIENT ON FAC.FAC_ID = CLIENT.CLI_FAC_ID
    Tu fais un essai en modifiant la valeur de CLI_FAC_ID, tu verras que les champs FAC_LIB et FAC_TARIF se mettent automatiquement à jour.

    Ensuite tu vas dans le DataEnvironment de VB, tu ajoutes une Command, tu poses le même code SQL et tu executes...
    Tu verras que si tu modifies dans le tableau la valeur de CLI_FAC_ID, rien ne se passe...
    Si tu ré-executes la requête aprés, la ca marche...

    J'ai pensé donc que par le code, je n'aurais qu'a mettre un DE.Macommand.requery pour qu'aprés la validation de CLI_FAC_ID, tout se mette à jour...Hélas ca marche une fois ensuite le recordset est verrouillé (bug microsoft) et il faut fermer le form pour recommencer...
    (A ce propos, sur le site de microsoft, ils donnent une solution qui ne marche absolument pas -> fermer puis rouvrir le recordset...)

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Je pense que la requete marche car j'en est fait une similaire et tout est OK.
    Je vais plancher sur ton problème se soir et je te tien au courant demain car la je doit partir en réunion.

    A+

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Ok je te remercie...

    Je vais continuer à chercher de mon côté en attendant...

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Salut

    Comme promis j’est testé la requette est tous t’est OK.
    Je crois que tu t’est mélangé les pinceaux dans les requettes, je m’explique :
    Les requettes du dataenvironment servent à sélectionner des bases de données et leurs champs
    Dans ton code tu doit ensuite définir tes requettes de sélection.

    Pour ton problème voici un exemple qui est loin d’etre tiptop mais si ca dépanne :

    1/- création du dataenvironment avec la requette suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM CLIENT INNER JOIN FAC ON CLIENT.CLI_FAC_ID =  FAC.FAC_ID
    2/- Création d’une form avec 3 textbox et 2 bouton de commande
    dans la form saisir le code suivant :
    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
    Private Sub Execute_Click()
    'Vérification de l'état du recordset : si ouvert je le ferme
    If DEnv1.rsCmd1.State <> 0 Then
        DEnv1.rsCmd1.Close
    End If
     
    'Test de la saisie du text1 : si vide Message sinon execution du recordset
    If Text1.Text = vbNullString Then
        MsgBox ("vous devez saisir un Cli_Fac_Id")
    Else
        'Text1 est non null : je place le recordset sur l'enregistrement choisi
        With DEnv1.rsCmd1
            .CursorType = adOpenDynamic
            .LockType = adLockOptimistic
            'Définition de la requette de selection qui pourrait être largement simplifié
            .Open "SELECT * FROM CLIENT INNER JOIN FAC ON CLIENT.CLI_FAC_ID =  FAC.FAC_ID WHERE CLIENT.CLI_FAC_ID = '" & Text1.Text & "'"
        End With
     
        'J'affecte les valeurs de mes champs aux textbox
        Text2.Text = DEnv1.rsCmd1!FAC_LIB
        Text3.Text = DEnv1.rsCmd1!FAC_TARIF
    End If
    End Sub
     
    Private Sub Quit_Click()
    End
    End Sub
    Le tour est joué
    NB que j’utilise un bouton de commande pour lancer la requette pour eviter de gérer un text1_change qui complique les choses mais tu est libre de faire ou d’utiliser ce que tu veux (Datacombo, Datalist, …. Etc)

    Si tu as des questions tu dis.
    En espérant t’avoir aidé

    A+

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Bonjour BM42 et merci de m'avoir accordé du temps.

    Effectivement ton système fonctionne mais il ne correspond pas à ce que j'attendais.

    Mon but était d'avoir une datagrid avec la liste des clients + les infos concernant les facs d'ou la requête:
    SELECT * FROM CLIENT INNER JOIN FAC ON CLIENT.CLI_FAC_ID = FAC.FAC_ID

    Ensuite au dessous je voulais avoir (par exemple) une textbox pointant sur CLI_FAC_ID de la ligne selectionné de la datagrid. Je précise la datagrid est verrouillée...

    Ensuite en saisissant une nouvelle valeur dans la textbox, je voulais actualiser les données de ma requête pour que le datagrid affiche les bonnes valeurs...

    Le soucis c'est qu'en faisant DE.MaCommand.requery, tout plante (merci microsoft...). Il semble quasiment impossible d'actualiser un recordset provenant d'un DataEnvironment...

    Avec ta méthode je ne fais qu'afficher les valeurs de FAC en fonction de ma saisie, je n'actualise pas le recordset...

    Merci quand même, et si tu as d'autres idées je suis preneur...

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 301
    Points : 337
    Points
    337
    Par défaut
    Re

    datagrid verouillé ?
    Sinon pour le Datagrid je peut te faire un exemple car je l'utilise régulièrement
    Attention j'ais l'impression que tu te mélange entre le dataenvironment et les requette de tes recordsets, c'est 2 choses bien différentes.
    Peut tu préciser "actualiser le recordset"
    A+

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Et bien un truc tout bête que je viens d'essayer:

    Supposons une datagrid (dtg) et une textbox (txt) comme je t'ai decris dans le post précédent.

    J'ai aussi un DataEnvironment (DE) et une command (cmd) basée sur le SQL:
    SELECT * FROM CLIENT INNER JOIN FAC ON CLIENT.CLI_FAC_ID = FAC.FAC_ID

    En mode conception du form, j'assigne:
    dtg.datasource = DE
    dtg.datamember = cmd
    txt.datasource = DE
    txt.datamember = cmd
    txt.datafield = CLI_FAC_ID

    Je lance l'appli, si je modifie la valeur de ma txt, il ne se passe rien...Je dois donc reactualiser le recordset de ma command.
    Dans l'évenement Validate de mon txt, j'ajoute
    Et la ca plante royal avec un message d'erreur obscur comme seul M$ sait les inventer...

    Je décide de me passer de "l'avantage" du DE.

    Dans l'évenement Load de mon form, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dim rst as new adodb.recordset
    rst.open DE.cmd.source, DE.cnx, adOpenDynamic, adLockOptimistic
    set dtg.datasource = rst
    set txt.datasource = rst
    Et dans l'évenement Validate du txt
    Et la ca marche sans problème...

    La définition de mon recordset etant la même que celle du DE, c'est a n'y rien comprendre...

    Je pars donc sur l'idée d'utiliser le DE (plus pratique et evitant des lignes de codes) et uniquement les définitions des commands...

    Dans l'espoir peut être que toi ou quelqu'un d'autre ai une idée concernant la réactualisation d'une command du DE...

    Je précise aussi que le plantage n'est pas permanent avec le requery de la command. Généralement ca marche la première fois, ensuite la command se verrouille et ciao...
    Autre précision, la "solution" M$ qui consiste a faire DE.cmd.close puis DE.cmd.open ne marche pas...

    Merci quand même BM et puis n'hésites pas si tu penses que je me trompe...

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/08/2018, 19h52
  2. [AC-2007] Problème requête count dans VBA ACCESS
    Par carophil dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/06/2010, 16h11
  3. Problême requête SQL dans access..Erreur 3079
    Par DavidGG dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/01/2008, 17h48
  4. problème requête between dans access
    Par Vodkha dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/09/2005, 07h50

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