Sql Oracle APEX-将穿梭项目选择保存到新表
我有一个项目,我正在处理的零件和订单。每个订单可能包含多个部分,每个部分在其生命周期内可能存在于多个订单上,尽管一次不超过一个活动订单。我的表格目前如下:Sql Oracle APEX-将穿梭项目选择保存到新表,sql,oracle-apex,Sql,Oracle Apex,我有一个项目,我正在处理的零件和订单。每个订单可能包含多个部分,每个部分在其生命周期内可能存在于多个订单上,尽管一次不超过一个活动订单。我的表格目前如下: PARTS_TABLE PART_NUMBER varchar2(20) ASSIGNED_ORDER_NUMBER number(5) ASSIGNED_ORDER_STATUS varchar2(20) ORDER_TABLE ORDER_NUMBER number (5)
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工作:但是它需要在两个表中复制大量数据,并且它实际上不允许一个部件在其生命周期内处于多个订单上
我想做的是在这两个表之间创建一个交叉引用表:
ORDER_PARTS_TABLE
ORDER_NUMBER number(5) (pk1)
PART_NUMBER varchar2(20) (pk2)
ORDER_STATUS varchar2(20)
其中零件号和订单号创建关节主键
我的主要问题是根据穿梭项目的值按顺序创建和编辑行。我能够使用当前设置有效地编辑/更新,但在当前设置中,我不尝试创建行,我只是引用PARTS_表中的行。当一个人使用APEX表格上的穿梭项目向订单添加零件时,应在订单零件表中创建新行,即:
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_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\u SUBSTR 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;
注意:我没有处理是否已经存在争议,但你明白了
移除项目的处理过程将是相同的,尽管有点复杂。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。。。问题:我试图在创建订单的同一页面上运行此流程。因此,订单号将自动递增,并在提交表单时分配。在这个过程中,是否有方法获取该值并使用它来代替:p1\U订单号?这有意义吗?谢谢是的,这应该是可能的,但你所说的自动递增到底是什么意思?它是使用一个基本的数据库序列,在插入新行时从最后一个值递增来生成订单号。在这种情况下,你可以使用序列号而不是:p1\U订单号Y Tony!谢谢你的回复!我只是想澄清一下。。。您已将此设置为提交时的页面进程,对吗?Tony。。。问题:我试图在创建订单的同一页面上运行此流程。因此,订单号将自动递增,并在提交表单时分配。在这个过程中,是否有方法获取该值并使用它来代替:p1\U订单号?这有意义吗?谢谢是的,这应该是可能的,但您所说的自动递增到底是什么意思?它使用一个基本的数据库序列,在插入新行时从最后一个值开始递增,从而生成订单号。在这种情况下,您可以使用sequence_name.currval而不是:p1_ORDER_NUMBER来获取该值