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

Access Discussion :

champ qui peut avoir plusieurs tables comme source de données [AC-2019]


Sujet :

Access

  1. #1
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut champ qui peut avoir plusieurs tables comme source de données
    Bonjour,


    alors voilà: je n'en suis qu'au stade la modélisation et je veux créer une BDD pour gérer des interventions techniques sur des logements (sites) des véhicules (et autres par la suite). J'ai une table vehicule (vehicule_id, vehicule_marque, vehicule modele...), une table site (site_id, site_adresse,site_type...).

    Je ne sais pas si c'est possible: je veux une troisième table intervention (inter_id, inter_nature, inter_objet...). Le champ inter_objet serait lié soit à site_id soit à vehicule_id en fonction de la valeur du champ inter_nature ("véhicule" ou "site").

    Sinon, j'ai pensé à 2 autres voies:
    une table pour les interventions site et une autre pour les interventions véhicules: j'aurai une table par nature (au final j'en serai à 5 (vehicule, sites, électroménager, mobilier, informatique); peut-être plus compliqué à gérer par la suite (notamment dans les états)
    une table unique mais avec des champs différents du genre intervention (inter_id, inter_nature, site_id, vehicule_id, mobilier_id...): j'aurai au final une seule table mais avec des champs vides

    Que me conseilleriez vous?

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    Le lien entre champs de tables n'est pas obligatoire, c'est juste un confort de programmation qui facilite les jointures et délègue en partie à la base le controle de cohérence des données.

    Il est donc tout à fait possible d'avoir une table des interventions qui intervient sur plusieurs natures d'objets, par contre la requete pour faire la liste des interventions tous objets confondus va ressembler à un truc comme ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select inter_id, inter_nature, inter_objet, iif(i.inter_nature='vehicule', v.designation, s.designation) from (interventions i left join vehicules v on (v.vehicule_id=i.inter_objet and i.inter_nature='vehicule')) 
                                                                                                                                                                              left join sites s on (s.site_id=i.inter_objet and i.inter_nature='site')

    ou alors autant d'unions que de natures
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select inter_id, inter_nature, inter_objet, v.designation from (interventions i inner join vehicules v on v.vehicule_id=i.inter_objet where i.inter_nature='vehicule'
    union all
    select inter_id, inter_nature, inter_objet, s.designation from (interventions i inner join sites s on s.site_id=i.inter_objet where i.inter_nature='site'

    Et dans les 2 cas ce sont probablement des requetes non modifiables donc elles ne pourront pas alimenter des fenêtres de saisie
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut
    Bonjour, et merci pour la réponse

    J'ai du mal m'exprimer: en fait je veux que le champ inter_objet soit une liste déroulante dont les valeurs sont issues soit de la table véhicule soit de la table site en fonction de la valuer du champ inter_nature

    Citation Envoyé par nico84 Voir le message
    Bonjour,


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select inter_id, inter_nature, inter_objet, iif(i.inter_nature='vehicule', v.designation, s.designation) from (interventions i left join vehicules v on (v.vehicule_id=i.inter_objet and i.inter_nature='vehicule')) 
                                                                                                                                                                              left join sites s on (s.site_id=i.inter_objet and i.inter_nature='site')


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select inter_id, inter_nature, inter_objet, v.designation from (interventions i inner join vehicules v on v.vehicule_id=i.inter_objet where i.inter_nature='vehicule'
    union all
    select inter_id, inter_nature, inter_objet, s.designation from (interventions i inner join sites s on s.site_id=i.inter_objet where i.inter_nature='site'

    Et dans les 2 cas ce sont probablement des requetes non modifiables donc elles ne pourront pas alimenter des fenêtres de saisie
    Ce que vous me proposez pourra fonctionner si je ma table intervention se décompose comme ce ci intervention(inter_id, inter_nature, inter_objetsite, inter_objetvehicule...) où les inter objet_vehicule et inter_objetsite seraient liés chacuns à leur table respective. A moins que je ne saisisse pas votre proposition...

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par gui_li_aume Voir le message
    J'ai du mal m'exprimer: en fait je veux que le champ inter_objet soit une liste déroulante dont les valeurs sont issues soit de la table véhicule soit de la table site en fonction de la valuer du champ inter_nature
    C'est bien ce que j'ai compris et cela ne posera de de problème à condition de ne pas définir de relation entre les tables

    Citation Envoyé par gui_li_aume Voir le message
    Ce que vous me proposez pourra fonctionner si je ma table intervention se décompose comme ce ci intervention(inter_id, inter_nature, inter_objetsite, inter_objetvehicule...) où les inter objet_vehicule et inter_objetsite seraient liés chacuns à leur table respective. A moins que je ne saisisse pas votre proposition...
    Effectivement vous n'avez pas bien lu ma proposition, j'ai bien écrit i.inter_objet dans mes exemples...
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut
    Quel est donc ce i? Et ce .designation ? Pourquoi appeler inter_id dans la requête ? Je pense que j'ai un chapitre de retard...

  6. #6
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut
    Sans doute une méthode simple (trop?). Voilà ce que je pense faire:

    une requête qui reprendra tous mes objets (site, vehicule, mobilier, parc informatique...), et qui viendra alimenter mon champ objet

    j'ai 2 requêtes dont je me sers déjà pour d'autres bases (qrySiteEtendu et qryVehicEtendu)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT qrySiteEtendu.[Nom Site] AS Objet, "site" AS Nature
    FROM qrySiteEtendu
    UNION ALL
    SELECT qryVehicEtendu.[Nom Vehicule] AS Objet, "vehicule" AS Nature
    FROM qryVehicEtendu;

    Puis dans ma liste déroulante une autre requête avec filtre selon nature...

    Mais j'aimerai bien comprendre les propositions précédentes...

  7. #7
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut
    Je cale.

    J'ai donc ma qryObjets
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT qrySiteEtendu.[Nom Site] AS Objet, "site" AS Nature
    FROM qrySiteEtendu
    UNION ALL SELECT qryVehicEtendu.[Nom Vehicule] AS Objet, "vehicule" AS Nature
    FROM qryVehicEtendu;

    Fonctionne, elle me donne les noms de site ou de vehicule avec leur nature.

    Du coup, je me suis dit que ma liste déroulante serait basée sur cette qry avec un filtre automatique selon la valeur du champ tblInter.Inter_Nature; j'ai fait ça:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT qryObjets.Objet
    FROM qryObjets, tblInter 
    WHERE (((qryObjets.Nature)=IIf([tblInter].[Inter_Nature]="site","site","vehicule")));

    mais ça ne fonctionne pas (j'ai essayé diverses variantes avec ' au lieu de "). Là, ma liste déroulante ne m'affiche que les objets de nature site... Comme si la liste déroulante ne tenait pas compte de la valeur du champ Inter_Nature. Comment lui dire de se référer à la valeur de l'enregistrement en cours. INNER JOIN?

    Ou: ce filtre doit être appliqué dans le formulaire par VBA?

  8. #8
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par gui_li_aume Voir le message
    Quel est donc ce i? Et ce .designation ? Pourquoi appeler inter_id dans la requête ? Je pense que j'ai un chapitre de retard...
    i est un alias pour la table intervention, cela permet de compacter la requete
    J'ai supposé qu'il faudrait remonter les désignations des tables véhicule et site pour ne pas les stocker en double, j'ai donc écrit une requete qui permet de le faire...
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  9. #9
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par gui_li_aume Voir le message
    Je cale.

    J'ai donc ma qryObjets
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT qrySiteEtendu.[Nom Site] AS Objet, "site" AS Nature
    FROM qrySiteEtendu
    UNION ALL SELECT qryVehicEtendu.[Nom Vehicule] AS Objet, "vehicule" AS Nature
    FROM qryVehicEtendu;

    Fonctionne, elle me donne les noms de site ou de vehicule avec leur nature.

    Du coup, je me suis dit que ma liste déroulante serait basée sur cette qry avec un filtre automatique selon la valeur du champ tblInter.Inter_Nature; j'ai fait ça:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT qryObjets.Objet
    FROM qryObjets, tblInter 
    WHERE (((qryObjets.Nature)=IIf([tblInter].[Inter_Nature]="site","site","vehicule")));

    mais ça ne fonctionne pas (j'ai essayé diverses variantes avec ' au lieu de "). Là, ma liste déroulante ne m'affiche que les objets de nature site... Comme si la liste déroulante ne tenait pas compte de la valeur du champ Inter_Nature. Comment lui dire de se référer à la valeur de l'enregistrement en cours. INNER JOIN?

    Ou: ce filtre doit être appliqué dans le formulaire par VBA?
    Où se trouve cette liste déroulante ? Dans l'écran de saisie ?
    Si oui il faut modifier la source de la liste déroulante dynamiquement en fonction du type d'intervention en cours de saisie. Voici un exemple qui modifie la liste déroulante du champ x_rc en fonction des droits de l'utilisateur (rine à voir mais l'idée est la même) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub x_rc_Enter() 
    If Mode_admin Then
      x_rc.RowSource = "select cd_rc, valeur, date_reg, libelle, piece, cd_trans from RC where cd_rc>1 and rc_sup=0 and (cd_trans=0 or year(date_reg)=year(date())) order by 1 desc;"
    Else
      x_rc.RowSource = "select cd_rc, valeur, date_reg, libelle, piece, cd_trans from RC where cd_rc>1 and rc_sup=0 and cd_trans=0 order by 1 desc;"
    End If
    End Sub
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  10. #10
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par nico84 Voir le message
    Où se trouve cette liste déroulante ? Dans l'écran de saisie ?
    Si oui il faut modifier la source de la liste déroulante dynamiquement en fonction du type d'intervention en cours de saisie. Voici un exemple qui modifie la liste déroulante du champ x_rc en fonction des droits de l'utilisateur (rine à voir mais l'idée est la même) :
    Je n'ai créé que les tables et la qry pour l'instant. Je suis revenu sur l'article suivant: https://argyronet.developpez.com/off...mboautofilter/.

    Après confirmation de l'auteur, mon souci devra se régler au niveau du formulaire par codage en VBA. Je posterai la réponse quand j'aurai résolu le problème.

  11. #11
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut
    Merci pour les infos. Problème solutionné!

    1: dans ma tblInter j'ai modifié mon champ Inter_Objet en lui retirant la requete qryObjets comme source (donc aucune source)
    2: dans le formulaire, j'ai repris mes champs Inter_Nature et Inter_Objet et mis le vba suivant sur Inter_Nature:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Inter_Nature_AfterUpdate()
     
    Dim nat As String
    Dim sql As String
     
    nat = Me.Inter_Nature
    sql = "SELECT Objet FROM qryObjets WHERE Nature = '" & nat & "'"
    Inter_Objet.RowSource = sql
    Inter_Objet.SetFocus
     
    End Sub

  12. #12
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Je ne définis jamais la source au niveau de la table donc je n'avais pas envisagé cette hypothèse

    Comme l'utilisateur saisit dans l'ordre qu'il veut et peut passer d'une ligne à l'autre, il est plus sûr de modifier le rowsource dans la procédure Inter_Objet_enter (cf mon exemple)
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  13. #13
    Membre habitué
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 152
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par nico84 Voir le message
    Comme l'utilisateur saisit dans l'ordre qu'il veut et peut passer d'une ligne à l'autre, il est plus sûr de modifier le rowsource dans la procédure Inter_Objet_enter (cf mon exemple)
    Pour ça je vais utiliser du vba, en mettant la propriété disabled par défaut sur les champs, propriété qui sera levée au fur et à mesure par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     nomduchamparemplirensuite.enabled=true
    .
    Mais je sens que ça va compliquer le bazar...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/05/2013, 11h17
  2. [AC-2000] Champ spécifié peut désigner plusieurs tables
    Par jclm230759 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/01/2013, 16h12
  3. [ODBC] Le champ spécifié peut désigner plusieurs tables et pourtant
    Par nawak.seb dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/11/2008, 09h33
  4. Réponses: 2
    Dernier message: 26/04/2006, 08h53

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