在 Subinventory 下面还有 Locator 控制. 对于一个 sub 是否启用 locator 控制, 实在 Subinventory form 里面控制的.
比较常用的是 Item Level, 在 item 层次定义是否启用locator 控制, 这里的 locator 要是 Sub 里面已经定义好的. 也可以选择 Dynamic entry, 动态插入 locator. 这个 locator 可以是这个 Sub 里面还没有的, 动态生成.
在Receipts 界面收货的时候, 输入 Sub 和一个 locator. 这个 locator 可以是这个 Sub 已经存在的, 也可以是整个 Org 都不存在的, 但不可以是这个 Sub 不存在, 但是存在于其他 Sub 里面的
保存这个 Form, 于是就动态生成了一个 locator
select * from MTL_ITEM_LOCATIONS where SUBINVENTORY_CODE = 'yuSub' and SEGMENT1 = 10 and SEGMENT2 = 1 and SEGMENT3 = 6;在这条记录里面记录了这个 locator 的基本信息, 包括所属 Organization, Sub, 各个segment, enabled_flag, status_id 等等.
但是需要注意的是, Form 上的 Locator 是一个 Key Flexfield, 这个 field 是由 Form 自动插入表中的
INSERT INTO MTL_ITEM_LOCATIONS( ENABLED_FLAG, SUMMARY_FLAG, START_DATE_ACTIVE, END_DATE_ACTIVE, LAST_UPDATE_DATE, LAST_UPDATED_BY, SEGMENT1, SEGMENT2, SEGMENT3, ORGANIZATION_ID, INVENTORY_LOCATION_ID) VALUES ( 'Y', :sumflg, to_date(:sdate, 'J'), to_date(:edate, 'J'), SYSDATE, :user_id, :SEGMENT1, :SEGMENT2, :SEGMENT3, :ORGANIZATION_ID, :INVENTORY_LOCATION_ID)这里并没有插入 Locator 所属的 SUBINVENTORY_CODE, 也没有插入这个 Locator 的 STATUS_ID.
实际的做法是, 在 Form 保存的时候, 调用了触发器 RCVRCERC.fmb -> RCV_TRANSACTION -> PRE-UPDATE
在这个触发器里面调用了
rcv_receipts_eh2.event ('PRE-UPDATE');在 RCVRCERL.pld, PACKAGE BODY RCV_RECEIPTS_EH2, event = 'PRE-UPDATE' 里面接着调用
rcv_locator_control.set_locator_attributes (event);在 RCVCOTRX.pld, PACKAGE BODY RCV_LOCATOR_CONTROL, PROCEDURE set_locator_attributes, event = 'PRE-UPDATE'
update mtl_item_locations set subinventory_code = X_subinventory where inventory_location_id = X_locator_id and organization_id = X_organization_id and subinventory_code is null;
update mtl_item_locations set status_id = l_locator_status where inventory_location_id = X_locator_id;这样就完善了 Locator 记录里面的 Sub 和 Status.
在 RCVTXERE.pld, RCV_TRANSACTIONS_1.event (event = 'PRE-UPDATE') OR (event = 'PRE-INSERT') 里面也有同样的代码, 做了同样的事情. 但那可能不是对应 Recepts 界面收货的情况, 而是其他的业务.