Trimph31 Posted June 6, 2020 Share Posted June 6, 2020 Bonjour à tous, Suite au bogue/fonctionnalité sur la création d'un nouveau transporteur à chaque modif de celui-ci, je souhaiterais modifier l'écran Commandes back-office, afin de corriger la requête SQL qui filtre sur le transporteur. Par contre, je n'ai pas trouvé où modifier mon code (la clause Where). Merci de votre aide Link to comment Share on other sites More sharing options...
doekia Posted June 6, 2020 Share Posted June 6, 2020 Et si tu mettait ta requête? Et si tu nous disais sur quelle version tu travailles? Et si tu nous expliquais ce que tu entends par bug de la création des transporteurs ? Link to comment Share on other sites More sharing options...
Trimph31 Posted June 6, 2020 Author Share Posted June 6, 2020 7 minutes ago, doekia said: Et si tu mettait ta requête? Et si tu nous disais sur quelle version tu travailles? Et si tu nous expliquais ce que tu entends par bug de la création des transporteurs ? Et si tu commençais tes phrases par "bonjour" ? Effectivement, je vais détailler un peu. Je suis sur une 1.7.5.1 Mon client avait fait rajouter dans le tableau standard de liste des commandes la colonne Transporteur : lorsque l'utilisateur filtre par transporteur, une clause "id_carrier = <l'id sélectionné>" est rajoutée dans le WHERE. Ce que je qualifie de "bogue", c'est le fait que lorsque l'on effectue une modification sur un transporteur --> résultat, avec le filtre sur l'ID effectué actuellement, PS ne remonte que les commandes correspondant au dernier ID et pas à tous les précédents. Je suis en train de réaliser en écrivant que mon client a un dev spécifique sur sa liste des commandes, donc je comprendrais qu'il n'y ait pas de réponse à ma question Link to comment Share on other sites More sharing options...
doekia Posted June 7, 2020 Share Posted June 7, 2020 Il y a 16 heures, Trimph31 a dit : Et si tu commençais tes phrases par "bonjour" ? ?!? Il y a 16 heures, Trimph31 a dit : Ce que je qualifie de "bogue", c'est le fait que lorsque l'on effectue une modification sur un transporteur --> résultat, avec le filtre sur l'ID effectué actuellement Ce n'est pas un bug, c'est le seul moyen de maintenir l'intégrité des changements. Tu n'as qu'a baser ton filtre sur la bonne valeur dans ton critère (ici id_reference) Il y a 16 heures, Trimph31 a dit : Et si tu commençais tes phrases par "bonjour" ? Et si tu avais commencé par faire des recherches sérieuses, tu te serais aperçu que cette problématique a été abordée plusieurs fois et que les réponses appropriées ont été apportées Link to comment Share on other sites More sharing options...
Trimph31 Posted June 7, 2020 Author Share Posted June 7, 2020 1 minute ago, doekia said: Quote Ce n'est pas un bug, c'est le seul moyen de maintenir l'intégrité des changements. Tu n'as qu'a baser ton filtre sur la bonne valeur dans ton critère (ici id_reference) J'ai bien compris l'intérêt fonctionnel, sauf que si je souhaite connaitre la liste de toutes les commandes d'un transporteur donné, je ne vois pas comment faire autrement qu'un SELECT dans la liste de ses id successifs. Je ne vois pas d'ailleurs ce que id_reference vient faire là ?? En gros, ce que je souhaite faire, c'est un (schématiquement) : SELECT id_order, <...> FROM ps_orders WHERE id_carrier in (select id_carrier FROM ps_carrier WHERE name=<celui choisit dans mon filtre>) Mais je ne vois pas où le faire Et si tu avais commencé par faire des recherches sérieuses, tu te serais aperçu que cette problématique a été abordée plusieurs fois et que les réponses appropriées ont été apportées Je pense avoir quand même pas mal recherché avant de poster, mais j'ai pu passer à côté, désolé. Link to comment Share on other sites More sharing options...
doekia Posted June 7, 2020 Share Posted June 7, 2020 Peut-être commencer à lire avant de bondir sur des remarques concernant les bisous qui te manquent. il y a 17 minutes, doekia a dit : Tu n'as qu'a baser ton filtre sur la bonne valeur dans ton critère (ici id_reference) id_reference Link to comment Share on other sites More sharing options...
Trimph31 Posted June 7, 2020 Author Share Posted June 7, 2020 2 minutes ago, doekia said: Peut-être commencer à lire avant de bondir sur des remarques concernant les bisous qui te manquent. id_reference Oula, on se calme !!!! Il faut pas être stressé comme ça, on finit par raconter n'importe quoi après, et parler de "bisous qui manquent" J'ai bien lu ton conseil : je dois être buté mais, encore une fois, je ne vois pas en quoi le id_reference va m'aider pour mon besoin (qui est, je le rappelle, d'avoir la liste de toutes les commandes d'un même transporteur, quels que soient ses id successifs). Link to comment Share on other sites More sharing options...
doekia Posted June 7, 2020 Share Posted June 7, 2020 il y a 1 minute, Trimph31 a dit : Oula, on se calme !!!! c'est bien ça ton problème. Il y a 17 heures, doekia a dit : Et si tu mettait ta requête? Link to comment Share on other sites More sharing options...
Trimph31 Posted June 7, 2020 Author Share Posted June 7, 2020 2 minutes ago, doekia said: c'est bien ça ton problème. Mais moi, je n'ai aucun problème, doekia Ma requête (avec en gras la partie que je souhaite remplacer par un SELECT IN) : SELECT SQL_CALC_FOUND_ROWS a.`id_order`, `reference`, `total_paid_tax_incl`, `payment`, a.`date_add` AS `date_add` , a.id_currency, a.id_order AS id_pdf, a.id_carrier, carrier.name as crname, CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`, osl.`name` AS `osname`, os.`color`, IF((SELECT COUNT(so.id_order) FROM `ps_orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new, country_lang.name as cname, IF(a.valid, 1, 0) badge_success, shop.name as shop_name FROM `ps_orders` a LEFT JOIN `ps_customer` c ON (c.`id_customer` = a.`id_customer`) INNER JOIN `ps_address` address ON address.id_address = a.id_address_delivery INNER JOIN `ps_carrier` carrier ON carrier.id_carrier = a.id_carrier INNER JOIN `ps_country` country ON address.id_country = country.id_country INNER JOIN `ps_country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = 1) LEFT JOIN `ps_order_state` os ON (os.`id_order_state` = a.`current_state`) LEFT JOIN `ps_order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1) LEFT JOIN `ps_shop` shop ON a.`id_shop` = shop.`id_shop` WHERE 1 AND carrier.`id_carrier` = 504 AND a.id_shop IN (1) ORDER BY a.id_order DESC LIMIT 0, 50 Une idée comme ça : remplacer le carrier.id_carrier par le carrier.name, et rajouter un Index en BDD sur cette colonne... Link to comment Share on other sites More sharing options...
doekia Posted June 7, 2020 Share Posted June 7, 2020 SELECT SQL_CALC_FOUND_ROWS a.`id_order`, `reference`, `total_paid_tax_incl`, `payment`, a.`date_add` AS `date_add` , a.id_currency, a.id_order AS id_pdf, a.id_carrier, carrier.name as crname, CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`, osl.`name` AS `osname`, os.`color`, IF((SELECT COUNT(so.id_order)FROM `ps_orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new, country_lang.name as cname, IF(a.valid, 1, 0) badge_success, shop.name as shop_name FROM `ps_orders` a LEFT JOIN `ps_customer` c ON (c.`id_customer` = a.`id_customer`) INNER JOIN `ps_address` address ON address.id_address = a.id_address_delivery INNER JOIN `ps_carrier` carrier ON carrier.id_carrier = a.id_carrier INNER JOIN `ps_country` country ON address.id_country = country.id_country INNER JOIN `ps_country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = 1) LEFT JOIN `ps_order_state` os ON (os.`id_order_state` = a.`current_state`) LEFT JOIN `ps_order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1) LEFT JOIN `ps_shop` shop ON a.`id_shop` = shop.`id_shop` INNER JOIN `ps_carrier` carrier2 ON carrier2.id_reference = carrier.id_reference WHERE 1 AND carrier.`id_carrier` = 504 AND a.id_shop IN (1) ORDER BY a.id_order DESC LIMIT 0, 50 PS: les LEFT JOIN sur ps_shop et ps_customer auraient avantage à être des INNER JOIN Link to comment Share on other sites More sharing options...
Trimph31 Posted June 7, 2020 Author Share Posted June 7, 2020 Bon ben finalement, en faisant mon WHERE sur le carrier.name et en rajoutant un INDEX en BDD, ça répond à mon besoin, même si ce n'est probablement pas optimisé : SELECT SQL_CALC_FOUND_ROWS a.`id_order`, `reference`, `total_paid_tax_incl`, `payment`, a.`date_add` AS `date_add` , a.id_currency, a.id_order AS id_pdf, ca.name as crname, CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`, osl.`name` AS `osname`, os.`color`, IF((SELECT COUNT(so.id_order) FROM `ps_orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new, country_lang.name as cname, IF(a.valid, 1, 0) badge_success, shop.name as shop_name FROM `ps_orders` a LEFT JOIN `ps_customer` c ON (c.`id_customer` = a.`id_customer`) INNER JOIN `ps_address` address ON address.id_address = a.id_address_delivery INNER JOIN `ps_carrier` ca ON ca.id_carrier = a.id_carrier INNER JOIN `ps_country` country ON address.id_country = country.id_country INNER JOIN `ps_country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = 1) LEFT JOIN `ps_order_state` os ON (os.`id_order_state` = a.`current_state`) LEFT JOIN `ps_order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1) LEFT JOIN `ps_shop` shop ON a.`id_shop` = shop.`id_shop` WHERE 1 AND ca.`name` LIKE '%Courrier suivi%' AND a.id_shop IN (1) ORDER BY a.id_order DESC LIMIT 0, 50 Link to comment Share on other sites More sharing options...
Trimph31 Posted June 7, 2020 Author Share Posted June 7, 2020 1 minute ago, doekia said: SELECT SQL_CALC_FOUND_ROWS a.`id_order`, `reference`, `total_paid_tax_incl`, `payment`, a.`date_add` AS `date_add` , a.id_currency, a.id_order AS id_pdf, a.id_carrier, carrier.name as crname, CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`, osl.`name` AS `osname`, os.`color`, IF((SELECT COUNT(so.id_order)FROM `ps_orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new, country_lang.name as cname, IF(a.valid, 1, 0) badge_success, shop.name as shop_name FROM `ps_orders` a LEFT JOIN `ps_customer` c ON (c.`id_customer` = a.`id_customer`) INNER JOIN `ps_address` address ON address.id_address = a.id_address_delivery INNER JOIN `ps_carrier` carrier ON carrier.id_carrier = a.id_carrier INNER JOIN `ps_country` country ON address.id_country = country.id_country INNER JOIN `ps_country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = 1) LEFT JOIN `ps_order_state` os ON (os.`id_order_state` = a.`current_state`) LEFT JOIN `ps_order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1) LEFT JOIN `ps_shop` shop ON a.`id_shop` = shop.`id_shop` INNER JOIN `ps_carrier` carrier2 ON carrier2.id_reference = carrier.id_reference WHERE 1 AND carrier.`id_carrier` = 504 AND a.id_shop IN (1) ORDER BY a.id_order DESC LIMIT 0, 50 PS: les LEFT JOIN sur ps_shop et ps_customer auraient avantage à être des INNER JOIN J'en prends note et je vais rectifier, merci doekia. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now