Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];

Вниз

Хранимая процедура для InterBase. Help.   Найти похожие ветки 

 
Step[B.M.]   (2003-06-28 09:29) [0]

Есть таблица с полями:

HACH - начислено оплат (руб.)
DATE_SK1 - дата начала скидки
DATE_SK2 - дата конца скидки
SUM_SK - скидка (руб.)
REAL_HACH - реально начиислено (руб.)

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

1. если текущая дата НЕ попадает в диапазон дат
DATE_SK1 ... DATE_SK2 то:

REAL_HACH = HACH

2. если текущая дата попадает в диапазон дат
DATE_SK1 ... DATE_SK2 то:

REAL_HACH = HACH - SUM_SK

Большое Вам спасибо за любую оказанную помощь.


 
XanderMan   (2003-06-28 11:05) [1]

for select DT.CODE, DT.DATE_SK1, DT.DATE_SK1
from DT
into :CODE, :D1, :D2
do begin
if ("TODAY" between :D1 and :D2) then
update DT set DT.REAL_HACH = DT.HACH-DT.SUM_SK where DT.CODE=:CODE;
else
update DT set DT.REAL_HACH = HACH where DT.CODE=:CODE;
end


 
Step[B.M.]   (2003-06-28 13:08) [2]

Большое, Вам, СпасибО!!


 
Zacho   (2003-06-29 23:50) [3]

А зачем процедура ? Как уже (к сожалению, в удаленной ветке) отвечал Johnmen, самое правильное решение - триггер BEFORE INSERT проимерно такого вида:
IF (NOW BETWEEN (NEW.DATE_SK1 AND NEW.DATE_SK2)) THEN
BEGIN
NEW.REAL_HACH=NEW.HACH-NEW.SUM_SK;
END ESLE
BEGIN
NEW.REAL_HACH=NEW.HACH;
END


 
Step[B.M.]   (2003-07-04 08:44) [4]

Ок. А если надо сделать эти подщеты сразу одной транзакцией для всех записей, и делать это при вызове процедуры а не при вставке новой записи.


 
Zacho   (2003-07-04 08:53) [5]


> Step[B.M.] © (04.07.03 08:44)

Все-таки, зачем процедурой ? Делается два триггера BEFORE INSERT и BEFORE UPDATE и в REAL_HACH всегда будут правильные данные, без всяких дополнительных телодвижений типа вызова процедуры.


 
Step[B.M.]   (2003-07-04 08:59) [6]

Дело в том, что єтно надо делать РАЗ в МЕСЯЦ. :)


 
Zacho   (2003-07-04 09:06) [7]


> Step[B.M.] © (04.07.03 08:59)

А, ну тогда действительно процедурой. Или без процедуры, двумя запросами.


 
Step[B.M.]   (2003-07-04 09:08) [8]

Мда. Причем одной транзакцией.


 
kaif   (2003-07-04 11:01) [9]

А почему раз в месяц?
Это заказчик так придумал? Пусть объяснит, какой в этом смысл.
Я бы вообще вычисляемое поле сделал вместо всех этих процедур и триггеров. А насчет процедуры... один минус: многоверсионный механизм IB не очень любит такие подходы (типа в процедуре каждый раз данные перетряхивать непонятно зачем). Мусора много будет возникать. Особенно если таблица большая. Учти, что при таком действии количество записей в таблице реально всегда удваивается (в IB).
И вообще я здесь подозреваю в постановке задачи лажа имеется. Что значит начислять раз в месяц скидку на таких условиях? Скидка это что, атрибут платежа? Если это скидка, да еще от даты зависящая, то это атрибут другой сущности (клиента, договора) и храниться должна в виде процента в другой таблице.
А то странно как-то получается. Каждая строка в твоей таблице вроде - ОДИН платеж. И К КАЖДОМУ ТАКОМУ ПЛАТЕЖУ присвоены такие атирибуты, как ДИАПАЗОН ДАТ, когда ЭТОТ платеж имел скидку. Тебе не кажется все это СТРАННЫМ?


 
kaif   (2003-07-04 11:04) [10]


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

Может, речь все же идет о двух таблицах?




Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
1-91734
Прохожий
2003-07-15 12:45
2003.07.28
Иконки


3-91686
xmrz
2003-07-06 15:36
2003.07.28
Соединение с IB


14-91832
Poirot
2003-07-10 18:37
2003.07.28
Повторю вопрос!!!! В ЧЁМ БЫЛ ОФФТОПИК???


3-91651
ximik
2003-07-04 01:05
2003.07.28
ClientDataSet и MasterSource не получается :(


3-91642
АТ
2003-07-04 16:29
2003.07.28
При переносе приложения c одной машины на др. исчез русский шрифт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский