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

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

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

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


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

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

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

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

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

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

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

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

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

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

Можешь показать как.
...
Рейтинг: 0 / 0
12.11.2008, 13:18
    #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
12.11.2008, 13:20
    #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
12.11.2008, 13:26
    #35649051
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Набор правил для вычисления цены.
Можно вместо строки:
"SET CENA = CENA+" || cur.ФОРМУЛА_РАСЧЕТА ||

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

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

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

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

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

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

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

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


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