【问题标题】:Classic report, dynamic display with PL / SQL content经典报表,动态显示PL/SQL内容
【发布时间】:2020-06-25 11:41:34
【问题描述】:

在 APEX 中,我创建了一个页面,这里创建了一个区域。该地区报告了一份经典报告。我选择了“PL/SQL function body that return an SQL query”作为源。这里我也存了如下代码

declare
    l_date_string varchar2(32000);
    l_date_diff number(4);
    x NUMBER := 0;
    l_script varchar2(32000);
    l_script_pivot varchar2(32000);
    new_date varchar(256);
begin
   
   l_date_diff:=TO_DATE(:P2066_DATE_UNTIL, 'dd.mm.yyyy') - TO_DATE(:P2066_DATE_FROM, 'dd.mm.yyyy') ;
   
    While X < l_date_diff+1 Loop
       new_date := to_char(TO_DATE(:P2066_DATE_FROM, 'dd.mm.yyyy')+X,'dd.mm.yyyy');
       l_date_string := l_date_string || ',''' || new_date || '''';
        X := X + 1;
   End Loop;
   
   l_date_string := substr(l_date_string,2);

   
   l_script := 'Select * from
                    (Select 
                        pkey, 
                        to_char(createdformat,''dd.mm.yyyy'') business_date, 
                        regexp_substr(statistics, ''business_\w*'') business_statistics 
                    from 
                        gss.business_data 
                    where 
                        statistics like ''%business_%'' 
                        and createdformat between :P2066_DATE_FROM and :P2066_DATE_UNTIL
                     ) ';
   
   
   l_script_pivot := l_script || ' pivot(
                    count(pkey) 
                    for business_date 
                    in ('||l_date_string||'))';
   
   
    
    sys.htp.p('<li>' || l_script_pivot || ' </li>' );
    
   
    return l_script_pivot;
end;

始终显示第一列 Business_Statistis,后续列中的日期应动态显示 - 取决于期间的选择。

我也根据时间段选择使用了各自的代码,知道成功是一个带有SQL查询的经典报表。这行得通。

我现在如何使用 PL / SQL 操作动态更新经典报告。这意味着根据结果,始终显示经典报告?

我曾经选择并行使用通用列数,数量为365。然后他向我展示了列,但列标题不是日期而是Col2,Col3,Col4和以此类推

【问题讨论】:

标签: oracle-apex


【解决方案1】:

有几种方法可以解决这个问题。

选项 1:如果您乐于使用“通用列数”,则选择 PL/SQL 作为“标题类型”。然后用 PL/SQL 定义标题,例如

DECLARE
    v_heading varchar2(2000);
    l_date_diff number(4);
BEGIN
v_headings := 'business_statistics';

   l_date_diff:=TO_DATE(:P2066_DATE_UNTIL, 'dd.mm.yyyy') - TO_DATE(:P2066_DATE_FROM, 'dd.mm.yyyy') ;
   
    WHILE X < l_date_diff+1 LOOP
       new_date := to_char(TO_DATE(:P2066_DATE_FROM, 'dd.mm.yyyy')+X,'dd.mm.yyyy');
       v_headings :=  v_headings ||':' || new_date ;
        X := X + 1;
   END LOOP;
END;

选项 2:我假设您正在使用“返回 SQL 查询的 PL/SQL 函数体”来绕过枢轴的“in 子句”?解决此问题的另一种方法是将枢轴子句定义为页面项目。例如。 P2066_PIVOT_CLAUSE。然后,您可以使用 before 标头进程设置数据透视子句。然后,您可以在报告中使用标准 SQL。 即

SELECT * FROM
(SELECT pkey, 
to_char(createdformat,'dd.mm.yyyy') business_date, 
regexp_substr(statistics, 'business_\w*') business_statistics 
FROM
gss.business_data 
WHERE
statistics like '%business_%'
AND createdformat BETWEEN :P2066_DATE_FROM AND :P2066_DATE_UNTIL) 
PIVOT (COUNT(pkey)FOR business_date in (&P2066_PIVOT_CLAUSE.))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2012-08-24
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多