在Oracle EBS 中做收货动作的时候, 会伴随着产生发运记录, 这个记录在RCV_SHIPMENT_HEADERS 和 RCV_SHIPMENT_LINES 两个表里面. 对用户来说, 记住这两个表的ID 很不容易, 因为这个ID 非常长. 所以在RCV_SHIPMENT_HEADERS 这个表里面有一个字段 RECEIPT_NUM. 这个字段是VARCHAR2 类型的, 通常是比较短的数字. 那么这个数字是怎样产生的呢?
这里要注意的是RSH 这个表里面的两个字段 shipment number 和receipt number 不一样; shipment number 有时候用字符来表示, 比如容易记的 "ASN2014" 等等. 这个是可以在发运的时候产生的, 但是receipt number是在收货的时候产生的.
我们的问题是, 为什么receipt number 可以用一个短的数字来表示, 而shipment header id 那么长呢? 问题的答案是因为, 这两个字段表示的含义不同. shipment header id 表示的是整个表的id, 而receipt number 是针对每个不同的org 有不同的receipt number. 这也就是说, shipment header id 是不能重复的, 但是receipt number 是可以重复的.
事实上, 在Form 界面上做保存的时候, 会调用 RCV_RECEIPTS_TH2.insert_header, 这个时候 shipment header id 和receipt number 都是空值, 并没有在界面上产生. 在这个procedure 里面又调用了rcv_shipment_headers_pkg.insert_row(), 也就是数据库里面的procedure 了. 在这个procedure 里面分别产生了shipment header id 和 receipt number.
shipment header id: select rcv_shipment_headers_s.nextval FROM sys.dual;
receipt number: select to_char(next_receipt_num + 1) from rcv_parameters where organization_id = x_ship_to_org_id FOR UPDATE OF next_receipt_num;
这里我们就可以看到receipt number 是根据不同的org 而产生的.
2014-04-29 更新
今天看了下红生的代码, 他是在EO 的create() 方法里面产生的 shipmentHeaderId, 这个方法在产生EO 的时候就调用了, 也就是说这个 id 不是在插入RSH 表的时候产生的. 和 form 做法不同. 另外我感觉, 既然一个AM 就代表一个transaction, 那么在AM 里面产生shipmentHeaderId 和receiptNum 也不是不可以.