Как у 50 000 товаров удалить пустые артикулы?

При импорте постоянно создаются новые артикулы, в которых не прописывается "артикул товара". Как создавать файлы знаю, занимаюсь на протяжении многих лет этим сама. при ОДИНАКОВЫХ размерах (наименованиях артикула) все равно создаются дубли, и ничего сделать нельзя. Если бы они просто висели и не затрагивали витрину - Бог бы с ними. Но. то что есть по факту - выводится как ноль на складе из-за создавшегося дубля.

У 700 товаров 822 лишних строки по отчету импорта. Вручную вряд ли это осилить.

Это скрин магазина. Так же, другой товар имеет похожую ситуацию, но товар в строках дублях: в одной ноль, в другой 5 штук, а клиенту все равно показывается ноль.


Кто знает чем помочь, и что можно сделать?

а ниже картинка из админки

2 ответа

  • 1
    Михаил Ушенин Webasyst 18 марта 2016 07:51 #

    Для подробного изучения вашей ситуации потребуется детальное тестирование при использовании предоставленных вами материалов (CSV-файлов, дампа базы данных, снимков экрана). Для выполнения расширенной диагностики обратитесь в службу поддержки Webasyst из своего Центра заказчика.

    • +1
      Nikolai Nikolai 26 сентября 2016 04:41 #

      Столкнулся с аналогичной проблемой (магазин актуальной версии на текущую дату): сначала выгрузил товары, внес изменения (в 1 характеристику с множественном выбором, которая нужна для фильтра категории), остальные поля удалил. В итоге у меня остался csv файл с двумя полями: уникальное название товара и характеристика. При импорте товаров характеристики обновились (за исключением ошибки с регистром букв). Но через некоторое время обратил внимание, что у товара создались какие-то новые артикулы (у меня все товары изначально в одном варианте, т.е. без доп. артикулов).

      Если у кого-то есть решение или sql-скрипт, буду благодарен.

      • +1
        Nikolai Nikolai 26 сентября 2016 05:28 #

        Возможно, кому-то будет интересно, как удалить эти дубли артикулов из базы, вот мое решение.

        Внимание! Все на ваш страх и риск, делайте только если понимаете что делаете, сделали бекапы и осознаете последствия.

        Мое решение подойдет тем, у кого нет осознанных доп.артикулов для товаров (т.е. каждый товар имеет по 1 артикулу). Но если есть артикулы, можете модифицировать код нужным образом и добиться результата.

        Сначала я сделал бекап таблицы с артикулами:

        create table _shop_product_skus_backup as
        select * from shop_product_skus

        Запишите количество обработанных строк, оно нам понадобится (число A).

        После этого я запустил скрипт отображения всех строк с артикулами-дублями:

        select *
        from shop_product_skus
        where 
        available = 0 and
        count is NULL and 
        image_id is null and 
        sku = '' and
        name = '' and
        price = '0.0000'

        В запросе я указал максимально много параметров, чтобы быть уверенным, что данные дубли нам не нужны. Т.е. если будет выбрана доступность, будет остаток по артикулу, картинка или имя, то такие данные в таблицу не попадут. Прокрутите выгрузку и проверьте, что там нет нужных данных.

        Запишите количество выгруженных строк (число B).

        После этого я выгрузил общее количество товаров:

        select count(*) from shop_product

        Записал. Это число C.

        После этого я проверил данные, чтобы быть уверенным, что не удалю ничего лишнего. Т.к. у меня каждый товар представлен одним артикулом, формула получилась такая:

        число товаров = (общее число артикулов) - (число артикулов, которые надо удалить) или C = A - B

        Подставив числа и подсчитав, я убедился, что все ок, дубли артикулов можно удалять.

        Внимание! Следующий запрос удаляет данные, перед выполнением будьте уверены в своих действиях:

        delete
        from shop_product_skus
        where 
        available = 0 and
        count is NULL and 
        image_id is null and 
        sku = '' and
        name = '' and
        price = '0.0000'

        После этого проверьте на товарах, что все ок.

        Также я заметил, что параметр sku_count (количество артикулов) в таблице shop_product не обновилось. Разницы в работе магазина я не заметил, кроме того, при открытии и сохранении товара это число пересчитывается автоматически. Но на всякий случай это число лучше тоже актуализировать.

        Для этого я воспользовался следующим скриптом:

        Внимание! Следующий скрипт принудительно поставит всем товарам 1 артикул. Если у вас есть товары, у которых несколько артикулов, не нужно его запускать.

        -- Создаем резервную копию
        create table _temp_shop_products_skus
        as
        select id, sku_count
        from shop_product;
        -- Ставим всем товарам количество артикулов = 1
        update
        shop_product t1
        set
        sku_count=1
  • 1

    Это еще один нюанс импорта... Если у товара есть характеристики со множественными значениями, то поле Артикул не заполняется когда товар импортируется одной строкой. Если используется полноформатное описание товара (каждый артикул отдельной строкой), то Артикул должен быть прописан явно в каждой строке. Если не прописан - будет пусто. Порешаем это с вами в рамках той разборки которую учинили с вашими файлами :)

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите