powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Набор правил для вычисления цены.
12 сообщений из 12, страница 1 из 1
Набор правил для вычисления цены.
    #35648742
albert t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос по реализации.

Есть товар, его цена зависит от набора правил. Например:
Товар А в стране Б в количестве 14 шт. стоит 5 долларов + по одному доллару за каждый больше 10.

То есть цена товара зависит от набора правил, например
Весь товар в количестве до 7 шт стоит 11 долларов потом по 2 доллара за каждую штуку до 15 товара потом ещё 100 долларов за любое количество после 15.
И это правило для одной страны.
Для другой своё правило.
Ещё могут быть скидки.

В принципе, все правила достаточно простые и легко записываются на T-SQL. Но однозначно их полная формализация, типа составления общей формулы, невозможна. Есть праивила которые выполняются если результаты некоторого запроса по БД отличны от NULL.


Но как реализовать набор правил, который бы пересчитывался как только клиент добавит товар в карзину и укажет его количество?

Может есть готовые придумки или решения? Это скорее всего из области бизнес-логики для БД...
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35648956
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем сложность? Или я чего-то не понял...

Мысль такая:
Имеешь таблицу правил расчета цены:

ПРАВИЛО_ID - Идентификатор (люблю я их)
КРИТЕРИЙ - Строка, содержащая запрос или часть запроса, отвечающая за то - применять ли данное правило или нет
ФОРМУЛА_РАСЧЕТА - Строка, содержащая формулу вычисления результата
ПОРЯДОК - число, определяющее порядок выполнения правил (от него может зависеть результат)

Один из алгоритмов:
при необходимости пересчета цены:
1) заполняем параметрами временную таблицу установленного образца (имена полей участвуют в полях КРИТЕРИЙ и ФОРМУЛА_РАСЧЕТА)
2) В цикле пробегаем по всей таблице правил в порядке ПОРЯДОК:
2.1) определяем выполняется ли кретерий: строим запрос и динамоSQLем выполняем.
2.2) если критерий выполнился, то выполняем расчет цены по формуле - аналогично, динамоSQLем
2.3) Итоговая цена - например сумма по кретериям. Как вариант - итоговая цена каждой строки во временной таблице может пересчитываться в 2.2 (там UPDATE)
Тоже как вариант: 2.1 и 2.2 могут быть совмещены в одном запросе

Собственно предложена упрощенная технология, которую можно (и нужно) наворачивать и наворачивать.
Да и предложен не конкретный алгоритм, а направление в котором реально можно работать. Вариации - велком
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35648977
albert t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KOT MATPOCKuH,

Спасибо большое. Я так примерно и представлял но опыта маловато. Что такое "динамоSQL"?

Можно маленький пример.

Допустим есть параметр К-количество товара

Правило "Если К больше 10" тогда формула "17+(К-10)*2"

Можешь показать как.
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35649029
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по "T-SQL" на MS SQL програмякаешь.
Я на нем уже очень давно не работал.
Приведу на псевдоORACLE, там разберешься:
строка такая:
ПРАВИЛО_ID =1
КРИТЕРИЙ = "K > 10"
ФОРМУЛА_РАСЧЕТА = "17+(К-10)*2"
ПОРЯДОК = 1

В таблице TEST_TABLE должны быть все строки, для которых нужно посчитать, а также колонки К и CENA

В процедуре расчета:
...
-- Инициализация
UPDATE TEST_TABLE
SET CENA = 0;

-- Расчет
FOR cur IN (SELECT * FROM RULES_TABLE ORDER BY ПОРЯДОК) LOOP
sSQL := "UPDATE TEST_TABLE " ||
"SET CENA = CENA+" || cur.ФОРМУЛА_РАСЧЕТА ||
" WHERE " || cur.ФОРМУЛА_РАСЧЕТА;
BEGIN
EXECUTE IMMEDIATE sSQL;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
END LOOP;
...

где-то так
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35649035
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по "T-SQL" на MS SQL програмякаешь.
Я на нем уже очень давно не работал.
Приведу на псевдоORACLE, там разберешься:
строка такая:
ПРАВИЛО_ID =1
КРИТЕРИЙ = "K > 10"
ФОРМУЛА_РАСЧЕТА = "17+(К-10)*2"
ПОРЯДОК = 1

В таблице TEST_TABLE должны быть все строки, для которых нужно посчитать, а также колонки К и CENA

В процедуре расчета:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
...
-- Инициализация
UPDATE TEST_TABLE 
SET CENA = 0;

-- Расчет
FOR cur IN (SELECT * FROM RULES_TABLE ORDER BY ПОРЯДОК) LOOP
    sSQL := "UPDATE TEST_TABLE " || 
               "SET CENA = CENA+" || cur.ФОРМУЛА_РАСЧЕТА || 
               " WHERE " || cur.ФОРМУЛА_РАСЧЕТА;
    BEGIN
        EXECUTE IMMEDIATE sSQL;
    EXCEPTION
        WHEN OTHERS THEN NULL;
    END;
END LOOP;
...
где-то так
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35649051
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вместо строки:
"SET CENA = CENA+" || cur.ФОРМУЛА_РАСЧЕТА ||

написать
"SET CENA = " || cur.ФОРМУЛА_РАСЧЕТА ||

тогда формат написания формул может измениться, в частности туда можно добавить псевдопараметр CENA, например, для скидок/накидок: "CENA*0.90" - для 10% скидки от уже посчитанного.

И еще:
Правила могут быть двух типов: построчные и комплексные.
Первые я привел в примере, вторые - для выполнения расчетов по всей выборке, например: если клиент заказал больше 10 наименований товаров, то скидку ему 5%
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35649075
albert t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KOT MATPOCKuH,

Спасибо. Принцип понятен. Не знаю работает ли в MS SQL. Буду смотреть.
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35649078
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динамическое выполнение запросов в MS SQL точно есть, я его пользовал, лет 10 назад!
Это один из обязательных критериев современной БД (ИМХО)
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35649095
albert t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KOT MATPOCKuH,

Еще раз спасибо.
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35650787
vinger4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нельзя повесить на табличку триггер, в котором прописать автозаполнение по любым нам удобным правилам (правила можно хранить в другой табличке)?
Евгений
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35650805
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinger4А нельзя повесить на табличку триггер, в котором прописать автозаполнение по любым нам удобным правилам (правила можно хранить в другой табличке)?
Евгений

KOT MATPOCKuH...
Один из алгоритмов:
при необходимости пересчета цены:
...
Если необходимо делать в триггере - делай (только правильно)!
...
Рейтинг: 0 / 0
Набор правил для вычисления цены.
    #35651295
albert t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vinger4А нельзя повесить на табличку триггер, в котором прописать автозаполнение по любым нам удобным правилам (правила можно хранить в другой табличке)?
Евгений

Тригер и так вешается. Он заполняет промежуточную таблицу параметров.
Потом уже с помощью построчного прохождения всех связанных "Правил вычисления" формируется цена.

Может и можно просто тригер. В принципе это не важно тригер или процедура или динамический запрос. Скорее всего получиться рабочий варинат смешанным
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Набор правил для вычисления цены.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]