存货核算的存储过程设计

简介: 存货核算的存储过程设计

存货核算是企业物料管理的核算功能,涉及的表较多,关系也较复杂,通过存储过程完成计算和数据更新,可以取得较好的用户体验。

存货核算过程一般每月月末执行一次,或在必要时由用户操作。

数据字典

存货总账UTZZCH字段列表:
ID        int           4 键号            TextEdit          
NY        char          6 年月            TextRead          
CKMC      nvarchar    100 仓库            TextRead          
CHXH      varchar      20 货号            TextRead          
JLDW      varchar      20 计量单位          TextEdit          
QCJS      int           4 期初件数          TextEdit     0;0;#
QCSL      decimal       9 期初数量          TextEdit  #,###.00;-#,###.00;#
QCDJ      decimal       9 期初单价          TextEdit  #,###.00;-#,###.00;#
QCJE      decimal       9 期初金额          TextEdit  #,###.00;-#,###.00;#
XQJS      int           4 需求件数          TextEdit     0;0;#
XQSL      decimal       9 需求数量          TextEdit  #,###.00;-#,###.00;#
XQJE      decimal       9 需求金额          TextEdit  #,###.00;-#,###.00;#
JHJS      int           4 计划件数          TextEdit     0;0;#
JHSL      decimal       9 计划数量          TextEdit  #,###.00;-#,###.00;#
JHJE      decimal       9 计划金额          TextEdit  #,###.00;-#,###.00;#
SRJS      int           4 收入件数          TextEdit     0;0;#
SRSL      decimal       9 收入数量          TextEdit  #,###.00;-#,###.00;#
SRJE      decimal       9 收入金额          TextEdit  #,###.00;-#,###.00;#
FCJS      int           4 发出件数          TextEdit     0;0;#
FCSL      decimal       9 发出数量          TextEdit  #,###.00;-#,###.00;#
FCJE      decimal       9 发出金额          TextEdit  #,###.00;-#,###.00;#
JCJS      int           4 结存件数          TextEdit     0;0;#
JCSL      decimal       9 结存数量          TextEdit  #,###.00;-#,###.00;#
JCDJ      decimal       9 结存单价          TextEdit  #,###.00;-#,###.00;#
JCJE      decimal       9 结存金额          TextEdit  #,###.00;-#,###.00;#
单据头DJCHO字段列表:(部分)
OID       varchar      30 计划单号          TextRead          
DJMC      nvarchar     60 单据名称          TextRead          
NY        char          6 年月            TextRead          
RQ        date          3 日期            DateEdit  yyyy-MM-dd
DQBZ      nvarchar     40 当前步骤          TextRead          
YWLB      nvarchar     40 业务类别          TextEdit          
WLDW      nvarchar    200 往来单位          ButtonEdit          
JSWB      nvarchar     40 结算外币          TextRead          
SCBM      nvarchar    100 生产部门          ListEdit          
CKMC      nvarchar    100 仓库名称          ListEdit          
HTBH      varchar      50 合同编号          TextEdit          
JFRQ      datetime      8 交付日期          DateEdit  yyyy-MM-dd
YWY       nvarchar     60 业务员           ComboEdit         
GLBJ      nvarchar    100 关联标记          TextEdit          
BZ        nvarchar    100 备注            TextEdit          
TZR       nvarchar     20 制表人           TextRead          
SHR       nvarchar     20 审核人           TextRead          
DJR       nvarchar     20 登记人           TextRead        
单据体DJCHM字段列表:
MID       int           4 计划序号          TextRead          
OID       varchar      30 计划单号          TextRead          
DJMC      nvarchar     60 单据名称          TextRead          
NY        char          6 年月            TextRead          
DQBZ      nvarchar     40 当前步骤          TextRead          
CHXH      varchar      20 货号            ButtonEdit          
CHDH      varchar      30 存货代号          ButtonEdit          
CHMC      nvarchar    100 存货名称          TextRead          
XH1       nvarchar    100 型号            ButtonEdit          
XH2       nvarchar    100 规格            ButtonGgxh          
XH3       nvarchar    400 参数            TextEdit          
GG1       nvarchar    100 颜色            ComboEdit     EDIT
GG2       nvarchar    100 材质            TextEdit          
GG3       nvarchar    100 图号            TextEdit          
BZDW      nvarchar     40 包装单位          NotEnter          
MJSL      decimal       9 每件数量          TextEdit  0.00;0.00;#
JLDW      nvarchar     20 计量单位          NotEnter          
BZJS      int           4 件数            TextEdit     0;0;#
XQSL      decimal       9 需求数量          TextEdit  #,###.00;-#,###.00;#
XQDJ      decimal       9 需求单价          TextEdit  #,###.00;-#,###.00;#
XQJE      decimal       9 需求金额          TextEdit  #,###.00;-#,###.00;#
JHSL      decimal       9 计划数量          TextRead  #,###.00;-#,###.00;#
JHDJ      decimal       9 计划单价          TextEdit  #,###.00;-#,###.00;#
JHJE      decimal       9 计划金额          TextEdit  #,###.00;-#,###.00;#
RKSL      decimal       9 入库数量          TextEdit  #,###.00;-#,###.00;#
RKDJ      decimal       9 入库单价          TextEdit  #,###.00;-#,###.00;#
RKJE      decimal       9 入库金额          TextEdit  #,###.00;-#,###.00;#
CKSL      decimal       9 出库数量          TextEdit  #,###.00;-#,###.00;#
CKDJ      decimal       9 出库单价          TextEdit  #,###.00;-#,###.00;#
CKJE      decimal       9 出库金额          TextEdit  #,###.00;-#,###.00;#
JGSL      decimal       9 加工数量          TextEdit  #,###.00;-#,###.00;#
JGDJ      decimal       9 加工单价          TextEdit  #,###.00;-#,###.00;#
JGJE      decimal       9 加工金额          TextEdit  #,###.00;-#,###.00;#
XSSL      decimal       9 销售数量          TextEdit  #,###.00;-#,###.00;#
XSDJ      decimal       9 销售单价          TextEdit  #,###.00;-#,###.00;#
XSJE      decimal       9 销售金额          TextEdit  #,###.00;-#,###.00;#
WBJE      decimal       9 外币金额          TextEdit  #,###.00;-#,###.00;#
ZZSL      decimal       9 税率            TextEdit        N2
ZZSE      decimal       9 税额            TextEdit        N2
WBSE      decimal       9 外币税额          TextEdit        N2
TP1       nvarchar    400 图片            FileEdit          
CLYT      varchar      20 材料用途          TextRead          
DJRQ      datetime      8 登记日期          DateEdit  yyyy-MM-dd
BZ        nvarchar    400 备注            ButtonTextEdit          
MHH       int           4 行号            TextEdit          
SFSH      bit           1 是否审核          CheckEdit         
SFDJ      bit           1 是否登记          CheckRead     

存货核算存储过程代码:ms sql

ALTER PROCEDURE [dbo].[X9_HSCH]
    @HSNY VARCHAR(6),   --核算年月
  @DQYH nvarchar(10)  --当前用户
AS
BEGIN TRY
  SET NOCOUNT ON;
  --操作前请备份数据库
  --一、清空存货总账入库数据
  UPDATE UTZZCH SET JCJS=0,XQJS=0,XQSL=0,XQJE=0,JHJS=0,JHSL=0,JHJE=0,SRJS=0,SRSL=0,SRJE=0,FCJS=0,FCSL=0,FCJE=0 
    FROM UTZZCH WHERE NY=@HSNY;
  --二、更新存货总账数据,需求、计划、入库
  WITH HSCH (NY,CHXH,XQJS,XQSL,XQJE,JHJS,JHSL,JHJE,SRJS,SRSL,SRJE) AS 
    (SELECT O.NY,M.CHXH,
      SUM(CASE WHEN M.DJMC IN ('销售订单','需求计算单') THEN M.BZJS ELSE 0 END) AS XQJS, SUM(M.XQSL),SUM(M.XQJE),
      SUM(CASE WHEN M.DJMC IN ('采购订单','委外订单','生产计划单') THEN M.BZJS ELSE 0 END) AS JHJS,SUM(M.JHSL),SUM(M.JHJE),
      SUM(CASE WHEN M.DJMC IN ('采购入库单','委外入库单','完工入库单','盘点入库单') THEN M.BZJS ELSE 0 END) AS RKJS,
      SUM(M.RKSL),SUM(M.RKJE) 
     FROM DJCHO O INNER JOIN DJCHM M ON O.OID=M.OID 
      WHERE (O.NY = @HSNY) AND (O.DJR<>'') AND CHARINDEX('出库',O.DJMC)=0 GROUP BY O.NY,M.CHXH)
  UPDATE UTZZCH SET XQJS=DJ.XQJS,XQSL=DJ.XQSL,XQJE=DJ.XQJE,JHJS=DJ.JHJS,JHSL=DJ.JHSL,JHJE=DJ.JHJE,
      SRJS=DJ.SRJS,SRSL=DJ.SRSL,SRJE=DJ.SRJE 
    FROM UTZZCH AS ZZ INNER JOIN HSCH AS DJ ON 
      (ZZ.NY=DJ.NY AND ZZ.CHXH=DJ.CHXH) WHERE ZZ.NY=@HSNY;
  UPDATE UTZZCH SET JCDJ=XM.JHJJ FROM UTZZCH ZZ INNER JOIN MLCHXM XM ON ZZ.CHXH=XM.CHXH 
    WHERE ZZ.NY=@HSNY AND (ZZ.QCSL+ZZ.SRSL)<=0;
  UPDATE UTZZCH SET JCDJ=(QCJE+SRJE)/(QCSL+SRSL) WHERE NY=@HSNY AND (QCSL+SRSL)>0 AND (QCJE+SRJE)>0;
  --三、更新单据数据,出库单价
  UPDATE DJCHM SET CKDJ=ZZ.JCDJ,CKJE=ZZ.JCDJ*M.CKSL 
    FROM DJCHM M INNER JOIN UTZZCH ZZ ON M.CHXH=ZZ.CHXH AND M.NY=ZZ.NY 
    WHERE ZZ.NY=@HSNY AND CHARINDEX('出库',M.DJMC)<>0;
  --四、更新存货总账数据,出库
  WITH HSCK (NY,CHXH,FCJS,FCSL,FCJE) AS 
    (SELECT O.NY,M.CHXH,
      SUM(CASE WHEN M.DJMC IN ('领用出库单','委外出库单','销售出库单') THEN M.BZJS ELSE 0 END) AS CKJS,SUM(M.CKSL),SUM(M.CKJE) 
     FROM DJCHO O INNER JOIN DJCHM M ON O.OID=M.OID 
      WHERE (O.NY = @HSNY) AND (O.DJR<>'') AND CHARINDEX('出库',O.DJMC)<>0 GROUP BY O.NY,M.CHXH)
  UPDATE UTZZCH SET FCJS=DJ.FCJS,FCSL=DJ.FCSL,FCJE=DJ.FCJE 
    FROM UTZZCH AS ZZ INNER JOIN HSCK AS DJ ON 
      (ZZ.NY=DJ.NY AND ZZ.CHXH=DJ.CHXH) WHERE ZZ.NY=@HSNY;
  --五、更新总账结存数量金额
  UPDATE UTZZCH SET JCSL=QCSL+SRSL-FCSL,JCJE=QCJE+SRJE-FCJE,JCJS=QCJS+SRJS-FCJS WHERE NY=@HSNY ;
  --六、更新总账余额 数量为0时金额不为零的核算误差
  DECLARE @ZZID INT,@CHXH NVARCHAR(10);
  DECLARE @JCJE DECIMAL(16,2);
  DECLARE HSWC_cursor CURSOR LOCAL FOR
    SELECT  ID,CHXH,JCJE
    FROM    UTZZCH
    WHERE   NY=@HSNY AND (JCSL=0 AND JCJE<>0);
  OPEN HSWC_cursor;
  FETCH FROM HSWC_cursor INTO @ZZID,@CHXH,@JCJE;
  WHILE @@FETCH_STATUS=0
    BEGIN
      UPDATE UTZZCH SET JCJE=0,FCJE=FCJE+JCJE WHERE NY=@HSNY AND ID=@ZZID;
      WITH CKID (ID) AS 
        (SELECT MAX(MID) AS ID FROM DJCHM WHERE NY=@HSNY AND CHXH=@CHXH AND (DJMC LIKE '%出库%'))
      UPDATE DJCHM SET CKJE=CKJE+@JCJE 
        FROM DJCHM INNER JOIN CKID ON DJCHM.MID=CKID.ID;
      FETCH FROM HSWC_cursor INTO @ZZID,@CHXH,@JCJE;
    END
  CLOSE HSWC_cursor;
  DEALLOCATE HSWC_cursor  ;
  --七、应付账款  
  --更新应付账款总账 借方贷方金额 采购入库单\委外入库单(加工费)部分
  UPDATE UTZZWL SET JFFS=0,DFFS=0,WBJF=0,WBDF=0 WHERE NY=@HSNY AND WLDW>'50';
  WITH HSYF (WLDW,JSWB,JFFS,DFFS,WBJF,WBDF) AS 
    (SELECT O.WLDW,O.JSWB,0 AS JFFS,
        SUM(CASE WHEN O.DJMC='采购入库单' THEN M.CGJE WHEN O.DJMC='委外入库单' THEN M.JGJE ELSE 0 END) AS DFFS,0 AS WBJF,
        SUM(CASE WHEN O.DJMC='采购入库单' OR O.DJMC='委外入库单' THEN M.WBJE ELSE 0 END) AS WBDF 
      FROM DJCHO O INNER JOIN DJCHM M ON O.OID = M.OID 
      WHERE (O.NY = @HSNY) AND (O.DJR<>N'') AND (O.DJMC='采购入库单' OR O.DJMC='委外入库单')
      GROUP BY O.WLDW,O.JSWB)
  UPDATE UTZZWL SET JFFS=RK.JFFS,DFFS=RK.DFFS,WBJF=RK.WBJF,WBDF=RK.WBDF  
    FROM UTZZWL AS ZZ INNER JOIN HSYF AS RK ON (ZZ.WLDW=RK.WLDW AND ZZ.WBMC=RK.JSWB) 
  WHERE ZZ.NY=@HSNY;
  --更新应付账款总账 借方金额 付款单部分
  WITH HSCN (WLDW,JSWB,FKJE,FKZR,FKJEWB,FKZRWB) AS 
    (SELECT O.WLDW,O.JSWB,SUM(M.FKJE) AS FKJE, SUM(M.FKZR) AS FKZR,SUM(M.FKJEWB) AS FKWBJE,SUM(M.FKZRWB) AS FKZRWB   
      FROM DJCNO O INNER JOIN DJCNM M ON O.OID = M.OID 
      WHERE  (O.NY = @HSNY) AND (M.FKJE <> 0) AND (O.DJMC='付款单') AND (O.DJR <> N'')
      GROUP BY O.WLDW,O.JSWB)
  UPDATE UTZZWL SET JFFS=ZZ.JFFS+FKJE+FKZR,WBJF=ZZ.WBJF+FKJEWB+FKZRWB 
    FROM UTZZWL AS ZZ INNER JOIN HSCN AS CN ON (ZZ.WLDW=CN.WLDW AND ZZ.WBMC=CN.JSWB) 
    WHERE ZZ.WLDW>'50' AND ZZ.NY=@HSNY;
  --更新应付账款总账余额
  UPDATE UTZZWL SET YMYE=YCYE-DFFS+JFFS,WBYM=WBYC-WBDF+WBJF FROM UTZZWL WHERE NY=@HSNY;
  --六、更新以后年度总账:存货、往来 
  IF @HSNY<DBO.X9_DQNY()
    BEGIN
      DECLARE @SYNY CHAR(6);
      DECLARE @DQNY CHAR(6);
      SET @SYNY=@HSNY;
      DECLARE ZZNY_cursor CURSOR LOCAL FOR
        SELECT  NY
        FROM    MLNY
        WHERE   NY>@HSNY;
      OPEN ZZNY_cursor;
      FETCH FROM ZZNY_cursor INTO @DQNY;
      WHILE @@FETCH_STATUS=0
        BEGIN
          --更新UTZZCH
          WITH SYZZ (CHXH,JCJS,JCSL,JCDJ,JCJE) AS 
            (SELECT CHXH,JCJS,JCSL, JCDJ, JCJE FROM UTZZCH WHERE (NY = @SYNY))
          UPDATE UTZZCH SET QCJS=SYZZ.JCJS,QCSL=SYZZ.JCSL,QCDJ=SYZZ.JCDJ,QCJE=SYZZ.JCJE 
            FROM UTZZCH AS ZZ INNER JOIN SYZZ ON ZZ.CHXH=SYZZ.CHXH
            WHERE ZZ.NY=@DQNY;
          UPDATE UTZZCH SET JCJS=QCJS+SRJS-FCJS,JCSL=QCSL+SRSL-FCSL,JCJE=QCJE+SRJE-FCJE WHERE NY=@DQNY ;
          UPDATE UTZZCH SET JCDJ=(QCJE+SRJE)/(QCSL+SRSL) WHERE NY=@DQNY AND (QCSL+SRSL)>0 AND (QCJE+SRJE)>0;
          --生成应付空账  
          INSERT INTO [UTZZWL] ([NY],[WLDW],WBMC)
            SELECT @DQNY AS NY,WLDH+'_'+WLMC AS WLDW,JSWB AS WBMC  
              FROM MLWL WHERE DCMX=1 AND 
                ((WLDH+'_'+WLMC) NOT IN (SELECT WLDW FROM UTZZWL WHERE NY=@DQNY));
          --更新YFZZ          
          WITH SYYF (WLDW,WBMC,YMYE,WBYM) AS (SELECT WLDW,WBMC,YMYE,WBYM FROM UTZZWL WHERE (NY = @SYNY))
          UPDATE UTZZWL SET YCYE=SYYF.YMYE,WBYC=SYYF.WBYM FROM UTZZWL AS ZZ INNER JOIN SYYF ON 
              (ZZ.WLDW=SYYF.WLDW AND ZZ.WBMC=SYYF.WBMC) 
            WHERE ZZ.NY=@DQNY;
          UPDATE UTZZWL SET YMYE=YCYE+DFFS-JFFS,WBYM=WBYC+WBDF-WBJF FROM UTZZWL WHERE NY=@DQNY;
          SET @SYNY=@DQNY;
          FETCH NEXT FROM ZZNY_cursor INTO @DQNY;
        END
      CLOSE ZZNY_cursor;
      DEALLOCATE ZZNY_cursor  ;
    END 
    SELECT '存货核算已经完成!'
END TRY
BEGIN CATCH
  IF XACT_STATE() <> 0
    BEGIN
      IF CURSOR_STATUS('LOCAL','HSWC_cursor')>=0 
        BEGIN
          CLOSE HSWC_cursor;
          DEALLOCATE HSWC_cursor  ;
        END 
      IF CURSOR_STATUS('LOCAL','ZZNY_cursor')>=0 
        BEGIN
          CLOSE ZZNY_cursor;
          DEALLOCATE ZZNY_cursor  ;
        END 
    END
  INSERT [dbo].[X9_ERRLOG] ([ErrorTime],[UserName], [ErrorNumber],[ErrorSeverity],
      [ErrorState], [ErrorProcedure], [ErrorLine], [ErrorMessage]) 
    VALUES (GETDATE(),CURRENT_USER, ERROR_NUMBER() ,ERROR_SEVERITY(),
      ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE());
  SELECT '存货核算未能完成:'+CHAR(13)+CHAR(10)+ERROR_MESSAGE() ;
END CATCH; 

正常情况下,存货核算数据在每项业务登记时已经完成,本过程用户数据发生非常调整时,如进价调整、售价调整等、实施期间的业务期间非正常跳转(回到月初、回到上月)等,或数据发生意外错误时,可以使用本过程一次性重新计算。

相关文章
|
8月前
|
存储 前端开发
数据字典解决方案和存储过程设计
数据字典解决方案和存储过程设计
118 1
|
8月前
|
存储
物料需求计算存储过程设计
物料需求计算存储过程设计
|
存储
SAP扩充物料的采购视图和会计视图
你一定想,哇,我们已经创建了供应商主数据,是不是我们就可以开始采购了?no你想买什么呢?你想买的是物料。你的物料,采购主数据创建了吗?没有。所以MM50扩充采购视图。但是,朋友,你太幼稚了。如果你想要采购某个物料,你对于物料主数据的维护顺序是这样的:基本视图--会计视图--采购视图不维护会计视图的话,创建采购信息记录的时候,会提示物料没有在1020工厂中维护。
4703 0
SAP扩充物料的销售视图
比如我们现在有一个物料,这个物料只具备基本视图,我们如何为这个物料补充销售视图呢?先看看这个物料,使用事务码MM03我们无法使用MM02去扩充视图,我们需要使用MM50为它扩充销售视图。维护执行之后,进入类似于MM01的画面,如下图看,我们可以开始扩充这个物料的销售视图了。
4212 0
|
2月前
|
存储 前端开发 安全
现货量化合约跟单交易所系统开发逻辑策略及源码示例
现货量化合约跟单交易所系统的开发涉及需求分析、技术选型、数据获取、策略设计、风险管理、交易接口、系统架构、安全合规、测试优化等多个环节。本文档详细介绍了开发策略指南及Python源码示例,涵盖从连接交易所API获取市场数据到系统部署和优化的全过程。
|
2月前
|
存储 运维 安全
交易所系统/开发逻辑及功能描述
交易所系统开发涉及需求分析、架构设计、开发实现、测试优化、安全合规、发布上线及运维支持等环节。关键功能包括用户管理、资产管理、交易功能、订单管理、行情展示、安全监管及性能扩展,确保系统的高效、安全与稳定。
|
6月前
|
存储 算法 安全
现货合约跟单交易所系统开发(方案)源码逻辑规则
在网络上,每隔一段时间就会生成一个块。该块等效于网络记录簿,该记录簿用于记录一段时间内发生的相关信息。记录已满时,将生成一个新记录。一旦记录了信息,记录簿将通知所有参与者并更新每个人的记录簿。
|
8月前
|
索引 Python
浅谈/合约跟单系统开发/合约量化系统开发源码功能/方案
Numpy的`ndarray`是同类型的元素表,用整数元组索引,维数称作秩,形状表示各维大小。例如,`[[1, 2, 3], [4, 2, 5]]`秩为2,形状为`(2, 3)`。通过`numpy`的`array`函数、`zeros`, `ones`, `full`, `empty`等创建数组,`arange`和`linspace`生成数字序列,`reshape`改变数组形状,保持元素总数不变。`flatten`方法用于将数组扁平化为一维,默认按行优先(`order=&#39;C&#39;`)。
|
算法 区块链 数据库
秒合约交易系统开发|量化跟单系统开发模式
智能合约作为Web3下的核心概念,具有巨大的潜力和应用前景
|
安全 区块链 数据库
秒合约系统开发源码部署|秒合约跟单系统开发逻辑与方案
Web3是一种新的互联网社交网络,它是基于区块链技术建立起来的