Jump to content
Trimph31

[RESOLU] Modifier filtre sur l'écran back-office des Commandes

Recommended Posts

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

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites
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 :mellow:

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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 :mellow:

 

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é.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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). 

 

Share this post


Link to post
Share on other sites
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?

 

Share this post


Link to post
Share on other sites
2 minutes ago, doekia said:

c'est bien ça ton problème.

 

Mais moi, je n'ai aucun problème, doekia :D

 

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... 

 

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More