物料需求计算存储过程设计

简介: 物料需求计算存储过程设计

需求计算程序,根据销售订单或生产计划单、物料清单、总账结存数据、存量控制表等数据计算。

计算结果保存在需要计算表中。

ALTER PROCEDURE [dbo].[X9_XQJS]
    @DQYH  NVARCHAR(10),  --用户名称
    @DJOID VARCHAR(30)    --销售订单OID
AS
BEGIN TRY
  SET NOCOUNT ON;
  DECLARE @DQJC INT;
  DECLARE @DQNY CHAR(6);
  DECLARE @RKERR AS VARCHAR(200);
  IF NOT EXISTS(SELECT SHR FROM DJCHO WHERE DJMC='销售订单' AND OID=@DJOID AND SHR<>'' AND DJR<>'') 
    BEGIN
      SELECT @RKERR='单据['+@DJOID+']不存在或未登记!' ;
      THROW 50007,@RKERR,7
    END
  IF EXISTS(SELECT 1 FROM DJCHM DD INNER JOIN MLQD QD ON QD.CPCHXH=DD.CHXH 
      WHERE DD.OID=@DJOID AND QD.SFSH=0) 
    BEGIN
      SELECT @RKERR='单据['+@DJOID+']的物料清单未被审核,无法进行需求计算' ;
      THROW 50007,@RKERR,7
    END
  --   步骤 
  -- 1.删除原有计算结果
  DELETE FROM UTWLXQ WHERE OID=@DJOID;  
  SET @DQNY=DBO.X9_DQNY();
  -- 2.生成当前单据的一级物料需求行
  INSERT INTO UTWLXQ   (OID,NY,CPCHXH,JGDH,SJCHXH,CLCHXH,JC,CLLB,XQSL)
    SELECT @DJOID AS OID,@DQNY 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 = @DJOID) AND (MLQD.JC = 1);
  -- 3.分级计算
  SET @DQJC=1;
  WHILE (@DQJC<=6)
    BEGIN
      --生成下一级物料需求
      INSERT INTO UTWLXQ (OID,NY,CPCHXH, JGDH, SJCHXH,CLCHXH, JC, CLLB,XQSL)
        SELECT @DJOID AS OID,@DQNY 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 = @DJOID) AND (WLXQ.JC = @DQJC) AND (WLXQ.XQSL>0) AND (MLQD.JC = @DQJC + 1)
          GROUP BY MLQD.CPCHXH, MLQD.JGDH,WLXQ.CLCHXH,MLQD.CHXH,MLQD.JC,MLQD.CLLB;
      SET @DQJC=@DQJC+1;
    END
END TRY
BEGIN CATCH
    THROW;
END CATCH; 

代码中的相关表,可在 企业开发 专栏的其他文章中找到,需要可联系博主。

相关文章
|
5月前
|
存储 SQL
物料清单应用输入模板的SQL存储过程设计
物料清单应用输入模板的SQL存储过程设计
|
4月前
|
存储 关系型数据库 MySQL
MySql创建带事务操作的存储过程
MySql创建带事务操作的存储过程
|
4月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
4月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
2月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
39 0
|
2月前
|
存储 SQL 关系型数据库
MySQL 创建存储过程注意项
MySQL 创建存储过程注意项
34 0
|
3月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
|
3月前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
4月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
4月前
|
存储 SQL 关系型数据库
MySQL存储过程和存储函数的使用
MySQL的存储过程和存储函数在功能和用法上有明显的区别。存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,通过指定名称和参数(如果有)来调用执行,可以返回多个值或结果集,但不直接返回值。而存储函数则是一个有返回值的特殊存储过程,它返回一个值或表对象,可以直接嵌入SQL语句中使用,如SELECT语句中。两者都是为了提高SQL代码的重用性和性能,但使用场景和方式有所不同。
197 4