DEMANDE REQUETE SQL [Fermé]

Signaler
Messages postés
16
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
5 février 2011
-
 fiu -
Bonjour,

Je suis entrain de développer une application "Gestion Commerciale" sous VB.NET et qui utilise le SQL Server comme SGBD.
J'ai beaucoup de difficultés en langage SQL, et mon problème consiste à créer une requète SQL qui permet d'afficher les "lignes Réception" de chaque "BON DE RECEPTION":

----------------------------------------------------------------
Qté | DESIGNATION (Disque/Abrasif)| Observation|
----------------------------------------------------------------

La structure de mes tables est:

Table "Bon de Reception"([N° RECEPT], [DATE RECEPT])
Table "Ligne Reception" ([N° LIG RECPT], REF, QTE, OBSERVATION,[N° RECEPT])
Table "Article" (REF, PUTTC)
Table "Disque"(REF, DESIGNATION)
Table "Abrasif"(REF, DESIGNATION)

J'attends vos solutions, et merci d'avance ;)

Imagination is more important than knowledge

8 réponses

Salut,

Donc, la méga requête pour afficher Qté, DESIGNATION (Disque/Abrasif), Observation est
SELECT qte
, '('
|| CASE WHEN dd.designation IS NULL THEN '' ELSE dd.designation END
|| CASE WHEN aa.designation IS NULL THEN '' ELSE aa.designation END
|| ')' desig
, observation
FROM [Bon de Reception] br, [Ligne Reception] lr, article a
LEFT OUTER JOIN disque dd on lr.ref = dd.ref
LEFT OUTER JOIN abrasif aa on lr.ref = aa.ref
WHERE br.[N° RECEPT] = lr.[N° RECEPT]
AND lr.ref = a.ref;
Il te reste alors à ajouter un AND pour filtrer sur la date ou des numéros et tu auras ta liste.

Mais je persiste : tes tables Disque & Abrasif sont une véritable hérésie. Ça frise la faute professionnelle.

Si tu avais une table supplémentaire Famille ou Catégorie qui liste familles ou catégories et des zones supplémentaires dans Article où soient stockées la famille ou catégorie, la désignation et toutes les caractéristiques supportables par tes différentes familles ou catégories (ie la catégorie DISQUE a 8 attributs numériques alors qu'Abrasif en a 12, ça te donne 12 attributs numériques dans Article), la requête est alors
SELECT qte, designation, observation
FROM [Bon de Reception] br, [Ligne Reception] lr, article a
WHERE br.[N° RECEPT] = lr.[N° RECEPT]
AND lr.ref = a.ref;
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57002 internautes nous ont dit merci ce mois-ci

Messages postés
16
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
5 février 2011

Salut,

Tout d'abord je te remercie pour les réponses à mes questions et pour ton effort, et après la saisie de la 1ère requête le compilateur a détecté cette erreur:
"L'identificateur en plusieurs parties "lr.ref" ne peut pas être lié."

au niveau du:
LEFT OUTER JOIN disque dd on lr.ref = dd.ref
LEFT OUTER JOIN abrasif aa on lr.ref = aa.ref

A ton avis, quelle est l'origine de cette erreur ?

Merci d'avance.
Salut,

Avant de formuler une réponse, il faut préciser
1. comment faire le lien entre [N° LIG RECPT] & [N° RECEPT]
2. à quoi servent les tables Disque & Abrasif ?
Messages postés
16
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
5 février 2011

1. Un Bon de réception contient juste Le N° et la date de réception du stock, mais les autres informations (càd la Qté et la désignation des articles) doivent être mentionnées dans une ou plusieurs Ligne réception.

2. Les tables "Disque" & "Abrasif" sont deux types différents d'article. (notion d'héritage)

je pense que tout est clair maintenant, et à vous de jouer !!!
Messages postés
6745
Date d'inscription
jeudi 2 février 2006
Statut
Contributeur
Dernière intervention
31 juillet 2016
1 371
Dans ce cas, comment savoir à quel bon de commande appartiennent les lignes réception ? Il ne manquerait pas une clé étrangère dans la table "ligne réception" pour faire le lien avec les bons de commande ?
Messages postés
16
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
5 février 2011

T'as raison mais l'application ne permet pas de gérer les bons de commande envoyés, je gère que les Bons de commande reçus par les clients et les bons de Réception et Sortie de stock. Donc j'ai pas de relation entre le bon de commande et le bon de Réception.
Salut,

J'ai quand même un peu peur de t'aiguiller sur une mauvaise voie. As-tu aussi prévu une table Lubrifiant ? et une table Mèche ? et une table Visserie ? et une table Joint ? et une table...

Avoue que ce serait dommage que l'on t'indique quelque chose et que ce ça s'envoie en l'air à cause d'une table que l'on ajoute
Messages postés
16
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
5 février 2011

Salut,

Y'as pas de raison te paniquer, j'ai seulement 4 types d'articles (qui n'ont pas les même caractéristiques) alors je dois les séparer en 4 tables et qui héritent de la table "Article".Pense-tu que c'est faux de raisonner comme ça ?
Salut,

Un jour, la société va s'agrandir. Et agrandira sa gamme au passage.
Comment le logiciel va-t-il digérer cette évolution ?

Traditionnellement, on se contente d'ajouter des attributs optionnels dans Article, voire de prévoir des attributs inutilisés aujourd'hui qui le seront plus tard. L'évolution ci-dessus passe alors par l'utilisation de ces attributs sur-numéraires, sans réécriture de code.
Messages postés
16
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
5 février 2011

Salut,

Je te remercie pour tes conseils, mais l'essentiel n'était pas fait jusqu'à maintenant, j'ai encore besoin de la requête SQL demandée si-dessus... tu peux m'aider ou non ?
Salut,

C'était une réponse à la question "Pense-tu que c'est faux de raisonner comme ça ?"

Quel que soit le schéma retenu, il faut de toute façon pouvoir établir un lien entre un bon de réception et une ligne d'un bon de réception : si je prends une ligne au hasard dans ta table Ligne de réception, comment faire pour trouver le bon de réception auquel la ligne est rattachée ?
Messages postés
16
Date d'inscription
samedi 18 octobre 2008
Statut
Membre
Dernière intervention
5 février 2011

salut,

T'as raison, j'ai oublié de mettre une clé étrangère "N° RECEPT" dans la table "Ligne Reception" dans mon sujet sur ce forum, mais crois moi j'ai pas commis cette erreur dans ma base ;)
Messages postés
6745
Date d'inscription
jeudi 2 février 2006
Statut
Contributeur
Dernière intervention
31 juillet 2016
1 371
Je "plussoie" les commentaires faits plus haut : une requête SQL ne peut fonctionner que si l'analyse faite autour de la problématique est correcte. Les deux sont liés. Il faut donc commencer par la vérification de l'analyse, pour éviter d'avoir tout simplement de faux résultats dans les requêtes SQL.

Salut,

peut-être faut-il isoler les prédicats des join avec des parenthèses ?
SELECT qte
, '('
|| CASE WHEN dd.designation IS NULL THEN '' ELSE dd.designation END
|| CASE WHEN aa.designation IS NULL THEN '' ELSE aa.designation END
|| ')' desig
, observation
FROM [Bon de Reception] br, [Ligne Reception] lr, article a
LEFT OUTER JOIN disque dd on (lr.ref = dd.ref)
LEFT OUTER JOIN abrasif aa on (lr.ref = aa.ref)
WHERE br.[N° RECEPT] = lr.[N° RECEPT]
AND lr.ref = a.ref;


en fait, je travaille majoritairement avec DB2 qui est suffisamment intelligent pour ne pas avoir besoin de parenthèses et avec oracle ou j'utilise une syntaxe non standard mais bien plus simple.
Et là, honnêtement, je vois pas pourquoi tu te prends cette erreur !