用户开发的物料收发单据数据如何加入到物料收发明细表中
金蝶云社区-卡比兽就是你啦
卡比兽就是你啦
10人赞赏了该文章 656次浏览 未经作者许可,禁止转载编辑于2018年05月16日 11:49:41

由于公司业务的需要,我们自行采用复制的方法产生了新的物料收发单据,这此单据进行审核及反审核后,能实现库存数量的修改,但是在查询物料的收发明细表时,我们自行做的单据的数据不能反应到《物料收发明细表》中.
请问金碟公司,怎样才能将用户自己做的单据的数据也能添加到《物料收发明细表》中?


物料收发明细报表(物料收发汇总表)支持把自定义的单据加入到取数列表中,原理如下:

1. 各种不同的单据,所采用的物理表格以及字段名都不同,因此,供应链封装了一个抽象取数基类,供二开派生,以实现二开单据读取物料收发数据的SQL,称为二开单据的取数类

2. 把二开派生的取数类,注册到 t_BAS_UpdatestockRptSet,示意SQL:

INSERT INTO t_BAS_UpdatestockRptSet
             (FID, FBILLFORMID, FRPTTYPE, FCLASSNAME)
      VALUES (100001, '二开单据FormId', '', 'JDSample.ServicePlugIn.Report.AddBillToStockDetailReport,JDSample.ServicePlugIn')

3. 物料收发明细表取数时,会读取 t_BAS_UpdatestockRptSet 表,取物料收发明细报表覆盖的全部单据及其派生的取数类;然后根据取数类构建的SQL对象,读取二开单据上的数据,统一插入到物料收发明细报表的临时表;


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.K3.SCM.App.Stock.Report.StockDetail;
namespace JDSample.ServicePlugIn.Report
{
    /// <summary>
    /// 演示如何把自定义单据数据,加入到物料收发明细报表
    /// </summary>
    /// <remarks>
    /// 1. 定义一个类,用来根据物料收发明细报表过滤条件,读取自定义单据
    /// 2. 类派生自Kingdee.K3.SCM.App.Stock.Report.StockDetail.AbstractStockDetailGetData
    /// 3. 把该类注册到表格 t_bas_UpdatestockRptSet 中:
    /// INSERT INTO t_BAS_UpdatestockRptSet
    ///         (FID, FBILLFORMID, FRPTTYPE, FCLASSNAME)
    ///  VALUES (100001, '二开单据FormId', '', 'JDSample.ServicePlugIn.Report.AddBillToStockDetailReport,JDSample.ServicePlugIn')
    /// </remarks>
    public class AddBillToStockDetailReport : AbstractStockDetailGetData
    {
        /// <summary>
        /// 初始化各种变量值
        /// </summary>
        /// <remarks>
        /// 基类已经根据更新库存的配置,对单据上各库存维度变量进行了默认值设定,
        /// 重载本函数,仅用于指定个性变量值
        /// </remarks>
        public override void InitialFullField()
        {
            base.InitialFullField();
            // 单据体表格名称
            this.FEntryTable = "JD_T_CustEntry100001";
            
            // TODO: 其他的一些属性赋值
            // 技巧:进入调试状态,观察基类给this对象各属性设置的默认值,如果不适用,则改之
        }
        /// <summary>
        /// 生成取数SQL对象然后返回,取数SQL对象包含两个:
        /// 1. 取物料收发明细信息,取单据体行明细数据
        /// 2. 取物料收发期初数据,汇总合并发生日期前的单据体数据
        /// </summary>
        /// <param name="lstSql"></param>
        /// <remarks>
        /// 构建的SQL语句: INSERT INTO tmpXXX(F1....) SELECT F1 From T1 .... WHERE sqlFilter...
        /// 技巧:
        /// </remarks>
        public override void GetFullSql(List<SqlObject> lstSql)
        {
            //
            StringBuilder sbSQL = new StringBuilder();
            // 如下语句,会产生插入语句的字段部分
            // Insert Into tmpXXX (FSTOCKORGID,FOWNERTYPEID,FOWNERID,FENTRYTABLE,FBILLENTRYID...;
            sbSQL.AppendLine(base.GetInsertSql());
            // 接下来,生成插入语句的数据来源
            sbSQL.AppendLine(" SELECT ");
            // 用基类公用函数,生成FSTOCKORGID,FOWNERTYPEID,FOWNERID,FENTRYTABLE,FBILLENTRYID这5个字段的取数SQL
            sbSQL.AppendLine(base.SelListFieldSql());
            // 接下来,自行实现其他字段
            // 字段一个都不能少,而且顺序不能变
            // 如果自定义单据上,没有对应字段,则给默认值
            // 排序
            sbSQL.AppendLine(" ,0 AS FORDERBY, ");
            // 单据收发类型:收 = I; 发 = O
            sbSQL.AppendLine(" 'I' AS FSTOCKIO, ");
            // 价格
            sbSQL.AppendLine(" ISNULL(TSEF.FPRICE,0) AS FIOPRICE, ");
            // 金额
            sbSQL.AppendLine(" ISNULL(TSEF.FAMOUNT_LC,0) AS FIOAMOUNT, ");
            // 物料
            sbSQL.AppendLine(" TSE.FMATERIALID AS FMATERIALID, ");
            // 币别
            sbSQL.AppendLine(" TSF.FLOCALCURRID AS FCURRID, ");
            // 辅助属性
            sbSQL.AppendLine(" ISNULL(TSE.FAUXPROPID,0) AS FAUXPROPID, ");
            // 业务日期
            sbSQL.AppendLine(string.Format(" {0} AS FDATE, ", base.FFullDate));
            // 创建日期
            sbSQL.AppendLine(" TS.FCREATEDATE AS FCREATEDATE, ");
            // 批号
            sbSQL.AppendLine(" ISNULL(TSE.FLOT_TEXT,' ') AS FLOTNO, ");
            // 仓库
            sbSQL.AppendLine(" TSE.FSTOCKID AS FSTOCKID, ");
            // 部门
            sbSQL.AppendLine(" TS.FPURDEPTID AS FDEPARTMENTID, ");
            // 仓位
            sbSQL.AppendLine(" ISNULL(TSE.FSTOCKLOCID,0) AS FSTOCKLOCID, ");
            // 库存状态
            sbSQL.AppendLine(" TSE.FSTOCKSTATUSID AS FSTOCKSTATUSID, ");
            // 保管类型
            sbSQL.AppendLine(" TSE.FKEEPERTYPEID, ");
            // 保管者
            sbSQL.AppendLine(" TSE.FKEEPERID, ");
            // 生产日期
            sbSQL.AppendLine(" TSE.FPRODUCEDATE, ");
            // 有效期
            sbSQL.AppendLine(" TSE.FEXPIRYDATE, ");
            // BOM版本
            sbSQL.AppendLine(" ISNULL(TSE.FBOMID,0),");                     
            sbSQL.AppendLine(string.Format(" '{0}' AS FFORMID, ", "二开单据FormId"));
            sbSQL.AppendLine(string.Format(" '{0}' AS FBILLNAME, ", "二开单据名称"));
            // 二开单据内码
            sbSQL.AppendLine(" TS.FID AS FBILLID, ");
            // 单据体行号
            sbSQL.AppendLine(" TSE.FSEQ AS FBILLSEQID, ");
            // 二开单据编号
            sbSQL.AppendLine(" TS.FBILLNO AS FBILLNO, ");
            // 单据类型
            sbSQL.AppendLine(" TS.FBILLTYPEID AS FBILLTYPE, ");
            // MTO编码
            sbSQL.AppendLine(" ISNULL(TSE.FMTONO, ' ') AS FMTONO, ");
            // 即时库存的库存数量(基本)
            sbSQL.AppendLine(" 0 AS FBASEQCQTY, ");
            // 即时库存的平均价(基本)
            sbSQL.AppendLine(" 0 AS FBASEQCPRICE, ");
            // 即时库库存的辅助单位数量
            sbSQL.AppendLine(" 0 AS FSECQCQTY, ");
            // 收入数量(取单据上的基本单位数量)
            sbSQL.AppendLine(" TSE.FBASEUNITQTY AS FBASEINQTY, ");
            // 收入单价(取单据上的单价)
            sbSQL.AppendLine(" 0 AS FBASEINPRICE, ");
            // 收入辅数量(取单据上的辅助单位数量)
            sbSQL.AppendLine(" TSE.FAUXUNITQTY AS FSECINQTY, ");
            // 支出数量(取单据上的基本单位数量,单据为收入物料时,默认0)
            sbSQL.AppendLine(" 0 AS FBASEOUTQTY, ");
            // 支出单价
            sbSQL.AppendLine(" 0 AS FBASEOUTPRICE, ");
            // 支出辅数量
            sbSQL.AppendLine(" 0 AS FSECOUTQTY ");                          
            
            // 开始拼接FORM子句:
            // 二开单据主表,表别名使用TS
            sbSQL.AppendLine(" FROM JD_T_CustEntry100000 TS ");                    
            // 二开单据从表,表别名使用TSE
            sbSQL.AppendLine(" INNER JOIN JD_T_CustEntry100001 TSE ON TSE.FID=TS.FID ");
            // 如果还需要关联其他表,请继续在此添加
            // 拼接物料、仓库表
            base.LinkMaterialTable(sbSQL);
            base.LinkStockTable(sbSQL);
            sbSQL.AppendLine(" INNER JOIN T_BD_MATERIALBASE TMB ON TMB.FMaterialId = TSE.FMaterialId");
            // 开始拼接过滤条件:
            sbSQL.AppendLine(" WHERE ");
            // 日期过滤条件 qzDateFilter
            sbSQL.AppendLine(base.qzDateFilter);
            // 报表过滤界面上的条件 comFilter
            sbSQL.AppendLine(string.Format(" AND ({0}) ", base.comFilter));
            // 如果二开单据有些数据,需要强制排除,在此增加条件
            // 把取数对象,添加进SQLObject列表,与其他出入库单取数SQLObject放在一起
            lstSql.Add(new SqlObject(sbSQL.ToString(), new List<SqlParam>()));
            // 继续创建取物料收发期初数据的SQL对象
            this.GetQcDataSql(lstSql);
        }
        /// <summary>
        /// 子函数:创建取物料收发期初数据SQL
        /// </summary>
        /// <param name="lstSql"></param>
        private void GetQcDataSql(List<SqlObject> lstSql)
        {
            StringBuilder sbSQL = new StringBuilder();
            // 使用基类生成标准的,插入汇总表的字段列表
            sbSQL.AppendLine(base.GetInsertQcSql());
            // 构建取数SELECT子句
            sbSQL.AppendLine(" SELECT ");
            // 使用基类创建固定字段
            sbSQL.AppendLine(base.QCSelListFieldSql());
            // 日期
            sbSQL.AppendLine(string.Format(" ,{0} AS FDATE, ", base.FFullDate));
            // ??
            sbSQL.AppendLine(" -200 AS FORDERBY, ");
            // 单据收发类型:I = 收;O = 发
            sbSQL.AppendLine(" 'I' AS FSTOCKIO, ");
            // 物料
            sbSQL.AppendLine(" TSE.FMATERIALID AS FMATERIALID, ");
            // 辅助属性
            sbSQL.AppendLine(" ISNULL(TSE.FAUXPROPID,0) AS FAUXPROPID, ");
            // 批号
            sbSQL.AppendLine(" ISNULL(TSE.FLOT_TEXT,' ') AS FLOTNO, ");
            // MTO编码
            sbSQL.AppendLine(" ISNULL(TSE.FMTONO, ' ') AS FMTONO, ");
            // 仓库
            sbSQL.AppendLine(" TSE.FSTOCKID AS FSTOCKID, ");
            // 仓位
            sbSQL.AppendLine(" ISNULL(TSE.FSTOCKLOCID,0) AS FSTOCKLOCID, ");
            // 库存状态
            sbSQL.AppendLine(" TSE.FSTOCKSTATUSID AS FSTOCKSTATUSID, ");
            // 保管者、有效期等
            sbSQL.AppendLine(" TSE.FKEEPERTYPEID,TSE.FKEEPERID,TSE.FPRODUCEDATE,TSE.FEXPIRYDATE,ISNULL(TSE.FBOMID,0),");
            // 汇总收入基本单位数量
            sbSQL.AppendLine(" SUM(TSE.FBASEUNITQTY) AS FBASEQCQTY, ");
            // 汇总收入辅单位数量
            sbSQL.AppendLine(" SUM(TSE.FAUXUNITQTY) AS FSECQCQTY ");
            
            // 拼接FROM子句,主表固定使用TS为别名
            sbSQL.AppendLine(" FROM JD_T_CustEntry100000 TS ");
            // 从表,固定使用TSE为别名
            sbSQL.AppendLine(" INNER JOIN JD_T_CustEntry100001 TSE ON TSE.FID=TS.FID ");
            // 关联物料、仓库
            base.LinkMaterialTable(sbSQL);
            base.LinkStockTable(sbSQL);
            
            // 拼接条件
            sbSQL.AppendLine(" WHERE ");
            // 日期:开始日期之前
            sbSQL.AppendLine(base.qcDateFilter);
            // 过滤界面其他条件
            sbSQL.AppendLine(string.Format(" AND ({0}) ", base.comFilter));
            // 如果二开单据有其他条件,请在此加入
            // 拼接合并子句
            sbSQL.AppendLine(base.GetGroupbyQcSql());
            // 把取数对象,添加进SQLObject列表,与其他出入库单取数SQLObject放在一起
            lstSql.Add(new SqlObject(sbSQL.ToString(), new List<SqlParam>()));
        }
    }
}

图标赞 10
10人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!