Exportar las combinaciones de productos en Prestashop con una query SQL 9


Cuando necesitamos actualizar gran número de productos en un Prestashop, tenemos tres alternativas:

  1. Actualizar producto a producto, lo cual es pesadísimo e ineficiente.
  2. Utilizar algún módulo de edición masiva de productos para Prestashop, o de manera similar, algún programa externo que se conecta a la base de datos y nos permite realizar cambios en una tabla a modo de hoja de cálculo.
  3. Usar directamente una hoja de cálculo, es decir, exportando los datos de los productos, hacer las modificaciones en la hoja de cálculo, y volviendo a importar los datos al catálogo de productos de Prestashop.

Esta última opción es la que personalmente más me gusta.
A poco que sepamos usar una hoja de cálculo de LibreOffice/OpenOffice, o un Excel de MS-Office, podremos realizar cualquier tipo de modificación, aplicar macros o formulas de una manera flexible y sin limitaciones.
Aunque hay que ser cuidadoso para no cambiar información que no queremos alterar.

 

Sorprendentemente Prestashop 1.6.x incorpora la funcionalidad de importar los datos de una hoja de cálculo en fomato CSV, pero no tiene la funcionalidad inversa, es decir, exportar a un CSV los datos de los productos y sus combinaciones.

Se pueden encontrar algún módulo gratuito o incluso alguna consulta sql para exportar los productos de una manera más o menos adecuada para, posteriormente, poder usar el importador de CSV. Sin embargo, para exportar las combinaciones de productos no he encontrado ninguna query SQL ni módulo gratis.

El formato requerido para crear un CSV con las combinaciones de productos necesita los siguientes 23 campos para poder ser incorporado de nuevo al catálogo de productos:

01º ID del producto
02º Referencia del producto
03º Atributo (Nombre:Tipo:Posición)*
04º Valor (Valor:Posición)*
05º Ref proveedor
06º Referencia
07º EAN13
08º UPC
09º Precio al por mayor
10º Impacto en el precio
11º Ecotasa
12º Cantidad
13º Cantidad mínima
14º Impacto en el peso
15º Por Defecto (0 = No, 1 = Si)
16º Fecha de disponibilidad de la combinación
17º Elegir entre imágenes de productos por posición (1,2,3…)
18º URL’s de las imágenes (x,y,z…)
19º Elimina las imágenes existentes (0 = no, 1 = si).
20º ID / Nombre de la tienda
21º Gestor avanzado de inventario
22º Dependiendo del stock
23º Almacén

En donde los campos 3º y 4º, que se corresponden con la lista de «Atributos» y sus «Valores» respectivos, que además de obligatorios, son complejos de obtener mediante una consulta SQL porque son una lista de elementos, separados por comas.

Así que aquí os dejo mi aportación en forma de query SQL mediante la cual se pueden obtener los primeros 6 campos:

SELECT pat.id_product
    , prd.reference
    , GROUP_CONCAT(DISTINCT(concat(atgl.name, ":", atg.group_type, ":", atg.position)) SEPARATOR ", ")
    , GROUP_CONCAT(DISTINCT(concat(pal.name, ":", atg.position)) SEPARATOR ", ")
    , pat.supplier_reference
    , pat.reference
 FROM ps_product_attribute pat
INNER JOIN ps_product prd ON (prd.id_product = pat.id_product)
 LEFT JOIN ps_product_attribute_combination pac ON (pat.id_product_attribute = pac.id_product_attribute)
 LEFT JOIN ps_attribute att ON (pac.id_attribute = att.id_attribute)
 LEFT JOIN ps_attribute_group atg ON ( atg.id_attribute_group = att.id_attribute_group)
 LEFT JOIN ps_attribute_group_lang atgl ON ( atgl.id_attribute_group = atg.id_attribute_group)
 LEFT JOIN ps_attribute_lang pal ON (pac.id_attribute = pal.id_attribute AND pal.id_lang = atgl.id_lang)
WHERE atgl.id_lang = 1
GROUP BY pat.id_product_attribute
ORDER BY pat.id_product, pac.id_attribute

 

El resto de campos, salen «casi» directamente de las tablas de prestashop, haciendo un par de outher joins con [ps_product_attribute_image] y [ps_image].

Es útil restringir la consulta a los productos de un determinado fabricante, por ejemplo para actualizar los precios de los productos según la nueva tarifa o el catálogo nuevo.

Y además hay que especificar el código del idioma que queramos usar.

 


¿Necesitas ayuda de un profesional en Prestashop para crear consultas SQL o manipular la BBDD?

Mándame un mensaje desde el formulario de Contacto.


Dejar un comentario

Para comentar has de leer y aceptar la Política de privacidad.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

9 ideas sobre “Exportar las combinaciones de productos en Prestashop con una query SQL

  • mariano

    Hola Feliciano, muy bueno el Tutorial!
    Solo queria preguntarte como puedo agregar ademas el stock disponible
    quisiera me salga id-nombre-atributo-referencia-precio-cantidad
    Gracias por el Aporte !!!!

  • jose

    Muchas gracias por la consulta, la uso para exportar mis combinaciones peeero el problema viene cuando intento que me muestre cada ean me lo repite una y otra vez..

    te dejo la consulta a ver si me puedes ayudar

    SELECT pat.id_product_attribute
    , prd.reference
    , pacc.ean13
    , pl.name
    , GROUP_CONCAT(DISTINCT(concat(pal.name)) SEPARATOR «, «) AS Talla_Color
    , pat.supplier_reference
    , pat.reference
    , pacco.wholesale_price As Precio_Compra
    , round( pacco.price*1.21, 2) As PVP
    , round( pacco.wholesale_price*1.36, 2) As PVP_Amazon_Minimo
    , pati.quantity AS Stock
    FROM ps_product_attribute pat
    INNER JOIN ps_product prd ON (prd.id_product = pat.id_product)
    LEFT JOIN ps_product_attribute_combination pac ON (pat.id_product_attribute = pac.id_product_attribute)
    LEFT JOIN ps_attribute att ON (pac.id_attribute = att.id_attribute)
    LEFT JOIN ps_product_lang pl ON (pat.id_product = pl.id_product)
    LEFT JOIN ps_stock_available pati ON (pat.id_product = pati.id_product)
    LEFT JOIN ps_product pacco ON pacco.id_product = pat.id_product
    LEFT JOIN ps_product_attribute pacc ON pacc.id_product = pat.id_product
    LEFT JOIN ps_attribute_group atg ON ( atg.id_attribute_group = att.id_attribute_group)
    LEFT JOIN ps_attribute_group_lang atgl ON ( atgl.id_attribute_group = atg.id_attribute_group)
    LEFT JOIN ps_attribute_lang pal ON (pac.id_attribute = pal.id_attribute AND pal.id_lang = atgl.id_lang)
    WHERE atgl.id_lang = 1
    GROUP BY pat.id_product_attribute
    ORDER BY pat.id_product, pac.id_attribute

    • FelicianoBV Autor

      Hola Jose,
      Sin lanzar esa query SQL -que al tener 10 Joins es compleja de analizar-,
      presupongo que te está dando el ean13 de cada uno de los attributos (combinaciones) del producto,
      lo cual es correcto porque cada combinación debería de tener un ean13 diferente.

      Mi consejo es que montes la query progresivamente, añadiendo 1 Join tras comprobar que el resultado es el correcto.
      Este tipo de querys sql son una locura si no haces aquello de «divide y vencerás».

    • Montse

      Hola, esta consulta me funciona casi correctamente pero por lo que veo el EAN no es el de cada combinación (cada combinación tiene su propio EAN) y a mi no me sale ninguno, por lo que entiendo que es porque me coge el EAN que no es el de las combinaciones. Me podéis ayudar a solucionarlo?

  • Lupi

    Buenas! A ver si alguien es capaz de resolverme esta gran duda.
    Hay un quantity en la tabla products.
    Hay un quantity en la tabla atributos.
    Hay un quantity en la tabla stock.
    No coinciden casi nunca.
    ¿WTF? Alguno sabe que es cada quantity.
    Me imagino que el de products es el que hay de un producto sin combinaciones. Pero y los otros dos?!?!?

    Gracias chicos!
    (Presta 1.5.4.1 pero creo que en versiones superiores también pasa)

  • Ale

    Hola he visto varios foros que dan solucion ala exportacion de productos y combinaciones pero a mi todas las consultas me marcan un error

    Error indefinido «checkedForm»

    he busado solucion sin encontrar nada, tendras alguna sugerencia para mi?