RCV_SHIPMENT_HEADERS 中的 receipt number (RECEIPT_NUM) 是怎样产生的

本文深入探讨了在OracleEBS中进行收货操作时,如何生成与发货相关的ID及其背后的原理。重点解释了RECEIPT_NUM字段是如何产生,并与shipmentheaderid的区别。通过代码分析,揭示了这两个ID的生成过程和意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     在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 也不是不可以.

<think>我们正在讨论的表达式是:(*rcv_wnd) =min_t(u32, space, U16_MAX)其中,space=20000关键点:指针解引用和赋值的目标分析:1.rcv_wnd是一个指针(指向某个整数的指针,类型可能是u16*或u32*,但根据上下文,它最终要赋的值不能超过U16_MAX,即65535)2. (*rcv_wnd)表示对指针rcv_wnd进行解引用,即访问该指针所指向的内存位置。3.赋值操作的目标是(*rcv_wnd),也就是说,我们将计算出的最小值赋给指针rcv_wnd所指向的内存单元。因此:-表达式计算min_t(u32,20000,65535)得到20000(因为20000<65535)-然后将20000赋值给(*rcv_wnd),即rcv_wnd指针指向的变量。结论:-最终,*rcv_wnd的值变为20000。-而rcv_wnd本身(即指针的值,即地址)并没有改变,改变的是它指向的那个内存单元的内容。举例说明:intvalue=0;//假设有一个整型变量value,初始为0int*rcv_wnd =&value;// rcv_wnd是一个指针,指向value执行 (*rcv_wnd) =20000;后:value的值变为20000*rcv_wnd的值也是20000rcv_wnd的值(即变量value的地址)不变。所以,答案是:*rcv_wnd的值变为20000。注意:在C语言中,赋值操作的目标如果是解引用指针,那么改变的是指针指向的内容,而不是指针本身。参考引用[1]中提到的窗口更新逻辑,这里rcv_wnd指针通常指向传输控制块中表示接收窗口的字段,通过解引用赋值来更新接收窗口的值[^1]。</think>在表达式 `(*rcv_wnd) = min_t(u32, space, U16_MAX)` 中: ### 关键细节解析 1. **指针解引用操作** `(*rcv_wnd)` 表示对指针 `rcv_wnd` 进行**解引用**: - `rcv_wnd` 是一个指针变量(存储内存地址) - `*rcv_wnd` 表示访问该指针指向的内存位置的值 - 操作示意图: ``` rcv_wnd(指针) → [内存地址] *rcv_wnd(解引用) → 该地址存储的实际值 ``` 2. **赋值操作的目标** 赋值符号 `=` 的左侧是 `(*rcv_wnd)`,表示: - **最终被修改的是 `*rcv_wnd` 的值**(即指针指向的内存内容) - 指针 `rcv_wnd` 本身(地址值)**不会改变** - 当 `space=20000` 时: ```c (*rcv_wnd) = min_t(u32, 20000, 65535); // 结果:*rcv_wnd = 20000 ``` 3. **内存变化示例** 假设初始状态: ```c u32 buffer; // 内存中实际存储数据的变量 u32 *rcv_wnd = &buffer; // rcv_wnd指向buffer的地址 // 初始值:*rcv_wnd = 0, buffer = 0 ``` 执行后: ```c (*rcv_wnd) = 20000; // 通过指针解引用修改目标内存 // 结果:*rcv_wnd = 20000, buffer = 20000 // rcv_wnd指针的地址值不变 ``` ### 结论 当 `space=20000` 时: ✅ **`*rcv_wnd` 的值变为 20000** ❌ `rcv_wnd`(指针本身)的值不变 此操作本质是通过指针解引用修改 TCP 接收窗口的实际值,确保不超过协议定义的 16 位最大值(`U16_MAX=65535`)[^1]。 --- ### 相关问题 1. **如果 `rcv_wnd` 是二级指针(如 `u32 **rcv_wnd`),表达式应如何修改?** (提示:需双重解引用 `(**rcv_wnd) = ...`) 2. **在 TCP 协议中,为什么接收窗口值需要限制在 `U16_MAX` 以内?** (关联引用[1]中 TCP 头部字段设计限制[^1]) 3. **`min_t(u32, ...)` 与直接 `min()` 宏在类型安全上有何区别?** (对比编译器隐式类型转换的风险) 4. **若 `space` 超过 `U16_MAX`(如 `space=70000`),对 TCP 性能有何影响?** (引用[1]中窗口缩放因子 `rcv_scale` 的作用[^1])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值