отчет оракула с заполнением пустых ячеек

Я сделал матричный отчет в построителе отчетов оракула, подобном этому

введите описание изображения здесь

А вот и мой запрос, из какого отчета звонят

SELECT A.p_date,
       L.sup_name,
       Decode(A.perc_typ, 1, 'Buff',
                          2, 'Cow')     PERC_TYPE,
       A.sup_rate                       RATE,
       Decode(A.perc_typ,
       1, Round(( Nvl(A.fat_perc, 0) * Nvl(A.gross_vol, 0) ) / 6, 5),
       2, Round(
          ( Nvl(A.fat_perc, 0) + (
            ( Nvl(A.fat_perc, 0) * 0.22 ) + (
            Nvl(A.lr_perc, 0) * 0.25 ) + 0.72 ) ) *
          Nvl(A.gross_vol, 0) / 13, 5)) VOL
FROM   mlk_purchase A,
       supplier L
WHERE  A.sup_cod = L.sup_cod
       AND A.p_date <= Trunc(SYSDATE)
       AND a.p_date >= Trunc(SYSDATE) - 7
ORDER  BY 1 

Проблема в том, что отображаются пустые ячейки, в которых не поступают данные из запроса. Я хочу показать нулевые ячейки вместо пустого места. Есть ли способ сделать это в построителе отчетов оракула.


person Adeel Aslam    schedule 06.04.2013    source источник
comment
использовать функцию nvl?   -  person Sathyajith Bhat    schedule 07.04.2013
comment
Вы можете поделиться результатом запроса?   -  person Ajo Koshy    schedule 08.04.2013
comment
Или вы также можете использовать NVL2( string1, value_if_NOT_null, value_if_null ) для изменения результатов запроса ;-)   -  person g00dy    schedule 11.04.2013


Ответы (1)


Есть как минимум два решения.

Решение 1. В Oracle Reports создайте шаблонный текстовый объект, отображающий ноль, и расположите этот объект так, чтобы он отображался за полем матрицы. Таким образом, шаблон скрывается, когда поле отображается, но отображается, когда поле не отображается. Это решение описано в документации.

Решение 2. Перепишите свой запрос, чтобы он возвращал строки с нулевыми значениями для комбинаций полей строки и столбца, которые не содержат данных. Например, вы можете найти все возможные комбинации полей строки и столбца матрицы (в данном случае поставщик и дата), внешнее присоединить ваши данные к комбинациям и использовать NVL для преобразования нулевых значений в нули. Это может выглядеть примерно так:

SELECT
    L.P_DATE,
    L.SUP_NAME,
    DECODE(A.PERC_TYP, 1, 'Buff', 2, 'Cow') PERC_TYPE,
    A.SUP_RATE RATE,
    NVL
    (
        DECODE
        (
            A.PERC_TYP, 
            1, 
            ROUND
            (
                (NVL(A.FAT_PERC, 0) * NVL(A.GROSS_VOL, 0)) / 6,
                5
            ),
            2,
            ROUND
            (
                (NVL(A.FAT_PERC, 0) + 
                    (
                        (NVL(A.FAT_PERC, 0) * 0.22) + 
                        (NVL(A.LR_PERC, 0) * 0.25) + 0.72)
                    ) * NVL(A.GROSS_VOL, 0) / 13,
                5
            )
        ),
        0
    ) VOL
FROM
    MLK_PURCHASE A,
    (
        SELECT
            L1.SUP_CODE,
            L1.SUP_NAME,
            L2.P_DATE
        FROM
            (
                SELECT DISTINCT 
                    SUPPLIER.SUP_CODE, 
                    SUPPLIER.SUP_NAME 
                FROM 
                    SUPPLIER
            ) L1,
            (
                SELECT DISTINCT
                    MLK_PURCHASE.P_DATE
                FROM
                    MLK_PURCHASE
                WHERE
                    MLK_PURCHASE.P_DATE <= TRUNC(SYSDATE)
                    AND
                    MLK_PURCHASE.P_DATE >= TRUNC(SYSDATE) - 7
            ) L2
    ) L
WHERE 
    A.SUP_COD (+) = L.SUP_COD
    AND
    A.P_DATE (+) = L.P_DATE
ORDER BY
    1 

Более эффективным (и более простым) способом переписать запрос с тем же эффектом могло бы быть использование разделенное внешнее соединение между MLK_PURCHASE и SUPPLIER, которое разделяет SUP_CODE, но я не знаю, в какой степени ваша версия Oracle Reports поддерживает этот синтаксис.

person Brian Camire    schedule 08.04.2013