Нехорошие люди в таблице
Нехорошие люди в таблице
В таблице попадаются нехорошие люди. Которые не должны попасть в файл выгрузки. У них есть особые номера (начинаются на тройку). Так что определить их несложно: LIKE '3______'. А вот при выгрузке надо подставлять вместо нехороших людей - хороших. Причем надо, чтобы пол совпадал. Но это тоже несложно. И чтобы разница в возрасте была как можно меньше. Причем в разных выгрузках подставы должны быть одни и те же. Для этой цели я добавил поле "REDIR". У хороших людей оно пустое, у нехороших - содержит ID того, который пойдет на замену.
Триггер "после инсерта" проверяет LIKE '3______', и дальше он (или запускаемая триггером SP) должны выбрать хорошего, еще не выбранного, с тем же полом... Но это еще ладно. Главное - при всех этих условиях выбрать еще и ближайшего по возрасту.
Вот, прежде чем городить огород, решил спросить
Триггер "после инсерта" проверяет LIKE '3______', и дальше он (или запускаемая триггером SP) должны выбрать хорошего, еще не выбранного, с тем же полом... Но это еще ладно. Главное - при всех этих условиях выбрать еще и ближайшего по возрасту.
Вот, прежде чем городить огород, решил спросить
Вот наброски первые:
Так он, гад, кричит:
Код: Выделить всё
AS
begin
/* Trigger text */
if (new.ndoc like '3_____') then
begin
new.redir =
(
select distinct IID
from insured
where (extract(year from insured.dr))-(extract(year from new.dr)) =
(
select min(F_1) from (
select (extract(year from insured.dr))-(extract(year from new.dr)) as F_1
from insured
)
)
);
end
end
Пробуем вынести всю эту бодягу в ХП, вроде компилируется. Нигде не могу найти функции абсолютной величины... Есть в FB что-то вроде "ABS"?Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Subselect illegal in this context.
Если мне память не изменяет, то в FB в операторе присваивания нельзя писать подзапросы. Для этого существует конструкция select ... into ... Хотя, может уже и изменилось что-то.Solo писал(а):Так он, гад, кричит:
Subselect illegal in this context.
Только в UDF-ках. Но есть case, а в FB2 ещё и iifSolo писал(а):Есть в FB что-то вроде "ABS"?
Код: Выделить всё
new.redir =
(select first 1 IID
from insured
order by (case when insured.dr>new.dr then insured.dr-new.dr else new.dr-insured.dr end) desc
);
Блин, а я нагородил уже:WildSery писал(а):Код: Выделить всё
new.redir = (select first 1 IID from insured order by (case when insured.dr>new.dr then insured.dr-new.dr else new.dr-insured.dr end) desc );
Код: Выделить всё
begin
/* Procedure Text */
for select IID
from insured
where
IIF(
((extract(year from insured.dr))-(extract(year from :in_dr)))>0,
((extract(year from insured.dr))-(extract(year from :in_dr))),
-((extract(year from insured.dr))-(extract(year from :in_dr)))
) =
(
select min( IIF(F_1>0, F_1, -F_1) )
from (
select (extract(year from insured.dr))-(extract(year from :in_dr)) as F_1
from insured
)
) AND
insured.w = :in_w /*the same wendor*/
AND
insured.redir = -1
into :redir_id do begin
suspend;
exit;
end
end
Сейчас попробую покороче...
Вот триггер (без использования вышеописанной процы)WildSery писал(а):Код: Выделить всё
new.redir = (select first 1 IID from insured order by (case when insured.dr>new.dr then insured.dr-new.dr else new.dr-insured.dr end) desc );
Код: Выделить всё
AS
begin
/* Trigger text ïðîâåðÿåì ïåðâóþ òðîéêó*/
if ( (new.ndoc like '3_____') or (new.ncont = '1568') ) then
begin
/* execute procedure pr_assign_redirect(new.w, new.dr) returning_values new.redir; */
new.redir =
(select first 1 IID
from insured
where insured.redir = -1 and
insured.w = new.w
order by (case
when insured.dr > new.dr then insured.dr-new.dr
else new.dr-insured.dr end) desc
);
end
end
Slavik был прав - не дает присваивать субселектColumn does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Subselect illegal in this context.