Oracle APEX - 将 Shuttle Item 选择保存到新表
Posted
技术标签:
【中文标题】Oracle APEX - 将 Shuttle Item 选择保存到新表【英文标题】:Oracle APEX - Saving Shuttle Item selections to a new table 【发布时间】:2012-03-14 15:09:31 【问题描述】:我正在处理一个项目,我正在处理零件和订单。每个订单可能包含许多部分,并且每个部分在其生命周期中可能存在多个订单(尽管一次不超过一个活动订单)。我的表格目前如下:
PARTS_TABLE
PART_NUMBER varchar2(20)
ASSIGNED_ORDER_NUMBER number(5)
ASSIGNED_ORDER_STATUS varchar2(20)
ORDER_TABLE
ORDER_NUMBER number (5)
ORDER_STATUS varchar2(20)
ORDER_PARTS_LIST varchar2(4000) //Comma delimited list generated by shuttle item.
当前的设置对我们 atm 有效(借助上一个问题:Previous Question),但它需要在两个表中复制大量数据,并且它实际上不允许 PART 在多个 ORDERS 上它的生命历程。
我想做的是在这两个表之间创建一个交叉引用表:
ORDER_PARTS_TABLE
ORDER_NUMBER number(5) (pk1)
PART_NUMBER varchar2(20) (pk2)
ORDER_STATUS varchar2(20)
其中 PART_NUMBER 和 ORDER_NUMBER 创建一个联合主键。
我的主要问题是根据穿梭物品的值创建和编辑 ORDER_PARTS_TABLE 中的行。我能够使用我当前的设置有效地编辑/更新,但在我当前的设置中,我并没有尝试创建行,我只是引用 PARTS_TABLE 中的行。当一个人在 APEX 中使用表单上的穿梭项目将 PARTS 添加到 ORDER 中时,应在 ORDER_PARTS_TABLE 中创建新行,即:
ORDER_TABLE
ORDER_NUMBER ORDER_PARTS_LIST ORDER_STATUS
12345 675:342:871:902 ACTIVE
ORDER_PARTS_TABLE
ORDER_NUMBER PART_NUMBER ORDER_STATUS
12345 675 ACTIVE
12345 342 ACTIVE
12345 871 ACTIVE
12345 902 ACTIVE
如果稍后在删除部分的位置编辑该订单,则应从 ORDER_PARTS_TABLE 中删除与该关系相关的行或将其 ORDER_STATUS 设置为“已删除”
ORDER_TABLE
ORDER_NUMBER ORDER_PARTS_LIST ORDER_STATUS
12345 675:871:902 ACTIVE
either...
ORDER_PARTS_TABLE
ORDER_NUMBER PART_NUMBER ORDER_STATUS
12345 675 ACTIVE
12345 342 REMOVED
12345 871 ACTIVE
12345 902 ACTIVE
or...
ORDER_PARTS_TABLE
ORDER_NUMBER PART_NUMBER ORDER_STATUS
12345 675 ACTIVE
12345 871 ACTIVE
12345 902 ACTIVE
这些有意义吗?我目前的解决方案只是使用我非常满意的触发器,但让我知道解决这个新问题的最佳方法是什么。谢谢!
编辑:我一直在进行一些持续的挖掘,并发现了一些听起来很有希望的东西,如果它可以适应的话。这里有没有人有经验 REGEXP_SUBSTR? LINKLINK
【问题讨论】:
【参考方案1】:APEX 提供了一个实用程序,可以将值从穿梭项目中拆分出来,如下所示:
declare
tab apex_application_global.vc_arr2;
begin
tab := apex_util.string_to_table (:p1_multiple_item);
...
end;
因此,根据您的要求,您可以这样做:
declare
tab apex_application_global.vc_arr2;
begin
tab := apex_util.string_to_table (:p1_multiple_item);
for i in 1..tab.count loop
insert into order_parts_table (order_number, part_number, order_status)
values (:p1_order_number, tab(i), 'ACTIVE');
end loop;
end;
(注意我没有处理该行是否已经存在,但你明白了。)
删除项目的处理将遵循相同的路线,但会稍微复杂一些。
【讨论】:
嘿托尼!感谢您的回复!我只是想澄清一下...您已将其设置为提交时的页面流程正确吗? Tony... 一个问题:我正在尝试在创建订单的同一页面上运行此过程。因此,ORDER_NUMBER 会在提交表单时自动递增和分配。无论如何要获取该值并在此过程中使用它来代替:p1_order_number?那有意义吗?谢谢! 是的,这应该是可能的,但是“自动递增”到底是什么意思? 它使用基本的数据库序列来生成 ORDER_NUMBER,方法是在插入新行时从最后一个值递增。 在这种情况下,您可以使用sequence_name.currval
而不是:p1_order_number
获取值以上是关于Oracle APEX - 将 Shuttle Item 选择保存到新表的主要内容,如果未能解决你的问题,请参考以下文章
Oracle APEX - 将 Shuttle Item 选择保存到新表