基于存货总线设计的物料需求计算后台函数(plpgsql)

文章介绍了一个物料需求计算函数,该函数根据销售订单进行计算并在存货总线系统中生成需求计算单。它涉及到物料清单数据字典,使用PL/pgSQL语言实现,确保数据的准确性和决策支持。存货总线设计旨在简化物料管理,促进小企业ERP实施。

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

物料需求计算函数

有了存货总线数据后,需求计算将变得十分简单。本例需求计算根据销售订单计算,并生成需求计算单,销售订单+需求计算单=存货总线需求。在存货总线中,需求、计算、完成、交付与结存是直观体现的,不是传统的存货账项数据,为物料决策提供快速、准确的依据。
本例在需求计算单填制功能中,使用调入数据获得单据数据,此时完成需求计算。需求计算单与销售订单是一一对应的。

一、物料清单表数据字典

mlqd字段列表:
qdid    	int4    	   32	清单序号        	textedit	        
cpchxh  	varchar 	   20	产品货号        	textedit	   00000
cpchdh  	varchar 	   30	产品代号        	textedit	        
jgdh    	varchar 	   30	结构代号        	textedit	        
jc      	int4    	   32	级次          	textedit	        
chxh    	varchar 	   20	货号          	buttonedit	        
chdh    	varchar 	   30	存货代号        	buttonedit	        
chmc    	varchar 	  100	存货名称        	textread	        
xh1     	varchar 	  100	型号          	buttonedit	        
xh2     	varchar 	  100	规格          	textedit	        
xh3     	varchar 	  400	参数          	textedit	        
gg1     	varchar 	  100	颜色          	comboedit	    edit
gg2     	varchar 	  100	材质          	textedit	        
gg3     	varchar 	  100	图号          	textedit	        
jldw    	varchar 	  100	单位          	textread	        
cllb    	varchar 	   20	材料类别        	textread	        
desl    	numeric 	   16	定额数量        	textedit	0.0000;-0,0000;#
desh    	numeric 	   16	定额损耗        	textedit	0.00;-0,00;#
wldw    	varchar 	  200	往来单位        	buttonedit	        
scbm    	varchar 	  100	生产部门        	textedit	        
ckmc    	varchar 	  100	仓库名称        	listedit	        
jsjd    	int4    	   32	计算精度        	textedit	        
hh      	int4    	   32	行号          	textedit	        
rq      	date    	    0	日期          	dateedit	yyyy-MM-dd
sfsh    	bool    	    0	是否审核        	checkedit	        
shry    	varchar 	   40	审核人员        	textedit	        

存货单据数据字典在前面文章中已经给出。

二、物料需求计算函数

CREATE OR REPLACE FUNCTION public.x9_xqjs(
	ssdqyh character varying,
	ssdjoid character varying)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
   -- description:需求计算单计算程序,根据销售订单计算。原为根据生产计划单计算
   -- 本例用于需求计算单调入数据时使用。需求计算单与销售订单一一对应。	
DECLARE
	ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
   ssdqjc int;
	ssdqny char(6);
	ssrkerr varchar(200);
BEGIN
	-- 需求计算前要对关联物料清单进行验证
	IF NOT exists(SELECT shr FROM djcho WHERE djmc = '销售订单' AND oid = $2 AND shr <> '' AND djr <> '')  THEN
		ssrkerr:='单据' || $2 || '不存在或未登记!' ;
		CALL x9_jlproc(ssrkerr,'','djcho','登记销售订单','需求计算');
		RETURN ssrkerr;
	END IF;
	IF exists(SELECT oid FROM djchm dd INNER JOIN mlqd qd ON qd.cpchxh = dd.chxh WHERE dd.oid = $2 AND qd.sfsh = false) THEN
		ssrkerr:='单据' || $2 || '的物料清单未被审核,无法进行需求计算' ;
		CALL x9_jlproc(ssrkerr,'','mlqd','清单审核','需求计算');
		RETURN ssrkerr;
	END IF;
	--  步骤
	--  1.删除原有计算结果
	DELETE FROM utwlxq WHERE oid = $2;
	ssdqny:=x9_dqny();
	--  2.生成当前单据的一级物料需求行
	INSERT INTO utwlxq	(oid,ny,cpchxh,jgdh,sjchxh,clchxh,jc,cllb,xqsl)
		SELECT $2 AS oid,ssdqny AS ny,mlqd.cpchxh, mlqd.jgdh, '' AS sjchxh,mlqd.cpchxh, mlqd.jc,
			mlqd.cllb,	sum(round((djchm.xqsl * mlqd.desl) * (1 + mlqd.desh / 100), mlqd.jsjd)) AS xqsl
		FROM djchm INNER JOIN mlqd ON djchm.chxh = mlqd.cpchxh
		GROUP BY djchm.oid,mlqd.cpchxh,mlqd.jgdh,mlqd.chxh,mlqd.jc,mlqd.cllb
		HAVING (djchm.oid = $2) AND (mlqd.jc = 1);
	--  3.分级计算
	ssdqjc:=1;
	LOOP
		EXIT WHEN ssdqjc > 5;
		-- 生成下一级物料需求
		INSERT INTO utwlxq (oid,ny,cpchxh, jgdh, sjchxh,clchxh, jc, cllb,xqsl)
		SELECT $2 AS oid,ssdqny AS ny, mlqd.cpchxh, mlqd.jgdh,wlxq.clchxh AS sjchxh,mlqd.chxh, mlqd.jc,
			mlqd.cllb, sum(round((wlxq.xqsl * mlqd.desl) * (1 + mlqd.desh / 100), mlqd.jsjd)) AS xqsl
		FROM utwlxq AS wlxq INNER JOIN mlqd ON wlxq.cpchxh = mlqd.cpchxh AND mlqd.jgdh like wlxq.jgdh || '%'
		WHERE (wlxq.oid = $2) AND (wlxq.jc = ssdqjc) AND (wlxq.xqsl > 0) AND (mlqd.jc = ssdqjc + 1)
			GROUP BY mlqd.cpchxh, mlqd.jgdh,wlxq.clchxh,mlqd.chxh,mlqd.jc,mlqd.cllb;
		ssdqjc:=ssdqjc + 1;
	END LOOP;
   RETURN '计算完成';
EXCEPTION WHEN others THEN
	GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
		sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
	CALL x9_jlproc( ssmsg,ssdet ,sstname,sshint,ssctt);
   RETURN ssdjoid || '需求计算出现错误';
END;
$BODY$;

三、总结

存货总线设计的目的是使用物料管理业务简化的同进行规范化,为小企业ERP实施成功提供更大可能。使复杂的数据关系变得简单好懂并且可视化。为传统管理模式向先进管理模式的过度提供了更多机会。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值