Страница 1 из 1

Автоувеличение на единицу в поле "Артикул"

Добавлено: 04.04.2018, 06:59
Ivan2018
На сайте свыше 2 тыс товаров. Артикул начинается так, первый товар Артикул= 1, Артикул= 2, Артикул= 3 ... чисто цифрой, то есть все по порядку.
Необходимо сделать в админке, чтобы в базе находился максимум в этом поле и прибавлялась 1, при создании нового товара.
Т.к. человеческий фактор существует, могут быть допущены ошибки при написании значения в поле Артикул.

Добавлено: 04.04.2018, 08:08
makki
Чтобы прописать Артикул для существующих товаров, сделайте такой запрос в базу данных

Код: Выделить всё

UPDATE ok_variants SET sku=id;

Для того, чтобы при последующем добавлении новых товаров автоматически добавлялся Артикул, в файле api/Variants.php в функции add_variant после строки

Код: Выделить всё

$variant_id = $this->db->insert_id();

добавьте

Код: Выделить всё

if(empty($variant->sku)) {
            $this->db->query("UPDATE __variants SET sku=id WHERE id=?", $variant_id);
        }

Чтобы артикул выглядел так: 100001, 100002 и т.д., поменяйте в запросах sku=id на

Код: Выделить всё

sku=concat('1',substring(concat ('00000',id),-5))

Добавлено: 04.04.2018, 08:22
korshunov
А почему не попроще
UPDATE `ok_variants` SET `sku` = id;

Или уж, если не хочется маленьких чисел, то
UPDATE `ok_variants` SET `sku` = 1000000+id;

А если непременно при создании надо, то
в api/Variants.php после

public function add_variant($variant) {
$variant = (object)$variant;
$result = $this->languages->get_description($variant, 'variant');

$query = $this->db->placehold("INSERT INTO __variants SET ?%", $variant);
$this->db->query($query);
$variant_id = $this->db->insert_id();

добавить
$query = $this->db->placehold("UPDATE __variants SET sku=1000000+id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);

Добавлено: 04.04.2018, 08:36
makki
korshunov писал(а):А почему не попроще
UPDATE `ok_variants` SET `sku` = id;

Или уж, если не хочется маленьких чисел, то
UPDATE `ok_variants` SET `sku` = 1000000+id;
Мне больше нравится когда разрядность у всех артикулов одинаковая :)

Добавлено: 04.04.2018, 09:08
Ivan2018
korshunov писал(а):добавить
$query = $this->db->placehold("UPDATE __variants SET sku=1000000+id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);

Не добавляется артикул, что еще можно сделать? Может кеш удалить из папок
/compiled/
/backend/design/compiled/

Добавлено: 04.04.2018, 11:50
korshunov
Ivan2018 писал(а):
korshunov писал(а):добавить
Не добавляется артикул, что еще можно сделать?
Про то, что "еще можно сделать", можно книгу толстенную написать на сотни страниц.
Если дадите FTP, могу посмотреть...

Добавлено: 05.04.2018, 05:35
Ivan2018
При таком раскладе

Код: Выделить всё

$query = $this->db->placehold("UPDATE __variants SET sku=id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);

не находит максимальное значение, а пишет число 11031, у меня максимальный артикул 2750,
то есть при сохранении нового товара должно вставляться в ячейку артикула значение: 2751.

В примерах есть такое:
"Как определить наибольшее значение в столбце?"
SELECT MAX(article) AS article FROM shop

Тогда может быть WHERE id=? заменить на WHERE id=MAX(id)

Добавлено: 05.04.2018, 06:27
korshunov
Пробуйте заменить. Думаю, с гарантией получите ошибку SQL.

Если хотите работать по Вашему примеру, то, чтобы было полностью правильно, надо делать несколько сложнее, так как в поле артикула sku значения, вообще говоря, не числовые, и это надо учитывать.

Если не хотите использовать простые способы типа sku=substring(concat ('000000',id),-5), sku=1000000+id, sku=concat('A',d), дело Ваше. Если непременно хочется сделать из простого вопроса сложный, пробуйте идти своим путем...

Добавлено: 05.04.2018, 08:16
Ivan2018
Чем проще тем лучше, не принципиально значение артикула, важно что автоматом ставится и последовательно, оставил так

Код: Выделить всё

$query = $this->db->placehold("UPDATE __variants SET sku=id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);   

Добавлено: 09.04.2018, 13:18
Julius123
У меня почему-то запрос "UPDATE `ok_variants` SET `sku` = 1000000+id;" не меняет текущие значения Артикула, все остаётся как и было

Добавлено: 09.04.2018, 13:19
Ivan2018
Julius123 писал(а):У меня почему-то запрос "UPDATE `ok_variants` SET `sku` = 1000000+id;" не меняет текущие значения Артикула, все остаётся как и было
Сохраните товар и артикул появится

Добавлено: 09.04.2018, 13:21
Julius123
Ivan2018 писал(а):
Julius123 писал(а):У меня почему-то запрос "UPDATE `ok_variants` SET `sku` = 1000000+id;" не меняет текущие значения Артикула, все остаётся как и было
Сохраните товар и артикул появится
Мне что все несколько тысяч пересохранить? )
но вопрос в другом, я не очень хочу такое длинное значение и ставлю в запрос 100+id "UPDATE `ok_variants` SET `sku` = 100+id;" но не работает, пишет что запрос затронул 0 строк, но если выполнять "UPDATE `ok_variants` SET `sku` = 1000000+id;" тогда работает

Добавлено спустя 5 минут 18 секунд:
Кажется уже разобрался, не совсем понял как работает запрос, думал что будет видать число 100 отдельно и плюс число id товара, а тут просто математическое добавление одного числа к другому

Добавлено: 09.04.2018, 13:31
korshunov
Все правильно, так и быть должно.
"затронул 0 строк" - это и значит, что сработал.
А если чуть-чуть задумаетесь, то легко понять, почему затронуто 0 строк.
Подсказка: выполните запрос типа "UPDATE `ok_variants` SET `sku` = 200+id;" 2 раза и каждый раз обращайте внимание на отчет о выполнении...

Добавлено: 09.04.2018, 13:41
Julius123
korshunov писал(а):А если непременно при создании надо, то
в api/Variants.php после

public function add_variant($variant) {
$variant = (object)$variant;
$result = $this->languages->get_description($variant, 'variant');

$query = $this->db->placehold("INSERT INTO __variants SET ?%", $variant);
$this->db->query($query);
$variant_id = $this->db->insert_id();

добавить
$query = $this->db->placehold("UPDATE __variants SET sku=1000000+id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);
Еще такой вопрос, вот если например добавление идет не через админку а через импорт, это тоже будет работать?

Добавлено: 09.04.2018, 14:45
korshunov
Должно работать.
А быстрее было бы Вам самому провести эксперимент за пару минут и узнать точно...

Добавлено: 21.12.2022, 19:31
the99dots
Julius123 писал(а):А если непременно при создании надо, то
в api/Variants.php после

Объясните пжлст более подробно, куда именно этот кусок кода вставлять... не нашел в структуре сайта файл Variants.php
или это возможно только через пхп-май-админ?