交互式网格:仅使用不基于表的PL / SQL处理

时间:2019-11-12 11:53:54

标签: plsql oracle-apex oracle12c oracle-apex-5.1

Env:具有Oracle 12c第2版的Oracle APEX v5.1

首先,我创建了一个不基于基础表的交互式网格,因为我将使用PL / SQL手动对其进行处理。

我一直在使用以下内容作为指导:

https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/6361/index-en.html

我基本上有以下查询:

select  
  level as id,  
  level as grid_row,  
  null as product,  
  null as product_item  
from dual connect by level <= 1  

仅关注product和product_item列,其中product_item列将是只读列,并且只能输入产品编号,我想实现以下目标:

Product    Product Item
---------- -------------
123456     123456-1
123456     123456-2
556677     556677-1
654321     654321-1
654321     654321-2
654321     654321-3
123456     123456-3

从以上所述,当用户键入产品,然后在字段外跳格时,我希望触发DA,该DA将在该产品编号的末尾添加“ -1”的序列。然后是用户,然后在IG中添加另一行并输入相同的产品编号,然后我希望它在其末尾添加“ -2”。

仅当产品更改编号时,我才需要按照556677将该新产品的序列重置为“ -1”,依此类推。

还应考虑的其他情况如下:

  1. 在IG上方,用户再次输入123456,但这应计算出123456的下一个序列为“ -3”

  2. 从IG中删除产品时,需要同样注意,但始终要查看该产品的最大序列号。

我一直在考虑可能将APEX_COLLECTIONS用作存储网格中当前内容的一种方式,因为尚未对数据库提交任何更改。

2 个答案:

答案 0 :(得分:0)

假设您有一个产品值集合(在这种情况下,我使用的是内置SYS.ODCINUMBERLIST,它是VARRAY数据类型),那么输出的SQL将是:

SELECT id,
       id AS grid_row,
       product,
       product || '-' || ROW_NUMBER() OVER ( PARTITION BY product ORDER BY id )
         AS product_item
FROM   (
  SELECT ROWNUM AS id,
         COLUMN_VALUE AS product
  FROM   TABLE(
           SYS.ODCINUMBERLIST(
             123456,
             123456,
             556677,
             654321,
             654321,
             654321,
             123456
           )
         )
)
ORDER BY id

输出

ID | GRID_ROW | PRODUCT | PRODUCT_ITEM
-: | -------: | ------: | :-----------
 1 |        1 |  123456 | 123456-1    
 2 |        2 |  123456 | 123456-2    
 3 |        3 |  556677 | 556677-1    
 4 |        4 |  654321 | 654321-1    
 5 |        5 |  654321 | 654321-2    
 6 |        6 |  654321 | 654321-3    
 7 |        7 |  123456 | 123456-3    

db <>提琴here

答案 1 :(得分:0)

如前所述,插入产品时输入的数据不会保存到数据库中,因此实际上不会存储在任何地方。 因此,您无法检查该值是否已经存在并输入-2或其他值。

要考虑的一些事情可能是将这些值保存到临时表中,这样您就可以让一个函数检查其中有多少product_item(如123456-%),并使用该数字+1作为新的product_item。 >

或者,您可以采用更艰难的方法,并使用javascript完成所有操作。为此,您将需要以某种方式获取IG中的所有记录,遍历所有记录,查看您有123456次出现,然后插入123456-(不出现+ 1)。