|
|
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
Вопрос по реализации. Есть товар, его цена зависит от набора правил. Например: Товар А в стране Б в количестве 14 шт. стоит 5 долларов + по одному доллару за каждый больше 10. То есть цена товара зависит от набора правил, например Весь товар в количестве до 7 шт стоит 11 долларов потом по 2 доллара за каждую штуку до 15 товара потом ещё 100 долларов за любое количество после 15. И это правило для одной страны. Для другой своё правило. Ещё могут быть скидки. В принципе, все правила достаточно простые и легко записываются на T-SQL. Но однозначно их полная формализация, типа составления общей формулы, невозможна. Есть праивила которые выполняются если результаты некоторого запроса по БД отличны от NULL. Но как реализовать набор правил, который бы пересчитывался как только клиент добавит товар в карзину и укажет его количество? Может есть готовые придумки или решения? Это скорее всего из области бизнес-логики для БД... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 12:01 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
В чем сложность? Или я чего-то не понял... Мысль такая: Имеешь таблицу правил расчета цены: ПРАВИЛО_ID - Идентификатор (люблю я их) КРИТЕРИЙ - Строка, содержащая запрос или часть запроса, отвечающая за то - применять ли данное правило или нет ФОРМУЛА_РАСЧЕТА - Строка, содержащая формулу вычисления результата ПОРЯДОК - число, определяющее порядок выполнения правил (от него может зависеть результат) Один из алгоритмов: при необходимости пересчета цены: 1) заполняем параметрами временную таблицу установленного образца (имена полей участвуют в полях КРИТЕРИЙ и ФОРМУЛА_РАСЧЕТА) 2) В цикле пробегаем по всей таблице правил в порядке ПОРЯДОК: 2.1) определяем выполняется ли кретерий: строим запрос и динамоSQLем выполняем. 2.2) если критерий выполнился, то выполняем расчет цены по формуле - аналогично, динамоSQLем 2.3) Итоговая цена - например сумма по кретериям. Как вариант - итоговая цена каждой строки во временной таблице может пересчитываться в 2.2 (там UPDATE) Тоже как вариант: 2.1 и 2.2 могут быть совмещены в одном запросе Собственно предложена упрощенная технология, которую можно (и нужно) наворачивать и наворачивать. Да и предложен не конкретный алгоритм, а направление в котором реально можно работать. Вариации - велком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 12:57 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuH, Спасибо большое. Я так примерно и представлял но опыта маловато. Что такое "динамоSQL"? Можно маленький пример. Допустим есть параметр К-количество товара Правило "Если К больше 10" тогда формула "17+(К-10)*2" Можешь показать как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 13:01 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
Судя по "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; ... где-то так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 13:18 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
Судя по "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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 13:20 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
Можно вместо строки: "SET CENA = CENA+" || cur.ФОРМУЛА_РАСЧЕТА || написать "SET CENA = " || cur.ФОРМУЛА_РАСЧЕТА || тогда формат написания формул может измениться, в частности туда можно добавить псевдопараметр CENA, например, для скидок/накидок: "CENA*0.90" - для 10% скидки от уже посчитанного. И еще: Правила могут быть двух типов: построчные и комплексные. Первые я привел в примере, вторые - для выполнения расчетов по всей выборке, например: если клиент заказал больше 10 наименований товаров, то скидку ему 5% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 13:26 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuH, Спасибо. Принцип понятен. Не знаю работает ли в MS SQL. Буду смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 13:34 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
Динамическое выполнение запросов в MS SQL точно есть, я его пользовал, лет 10 назад! Это один из обязательных критериев современной БД (ИМХО) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 13:37 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuH, Еще раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 13:42 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
А нельзя повесить на табличку триггер, в котором прописать автозаполнение по любым нам удобным правилам (правила можно хранить в другой табличке)? Евгений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 09:45 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
vinger4А нельзя повесить на табличку триггер, в котором прописать автозаполнение по любым нам удобным правилам (правила можно хранить в другой табличке)? Евгений KOT MATPOCKuH... Один из алгоритмов: при необходимости пересчета цены: ... Если необходимо делать в триггере - делай (только правильно)! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 09:50 |
|
||
|
Набор правил для вычисления цены.
|
|||
|---|---|---|---|
|
#18+
vinger4А нельзя повесить на табличку триггер, в котором прописать автозаполнение по любым нам удобным правилам (правила можно хранить в другой табличке)? Евгений Тригер и так вешается. Он заполняет промежуточную таблицу параметров. Потом уже с помощью построчного прохождения всех связанных "Правил вычисления" формируется цена. Может и можно просто тригер. В принципе это не важно тригер или процедура или динамический запрос. Скорее всего получиться рабочий варинат смешанным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 12:16 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=96&tid=1543575]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 359ms |

| 0 / 0 |
