使用复选框所选元素筛选报表



我在为我的应用程序制作正确的报告时遇到问题。该报告应该返回一组参数(包括设备列表(的空闲房间。但是,我不能在我的交互式报告中包括设备搜索。

这是我收到的 SQL 请求:

SELECT s.code || ' ' || s.nom as Salle, s.capacite, LISTAGG(eq.libelle, ', ') WITHIN GROUP (ORDER BY eq.code) as Equipements, b.libelle as Batiment, s.numero
FROM SALLES s
INNER JOIN batiments b ON
b.numero = s.bat_numero
INNER JOIN sal_gpe sg ON
s.numero = sg.sal_numero
INNER JOIN groupespersonnes gp ON
gp.numero = sg.gpe_numero
LEFT JOIN equ_sal e ON
e.sal_numero = s.numero
LEFT JOIN equipements eq ON 
eq.numero = e.equ_numero
-- On vérifie les salles visibles pour le groupe de personne affecté à l'utilisateur connecté. 
WHERE gp.code = (SELECT code FROM groupespersonnes INNER JOIN personnes p ON p.gpe_numero = groupespersonnes.numero WHERE UPPER(:APP_USER) = UPPER(p.username))
AND :P30_PERIODE_DEBUT NOT IN (SELECT per_numero FROM enregistrements WHERE sal_numero = s.numero AND TO_CHAR(jour, 'DD.MM.RR') = :P30_DATE)
AND :P30_PERIODE_FIN NOT IN (SELECT per_numero FROM enregistrements WHERE sal_numero = s.numero AND TO_CHAR(jour, 'DD.MM.RR') = :P30_DATE)
AND e.equ_numero = regexp_substr(:P30_EQUIPEMENTS,'[^:]+')
GROUP BY s.capacite, s.nom, b.libelle, s.numero, s.code

我正在对设备进行 LISTAGG,以便我可以显示一个房间适合一个单元格的所有设备。现在:P 30_EQUIPEMENT实际上是一个字符串。它采用从复选框列表(动态 LOV(中选择的设备编号,并用":"分隔它们。我一直在尝试许多解决方案,但没有任何效果。我现在正在潜入PL/SQL选项。

如果你有一个更简单的方法的想法,我很乐意接受。

如果这是 :P 30_EQUIPMENTS 包含的内容,那么您应该:

SQL> with test (p30_equipments) as
2    (select 'tv:balcony:shower' from dual)
3  select regexp_substr(p30_equipments, '[^:]+', 1, level) equipment
4  from test
5  connect by level <= regexp_count(p30_equipments, ':') + 1;
EQUIPMENT
-----------------
tv
balcony
shower
SQL>

即应用于您的代码:

and e.equ_numero in (select regexp_substr(:p30_equipments, '[^:]+', 1, level)
from dual
connect by level <= regexp_count(:p30_equipments, ':') + 1
)

最新更新