Jump to content

Problême requête admintab [resolu]


Recommended Posts

       Bonjours, je viens de migrer un module que j'ai créé sur prestashop 1.4.4.1 vers une version 1.5.6.1 multiboutique. Quasiment tout est fonctionnel maintenant excepté qu'une requête générée automatiquement par mon onglet d'administration me renvoi un doublon. Je n'ai pas accés directement à la base de donnée en production mais par le biais de requêtes j'ai pu vérifier que la donée en question n'est pas en double dans la base. J'ai beaucoup de mal à trouver des informations sur le mecanisme multishop mais je le soupsconne fortement d'être impliqué (le site sur lequel je travail contenant deux boutiques).

    Je ne sais pas si ces informations seront suffisantes mais j'espère que ça éveillera une sensation de déjà vu chez quelqu'un... En espérant fournir quelques information complémentaires voici la requête générée par mon admintab (j'ai modifié temporairement la classe admintabcore pour qu'elle l'affiche):

 

SELECT SQL_CALC_FOUND_ROWS

     a.*,

     a.id_supplier,

     b.id_order,

    concat(d.firstname,' ', d.lastname) as 'client',

    f.name,

    b.product_quantity,

    truncate(e.wholesale_price, 2) as wholesale,

    e.EAN13,

    e.reference,

    substring(c.date_add, 1, 10) as date,

    h.state_color as color

FROM `ps_jit_order_detail_history` a

    JOIN `ps_order_detail` b ON a.id_order_detail=b.id_order_detail

    JOIN `ps_orders` c ON b.id_order=c.id_order

    JOIN `ps_customer` d ON c.id_customer=d.id_customer

    JOIN `ps_product` e ON b.product_id=e.id_product

    JOIN `ps_product_lang` f ON e.id_product=f.id_product && f.id_lang=1

    JOIN `ps_jit_order_detail_state` h ON a.id_order_detail_state=h.id_order_detail_state

WHERE 1

      && a.change_date=(SELECT max(change_date)

                                       FROM `ps_just-in-time_order_detail_history` g

                                       WHERE a.id_order_detail=g.id_order_detail)

      && a.id_supplier=3

ORDER BY `date` DESC

LIMIT 0,50

 

Et voici le résultat qui est un tableau comportant deux fois la même chose :

 

 

array(2)

{ [0]=> array(16)

{

       ["id_order_detail_history"]=> string(1) "4"

       ["id_order_detail"]=> string(2) "23"

       ["id_employee"]=> string(1) "8"

       ["id_order_detail_state"]=> string(1) "1"

       ["change_date"]=> string(19) "2013-11-28 11:51:07"

       ["id_supplier"]=> string(1) "3"

       ["comment"]=> NULL

       ["id_order"]=> string(1) "4"

       ["client"]=> string(14) "Obi Wan Kenobi"

       ["name"]=> string(56) "Produit 1"              

       ["product_quantity"]=> string(2) "15"

       ["wholesale"]=> string(4) "4.50"

       ["EAN13"]=> string(13) "0000000000000"

       ["reference"]=> string(9) "ZZZ-25318"

       ["date"]=> string(10) "2013-11-28"

       ["color"]=> string(7) "#daceff"

}

[1]=> array(16)

{

       ["id_order_detail_history"]=> string(1) "4"

       ["id_order_detail"]=> string(2) "23"

       ["id_employee"]=> string(1) "8"

       ["id_order_detail_state"]=> string(1) "1"

       ["change_date"]=> string(19) "2013-11-28 11:51:07"

       ["id_supplier"]=> string(1) "3" ["comment"]=> NULL

       ["id_order"]=> string(1) "4"

       ["client"]=> string(14) "Obi Wan Kenobi"

       ["name"]=> string(56) "Produit 1"

       ["product_quantity"]=> string(2) "15"

       ["wholesale"]=> string(4) "4.50"

       ["EAN13"]=> string(13) "0000000000000"

       ["reference"]=> string(9) "ZZZ-25318"

       ["date"]=> string(10) "2013-11-28"

       ["color"]=> string(7) "#daceff"

}

}

 

Voilà, je doute que ces informations soient réellement suffisantes mais qui ne tente rien n'a rien... Merci à ceux qui prendront le temps de survoler mon problème.

Edited by DamnedHippie (see edit history)
Link to comment
Share on other sites

Perso je mettrais SELECT * ... pour voir l'ensemble des champs et voir les différences entre ces 2 résultats, là on ne peut pas la voir.

Si c'est un problème de id_shop (certainement le cas vu que tu as 2 boutiques et 2 résultats) si suffira de le rajouter dans les conditions 

Link to comment
Share on other sites

Merci d'avoir pris du temps pour m'aider... malheureusement cette requête est générée automatiquement (à partir des attribut _select, _join, _where etc de mon admintab) et commence déjà par select a.*. J'ai vérifié à la main dans mes tables (avec select *) et elles ne contiennent pas de doublons. Je vais quand même creuser cette histoire de boutique... sinon je devrais avoir les codes d'accès à la base de donnée demain. En tous cas merci encore...

Link to comment
Share on other sites

Problème trouvé: il provenait indirectement du multishop. Ma jointure sur ps_product_lang est filtrée par la clause "ON e.id_product=f.id_product && f.id_lang=1" qui ne suffit plus en cas de multiboutique parce que le multiboutique permet de stocker un texte différent par langue et par boutique. C'est le fait que dans mon cas les textes sont les mêmes dans les deux boutiques qui m'a piegé. Je ne sais pas encore comment je vais solutionner ça parce que ma requête doit travailler sur les deux boutiques mais c'est un autre sujet et ça ne devrait pas trop poser de problèmes. Merci encore coeos.pro bonne continuation

Link to comment
Share on other sites

id_lang=1 est déjà présent et renvoi une ligne par boutique. La solution que j'ai utilisé consiste à ne choisir que la première ligne renvoyée en cas de doublon (sans mettre id_shop=x parce que je souhaite avoir les résultats même s'ils viennent de boutique différente). Pour implémenter cette solution j'ai remplacé la jointure sur la table product_lang d'origine

"JOIN `ps_product_lang` f ON e.id_product=f.id_product && f.id_lang=1" par celle-ci:

                            JOIN `ps_product_lang` f ON e.id_product=f.id_product 
                                                                    && f.id_lang=1
                                                                    && f.id_shop=(SELECT id_shop
                                                                      FROM `ps_product_lang` h
                                                                      WHERE e.id_product=f.id_product
                                                                            && f.id_lang=1
                                                                      LIMIT 1,1)

Tout fonctionne trés bien maintenant... bonne continuation.

Link to comment
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...