Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.28;
Скачать: CL | DM;

Вниз

Хранимая процедура для 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
7-91925
slex
2003-05-19 14:40
2003.07.28
Поиск имён классов


1-91721
R
2003-07-15 07:24
2003.07.28
Текст в ComboBox с Style:=csDropDownList


14-91831
five
2003-07-10 16:34
2003.07.28
работа в Москве (Delphi, PHP, Interbase)


14-91879
Johnny Smith
2003-07-11 17:55
2003.07.28
Во сколько и кому рожать исходников Дельфи для микроконтроллеров?


1-91759
Alec_
2003-07-14 15:31
2003.07.28
RichEdit