由于公司业务的需要,我们自行采用复制的方法产生了新的物料收发单据,这此单据进行审核及反审核后,能实现库存数量的修改,但是在查询物料的收发明细表时,我们自行做的单据的数据不能反应到《物料收发明细表》中.
请问金碟公司,怎样才能将用户自己做的单据的数据也能添加到《物料收发明细表》中?
物料收发明细报表(物料收发汇总表)支持把自定义的单据加入到取数列表中,原理如下:
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>()));
}
}
}
推荐阅读