Bonsoir Loïc,
Envoyé par
LoicL89
ajout de l'entité-type LIGNE.
Je suppose qu’une ligne est un ensemble de câbles et de supports, mais pouvez-vous en dire plus au profane ? Une ligne peut-elle être vue comme une chaîne, une succession, une séquence déterminée de câbles ?
Envoyé par
fsmrel
J’ai remplacé le type DECIMAL par le type DOUBLE, car ce chameau d’ACCESS le rejette.
En fait, pour que ça marche, il me suffisait de faire : ACCESS OPTIONS > OBJECT DESIGNERS et cocher « SQL Server Compatible Syntax (Ansi92) ». Mais je n’utilise ACCESS qu’occasionnellement, et vous me donnez ici l’occasion de m’entraîner ^^
Envoyé par
LoicL89
Envoyé par
fsmrel
Rcsc) Un câble est porté par un support de départ et un support d’arrivée. Si ces supports sont situés dans la même commune, par transitivité, le câble est situé dans cette commune. Si ces supports sont situés dans deux communes distinctes, du fait de la transitivité, le câble est « à cheval » sur ces communes.
Comment dans une table Access indiquer qu'un câble est sur deux communes? Il faut créer deux lignes décrivant ce câble?
Envoyé par
LoicL89
Un autre souci en essayant de remplir les tables : la table CABLE possède désormais SupportID et SupportID_Support (en raison des associations portée départ, portée arrivée), je ne peux pas renommer les attributs sinon il y a perte de lien entre les tables?
On peut nommer les attributs comme bon nous chante. Les liens ne sont pas perdus, voyez les contraintes CONSTRAINT CABLE_SUPPORT_DEPART et CONSTRAINT CABLE_SUPPORT_ARRIVEE ci-dessous.
Allons-y pour coder :
TABLE COMMUNE :
CREATE TABLE COMMUNE
(
CommuneId SERIAL
, CommuneInsee INTEGER NOT NULL
, CommuneNom VARCHAR(32) NOT NULL
, CONSTRAINT COMMUNE_PK PRIMARY KEY (CommuneId)
, CONSTRAINT COMMUNE_AK UNIQUE (CommuneInsee)
) ;
TABLE SUPPORT :
CREATE TABLE SUPPORT
(
SupportId SERIAL
, SupportNo INTEGER NOT NULL
, CommuneId INTEGER NOT NULL
, CONSTRAINT SUPPORT_PK PRIMARY KEY (SupportId)
, CONSTRAINT SUPPORT_NO_AK UNIQUE (SupportNo)
, CONSTRAINT SUPPORT_COMMUNE_FK FOREIGN KEY (CommuneId)
REFERENCES COMMUNE (CommuneId)
) ;
TABLE CABLE :
CREATE TABLE CABLE
(
CableId SERIAL
, SupportDepartId INTEGER NOT NULL
, SupportArriveeId INTEGER NOT NULL
, CONSTRAINT CABLE_PK PRIMARY KEY (CableId)
, CONSTRAINT CABLE_SUPPORT_DEPART FOREIGN KEY (SupportDepartId)
REFERENCES SUPPORT (SupportId)
, CONSTRAINT CABLE_SUPPORT_ARRIVEE FOREIGN KEY (SupportArriveeId)
REFERENCES SUPPORT (SupportId)
) ;
Un micro jeu d’essai :
INSERT INTO COMMUNE (CommuneInsee, CommuneNom) VALUES (56061, 'La Gacilly') ;
INSERT INTO COMMUNE (CommuneInsee, CommuneNom) VALUES (35328, 'Sixt-sur-Aff') ;
INSERT INTO COMMUNE (CommuneInsee, CommuneNom) VALUES (35168, 'Maure-de-Bretagne') ;
=>
CommuneId CommuneInsee CommuneNom
--------- ----------- ----------
1 56061 La Gacilly
2 35328 Sixt-sur-Aff
3 35168 Maure-de-Bretagne
INSERT INTO SUPPORT (SupportNo, CommuneId) VALUES (123, 1) ;
INSERT INTO SUPPORT (SupportNo, CommuneId) VALUES (234, 2) ;
INSERT INTO SUPPORT (SupportNo, CommuneId) VALUES (456, 3) ;
=>
SupportId SupportNo CommuneId
--------- --------- ---------
1 123 1
2 234 2
3 456 3
INSERT INTO CABLE (SupportDepartId, SupportArriveeId) VALUES (1, 2) ;
INSERT INTO CABLE (SupportDepartId, SupportArriveeId) VALUES (2, 3) ;
=>
CableId SupportDepartId SupportArriveeId
------- --------------- ----------------
1 1 2
2 2 3
Pour poser la question : de quelle commune part le câble 1 et où aboutit-il :
SELECT 'a : Départ' AS Support, CableId, CommuneInsee, CommuneNom
FROM (CABLE INNER JOIN SUPPORT ON CABLE.SupportDepartId = SUPPORT.SupportId)
INNER JOIN COMMUNE ON SUPPORT.CommuneId = COMMUNE.CommuneId
WHERE CableId = 1
UNION
SELECT 'b : Arrivée', CableId, CommuneInsee, CommuneNom
FROM (CABLE INNER JOIN SUPPORT ON CABLE.SupportArriveeId = SUPPORT.SupportId)
INNER JOIN COMMUNE ON SUPPORT.CommuneId = COMMUNE.CommuneId
WHERE CableId = 1 ;
Le 1er SELECT permet de récupérer la ville de départ du câble 1 et le 2e SELECT permet de récupérer la ville d’arrivée de ce câble 1. Par UNION on obtient :
Support CableId CommuneInsee CommuneNom
----------- ------- ------------ -----------
a : Départ 1 56061 La Gacilly
b : Arrivée 1 35328 Sixt-sur-Aff
Manifestement, le câble 1 a bien un support de départ dans une commune et un support d’arrivée dans une autre.
Envoyé par
LoicL89
Comment remplir la table Amorcer ? Elle ne doit pas se remplir automatiquement en raison des relations fixées?
C’est l’utilisateur qui sait quelles sont les associations à établir entre les tables CABLE et VEGETATION. On a un échantillon ci-dessus du contenu de la table CABLE.
Supposons que la table VEGETATION ait la structure (simplifiée) définie par l’instruction suivante :
CREATE TABLE VEGETATION
(
VegetationId SERIAL
, DateReleve DATE
, DynamiqueId INTEGER
, CONSTRAINT VEGETATION_PK PRIMARY KEY (VegetationId)
, CONSTRAINT VEGETATION_DYNAMIQUE_FK FOREIGN KEY (DynamiqueId)
REFERENCES DYNAMIQUE_VEGETATION (DynamiqueVegetationId)
) ;
Créons un échantillon pour cette table :
VegetationId DateReleve DynamiqueId
------------ ---------- -----------
1 03/06/2015 1
2 03/06/2015 1
3 04/06/2015 1
4 04/06/2015 2
Définition de la structure (simplifiée) de la table AMORCER :
CREATE TABLE AMORCER
(
VegetationId INTEGER NOT NULL
, CableId INTEGER NOT NULL
, CONSTRAINT AMORCER_PK PRIMARY KEY (VegetationId, CableId)
, CONSTRAINT AMORCER_VEGETATION_FK FOREIGN KEY (VegetationId)
REFERENCES VEGETATION (VegetationId)
, CONSTRAINT AMORCER_CABLE_FK FOREIGN KEY (CableId) REFERENCES CABLE (CableId)
) ;
Associons la végétation 1 (attribut VegetationId) au câble 2 (attribut CableId) :
INSERT INTO AMORCER (VegetationId, CableId) VALUES (1, 2) ;
=>
VegetationId CableId
------------ -------
1 2
A cette occasion, je rappelle qu’en principe l’utilisateur n’a pas accès aux attributs identifiants (artificiels et invariants, je le rappelle). Ainsi, devrait-il disposer d’un attribut (par exemple NumeroCable) lui permettant d’identifier à sa façon, « naturellement », une entité-type telle que CABLE. Même principe pour VEGETATION. Maintenant si l’utilisateur n’éprouve pas le besoin de disposer d’un identifiant naturel pour ses câbles, et si CableId lui suffit, alors d’accord, on lui montre cet attribut, mais qu’il sache qu’il n’a aucunement le pouvoir de l’altérer.
Envoyé par
LoicL89
Qu'est-ce qu'une association ad-hoc?
Partons de la situation la plus courante : un support est localisé dans une seule commune :
Supposons qu’un support soit à cheval sur deux communes, ce qui est très rare d’après ce que j’ai compris. Si vous avez besoin d’en tenir compte, une association de secours, ad-hoc peut faire l’affaire :
Les supports supplémentaires seront associés aux communes correspondantes au moyen de l’association CAS_RARE :
En passant, un point déjà effleuré : est-il réaliste qu’un câble partant d’un support situé dans une commune A, aboutisse directement à un support situé dans une commune Z tout en passant « au-dessus » d’une commune M sans support intermédiaire dans M ?
Envoyé par
LoicL89
Merci pour votre explication pour Access, je cherchais à faire toutes les étapes d'un seul coup en chargeant le fichier .sql mais je n'ai pas trouvé. J'ai donc suivi votre méthode.
Si vous connaissez VBA, vous pouvez tout faire d’un coup.
On aura à reparler des contraintes de chemin, de l’entité-type LIGNE, de l’association SITUER1.
Partager