oracle erp 库存账龄,探讨Oracle Applications 库存及库龄的计算方法
CREATE TABLE BITC_ITEM_INV_ATUO_AGE
(
ORGANIZATION_ID NUMBER,
INVENTORY_ITEM_ID NUMBER,
SUB_INV VARCHAR2(20 BYTE),
LOCATION_ID NUMBER,
LOCATION_NAME VARCHAR2(20 BYTE),
UNIT VARCHAR2(10 BYTE),
AGE_DATE DATE, --初始入库时间
QTY NUMBER,
ITEM_COST NUMBER,
SYS_DATE DATE DEFAULT SYSDATE,
TRANSACTION_ID NUMBER
)
2.2 物料帐龄滚动计算。
截取初始账龄时间到现在某个时间为止的时间段内mtl_material_transactions表中的所有类型的记录(除成本更新)。对这段记录要按交易时间的先后循序每一条,每一条的计算。按入库和出库情况进行分类。对新入库的要记录到表BITC_ITEM_INV_ATUO_AGE 中,原始的入库时间为这笔记录的交易时间。如果是出库的要找到这个物料最早的账龄日期的那笔库存。如果此笔库存不过扣减,则找到这个料下一笔账龄库存数。直到满足这笔记录出库为止。这样不停的计算直到最后一笔。且每计算一笔记录,我们要在mtl_material_transactions表中标记为此笔记录已运算过,下次不要重复计算。保证数据的准确性。如果运行到现在就是我们要的物料账龄表了,我们可以制定一个程序在后台定时运算。这样就能及时地得到所要的物料账龄表。
具体的实现方法如下:
1. 截取初始账龄时间到现在某个时间为止的时间段内mtl_material_transactions表中的所有类型的记录(除成本更新)(第一次运行此程序)
2. 对此段记录的排序要特别处理。要按TRANSACTION_ID 和 PRIMARY_QUANTITY 排序。记住单位的不一致的要转化成一致。对子库存转移和挑库类型以及组织间转移的类型TRANSACTION_ID 要做一下特殊处理要让此类型的数据的正数的记录排在负数前面记录的前面因为ORACLE 处理这些类型时,是先做一笔负数的扣减,从来源仓位扣去要转出的库存。然后再做一笔正数的到目的仓位的库存。为了记录帐龄表中的库存来源日期。我们要让正数的到目的仓位先入库存。再让负数从来源仓出库。
3. 要对出入库的记录要分类处理。不同的类型有不同的处理算法。
3.1 对入库类型为:1:PO接收 2:工单完工入库,3:杂入,4:工单退回
要按新入库的记录。
3.2 对出库类型和库存转移类型转出的部分。是要按帐龄的先后顺序扣减。
3.3 库存转移类型入库的部分要记录此笔记的原始入库时间,及从来原仓位的原始入库时间带过来。
整体的程序如下SQL:
CREATE OR REPLACE PROCEDURE BITC_ITEM_AGE_AUTO_UPDATE(P_ORGANIZATION_ID NUMBER)
AS
var_org_CODE VARCHAR2(20);
Var_Sub_Inv varchar2(20);
Var_Item varchar2(20);
Var_Date_To date;
Int_On_Hand NUMBER;
Int_Days_60 number;
Int_Days_90 number;
Int_Days_180 number;
Int_Days_270 number;
Int_OVER_270 number;
Int_onhand_qty number;
CURSOR c1(Var_ORGANZATION_ID NUMBER) IS
SELECT BITC_GET_AGE_TRANSACTION_ID(M.TRANSACTION_ID,M.TRANSACTION_ACTION_ID,M.PRIMARY_QUANTITY) TRANSACTION_ID1,
m.TRANSACTION_ID,
M.ORGANIZATION_ID,
M.INVENTORY_ITEM_ID,
M.SUBINVENTORY_CODE SUB_INV,
M.PRIMARY_QUANTITY QTY,
M.ACTUAL_COST ITEM_COST,
M.TRANSACTION_UOM UNIT,
to_date(to_char(m.CREATION_DATE,'YYYY-MM-DD'),'YYYY-MM-DD') TRANSACTION_DATE,
M.TRANSACTION_ACTION_ID,
M.TRANSFER_ORGANIZATION_ID,
M.TRANSFER_SUBINVENTORY
FROM MTL_MATERIAL_TRANSACTIONS M
WHERE to_char(m.CREATION_DATE,'YYYY-MM-DD')>='2009-01-01'
AND M.ATTRIBUTE15 IS NULL
ORDER BY BITC_GET_AGE_TRANSACTION_ID(M.TRANSACTION_ID,M.TRANSACTION_ACTION_ID,M.PRIMARY_QUANTITY) ,M.PRIMARY_QUANTITY DESC;
CURSOR c2(Var_ORGANZATION_ID NUMBER,Var_item_id number, Var_sub_inv varchar2) IS
SELECT B.TRANSACTION_ID,
B.ORGANIZATION_ID,
B.INVENTORY_ITEM_ID,
B.SUB_INV,
B.UNIT,
B.AGE_DATE,
B.QTY
FROM BITC_ITEM_INV_ATUO_AGE B
WHERE B.ORGANIZATION_ID=Var_ORGANZATION_ID
and b.INVENTORY_ITEM_ID=Var_item_id
and b.QTY>0
and (Var_sub_inv is null or b.SUB_INV=Var_sub_inv)
order by B.AGE_DATE ;
ic_c1_rec c1%ROWTYPE;
ic_c2_rec c2%ROWTYPE;
BEGIN
--DELETE FROM BITC_KPI_FINANCE_FOR_AGE ;
OPEN c1(P_ORGANIZATION_ID);
LOOP
FETCH c1 INTO ic_c1_rec;
EXIT WHEN c1%NOTFOUND;
IF (ic_c1_rec.TRANSACTION_ACTION_ID=27 OR ic_c1_rec.TRANSACTION_ACTION_ID=31) AND ic_c1_rec.QTY>0 THEN
INSERT INTO BITC_ITEM_INV_ATUO_AGE
(ORGANIZATION_ID, INVENTORY_ITEM_ID, SUB_INV, Transaction_id,
UNIT, QTY, ITEM_COST, AGE_DATE )
VALUES
(
ic_c1_rec.ORGANIZATION_ID, ic_c1_rec.INVENTORY_ITEM_ID, ic_c1_rec.Sub_Inv, BITC_item_age_seq.NEXTVAL ,
ic_c1_rec.UNIT, ic_c1_rec.QTY, ic_c1_rec.ITEM_COST, ic_c1_rec.TRANSACTION_DATE
);
UPDATE MTL_MATERIAL_TRANSACTIONS M
SET M.ATTRIBUTE15='Y'
WHERE M.ORGANIZATION_ID=ic_c1_rec.ORGANIZATION_ID
AND M.TRANSACTION_ID=ic_c1_rec.TRANSACTION_ID;
end if;
IF (ic_c1_rec.TRANSACTION_ACTION_ID=1 or ic_c1_rec.TRANSACTION_ACTION_ID=2 or ic_c1_rec.TRANSACTION_ACTION_ID=3 or ic_c1_rec.TRANSACTION_ACTION_ID=28 OR ic_c1_rec.TRANSACTION_ACTION_ID=32) and ic_c1_rec.QTY<0 THEN
Int_onhand_qty:=ic_c1_rec.QTY*-1;
OPEN c2(ic_c1_rec.ORGANIZATION_ID,ic_c1_rec.INVENTORY_ITEM_ID,ic_c1_rec.Sub_Inv);
LOOP
FETCH c2 INTO ic_c2_rec;
EXIT WHEN c2%NOTFOUND;
if Int_onhand_qty>0 then
IF Int_onhand_qty>ic_c2_rec.QTY THEN
update BITC_ITEM_INV_ATUO_AGE B
SET B.QTY=B.QTY-ic_c2_rec.QTY
WHERE B.TRANSACTION_ID=ic_c2_rec.TRANSACTION_ID;
Int_onhand_qty:=Int_onhand_qty- ic_c2_rec.QTY;
ELSE
update BITC_ITEM_INV_ATUO_AGE B
SET B.QTY=B.QTY-Int_onhand_qty
WHERE B.TRANSACTION_ID=ic_c2_rec.TRANSACTION_ID;
Int_onhand_qty:=0;
END IF;
end if;
end loop;
UPDATE MTL_MATERIAL_TRANSACTIONS M
SET M.ATTRIBUTE15='Y'
WHERE M.ORGANIZATION_ID=ic_c1_rec.ORGANIZATION_ID
AND M.TRANSACTION_ID=ic_c1_rec.TRANSACTION_ID;
CLOSE c2;
end if;
IF (ic_c1_rec.TRANSACTION_ACTION_ID=1 or ic_c1_rec.TRANSACTION_ACTION_ID=2 or ic_c1_rec.TRANSACTION_ACTION_ID=3 or ic_c1_rec.TRANSACTION_ACTION_ID=28) and ic_c1_rec.QTY>0 THEN
Int_onhand_qty:=ic_c1_rec.QTY;
OPEN c2(ic_c1_rec.TRANSFER_ORGANIZATION_ID,ic_c1_rec.INVENTORY_ITEM_ID,ic_c1_rec.TRANSFER_SUBINVENTORY);
LOOP
FETCH c2 INTO ic_c2_rec;
EXIT WHEN c2%NOTFOUND;
if Int_onhand_qty>0 then
IF Int_onhand_qty>ic_c2_rec.QTY THEN
INSERT INTO BITC_ITEM_INV_ATUO_AGE
(ORGANIZATION_ID, INVENTORY_ITEM_ID, SUB_INV, Transaction_id,
UNIT, QTY, ITEM_COST, AGE_DATE )
VALUES
(
ic_c1_rec.ORGANIZATION_ID, ic_c1_rec.INVENTORY_ITEM_ID, ic_c1_rec.SUB_INV, BITC_item_age_seq.NEXTVAL ,
ic_c1_rec.UNIT, ic_c2_rec.QTY, ic_c1_rec.ITEM_COST, ic_c2_rec.AGE_DATE
);
Int_onhand_qty:=Int_onhand_qty- ic_c2_rec.QTY;
ELSE
INSERT INTO BITC_ITEM_INV_ATUO_AGE
(ORGANIZATION_ID, INVENTORY_ITEM_ID, SUB_INV, Transaction_id,
UNIT, QTY, ITEM_COST, AGE_DATE )
VALUES
(
ic_c1_rec.ORGANIZATION_ID, ic_c1_rec.INVENTORY_ITEM_ID, ic_c1_rec.SUB_INV, BITC_item_age_seq.NEXTVAL ,
ic_c1_rec.UNIT, Int_onhand_qty, ic_c1_rec.ITEM_COST, ic_c2_rec.AGE_DATE
);
Int_onhand_qty:=0;
END IF;
end if;
end loop;
UPDATE MTL_MATERIAL_TRANSACTIONS M
SET M.ATTRIBUTE15='Y'
WHERE M.ORGANIZATION_ID=ic_c1_rec.ORGANIZATION_ID
AND M.TRANSACTION_ID=ic_c1_rec.TRANSACTION_ID;
CLOSE c2;
end if;
COMMIT;
END LOOP;
CLOSE c1;
COMMIT;
END ;
/
oracle erp 库存账龄,探讨Oracle Applications 库存及库龄的计算方法相关推荐
- Oracle ERP/EBS顾问就业前景 Oracle ERP/EBS顾问 培训
我们淘宝店铺:https://shop108514483.taobao.com/ 资料共享地址:https://pan.baidu.com/s/1PMWeRpUU0e12cYPt5UeUxg 需要进入 ...
- oracle 根据spid查sql,探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句...
Oracle数据库查看一个进程是如何执行相关的实际sql语句 代码如下: SELECT b.sql_text,sid,serial#,osuser,machine FROM v$session a,v ...
- oracle中row_number用法,深入探讨:oracle中row_number() over()分析函数用法
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...
- oracle erp二次开发语句,Oracle ERP二次开发常用脚本(1)
下面是我常用的脚本,在做报表,修改报表时很有用(对我是这样),希望能给大家带来帮助-- (1)./* 根据报表文件名称关键字查找报表的执行文件名称等信息*/ SELECT A.USER_CONCURR ...
- Oracle ERP 技术探讨
纯技术的博客! 对Oracle ERP功能和技术方面的探讨.没有兴趣千万别看,因为我怕浪费你的时间 Strcuts 开发举例 作者 HenryRen 17:14 | 静态链接网址 | 最新回复 (0) ...
- “醉眼”看Oracle ERP和SAP ERP种种异同
IT168上看到老朱07年写的一篇关于Oracle ERP和SAP ERP比较的文章,概括的不错. 文中提到一点值得商榷,"Oracle 应用系统11i 版本是真正完全基于互联网Intern ...
- oracle宣传标语,甲骨文全球大会 | Oracle SaaS系列更新 解锁创新未来
原标题:甲骨文全球大会 | Oracle SaaS系列更新 解锁创新未来 "Breakthrough Starts Here(突破从这里开始)"是2019甲骨文全球大会的主题标语, ...
- SAP库存库龄逻辑分析
https://blog.csdn.net/kangliujie/article/details/74784596 库存账龄指库存物料在仓库的存放时间,可反映出物料周转率与物料需求计划的准确性, ...
- SAP库龄报表解析说明
1. 查询出所有在库物料的总库存(mard 或鞋服 MCHB) 2. 从MSEG中获得所有的入库记录 3. 按照倒推规则,结合库存总量以及入库明细,计算每行采购收货在现有库存中的余量. 4. 基 ...
最新文章
- Windows下Node.js开发入门(1)
- html 右下角弹窗,javascript实现的右下角弹窗实例
- eclipse 安装tomcat
- 【转】更改远程桌面默认端口3389及删除远程桌面连接历史记录
- mysql按select导出_mysql 导出select结果到文本的几种方式
- Visual Studio 2008下AJAX的设置
- bash:express:command not found
- HTTP405: 错误方法 - 不支持使用的 HTTP 谓词。
- 编译原理实验五:编译器自动生成工具
- coap python_Python coap
- Anker 推出苹果二合一磁吸无线充电器:售价 328 元
- 【Java】If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
- android开发 h264传输,基于android的H264视频无线传输系统的设计与实现
- alfred 常用搜索_如何使用Alfred完善macOS的Spotlight搜索
- Springboot企业内部交流系统9r309计算机毕业设计-课程设计-期末作业-毕设程序代做
- Jupyter notebook用谷歌浏览器打开
- 1N5408-ASEMI整流二极管1N5408
- 开源四足机器人 附设计图及代码
- 移动webAPP前端开发代码演示和技巧汇总
- 26岁转行软件测试,目前34了,分享一些我的经历和感受