8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous !

J'ai un formulaire constitué de plusieurs type de ligne, ces lignes sont stocké dans différentes table (en fonction de leur type).
Je veux conserver leur ordre j'ai donc une table qui me conserve l'ordre de mes lignes.
Je simplifie pour l'exemple, en gros ca me donne ca :

DEVIS_LIGNE (ID_LIGNE,ORDRE)

DEVIS_LOCATION(ID_LIGNE,ID_PRODUIT,COEFF)
DEVIS_VENTE(ID_LIGNE,ID_PRODUIT)
DEVIS_TEXTE(ID_LIGNE,TEXTE)


Ce que je veux c'est faire une requête qui me renvoi un tableau avec : ID_LIGNE,ID_PRODUIT,COEF,TEXTE) avec les champs à NULL si besoin

(par exemple dans le cas d'une ligne de type texte les champs id_produit et coeff seront à NULL)

Pour le moment j'exécute cette requete :



SELECT *FROM DEVIS_LIGNE DL 
LEFT OUTER JOIN DEVIS_LOCATION L ON DL.ID_LIGNE = L.ID_LIGNE
LEFT OUTER JOIN DEVIS_VENTE V ON DL.ID_LIGNE = V.ID_LIGNE
LEFT OUTER JOIN DEVIS_TEXTE T ON DL.ID_LIGNE = T.ID_LIGNE
ORDER BY ORDRE


Le problème c'est que j'ai plusieurs fois les mêmes colonne en sortie... (4 fois la colonne ID_LIGNE, 2 fois la colonne ID_PRODUIT etc...)

Merci d'avance !
Modifié par korxx (20 Jul 2010 - 13:24)
Pour résoudre le problème des 4 ID_LIGNE j'ai juste à préciser dans le select LD.ID_LIGNE mais pour le reste je peux pas... vu que ID_PRODUIT peut à la fois être dans DEVIS_LOCATION et DEVIS_VENTE il me fait deux colonnes, mais le truc c'est que c'est exclusif, il peut pas être dans les deux à la fois, du coup je voudrai qu'il m'affiche ca dans la même colonne.
nop ça te les double quand même

En tout cas dans les tutos que j'ai lu j'ai jamais vu ce cas de figure

J'ai édité le titre du Sujet en le rendant le plus explicite possible Smiley cligne
Modifié par korxx (20 Jul 2010 - 13:49)
Heyoan a écrit :
Ta requête est vraiment étrange et j'ai un gros doute concernant la normalisation de tes tables. Smiley rolleyes

Regarder également du côté de COALESCE et de DISTINCT...



A priori je suis en 3eme forme normale.

Tu penses qu'il y a un hic ?
Heyoan a écrit :
Ta requête est vraiment étrange et j'ai un gros doute concernant la normalisation de tes tables. Smiley rolleyes

Regarder également du côté de COALESCE et de DISTINCT...


Tu avais raison avec COALESCE je m'en sors !






SELECT DL.ID_LIGNE, ORDRE, 
COALESCE(V.ID_PRODUIT,L.ID_PRODUIT) AS ID_PRODUIT, 
COEFF, TEXTE
FROM DEVIS_LIGNE DL
LEFT OUTER JOIN DEVIS_LOCATION L ON DL.ID_LIGNE = L.ID_LIGNE
LEFT OUTER JOIN DEVIS_VENTE V ON DL.ID_LIGNE = V.ID_LIGNE
LEFT OUTER JOIN DEVIS_TEXTE T ON DL.ID_LIGNE = T.ID_LIGNE
ORDER BY ORDRE

Modifié par korxx (20 Jul 2010 - 13:53)
korxx a écrit :
A priori je suis en 3eme forme normale.

Tu penses qu'il y a un hic ?
Oui puisque la phrase je suis en 3eme forme normale ne veut rien dire ! Smiley langue

Il faut tenir compte de toutes les formes normales.

Le plus simple serait de nous fournir un dump des tables concernées (CREATE TABLE... via phpMyAdmin) et de nous dire ce que tu veux faire avec ta requête.
Heyoan a écrit :
Oui puisque la phrase je suis en 3eme forme normale ne veut rien dire ! Smiley langue

Il faut tenir compte de toutes les formes normales.

Le plus simple serait de nous fournir un dump des tables concernées (CREATE TABLE... via phpMyAdmin) et de nous dire ce que tu veux faire avec ta requête.


mes schéma merise sont en 3eme forme normale si tu préfères. (et 2eme et en 1ere implicitement)
Modifié par korxx (20 Jul 2010 - 13:55)
korxx a écrit :
mes schéma merise sont en 3eme forme normale si tu préfères.
Ben je ne préfère pas puisque ça ne veut rien dire non plus.

Et que tu t'en sortes avec COALESCE m'inspire toujours de gros doutes quant à la normalisation de tes tables.
Modifié par Heyoan (20 Jul 2010 - 13:56)
Heyoan a écrit :
Ben je ne préfère pas puisque ça ne veut rien dire non plus.

Et que tu t'en sortes avec COALESCE m'inspire toujours de gros doutes quant à la normalisation de tes tables.



Je comprends pas pourquoi tu dis que ca ne veut rien dire...

Sinon j'ai une interface pour créer un devis, l'utilisateur peut ajouter plusieurs types de ligne dont l'ordre (présentation) doit être conservé.

Lors de la validation du formulaire je rempli mes tables sachant qu'une ligne location est une ligne (héritage entre la table DEVIS_LOCATION et DEVIS_LIGNE) etc...

Et la requete sur laquelle on discute c'est celle qui va me permettre de reparcourir les différentes tables afin de réafficher dans l'ordre les différentes lignes de mon devis.
Sinon je sais pas ce que tu veux dire par dump mais voila ce que j'ai tapé pour la création de mes tables :


	


CREATE TABLE DEVIS_VERSIONS
(	ID_VERSION				CHAR(16)		NOT NULL	PRIMARY	KEY,
	ID_DEVIS				INT				NOT NULL,
	DATE_VERSION			DATE			NOT	NULL,
	STATUT					CHAR			DEFAULT 'C',
	FOREIGN KEY (ID_DEVIS) REFERENCES DEVIS(ID_DEVIS))ENGINE=INNODB;




CREATE TABLE DEVIS_LIGNE
(	ID_LIGNE				INT				NOT NULL	PRIMARY KEY 	AUTO_INCREMENT,
	ORDRE					TINYINT			NOT	NULL,
	ID_VERSION				CHAR(16)		NOT NULL,
	UNIQUE(ID_VERSION,ORDRE),
	FOREIGN KEY (ID_VERSION) REFERENCES DEVIS_VERSIONS(ID_VERSION))ENGINE=INNODB;
	
	CREATE TABLE DEVIS_LOCATION
(	ID_LIGNE				INT				NOT	NULL	PRIMARY KEY,	
	ID_PRODUIT				INT				NOT	NULL,
	QUANTITE				TINYINT			NOT	NULL,
	REMISE					TINYINT			DEFAULT '0',
	PRIX					DECIMAL(8,2)	NOT	NULL,
	COEFF					DECIMAL(4,2)	NOT	NULL,
	FOREIGN	KEY	(ID_LIGNE) 	 REFERENCES DEVIS_LIGNE(ID_LIGNE),
	FOREIGN KEY (ID_PRODUIT) REFERENCES PRODUITS_LOCATION_PRIX(ID_PRODUIT))ENGINE=INNODB;
	
	CREATE TABLE DEVIS_VENTE
(	ID_LIGNE				INT				NOT	NULL	PRIMARY	KEY,
	ID_PRODUIT				INT				NOT	NULL,	
	QUANTITE				TINYINT			NOT	NULL,
	REMISE					TINYINT			DEFAULT '0',
	PRIX					DECIMAL(8,2)	NOT	NULL,
	FOREIGN	KEY	(ID_LIGNE) REFERENCES DEVIS_LIGNE(ID_LIGNE),
	FOREIGN KEY (ID_PRODUIT) REFERENCES PRODUITS_VENTE(ID_PRODUIT))ENGINE=INNODB;

	CREATE TABLE DEVIS_TEXTE
(	ID_LIGNE				INT				NOT	NULL	PRIMARY KEY,
	TEXTE					VARCHAR(128)	NOT NULL,
	FORMATAGE				TINYINT			DEFAULT '1',
	COULEUR					CHAR(6)			DEFAULT '000000',	
	FOREIGN	KEY (ID_LIGNE) REFERENCES DEVIS_LIGNE(ID_LIGNE))ENGINE=INNODB;


Modifié par korxx (20 Jul 2010 - 14:23)
korxx a écrit :
Je comprends pas pourquoi tu dis que ca ne veut rien dire...
Parce que, je me répète, il faut tenir compte de toutes les formes normales : elles sont indépendantes et on ne peut pas dire "je suis en 3ème forme".

korxx a écrit :
Sinon je sais pas ce que tu veux dire par dump mais voila ce que j'ai tapé pour la création de mes tables
C'est bien ce que je te demandais... sauf qu'il en manque.

Quoi qu'il en soit il me semble que tu as plusieurs tables en fonction du type de devis (location, vente...) et c'est à priori une erreur : il ne faudrait qu'une seule table DEVIS qui possèderait un type (nouvelle table avec clé étrangère).


Edit: en gros quelque chose comme ça :

produits
• id_produit (clé primaire en auto-indent)
• libelle_produit
• tarif
• …

customers
• id_customer (clé primaire en auto-indent)
• nom
• prenom
• …

types_devis
• id_type (clé primaire en auto-indent)
• libelle_type
• ...

devis_entete
• id_devis (clé primaire en auto-indent)
• id_type
• id_customer
• numero_ordre
• ...


devis_lignes
• id_devis_ligne (clé primaire en auto-indent)
• id_devis
• numeo_ligne
• id_produit
• …
Modifié par Heyoan (20 Jul 2010 - 14:20)
Heyoan a écrit :
Parce que, je me répète, il faut tenir compte de toutes les formes normales : elles sont indépendantes et on ne peut pas dire "je suis en 3ème forme".

C'est bien ce que je te demandais... sauf qu'il en manque.

Quoi qu'il en soit il me semble que tu as plusieurs tables en fonction du type de devis (location, vente...) et c'est à priori une erreur : il ne faudrait qu'une seule table DEVIS qui possèderait un type (nouvelle table avec clé étrangère).


Ben quand t'es en deuxieme t'es forcement en 1ere également.
Enfin quand je disais que j'etais en troisième j'entendais implicitement mon shema répondait au 3 premières formes normales


J'ai une seule table devis, dans un devis il peut y avoir différents types de produits de différents types (location, vente etc...) mais aussi des commentaires de textes etc...
Modifié par korxx (20 Jul 2010 - 14:24)
korxx a écrit :
Ben quand t'es en deuxieme t'es forcement en 1ere également.
Non... mais je pense que j'ai assez insisté pour aujourd'hui...

korxx a écrit :
J'ai une seule table devis, dans un devis il peut y avoir différents types de produits de différents types (location, vente etc...)
Alors dans la structure que je te suggère plus haut il suffit de rattacher le type au produit et pas au devis...
Modifié par Heyoan (20 Jul 2010 - 14:26)
Heyoan a écrit :
Non... mais je pense que je l'ai assez insisté pour aujourd'hui...

Alors dans la structure que je te suggère plus haut il suffit de rattacher le type au produit et pas au devis...



C'est pas possible, dans le devis j'ai pas que des produits, j'ai aussi des commentaires, j'ai des prestation etc... ce sont pas tous des produits.
Modifié par korxx (20 Jul 2010 - 14:29)
korxx a écrit :
C'est pas possible, dans le devis j'ai pas que des produits, j'ai aussi des commentaires, j'ai des prestation etc... ce sont pas du tout des produits.
D'où ma demande d'un dump de tes tables puisque ça ne se devine pas...
Heyoan a écrit :
Non... mais je pense que j'ai assez insisté pour aujourd'hui...



Pourtant dans le lien que tu m'as donné :


a écrit :
2FN - deuxième forme normale
Respecte la deuxième forme normale, la relation respectant la première forme normale et dont :

* Tout attribut ne composant pas un identifiant dépend d'un identifiant.

Le non respect de la 2FN entraine une redondance des données qui encombrent alors inutilement la mémoire et l'espace disque.
Heyoan a écrit :
D'où ma demande d'un dump de tes tables puisque ça ne se devine pas...



J'ai une trentaine de table je voulais pas vous ennuyer à lire un truc trop long, j'ai rajouté 2 tables sans doute nécéssaires à la compréhension dans le post plus haut.


Mais en gros ma structure s'apparente à la tienne, j'ai une entité version de devis

j'ai une entité ligne de devis

et j'ai plusieurs entité (location,vente,commentaire etc...) qui ont comme clé étrangère la ligne de devis.


Chaque version de devis étant constitué de plusieurs lignes qui sont de différent type (location, vente, commentaires etc...)
Modifié par korxx (20 Jul 2010 - 14:33)
Pages :