|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Bonjour à tous,
J'ai bien compris qu'Access ne savait pas faire les relations zero à plusieurs. Cependant, dans le modèle relationnel de ma table, j'ai des relations 0 à plusieurs, comment puis je les créer sur Access? J'ai essayé : Une relation 1 à plusieurs (table 1 -1, table 2 - plusieurs), cependant, vu que le champ vide n'est pas dans ma table 2, on m'interdit l'enregistrement dans ma table 1, bien que les propriétés (sur la table 1 et la table 2) permettent un champ nul. Je ne peux pas non plus rajouter un champ vide dans la table 2, puisque celle ci sert également à remplir une listbox que je ne veux limiter qu'aux valeurs non nulles. Vu le nombre de cas imposant des relations 0 à plusieurs, je ne pense pas être le premier à buter sur ce probleme. Merci de vos réponses. Damien |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 161 ![]() |
Bonjour Damien,
Il ne s'agit pas spécialement d'Access : la relation 0 à plusieurs entre deux tables n'existe pas ! Si j'ai bien compris, tu dois lier Table1 (1)=>(N) Table2 via un champ C et tu souhaites pouvoir remplir Table2 avec, parfois, le champ C=Null (sachant qu'une liste déroulante présente les champs C<>Null de Table1). Si c'est bien cela, dans "Relation", il faut décocher "intégrité référentielle" (click droit sur le trait de liaison). Tu peux, également, indiquer un type de jointure avec flèche à droite. Tu pourra, de cette manière, créer un enregistrement dans Table2 avec le champ C non renseigné.
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Bonjour Richard et merci pour ta réponse. Tu as bien compris mon probleme.
J'ai essayé de décocher l'intégrité référentielle, ca ne marche pas mieux. J'y est ajouté la jointure à droite, ca ne marche pas mieux non plus, le message est toujours le suivant : "Le moteur de base de données Microsoft Access ne peut pas trouver d'enregistrement dans la table table2 avec le(s) champ(s) C correspondant à la clé. Je signale au passage même si je pensais que cela n'avait rien à voir, que j'utilise une frontend et une BE, mes tables et relations sont définies sur le backend, mon formulaire (basée sur une requete table1+table2) sur le Frontend. Par contre, je viens de créer une nouvelle base de test rien que pour ca. Sur cette base, j'ai créé deux tables, un formulaire et une relation. En décochant l'intégrité référentielle, cela fonctionne sur cette nouvelle table, par contre, je n'ai plus aucun controle sur les données, il ne me permet pas seulement le nul, mais toute valeur ce qui ne correspond pas à ma recherche. De plus, les jointures à droite ou à gauche avec l'intégrité referentielle cochée ne permet pas de résoudre le probleme, on m'interdit toujours le nul. N'hésites pas à m'indiquer tes autres idées. Merci Damien |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 161 ![]() |
Bonjour Damien,
Sur le back end, peux-tu :
Ensuite :
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Je suis désolé mais je ne sais pas comment copier les structures.
Néanmoins je suis sur que ce que tu dis marche, étant donné que cela reflète le même comportement que celui que j'ai eu sur ma base de test. Néanmoins, décocher l'intégrité référentielle me permet, certes, de mettre une valeur nulle dans mes champs, mais aussi n'importe qu'elle autre valeur que celles indiquées dans table 2. Ce que je voudrais plutôt, c'est que l'on puisse, soit mettre une valeur nulle, soit uniquement les valeurs indiquées dans le champ C de table 2 et que le principe de l'intégrité référentielle reste (en clair, que quand je change une valeur dans le champ C de table 2, tous les champs affectés changent également) Y a t'il une solution pour cela? Merci beaucoup de ton aide. Damien |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 161 ![]() |
Comme tu disais
Citation:
L'intégrité référentielle que tu souhaiterais "conditionnelle" n'existe dans aucun système de base de données. Donc, la solution ne peut pas se situer au niveau "Relation" entre les tables, mais au niveau données. Il me semble que Access 2010 accepte les triggers. Ceux-ci agissent au niveau données, mais se situent à un niveau "au-dessus" des écritures/modifications dans les tables effectuées par les formulaires. Sinon, sans les triggers, je ne vois que l'action au niveau des formulaires eux-mêmes.
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 395 ![]() |
bonsoir,
@diablange, bizarre ton problème . Quand on commence à tripatouiller l'intégrité référentielle pour rentrer des champs Null, c'est que quelque chose ne va pas au niveau modélisation.Tu pourrais joindre un extrait de ta base en pièce-jointe ? |
|
10
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Hum Fab, ce n'est pas trop possible, ma base est déja sécurisée, avec des macros de réplication automatique partout etc....
Mais je comprends ce que vous me dites tous les deux. Je crois que j'ai fait une erreur des la conception, je m'explique : Dans mon systeme, je peux recevoir des commandes d'un client (nommé client) en direct ou via une autre entité de mon entreprise (nommé client interne). Mon idée était de mettre une case à cocher dans mon formulaire pour indiquer si oui ou non je recevais ma commande par un client interne. D'ou dans ma table, un champ : "client", un champ booléen "commande interne?" et un champ "client interne". Ce champ "client interne" mis en relation avec une autre table ou est dressée la liste des clients internes. Mais du coup, si je n'ai pas de client interne, la case est vide !!! (et l'intégrité référentielle refuse les cases vides). Je pense après reflexion (grace à vous) qu'il faut que je supprime le champ booléen et que je rajoute un client interne "NON" dans ma liste. Du coup, si il s'agit d'une commande direct, le champ par défaut sera nom et j'économise mon booléen. Pensez vous qu'il s'agisse de la meilleure solution? Merci à vous pour votre aide. Damien |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 161 ![]() |
Non, non, pas d'accord... si je peux me permettre.
Ton souhait est légitime et je ne vois pas d'erreur d'analyse : tu veux, simplement, agir sur les relations par une sorte "d'intégrité référentielle conditionnelle" qui t'arrangerait bien car elle serait plus confortable, pour toi, dans le développement proprement dit (c'est humain). Dans ton cas, les cardinalités sont les suivantes :
Notes qu'il ne s'agit pas d'une relation "0 à N", comme tu l'indiquais. La 2ème ligne est, néanmoins, légitime et gérable. Maintenant, c'est vrai que Access ne prévoit les relations que dans un sens.
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Oui Richard, en effet tes cardinalités sont exactes.
Mais si tu dis que Access ne sait pas les gerer, pourquoi n'es tu pas convaincu que ma solution soit la meilleure (dans Access bien sur) et que me proposerais tu ? Quand à mon erreur d'analyse, je ne pense pas qu'elle se situe à ce niveau. Elle vient simplement du fait, à mon sens, que j'ai créé un champ conditionnant un autre champ dans une même table, un peu comme si je créais un champ calculé par rapport à un autre dans une même table non? Eclaire moi si je me trompe. Et si possible, avec une alternative faisable sur Access (je n'ai que ca) Merci beaucoup pour le temps consacré à mon probleme Damien |
|
|
00
|
|
|
#11 | |||
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 395 ![]() |
Citation:
![]() Citation:
Toutefois, un champ vide (avec un marqueur NULL signifiant "absence de valeur") ne viole en aucune façon l’intégrité référentielle. Quelque chose m’échappe ! Si la règle de gestion est : "Une commande est passée soit pas un client, soit par un client interne" , on peut gérer ça de plusieurs façons dont la plus simple : ![]() Avec tous les clients dans la même table et un champ TypeClient pour typer le client (interne ou pas). Une case à cocher indépendante "client interne O/N ?" sur le formulaire pour filtrer la liste des clients suivant TypeClient et le tour est joué, non ? J’avoue ne pas comprendre ces "cardinalités" :Citation:
|
|||
|
00
|
|
|
#12 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
f-leb j'ai plusieurs remarques :
Dans mon cas ta solution ne peut s'appliquer car il y a toujours un "client" à remplir, que l'on passe par un client interne ou non, il est obligatoire d'indiquer qui est le client externe, ce qui exclu une table et un champ typeclient. Le champ null ne viole pas l'intégrité référentielle cependant, il ne peut pas exister sur un champ défini comme clé primaire (notamment de clientinterne). En clair, je ne peux pas avoir une table clientinternes avec comme champ : nomclientinterne et en valeurs : clientX; clientY; NULL, le NULL access me le refuse. Dans mon cas, je veux que dans ma table le client soit rempli à la main, et si la case clientinterne? est coché, l'utilisateur puisse selectionner dans la liste les clientsinternes prédéfinis (et seulement eux, pas une ligne de plus pour y mettre par exemple : "NON") mais je souhaite respecter l'intégrité référentielle pour pouvoir mettre à jour ma table si le nom de mon clientinterne change. Quant à la cardinalité de Richard, je la lis comme ceci : Un clientinterne peut passer une ou plusieurs commandes. Une commande peut etre passée par aucun ou un clientinterne. Des suggestions? Merci à vous Damien |
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 161 ![]() |
Damien, je vois que tu es connecté... mais il est tard : je reprends ce fil demain, si tu veux.
Je souhaiterais que nous allions jusqu'au bout de cette analyse car il s'agit d'un aspect fondamental : les tables entête/détail (1=>N, 1<=1) et les tables avec clé étrangère (1=>N, 0<=1). A demain.
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
00
|
|
|
#14 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Avec plaisir Richard,
Et merci pour ton aide. Damien |
|
|
00
|
|
|
#15 | ||
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 395 ![]() |
chuis encore là...
Citation:
Cependant il m’est difficile de contourner le problème sans me représenter les règles de gestion et je suggère de les décrire jusqu’au bout (en oubliant momentanément les champs, clés primaires, tables, relations, listes déroulantes et autres termes techniques et bassement matériels qui nous empêchent de progresser malgré la douzaine de posts déjà) Citation:
Commande----0,1-----passer-----0,n------ClientInterne Mais où sont les clients externes là-dedans ? Une commande est passée par un client qui est soit un client interne, soit un client externe ? Oui ? Non ? |
||
|
00
|
|
|
#16 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Bonjour Fab,
Non ! Client interne et client externe sont totalement dissociables. J'ai dans tous les cas un champ client externe, champ libre, sans relation à une liste. Et quand applicable, j'ai en plus un client interne en relation avec une table clientinterne. J'espere que mon explication est claire Damien |
|
|
00
|
|
|
#17 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Bon... la je ne comprends plus rien
Ce matin j'ai créé une nouvelle base exemple : Table 1, champs : a, b, c, a étant primaire Table 2, champ : d, d étant primaire Je crée une relation entre table 1 et table 2, champ d vers c, jointure complete, intégrité référentielle cochée. Je crée un formulaire basé sur table 1 avec a, b en textbox, c en listbox avec les données de d. Et la magie? J'arrive à faire ce que je veux, c'est à dire, ne rentrer que les valeurs de d ou un nul dans c et pas les autres valeurs. Mon probleme est donc ailleurs sur ma base... Je continue mes recherches. |
|
|
00
|
|
|
#18 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Bien, j'ai trouvé mon probleme !
Comme je le disais plus haut, on peut faire ce que je veux, nativement, avec l'intégrité référentielle. Par contre, j'ai basé mon formulaire sur une requete ayant table 1 ET table 2. Si je reprend mon exemple et que je rajoute un champ et une requete : Table 1, champs : a, b, c, a étant primaire Table 2, champ : d, e, d étant primaire Je crée une relation entre table 1 et table 2, champ d vers c, jointure complete, intégrité référentielle cochée. Je crée une requete basée sur ces deux table avec les champs a b c e Je crée un formulaire basé sur la requete avec a, b et e (e uniquement en lecture seule) en textbox, c en listbox avec les données de d. Et la, je suis bloqué ! Ma question, comment faire ma requete afin de pouvoir, quand je selectionne les données de d dans ma textbox, voir e et quand je ne le selectionne pas, que e reste nul et que l'enregistrement soit autorisé? On avance... Merci à vous pour vos reflexions. Damien |
|
|
00
|
|
|
#19 |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 161 ![]() |
Bonjour Damien,
Désolé pour le retard. Il me semble que, avant de passer au niveau "formulaire" ou "requête", il faudrait se pencher sur le niveau "table". Pour reprendre ton exemple : Relation de Table2 vers Table1 entre d et e avec intégrité référentielle. Dans l'onglet Table, si tu essaies de remplir Table1, Table2 restant vide, tu dois obtenir un message de refus. Confirmes-tu ?
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
00
|
|
|
#20 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2006 Messages : 45 ![]() |
Non justement !
C'est ce que je disais dans les messages précédent. J'ai réessayé et finalement cela marche. J'obtenais ce message de refus parce que je passais pour remplir ma table par un formulaire basé sur une requete elle meme basée sur toutes les tables. Je n'obtiens pas de refus sur le champ c de la table 1 dans les conditions suivantes : Null ou correspondance avec champ d de table 2. Par contre, j'obtiens un refus dans les cas suivants : Non null et non correspondant avec le champ d de table 2. D'ou ma conclusion que si c'est possible au niveau de la table, j'ai du faire une erreur au niveau requete ou formulaire ! Au niveau formulaire, en basant un formulaire sur ma table, j'y arrive aussi, donc j'en ai déduit que ma requete était mal faite. D'ou ma question dans mon message précédent. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com