Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Membre éprouvé
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    mai 2002
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 998
    Points : 440
    Points
    440

    Par défaut PB avec une requête

    Bonsoir,

    Je galère avec une petite requête :
    Code :
    1
    2
    3
    4
    5
    6
     
    SELECT Compose.code_article,
    max(Article.Stock_actuel / Compose.Quantite) as  QTE
    FROM  Article    INNER  JOIN  Compose
       ON  ( Article.code_article=Compose.code_element)  
    GROUP BY Compose.code_article
    Celle-ci me renvoie les lignes correctement mais si je rajoute un champ du côté gauche (Article) ce n'est pas bon. J'ai bien essayé en vain avec LEFT/RIGHT. C'est une BD paradox donc trés limitée en SQL.

    Merci pour votre aide .

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 628
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 5 628
    Points : 13 737
    Points
    13 737

    Par défaut

    Pour pouvoir t'aider, il faudrait que tu décrives un peu plus concrètement en quoi "ce n'est pas bon".
    Un message d'erreur ? Un résultat différent de celui que tu attends ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    mai 2002
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 998
    Points : 440
    Points
    440

    Par défaut

    Excusez moi de ne pas avoir été plus précis.
    Avec cette requête le résultat est correct , et, comme je l'ai dis, si je
    rajoute un champ du côté gauche (Article) pour récuperer une information supplémentaire j'obtiens toute les lignes de la table de droite (compose) donc résultat différent. Ce que je souhaiterais, c'est de conserver le résultat de la requête.

    Et désolé de ne pas avoir poster dans le bon forum

    Merci.

  4. #4
    Rédacteur/Modérateur
    Avatar de SergioMaster
    Homme Profil pro Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 408
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 408
    Points : 10 601
    Points
    10 601
    Billets dans le blog
    1

    Par défaut

    Il faudrait savoir exactement ce que tu désires , et pour cela la description des tables serait un atout .
    le champ à gauche , c'est pas très clair
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  5. #5
    Membre éprouvé
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    mai 2002
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 998
    Points : 440
    Points
    440

    Par défaut

    Bonjour,

    Alors les tables les voici :

    Table Article :
    --------

    code_article
    nom_article
    stock_actuel
    pu_vente
    .............
    .............


    Table Compose :
    ----------

    code_element (c'est le code article de la table article)
    code_article
    quantite

    Et encore pour être plus clair , voici les lignes de la table COMPOSE d'oû je n'aimerais extraire que les lignes du code_article et pas en doublon et de diviser le stock_actuel de la ligne ARTICLE par la quantite de la ligne COMPOSE:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    ID      CODE_ARTICLE  CODE_ELEMENT  QUANTITE
    --      --------------  --------------   ---------- 
     
    1	0007	             0009	         1
    2	0007              	0010               1
    3	0007	             0011	         1
    4	0017	             0009 	         1
    5	0017	             0016	         1

    Avec la requête que j'ai poster ca donne ce résultat qui est correct :

    Code :
    1
    2
    3
    4
    5
    6
     
     
    CODE_ARTICLE    QTE
    --------------    ----
       0007	             3
       0017	             5
    Mais lorsque je rajoute dans la requête le nom_article de la table ARTICLE ca me donne toutes les lignes qu'il y a dans la table COMPOSE ce n'est pas le résultat attendu:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    code_art  nom_art                           QTE
    --------  -------                            -----
    0007	  Disque dur 40 Go	               17
    0007	  Imprimante Laser lexmark      7	 
    0007	  Lecteur CD/DVD	                3
    0017	  Imprimante Laser lexmark      7	
    0017	  TwinMOS Mobile Disk III        5
    Merci

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations forums :
    Inscription : mars 2006
    Messages : 84
    Points : 68
    Points
    68

    Par défaut

    Bonjour Freud,

    Je pense que lorsque tu ajoutes un champ de la table article tu oublies de le mentionner dans la ligne GROUP_BY.

    Il y a une règle sql: "When GROUP_BY exists, every simple field in projectors must be in GROUP_BY".

    Essaie cette syntaxe:

    Code :
    1
    2
    3
    4
    5
    6
     
    SELECT Compose.code_article, Article.stock_actuel,
    max(Article.Stock_actuel / Compose.Quantite) AS  QTE
    FROM  Article    INNER  JOIN  Compose
    	ON  ( Article.code_article=Compose.code_element)  
    GROUP BY Compose.code_article,article.stock_actuel
    Bonne journée.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    mai 2002
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 998
    Points : 440
    Points
    440

    Par défaut

    marche pas je l'ai déjà essayer...
    Merci quand même .

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations forums :
    Inscription : mars 2006
    Messages : 84
    Points : 68
    Points
    68

    Par défaut

    Salut Freud,

    Donne s.t.p. les enregistrements concernés par ton query pour la table ARTICLE, comme tu l'as fait por la table COMPOSE dans ton 1er tableau.

    Donne aussi la syntaxe du sql qui ne marche pas. J'essaierai de le reproduire et le résoudre.

    A bientôt.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    mai 2002
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 998
    Points : 440
    Points
    440

    Par défaut

    Salut



    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    ID        CODE_ART   NOM_ART                   STOCK_ACTUEL      COMPOSE
    --         --------      -------                        ------------          -------    
     
    1	0001	NOKIA MOBILE            	 0		False
    2	0002	Pompe à huile	 	 0		False
    3	0003	Plaquettes 		 10009		False
    4	0004	Pompe à vide		  0		False
    5	0005	Chemise piston		  12		False
    6	0006	Chambre à air 		  52		False
    7	0007	Micro Ordi		  5		True
    8	0008	Canon PIXMA		  6		False
    9	0009	Imprimante 		  6		False
    10	0010	Disque dur 		 16		False
    11	0011	Lecteur CD/DVD	 	 2		False
    12	0012	Micro processeur 	              5		False
    13	0013	Clavier          	              4		False
    14	0014	GRAVEUR CD-DVD	 	 3		False
    15	0015	Imprimante Laser 	             7		False
    16	0016	TwinMOS Mobile   	             5		False
    17	0017	Ordinateur portable    	 3		True
    18	0018	Carte mère		99		False
    19	0019	Appareil photo 		19		False
    Voici les enregistrements de la table ARTICLE ce n'est pas toute la table parce qu'elle est volumineuse en champs je ne post que le nécéssaire avec un champ boolean en plus qui determine si l'article se trouve dans la table COMPOSE et désolé j'aurais dû mentionner ce champ au début du post mais je n'ai pas juger utile parce que j'ai en vain essayer avec ce champ en faisant un WHERE Article.compose=true.

    Je reprend depuis le début. J'ai deux articles le 0007 et le 0017 dont chaqu'un possede un ou plusieurs element qui le compose situé dans la table COMPOSE.

    Si par exemple le 0007 possede 3 elements je dois recupere le stock_actuel de ces element (qui sont aussi des articles ) depuis la table ARTICLE et le diviser par la quantite de ces elements dont la quantite est recupere depuis COMPOSE

    Code :
    1
    2
     
    ARTICLE.STOCK_ACTUEL/COMPOSE.QUANTITE
    Donc il y'aura des lignes de résultat et là je dois recuperer soit le Minimum soit le Maximum de ces lignes en faisant :

    Code :
    1
    2
     
    MAX(ARTICLE.STOCK_ACTUEL/COMPOSE.QUANTITE)
    Code :
    1
    2
    3
    4
    5
    6
     
    SELECT Compose.code_article,
    max(Article.Stock_actuel / Compose.Quantite) AS  QTE
    FROM  Article    INNER  JOIN  Compose
       ON  ( Article.code_article=Compose.code_element)  
    GROUP BY Compose.code_article
    Avec ce resultat qui est correct (les infos ont changer depuis le premier post parce je viens de travail sur la BDD) :
    Code :
    1
    2
    3
    4
    5
    6
     
     
    CODE     QTE
    -----     ----
    0007	16
    0017	6
    Donc en essayant de recuperer le nom_article ou autre depuis la table ARTICLE c'est que le resultat est incorrect qui renvois toutes les enregistrements de COMPOSE.

    C'est peut-être tordu mais si y a pas de solution j'opterais pour un ALTER ADD/DROP c'est juste un calcul à faire temporairement.

    Merci.

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations forums :
    Inscription : mars 2006
    Messages : 84
    Points : 68
    Points
    68

    Par défaut

    Salut Freud,

    je viens de tester avec tes données et ma syntaxe regarde les différences:

    1. ajout nom_art dans la liste SELECT
    2. ajout nom_art dans la clause GROUP_BY
    3. chengement clause ON ( Article.code_article=Compose.code_article)

    Dans mon Paradox ca marche normalement.

    J'ajoute les 4 contenus: les 2 tables avec tes données + mon sql et le résultat.

    TABLE COMPOSE SIMPLIFIEE
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    ID	CODE_ARTICLE	QUANTITE	CODE_ELEMENT
     
    1	7	1	9
    2	7	1	10
    3	7	1	11
    4	17	1	9
    5	17	1	16

    TABLE ARTICLE SIMPLIFIEE
    Code :
    1
    2
    3
    4
    5
     
    ID	CODE_ARTICLE	STOCK_ACTUEL	NOM_ART
     
    7	7	5	MICRO ORDI
    17	17	3	ORDINATEUR PORTABLE
    SQL
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /*
    Alias: WORK
    LiveAnswer: FALSE
    */
     
    SELECT Compose.code_article,Article.nom_art,
    max(Article.Stock_actuel / Compose.Quantite) AS  QTE
    FROM  Article    INNER  JOIN  Compose
       ON  ( Article.code_article=Compose.code_article)  //regarde cette clause dans ta version
    GROUP BY Compose.code_article,Article.nom_art
    RESULTAT DE PARADOX
    Code :
    1
    2
    3
    4
    5
     
    CODE_ARTICLE	NOM_ARTICLE	QTE
     
    7	MICRO ORDI		5
    17	ORDINATEUR PORTABLE	3
    Dis nous si ceci résoud le problème.
    Bonne chance !

  11. #11
    Membre éprouvé
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    mai 2002
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 998
    Points : 440
    Points
    440

    Par défaut

    Salut FDR2006,

    c'est vrai que ca donne les lignes escomptés mais malheureusement pas les bonnes quantités je suis tombé sur cette variante d'ailleurs si tu change le MIN par le MAX tu devrais avoir les bonnes lignes mais toujours pas les quantités. En fait, ces elements dans la table COMPOSE ce sont eux mêmes des articles qui figurent dans la table ARTICLE et qui compose un article lors d'un assemblage le champ quantité dans COMPOSE c'est la quantité nécéssaire pour assemblé un article composer.
    Par exemple, pour assembler un article je dois rechercher la quantité minimale
    du stock physique parmi les elements qui le composent pour que je puisse assembler.

    Je reprend cette table COMPOSE :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    ID      CODE_ARTICLE  CODE_ELEMENT        QUANTITE
    --      --------------  --------------   ---------- 
     
    1	0007	             0009	         2
    2	0007                   0010                1
    3	0007	             0011	         1
    4	0017	             0009 	         1
    5	0017	             0016	         1
    je voudrais savoir combien je peux assembler pour l'article 0007 qui est
    composé de 3 eléments qui se trouve dans la table ARTICLE comme
    suit :
    Code :
    1
    2
    3
    4
    5
    6
     
         CODE_ARTICLE     STOCK_PHYSIQUE
        --------------  --------------   
    	0009	              6	        
    	0010                   11                
    	0011	              4
    Je ne pourrais assembler que 3=6/2 (element 0009) unités pour 0007 bien que
    j'ai du stock superieurs chez d'autres éléments.
    Parce que, pour assembler plus de 3 ou 10 il en faudrait plus de 3 chez l'element 0009.

    Merci beaucoup de t'être penché sur mon problème mais faut pas trop s'archarné dessus, je vais opter pour une autre solution.

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations forums :
    Inscription : mars 2006
    Messages : 84
    Points : 68
    Points
    68

    Par défaut

    Salut,

    Dernières infos:

    1. Si tu as un query sql qui te donne les Q correctes et qui contient le Code_Art de la table Articles il est très facile de passer un deuxième query qui ajoute les intitulés avec un simple join. Ceci seulement dans le but d'eviter la recherche du query unique qui le fasse. Parfois il est plus utile, bien que mois élegant, de passer deux queries quand la perfo n'est pas un facteur limitatif, que passer une demie journée de travail à trouver "le" query. Souviens toi que les tables temporaires qui commencent par __tblName.db et sont écrites dans l'alias PRIV sont éffacées automatiquement par Paradox à la sortie. Très utile pour ne pas accumuler des temporaires.

    2. Query est le coeur de Paradox: un structure très rapide aussi bien à la programmation qu'à la performance. Donc on doit programmer par query tant que possible, avant de choisir des autrres structures (scan, for, while, avec Tcursors etc).

    Bonne chance!

  13. #13
    Membre éprouvé
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    mai 2002
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 998
    Points : 440
    Points
    440

    Par défaut

    Salut FDR2006,

    Effectivement, pourquoi chercher toujours la perf. pour regler un petit problème .....??? C'est tellement devenue une idée fixe de chercher à bien faire que l'on perd enormement de temps en passant à côté de l'essentiel.

    Ok pour une deuxieme query elle fera l'affaire.

    Merci pour les infos FDR2006.

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations forums :
    Inscription : mars 2006
    Messages : 84
    Points : 68
    Points
    68

    Par défaut

    Salut,

    et tout à fait d'accord.

    Un plaisir de te rencontrer, et à bientôt!

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •