基于 LOV(清单)在具有多个值的交互式报告列上显示多个显示值

Posted

技术标签:

【中文标题】基于 LOV(清单)在具有多个值的交互式报告列上显示多个显示值【英文标题】:Show multiple display values on interactive report column with multiple values based on LOV (checklist) 【发布时间】:2018-01-19 21:06:21 【问题描述】:

我想在列中显示显示值,但列是一个字符串,其中包含“1:3”、“2”、“1:2:4”等条目,它们是基于 LOV 的返回值具有静态值。

如果我将该列设置为“显示文本(基于 LOV)”,它将仅适用于只有一个数字的条目,例如“3”或“1”。

我想规范化表格,但后来我会有一个多表格表格。 这应该很简单,但我不知道该怎么做?

    select p.COD,
          UNIDADE_PROPONENTE,
          CAUSA_FUND,
          CAUSAS_RELAC,
          TITULO,
          DESC_SOLUC,
          listagg(a.acao, ';<br><br>') within group (order by null)  as "a.acao",    
          OUTRA_ACAO,
          SUGESTAO,
          SITUACAO
      from TB_PROPOSTA p, TB_ACAO a,
      table(cast(multiset(select level from dual
                            connect by level <=regexp_count(p.acao,':') + 1)
                            as sys.odcinumberlist)) x

      where 
        a.cod = regexp_substr(p.acao, '[^:]+', 1, x.column_value)
        and
        (:P2_XUNIDADE_RESPONSAVEL = UNIDADE_PROPONENTE OR :P2_XUNIDADE_RESPONSAVEL IS NULL)
        and   
        (INSTR(':'|| p.acao ||':', ':' || :P2_XACAO || ':') > 0 OR :P2_XACAO IS NULL)
    group by p.cod, p.acao, unidade_proponente, causa_fund, causas_relac, titulo, desc_soluc, outra_acao, sugestao, situacao
    order by p.cod, p.acao;

编辑: 现在我要么丢失关键字错误,要么 sql 命令没有正确结束。 这给出了 SQL 命令未正确结束

select p.COD,
       UNIDADE_PROPONENTE,
       CAUSA_FUND,
       CAUSAS_RELAC,
       TITULO,
       DESC_SOLUC,  
       listagg(a.acao, ';<br><br>') within group (order by null) as "a.acao",    
       OUTRA_ACAO,
       SUGESTAO,
       SITUACAO
  from TB_PROPOSTA p
  cross join table(cast(multiset(select level from dual
                        connect by level <=regexp_count(p.acao,':') + 1)
                        as sys.odcinumberlist)) x
  left join TB_ACAO.ACAO  

on TB_ACAO.COD = regexp_substr(TB_PROPOSTA.ACAO, '[^:]+', 1, x.column_value) 

    where
        (:P2_XUNIDADE_RESPONSAVEL )= UNIDADE_PROPONENTE OR :P2_XUNIDADE_RESPONSAVEL IS NULL)
        AND
        (:P2_XACAO IN (p.ACAO) OR :P2_XACAO IS NULL)
    group by p.cod, p.acao, unidade_proponente, causa_fund, causas_relac, titulo, desc_soluc, outra_acao, sugestao, situacao
    order by p.cod, p.acao;

如果我将“交叉连接”更改为仅“连接”,我会在“位置”之前得到“缺少关键字(ORA-06550:第 17 行,第 1 列:ORA-00905:缺少关键字)

【问题讨论】:

对不起,我不太明白。显示值和返回值是否相同?这就是你的第一句话所暗示的。为什么规范化会导致多 table (?) 形式?您使用哪个 Apex 版本?您能否在 apex.oracle.com 上创建一个示例并让我们知道凭据以便我们查看?或者,至少,张贴截图?我真的很难想象你所描述的,对不起。 当然。它是 APEX 5.0.2。关于规范化问题,如何在没有多表形式的情况下使表单作用于交集表?这是link。有问题的栏目是“Tipo acao”。显示值与返回值不同。所以,我希望它显示类似“这是显示值 1;这是显示值 2”而不是“1:2”。 凭证是 cursoaptcu, USER@USER.COM, 123456 【参考方案1】:

感谢您的补充说明。

这样的东西会有帮助吗?我的 TEST 表充当您的报告查询,而其余部分则拆分冒号分隔的值。这是一个 SQL*Plus 示例,只是为了向您展示发生了什么。

SQL> with test (situacao, tipo_acao) as
  2  (select 'Aguardando resposta', '1:2:3' from dual union
  3   select 'Aguardando resposta', '5' from dual
  4  )
  5  select
  6    situacao,
  7    'This is value ' || regexp_substr(tipo_acao, '[^:]+', 1, column_value) tipo_acao
  8  from test,
  9    table(cast(multiset(select level from dual
 10                        connect by level <= regexp_count(tipo_acao, ':') + 1)
 11                        as sys.odcinumberlist));

SITUACAO            TIPO_ACAO
------------------- ----------------------------------
Aguardando resposta This is value 1
Aguardando resposta This is value 2
Aguardando resposta This is value 3
Aguardando resposta This is value 5

SQL>

[编辑,在 Apex 应用程序中创建第 5 页后]

我想我明白了 - 看看第 5 页(创建为第 2 页的副本,这样我就不会破坏它)。它的列列表减少了,但你会得到一般的想法。查询看起来像这样;希望没事:

select p.cod,
       s.situacao,
       p.tipo_acao,
       listagg(t.acao, ', ') within group (order by null) acao
from tb_proposta p,
     tipo_situacao s,
     vw_unid v,
     tipo_acao t,
     table(cast(multiset(select level from dual
                         connect by level <= regexp_count(p.tipo_acao, ':') + 1)
                         as sys.odcinumberlist)) x
where s.cod = p.proposta_status
  and p.cod_vw_unid = v.cod
  and t.cod= regexp_substr(p.tipo_acao, '[^:]+', 1, x.column_value)
group by p.cod, s.situacao, p.tipo_acao
order by p.cod, p.tipo_acao;

[编辑 #2,ANSI 外连接]

这就是你应该尝试的方式。此外,CROSS JOIN 及其在查询中的位置。

select p.cod,
       s.situacao,
       p.tipo_acao,
       listagg(t.acao, ', ') within group (order by null) acao
from tb_proposta p
cross join table(cast(multiset(select level from dual
                               connect by level <= regexp_count(p.tipo_acao, ':') + 1)
                               as sys.odcinumberlist)) x 
      join tipo_situacao s   on s.cod = p.proposta_status
      join vw_unid v         on v.cod = p.cod_vw_unid
left  join tipo_acao t  on t.cod = regexp_substr(p.tipo_acao, '[^:]+', 1, x.column_value)
group by p.cod, s.situacao, p.tipo_acao
order by p.cod, p.tipo_acao;

【讨论】:

我认为这有帮助。但是我将如何显示 LOV 的显示值? f.e. 1 = 字符串 2 = 另一个字符串 另外,是否可以聚合结果,例如使用 listagg()? 好的,谢谢您的凭据。我创建了第 5 页,看看。我要睡觉了,这里已经快半夜了。如果还有其他事情要做,请留下便条——希望明天我会去看看。或者,如果不是我,其他人:) 这正是我想要的!你是个天才!谢谢 如果我想使用换行符/换行符作为分隔符,我应该使用 html 标签(并禁用转义特殊字符)还是有其他方法可以做到这一点? 我已经看到您已经这样做了,并且可以按预期工作。我认为这是正确的做法。

以上是关于基于 LOV(清单)在具有多个值的交互式报告列上显示多个显示值的主要内容,如果未能解决你的问题,请参考以下文章

交互式报表 Oracle Apex 5 上的 LOV

基于 Oracle ADF LOV 的查询并返回结果集

在另一列上复制在某些条件下具有空值的列

PHP 和 MYSQL:查询在具有值的列上返回 null

如何在具有空值的列上使用`jsonb_set`

具有重复值的列上的数据库索引