Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Здравствуйте, может кто подскажет, товары выгружаются из 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
Надіслати
Поділитися на інших сайтах

  • 3 months later...
В 11.12.2019 в 23:22, AlexDW сказал:

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

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

Нет.

 

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

Надіслати
Поділитися на інших сайтах


  • 3 years later...
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 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.