Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Как убрать цифры после запятой в БД?


clockwork
 Поделиться

Рекомендованные сообщения

Здравствуйте, может кто подскажет, товары выгружаются из 1С через модуль, в цены добавляются копейки, стоит округление и копейки убраны (визуально), но в БД они остались.

Когда например отправляется письмо покупателю, он видит эти копейки.

Можно ли как то сделать, чтобы он в БД уже округлял, а не на сайте? Или еще какие-то варианты подскажете, просто в голову не лезет.

 

Заранее спасибо!

Ссылка на комментарий
Поделиться на других сайтах


4 минуты назад, clockwork сказал:

товары выгружаются из 1С через модуль

Надо на этапе загрузки, перед тем как писать в БД округлять

Ссылка на комментарий
Поделиться на других сайтах


1 hour ago, clockwork said:

Можно ли как то сделать, чтобы он в БД уже округлял, а не на сайте? Или еще какие-то варианты подскажете, просто в голову не лезет.

 

Заранее спасибо!

можно. самый простой и костыльный вариант - изменить формат хранения\типа данных для колонки price прямо в бд.

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

 

Бэкап таблицы oc_product ОБЯЗАТЕЛЕН!

Spoiler

ALTER TABLE oc_product
  CHANGE COLUMN `price` `price` DECIMAL(15, 0) NOT NULL DEFAULT 0.0000;

 

 

Альтернативный вариант - использовать механизм триггеров самой БД. Триггеры срабатывают сразу же по событию добавления\изменения строк в таблице oc_products и будут округлять цену до нужной точности. вариант более сложный, но зато тип данных и формат колонки прайс останется неизменным + триггеры можно гибко настроить. Текст ниже рабочий, но он больше для примера. Без глубокого понимания сути не советую этот вариант. В любом случае, не забудьте заменить выделенные цветом значения на свои.

 

Бэкап таблицы oc_product ОБЯЗАТЕЛЕН!

Spoiler

USE название_вашей_базы_данных;

 

-- разово-принудитеьно округляем все имеющиеся цены в табличке oc_products с точностью до 0 знаков после запятой

UPDATE oc_product p SET p.price = ROUND(p.price, 0);

 

-- создаем триггеры

DELIMITER $$

 

--  Создаем триггер на округление цены для новых записей\строк.

CREATE
    DEFINER = 'имя_пользователя_БД_из-под_которого_работает_опенкарт'@'localhost'
TRIGGER round_price_before_insert
    BEFORE INSERT
    ON oc_product
    FOR EACH ROW
BEGIN
  SET new.price = ROUND(new.price, 0);
END
$$

 

-- создаем триггер на округление цены при изменении записей\строк

CREATE
    DEFINER = 'имя_пользователя_БД_из-под_которого_работает_опенкарт'@'localhost'
TRIGGER round_price_before_update
    BEFORE UPDATE
    ON oc_product
    FOR EACH ROW
BEGIN
  SET new.price = ROUND(new.price, 0);
END
$$

 

DELIMITER ;

 -- конец
 

 

P.S.: важно!

обратите внимание на строчку

DEFINER = 'имя_пользователя_БД_из-под_которого_работает_опенкарт'@'localhost'

если модуль обмена с 1с у Вас вносит изменения в базе из-под локального пользователя опенкарт - тогда все будет как в примере. Но если модуль обмена работает так, что 1с-ка вносит изменения в базу из-под своего не-локального пользователя БД, то будут нюансы

 

 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

Система > Локализация > Валюты - выбрать нужную и указать число знаков после запятой 0

или такой вариант не подходит?

Ссылка на комментарий
Поделиться на других сайтах

  • 3 месяца спустя...
В 11.12.2019 в 23:22, AlexDW сказал:

Система > Локализация > Валюты - выбрать нужную и указать число знаков после запятой 0

или такой вариант не подходит?

Нет.

 

Ищу решение такое только с весом. Где поковырять?)

Ссылка на комментарий
Поделиться на других сайтах


  • 3 года спустя...
11.12.2019 в 17:42, 100napb сказал:

можно. самый простой и костыльный вариант - изменить формат хранения\типа данных для колонки price прямо в бд.

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

 

Бэкап таблицы oc_product ОБЯЗАТЕЛЕН!

  Показать содержимое

ALTER TABLE oc_product
  CHANGE COLUMN `price` `price` DECIMAL(15, 0) NOT NULL DEFAULT 0.0000;

 

 

Альтернативный вариант - использовать механизм триггеров самой БД. Триггеры срабатывают сразу же по событию добавления\изменения строк в таблице oc_products и будут округлять цену до нужной точности. вариант более сложный, но зато тип данных и формат колонки прайс останется неизменным + триггеры можно гибко настроить. Текст ниже рабочий, но он больше для примера. Без глубокого понимания сути не советую этот вариант. В любом случае, не забудьте заменить выделенные цветом значения на свои.

 

Бэкап таблицы oc_product ОБЯЗАТЕЛЕН!

  Показать содержимое

USE название_вашей_базы_данных;

 

-- разово-принудитеьно округляем все имеющиеся цены в табличке oc_products с точностью до 0 знаков после запятой

UPDATE oc_product p SET p.price = ROUND(p.price, 0);

 

-- создаем триггеры

DELIMITER $$

 

--  Создаем триггер на округление цены для новых записей\строк.

CREATE
    DEFINER = 'имя_пользователя_БД_из-под_которого_работает_опенкарт'@'localhost'
TRIGGER round_price_before_insert
    BEFORE INSERT
    ON oc_product
    FOR EACH ROW
BEGIN
  SET new.price = ROUND(new.price, 0);
END
$$

 

-- создаем триггер на округление цены при изменении записей\строк

CREATE
    DEFINER = 'имя_пользователя_БД_из-под_которого_работает_опенкарт'@'localhost'
TRIGGER round_price_before_update
    BEFORE UPDATE
    ON oc_product
    FOR EACH ROW
BEGIN
  SET new.price = ROUND(new.price, 0);
END
$$

 

DELIMITER ;

 -- конец
 

 

P.S.: важно!

обратите внимание на строчку

DEFINER = 'имя_пользователя_БД_из-под_которого_работает_опенкарт'@'localhost'

если модуль обмена с 1с у Вас вносит изменения в базе из-под локального пользователя опенкарт - тогда все будет как в примере. Но если модуль обмена работает так, что 1с-ка вносит изменения в базу из-под своего не-локального пользователя БД, то будут нюансы

 

 

 

спасибо за первый вариант, помог) 

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.