我有一个正在处理零件和订单的项目。每个订单可能包含许多零件,并且每个零件在其生命周期中都有可能处于多个订单上(尽管一次不超过一个活动订单)。我的表目前如下:
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.
Run Code Online (Sandbox Code Playgroud)
这个当前的设置对我们 atm 有用(在上一个问题的帮助下:上一个问题),但它需要在两个表中复制大量数据,并且它实际上不允许 PART 在其生命周期中处于多个 ORDERS 状态.
我想做的是在这两个表之间创建一个交叉引用表:
ORDER_PARTS_TABLE
ORDER_NUMBER number(5) (pk1)
PART_NUMBER varchar2(20) (pk2)
ORDER_STATUS varchar2(20)
Run Code Online (Sandbox Code Playgroud)
其中 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
Run Code Online (Sandbox Code Playgroud)
如果该订单后来在删除部分的地方被编辑,则与该关系有关的行应该从 ORDER_PARTS_TABLE 中删除或将其 ORDER_STATUS 设置为“REMOVED”
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
Run Code Online (Sandbox Code Playgroud)
有任何意义吗?我目前的解决方案只是使用我非常满意的触发器,但让我知道解决这个新问题的最佳方法是什么。谢谢!
编辑:我一直在做一些持续的挖掘,发现了一些听起来很有希望的东西,如果它可以适应的话。这里有没有人有过 REGEXP_SUBSTR 的经验?友情 链接
APEX 提供了一个实用程序来将值从穿梭项目中分离出来,如下所示:
declare
tab apex_application_global.vc_arr2;
begin
tab := apex_util.string_to_table (:p1_multiple_item);
...
end;
Run Code Online (Sandbox Code Playgroud)
因此,根据您的要求,您可以执行以下操作:
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;
Run Code Online (Sandbox Code Playgroud)
(注意我还没有处理该行是否已经存在,但你明白了。)
删除项目的处理将沿着相同的路线,尽管稍微复杂一些。