powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Ошибка при сравнении БД Procedure PROCEDURE_NAME: Missing: THEN (AND)
3 сообщений из 3, страница 1 из 1
Ошибка при сравнении БД Procedure PROCEDURE_NAME: Missing: THEN (AND)
    #39396400
do.Donitoza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

столкнулся со следующей ошибкой при сравнении БД:
Код: plaintext
1.
2.
==== Error ==== : Procedure LS_STATS_CALCULATE: Missing: THEN (AND)
                  Script:  Line:52 Pos:26

При этом результирующий скрипт включает эту процедуру. При выполнении скрипта ошибок нет (БД становятся идентичны).

Процедура:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
create or alter procedure LS_STATS_CALCULATE (
    ID_TRANS integer)
as
declare variable LS_TRANS_CODE smallint;
begin

    select tls.code from transactions_loyal tls where tls.ID_TRANSACTION=:id_trans into :ls_trans_code;

    if (:ls_trans_code not in (3,4)) then exit;

    -- Обрабатка дебета
    if (:ls_trans_code = 3) then
    BEGIN

        -- Рассчитываем статистику по транзакции
        MERGE INTO transactions_loyal  tr_lo
        using (with tr_goodz as (
                    select gts.id_transaction as id_trans,
                        sum(gts.discountsum_out) as sum_discount_bonus,
                        sum(gts.sum_in) as in_sum,
                        sum(gts.plat_calc) as plat_calc,
                        sum(gts.bonus_calc) as bonus_calc
                    from transactions_goods gts
                    where gts.id_transaction = :id_trans
                    group by gts.id_transaction
                ),
                f_earn as
                (
                  SELECT VD.ID_TRANSACTION as id_trans, VD.VALUE_NUM as f_bonus --, CI.KOEF_BONUS
                  FROM TRANSACTIONS_LOYAL TL
                  JOIN D_TEMP_VALUE_DELTA VD ON VD.ID_TRANSACTION = TL.ID_TRANSACTION
                  JOIN D_SCHEME DS ON DS.ID_TREE = TL.ID_SCHEME
                  JOIN D_COUNTERS_CLIENTS CC ON CC.COUNTERS_CLIENTS_NUM = DS.ID_COUNTER_BONUS AND CC.ID_CLIENTS = TL.ID_CLIENTS
                  JOIN D_COUNTERS_INFO CI ON CI.NUM_COUNTERS = DS.ID_COUNTER_BONUS
                  WHERE TL.ID_TRANSACTION = :ID_TRANS
                  AND VD.ID_COUNTERS_CLIENTS = CC.ID_COUNTERS_CLIENTS
                )
                select first 1 tr_l.ID_TRANSACTION as id_trans,
                               IIF(tr_l.discount_amount is null, 0, tr_l.discount_amount) as f_amount,
                               IIF(tr_l.discount_sum is null, 0, tr_l.discount_sum)as f_sum,
                               IIF(tr_l.plat_calc is null, 0, tr_l.plat_calc) as f_plat_calc,
                               IIF(f_earn.f_bonus is null, 0, f_earn.f_bonus) as f_bonus_earn,
                               --IIF(tr_l.price is null, 0, tr_l.price) as f_price,
                               IIF(tr_l.discount_amount is null, 0, tr_l.discount_amount)*IIF(tr_l.price is null, 0, tr_l.price) - IIF(tr_l.discount_sum is null, 0, tr_l.discount_sum) as f_discount_sum,
                               IIF(tr_goodz.sum_discount_bonus is null, 0, tr_goodz.sum_discount_bonus) as g_sum,
                               IIF(tr_goodz.plat_calc is null, 0, tr_goodz.plat_calc) as g_plat_calc,
                               IIF(tr_goodz.bonus_calc is null, 0, tr_goodz.bonus_calc) as g_bonus_earn,
                               (IIF(tr_goodz.in_sum is null, 0, tr_goodz.in_sum) - IIF(tr_goodz.sum_discount_bonus is null, 0, tr_goodz.sum_discount_bonus)) as g_discount_sum --Выгода
                                from transactions_loyal tr_l
                                   left join tr_goodz on tr_l.ID_TRANSACTION = tr_goodz.id_trans
                                   left join f_earn on tr_l.ID_TRANSACTION = f_earn.id_trans
                                where tr_l.ID_TRANSACTION = :id_trans
        ) tr_ls
        ON tr_lo.ID_TRANSACTION = tr_ls.id_trans
        WHEN MATCHED and tr_lo.account_struc_id in (1, 2) THEN
            UPDATE SET tr_lo.real_goods_sum = tr_ls.g_sum,
                       tr_lo.real_goods_discount = tr_ls.g_discount_sum,
                       tr_lo.real_goods_bonus_earn = tr_ls.g_bonus_earn,
                       tr_lo.real_goods_bonus_payed = tr_ls.g_plat_calc

        WHEN MATCHED and tr_lo.account_struc_id IN (SELECT ACS.ID FROM ACCOUNTS_STRUC ACS WHERE ACS.IS_FUEL = 1) THEN
            UPDATE SET tr_lo.real_fuel_amount = tr_ls.f_amount,
                       tr_lo.real_fuel_sum = tr_ls.f_sum,
                       tr_lo.real_fuel_discount = tr_ls.f_discount_sum,
                       tr_lo.real_fuel_bonus_earn = tr_ls.f_bonus_earn,
                       tr_lo.real_fuel_bonus_payed = tr_ls.f_plat_calc,
                       tr_lo.real_goods_sum = tr_ls.g_sum,
                       tr_lo.real_goods_discount = tr_ls.g_discount_sum,
                       tr_lo.real_goods_bonus_earn = tr_ls.g_bonus_earn,
                       tr_lo.real_goods_bonus_payed = tr_ls.g_plat_calc;



      -- Обновляем статистику (по карте) крайней и, если необходимо, первой транзакции
      MERGE INTO ls_card_stats  ls_ca
        using (select first 1 tr_l.session_time as tr_time,
                   tr_l.id_card as tr_card,
                   tr_l.id_terminal as id_terminal,
                   t.id_service_station as id_service_station
                from transactions_loyal tr_l
                   left join terminals t on t.id = tr_l.id_terminal
                where tr_l.ID_TRANSACTION = :id_trans
        ) tr_ls
        ON ls_ca.id = tr_ls.tr_card
        WHEN MATCHED and ls_ca.ls_first_trans is not null THEN
            UPDATE SET ls_ca.ls_last_trans = tr_ls.tr_time
        WHEN MATCHED and ls_ca.ls_first_trans is null THEN
            UPDATE SET ls_ca.ls_first_trans = tr_ls.tr_time,
                       ls_ca.ls_last_trans = tr_ls.tr_time,
                       LS_CA.first_terminal_id = tr_ls.id_terminal,
                       LS_CA.first_sales_point_id = tr_ls.id_service_station;


        --
        MERGE INTO ls_card_stats  ls_ca
        using (select first 1 tr_l.id_card as id_card, min(tr_l.session_time) as tr_time
                from transactions_loyal tr_l
                   where tr_l.ID_TRANSACTION = :id_trans
                      and ((tr_l.real_goods_bonus_payed > 0) or (tr_l.real_fuel_bonus_payed > 0))
                   group by tr_l.id_card
        ) tr_ls
        ON ls_ca.id = tr_ls.id_card and ls_ca.ls_first_bonus_pay is null
        WHEN MATCHED THEN
            UPDATE SET ls_ca.ls_first_bonus_pay = tr_ls.tr_time;

    END

    -- Обрабатка возврата
    if (:ls_trans_code =4) then
    BEGIN


        -- Рассчитываем статистику по транзакции
        MERGE INTO transactions_loyal  tr_lo
        using (with tr_goodz as (
                    select gts.id_transaction as id_trans,
                        sum(gts.discountsum_out) as sum_discount_bonus,
                        sum(gts.sum_in) as in_sum,
                        sum(gts.plat_calc) as plat_calc,
                        sum(gts.bonus_calc) as bonus_calc
                    from transactions_goods gts
                    where gts.id_transaction = :id_trans
                    group by gts.id_transaction
                ),
                f_earn as
                (
                  SELECT VD.ID_TRANSACTION as id_trans, VD.VALUE_NUM as f_bonus --, CI.KOEF_BONUS
                  FROM TRANSACTIONS_LOYAL TL
                  JOIN D_TEMP_VALUE_DELTA VD ON VD.ID_TRANSACTION = TL.ID_TRANSACTION
                  JOIN D_SCHEME DS ON DS.ID_TREE = TL.ID_SCHEME
                  JOIN D_COUNTERS_CLIENTS CC ON CC.COUNTERS_CLIENTS_NUM = DS.ID_COUNTER_BONUS AND CC.ID_CLIENTS = TL.ID_CLIENTS
                  JOIN D_COUNTERS_INFO CI ON CI.NUM_COUNTERS = DS.ID_COUNTER_BONUS
                  WHERE TL.ID_TRANSACTION = :ID_TRANS
                    AND VD.ID_COUNTERS_CLIENTS = CC.ID_COUNTERS_CLIENTS
                )
                select first 1 tr_l.id_transaction_return as id_trans,
                               IIF(tr_l.discount_amount is null, 0, tr_l.discount_amount) as f_amount,
                               IIF(tr_l.discount_sum is null, 0, tr_l.discount_sum)as f_sum,
                               IIF(tr_l.plat_calc is null, 0, tr_l.plat_calc) as f_plat_calc,
                               IIF(f_earn.f_bonus is null, 0, f_earn.f_bonus) as f_bonus_earn,
                               --IIF(tr_l.price is null, 0, tr_l.price) as f_price,
                               IIF(tr_l.discount_amount is null, 0, tr_l.discount_amount)*IIF(tr_l.price is null, 0, tr_l.price) - IIF(tr_l.discount_sum is null, 0, tr_l.discount_sum) as f_discount_sum,
                               IIF(tr_goodz.sum_discount_bonus is null, 0, tr_goodz.sum_discount_bonus) as g_sum,
                               IIF(tr_goodz.plat_calc is null, 0, tr_goodz.plat_calc) as g_plat_calc,
                               IIF(tr_goodz.bonus_calc is null, 0, tr_goodz.bonus_calc) as g_bonus_earn,
                               (IIF(tr_goodz.in_sum is null, 0, tr_goodz.in_sum) - IIF(tr_goodz.sum_discount_bonus is null, 0, tr_goodz.sum_discount_bonus)) as g_discount_sum --Выгода
                                from transactions_loyal tr_l
                                left join tr_goodz on tr_l.ID_TRANSACTION = tr_goodz.id_trans
                                left join f_earn on tr_l.ID_TRANSACTION = f_earn.id_trans
                                where tr_l.ID_TRANSACTION = :id_trans
        ) tr_ls
            ON tr_lo.ID_TRANSACTION = tr_ls.id_trans
        WHEN MATCHED and tr_lo.account_struc_id in (1, 2) THEN
            UPDATE SET tr_lo.real_goods_sum = tr_lo.real_goods_sum - tr_ls.g_sum,
                       tr_lo.real_goods_discount = tr_lo.real_goods_discount - tr_ls.g_discount_sum,
                       tr_lo.real_goods_bonus_earn = tr_lo.real_goods_bonus_earn - tr_ls.g_bonus_earn,
                       tr_lo.real_goods_bonus_payed = tr_lo.real_goods_bonus_payed - tr_ls.g_plat_calc
        
        WHEN MATCHED and tr_lo.account_struc_id IN (SELECT ACS.ID FROM ACCOUNTS_STRUC ACS WHERE ACS.IS_FUEL = 1) THEN
            UPDATE SET tr_lo.real_fuel_amount = tr_lo.real_fuel_amount - tr_ls.f_amount,
                       tr_lo.real_fuel_sum = tr_lo.real_fuel_sum - tr_ls.f_sum,
                       tr_lo.real_fuel_discount = tr_lo.real_fuel_discount - tr_ls.f_discount_sum,
                       tr_lo.real_fuel_bonus_earn = tr_lo.real_fuel_bonus_earn + tr_ls.f_bonus_earn,
                       tr_lo.real_fuel_bonus_payed = tr_lo.real_fuel_bonus_payed - tr_ls.f_plat_calc,
                       tr_lo.real_goods_sum = tr_lo.real_goods_sum - tr_ls.g_sum,
                       tr_lo.real_goods_discount = tr_lo.real_goods_discount - tr_ls.g_discount_sum,
                       tr_lo.real_goods_bonus_earn = tr_lo.real_goods_bonus_earn - tr_ls.g_bonus_earn,
                       tr_lo.real_goods_bonus_payed = tr_lo.real_goods_bonus_payed - tr_ls.g_plat_calc;



    END


    WHEN ANY DO
    BEGIN
        exit;
    END
end


...
Рейтинг: 0 / 0
Ошибка при сравнении БД Procedure PROCEDURE_NAME: Missing: THEN (AND)
    #39396906
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил.
...
Рейтинг: 0 / 0
Ошибка при сравнении БД Procedure PROCEDURE_NAME: Missing: THEN (AND)
    #39401556
do.Donitoza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторИсправил.

Проверил. В крайнем релизе ошибка устранена.

Спасибо!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Ошибка при сравнении БД Procedure PROCEDURE_NAME: Missing: THEN (AND)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]