необходимо обновить записи с отчетом Crystal - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть отчет Crystal, который возвращает нужные мне записи на основе критериев, которые я добавил в отчет. Я также хочу, чтобы этот отчет обновлял записи в базе данных при запуске. Для этого я создал процедуру (в оракуле) ниже. Как мне заставить это работать? Мне действительно нужна только та часть, которая обновляет записи для запуска в процедуре. Это возможно? имеется в виду, могу ли я запустить процедуру из того же отчета, который я создаю, как обычно (используя select expert)? Я как бы прослеживаю оценку обновления между статьями, которые возвращают записи, поскольку мое исследование показывает, что я не могу просто запустить часть обновления из кристалла. когда я пытаюсь использовать процедуру, описанную ниже, кристалл выдает неверный аргумент при условии ошибки.

 create or replace Procedure           "P_UPDATE_REPORT_DATE_2" (

 N_BEGIN IN date,

 N_END IN date)

 is

 CUS_ID NUMBER;

 cursor c1 is select customer_id FROM customer;

 begin

 --real begining

 update dbo.customer set REPORT_DATE= sysdate 

 where customer.customer_id in

 (SELECT customer.custoemr_id

  FROM   dbo.CUS_ADDRESS CUS_ADDRESS INNER JOIN (((dbo.CUS_ASSOC_V
 CUS_ASSOC_V INNER JOIN dbo.customer customer ON
 CUS_ASSOC_V.ASSOC_ID=customer.ASSOC_ID) INNER JOIN dbo.ITEM ITEM ON
 CUSTOMER.ITEM_NUMBER=ITEM.ITEM_NUMBER) LEFT OUTER JOIN
 dbo.PAY_TYPE_CODE PAY_TYPE_CODE ON
 CUSTOMER.PRIM_PAY=PAY_TYPE_CODE.CODE) ON
 ITEM_ADDRESS.ADDRESS_ID=ITEM.ITEM_ADDRESS_ID

  WHERE  CUSTOMER.FACILITY='CHI' 

  AND CUSTOMER.START_DATE<= N_END 

  AND CUSTOMER.END_DATE>= N_BEGIN

  AND CUSTOMER.CUSTOMER_TYPE_CODE='O');

  commit;

 --fake to create sandwich

 OPEN c1;

    LOOP

       FETCH c1 INTO CUS_ID;

       EXIT WHEN c1%NOTFOUND;

       DBMS_OUTPUT.PUT_LINE(CUS_ID);

    END LOOP;


 end "P_UPDATE_REPORT_DATE_2";

1 Ответ

2 голосов
/ 16 декабря 2011

Создайте функцию с автономной транзакцией:

create or replace function my_function return number is
    pragma autonomous_transaction;
begin
    --Perform DML here
    insert into my_table values(1);

    --You must commit or rollback within an autonomous transaction
    commit;

    --Return any dummy value
    return 1;
end;
/

Затем вызовите ее с помощью SQL следующим образом:

select my_function from dual;

Выполнение DML как части инструкции SELECT - это вообще ужасВы должны попытаться избежать.SQL не дает никаких гарантий относительно того, как будет выполняться.А Crystal Reports не всегда выполняет каждый запрос в отчете.Будьте очень осторожны и тщательно проверяйте.Или, что еще лучше, найдите другой способ сделать это.

...