2017-02-21 3 views
0

У меня есть следующий вопрос.Положить расчет Crystal Report на процедуру Oracle

У меня есть несколько процедур оракула (как пример proc_1, proc_4), каждый из которых извлекает одну строку с несколькими столбцами.

я не ставил все процедуры заявления, так как они большие, лишь некоторые из примеров первого утверждения процедур, чтобы вы знали, что они одинаковы для proc_1 и proc_4:

CREATE OR REPLACE PROCEDURE proc_1 (
proc_1_cursor IN OUT Reports.rep_type, 
date_parameter IN system_days.daytime%TYPE) 
AS 
BEGIN 
OPEN proc_1_cursor FOR 
select * from ----- 

Затем в Crystal Reports кто-то отчет Bult и использование результата от этих различных процедур, в формуле CR:

if {?DATE_PARAMETER}>= DateTime (2012, 01, 01, 00, 00, 00)and {?DATE_PARAMETER}<= DateTime (2012, 12, 31, 00, 00, 00) then 
({proc_1.DRY_GAS_MTD_KSM3}/1.07322+{proc_1.TOTAL_DRY_GAS_MTD_KNM3})+({proc_4.DRY_GAS_FLARE_MTD_KNM3}) 
else 
if {?DATE_PARAMETER}>= DateTime (2015, 01, 01, 00, 00, 00)and {?DATE_PARAMETER}<= DateTime (2015, 12, 31, 00, 00, 00) then 
({proc_1.DRY_GAS_MTD_KSM3}/1.07322+{proc_1.TOTAL_DRY_GAS_MTD_KNM3})-({proc_4.DRY_GAS_FLARE_MTD_KNM3}) 
else 
if {?DATE_PARAMETER}>= DateTime (2016, 01, 01, 00, 00, 00)and {?DATE_PARAMETER}<= DateTime (2016, 12, 31, 00, 00, 00) then 
({proc_1.DRY_GAS_MTD_KSM3}/1.07322+{proc_1.TOTAL_DRY_GAS_MTD_KNM3})+({proc_4.DRY_GAS_FLARE_MTD_KNM3})-({proc_1.GAS_TO_LPG_M_MTD_KSM3})- 
({proc_1.GAS_TO_T_FIELD_M_MTD_KSM3}/1.07322)}) 

То, что я хочу, чтобы запустить расчет Crystal Report выше в процедуре Oracle, которая будет вызывать proc_1 и proc_4 процедуры, поэтому просчитывать в Oracle вместо расчета в ЧР и pu t to CR just end result, Можете ли вы помочь мне в том, как понравится эта процедура оракула?

спасибо, S

ответ

0

Попробуйте эту процедуру.

CREATE OR REPLACE PROCEDURE calc_proc (
date_parameter IN DATE, 
gas_result OUT NUMBER) 
IS 
    dry_gas_mtd_ksm3 NUMBER; 
    total_dry_gas_mtd_knm3 NUMBER; 
    dry_gas_flare_mtd_knm3 NUMBER; 
    gas_to_lpg_m_mtd_ksm3 NUMBER; 
    gas_to_t_field_m_mtd_ksm3 NUMBER; 

BEGIN 

    dry_gas_mtd_ksm3 := proc_1.DRY_GAS_MTD_KSM3; 
    total_dry_gas_mtd_knm3 := proc_1.TOTAL_DRY_GAS_MTD_KNM3; 
    dry_gas_flare_mtd_knm3 := proc_4.DRY_GAS_FLARE_MTD_KNM3; 

    IF (date_parameter >= TO_DATE('2012-01-01', 'YYYY-MM-DD') AND date_parameter <= TO_DATE('2012-12-31', 'YYYY-MM-DD')) THEN 
     gas_result:=(dry_gas_mtd_ksm3/1.07322) + 
total_dry_gas_mtd_knm3 + dry_gas_flare_mtd_knm3; 
    ELSIF (date_parameter >= TO_DATE('2015-01-01', 'YYYY-MM-DD') AND date_parameter <= TO_DATE('2015-12-31', 'YYYY-MM-DD')) THEN 
     gas_result:=(dry_gas_mtd_ksm3/1.07322) + 
total_dry_gas_mtd_knm3 + dry_gas_flare_mtd_knm3; 
    ELSIF (date_parameter >= TO_DATE('2016-01-01', 'YYYY-MM-DD') AND date_parameter <= TO_DATE('2016-12-31', 'YYYY-MM-DD')) THEN 
     gas_result:=(dry_gas_mtd_ksm3/1.07322+total_dry_gas_mtd_knm3) 
+ dry_gas_flare_mtd_knm3 - gas_to_lpg_m_mtd_ksm3 - 
     (gas_to_t_field_m_mtd_ksm3/1.07322); 
    END IF; 

END; 

Я сделал несколько предположений, которые могут повлиять на хранимую процедуру, если вы можете уточнить их:

  • Ваши сохраненные прок возвращают числовое значение.
  • Ваши сохраненные procs соответствуют формату ниже.
  • Вам не нужны непрерывные диапазоны дат в операторах IF.

Дайте мне знать, если что-то здесь неверно или я что-то пропустил.

+0

Hi bbrumm, спасибо за код !! Я попробовал, он дает сообщение об ошибке ниже: [Ошибка] PLS-00225 (25: 48): PLS-00225: ссылка подпрограммы или указателя курсора 'proc_1' выходит за пределы области действия. [Ошибка] PLS-00225 (25: 48): PLS-00225: ссылка подпрограммы или указателя курсора 'proc_4' не входит в область действия –

+0

Есть ли у вас процедура proc_1 и proc_4? Используют ли они одну и ту же схему? Возможно, вам придется обновить схему в приведенном выше коде. – bbrumm

+0

да, они в той же схеме. –