Ошибка в select ... into ... или я чего-то не понимаю ?
Добавлено: 02 фев 2006, 16:23
Не буду приводить весь текст процедуры, объясню на словах.
есть процедура расчитывающая начисления абоненту с учетом скидок на данную услуг, если нет скидки на данную услугу, проверяем нет ли общей скидки на все услуги.
так вот
не верно расчитывает скидки (точнее всем ставит коэфф. 0,5)
а вот этота процедура считает верно.
т.е. завернув запрос select ... into ... в структуру for ... do ...
спасает ситуацию!?
проверял на FB 1.5.2 и FB 1.5.3....
да.. еще интересный момент.. при отладке в IBexpert превый текст процедуры работает верно!
есть процедура расчитывающая начисления абоненту с учетом скидок на данную услуг, если нет скидки на данную услугу, проверяем нет ли общей скидки на все услуги.
так вот
Код: Выделить всё
for
select S.CUSTOMER_ID, count(DT.T_DAY), sum(DT.TARIF)
from SUBSCR_HIST S, DAYS_TARIF DT
where S.SERV_ID = :V_SERVICE_ID
and DT.SERV_ID = S.SERV_ID
and DT.T_DAY >= :V_S_MONTH
and DT.T_DAY <= :V_E_MONTH
and DT.T_DAY between S.DATE_FROM and S.DATE_TO
group by 1
into :CUSTOMER_ID, :V_UNITS, :V_FEE
do begin
select D.FACTOR_VALUE
from DISCOUNT_FACTOR D
where D.CUSTOMER_ID = :CUSTOMER_ID
and :V_S_MONTH between D.DATE_FROM and D.DATE_TO
and (D.SERV_ID = :V_SERVICE_ID)
into :V_DISCOUNT;
if (V_DISCOUNT is null)
then select D.FACTOR_VALUE
from DISCOUNT_FACTOR D
where D.CUSTOMER_ID = :CUSTOMER_ID
and :V_S_MONTH between D.DATE_FROM and D.DATE_TO
and (D.SERV_ID = -1)
into :V_DISCOUNT;
if (V_DISCOUNT is not null) then V_FEE = V_FEE * V_DISCOUNT;
V_FEE = ROUND(V_FEE,V_FEE_ROUND);
insert into MONTHLY_FEE(MONTH_ID, CUSTOMER_ID, SERVICE_ID, UNITS, FEE, EXPENSE_TYPE)
values (:V_S_MONTH, :CUSTOMER_ID, :V_SERVICE_ID, :V_UNITS, :V_FEE, :V_EXPENSE_TYPE);
end
а вот этота процедура считает верно.
Код: Выделить всё
for
select S.CUSTOMER_ID, count(DT.T_DAY), sum(DT.TARIF)
from SUBSCR_HIST S, DAYS_TARIF DT
where S.SERV_ID = :V_SERVICE_ID
and DT.SERV_ID = S.SERV_ID
and DT.T_DAY >= :V_S_MONTH
and DT.T_DAY <= :V_E_MONTH
and DT.T_DAY between S.DATE_FROM and S.DATE_TO
group by 1
into :CUSTOMER_ID, :V_UNITS, :V_FEE
do begin
for
select D.FACTOR_VALUE
from DISCOUNT_FACTOR D
where D.CUSTOMER_ID = :CUSTOMER_ID
and :V_S_MONTH between D.DATE_FROM and D.DATE_TO
and (D.SERV_ID = :V_SERVICE_ID)
into :V_DISCOUNT
do if (V_DISCOUNT is not null) then V_FEE = V_FEE * V_DISCOUNT;
if (V_DISCOUNT is null)
then begin
for
select D.FACTOR_VALUE
from DISCOUNT_FACTOR D
where D.CUSTOMER_ID = :CUSTOMER_ID
and :V_S_MONTH between D.DATE_FROM and D.DATE_TO
and (D.SERV_ID = -1)
into :V_DISCOUNT
do if (V_DISCOUNT is not null) then V_FEE = V_FEE * V_DISCOUNT;
end
V_FEE = ROUND(V_FEE,V_FEE_ROUND);
insert into MONTHLY_FEE(MONTH_ID, CUSTOMER_ID, SERVICE_ID, UNITS, FEE, EXPENSE_TYPE)
values (:V_S_MONTH, :CUSTOMER_ID, :V_SERVICE_ID, :V_UNITS, :V_FEE, :V_EXPENSE_TYPE);
end
спасает ситуацию!?
проверял на FB 1.5.2 и FB 1.5.3....
да.. еще интересный момент.. при отладке в IBexpert превый текст процедуры работает верно!