2013-04-06 1 views
0

Я сделал доклад матрицы в отчете оракула застройщика как этогооракула матрица заполнение отчета нулевые клетки

enter image description here

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

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 

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

+3

использовать функцию nvl? – Sathya

+0

Можете ли вы поделиться результатом запроса? –

+0

Или вы также можете использовать 'NVL2 (string1, value_if_NOT_null, value_if_null)' для изменения результатов запроса ;-) – g00dy

ответ

0

Существует по крайней мере два решения.

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

Решение 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 

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