资源描述
账表(服务取数)插件示例代码
修订记录
Ver. No
日期
编制\修订
校对
批准
修改的章节号
V1.0
20150415
杨兵
张晋博
刘兵
赖碧云
初始版本
问题和意见
如果你对文档有任何意见、问题或想法,或者你的问题未在此文档中找到答案,请通过电子邮件联系我们
jinbo_zhang@
目录
账表(服务取数)插件示例代码 1
账表(服务取数)插件概要说明 4
如何创建账表服务插件 6
如何启用账表服务插件 8
公共属性 9
BusinessInfo 9
Context 10
DctSpecialTempSumTable 10
DynamicHeader 10
ReportHeader 10
ReportId 10
ReportProperty 10
ReportTitles 10
SummarySpecialFields 11
TempTableNameList 11
分页账表特有属性 11
CurrentListPosition 11
CacheMapTempTableNameList 11
CacheDataList 11
树形账表特有属性 11
CurrentGroupID 11
事件 12
Initialize 12
案例 – 销售订单执行汇总表账表取数插件初始化 12
GetData 17
GetTableName 17
BuilderReportSqlAndTempTable 17
案例 – 销售订单执行汇总表账表取数 17
BuilderSelectFieldSQL 19
案例 – 核算错误记录账表取数 20
BuilderTempTableOrderBySQL 21
BuilderFromWhereSQL 21
案例 – 核算错误记录账表取数 22
GetIdentityFieldIndexSQL 24
ExecuteBatch 25
GetReportHeaders 25
案例 – 应付款账龄分析表构建列头信息 25
GetReportTitles 29
案例 – 销售订单执行汇总表账表表头信息 30
AnalyzeDspCloumn 35
AfterCreateTempTable 35
GetReportData 35
案例 – 供应商供货汇总表取数 36
GetRowsCount 37
案例 – 库存台账分页账表获取当前页数据行数 38
GetSummaryData 40
GetSummaryColumnInfo 40
案例 – 销售订单执行汇总表分组汇总字段信息 40
GetSummaryColumsSQL 43
案例 – 销售订单执行汇总表分组汇总SQL指令 43
CloseReport 45
案例 – 供货商供货汇总表关闭时,清除临时表 46
GetList 47
GetTreeNodes 49
账表(服务取数)插件概要说明
账表的服务端取数插件,是通过插件组装账表取数Sql指令,把取数结果返回给平台账表引擎,平台将取数结果绑定到账表页面的过程,简单说,平台在账表开发过程中,只负责把插件取到的账表数据绑定到设计好的账表模型上,取数逻辑由账表服务端插件完成
开发过程中,有几个重要模型
1、 设计账表模型
a) 账表表头字段
b) 账表表体字段(也说成账表列头字段)
2、 设计账表过滤模型
a) 自定义快捷过滤面板
b) 高级过滤条件面板
c) 排序面板
d) 分组汇总面板
e) 显示隐藏列面板
账表根据使用场景,分为简单账表、树形账表、分页账表、简单Sql账表
简单Sql账表没有服务取数插件
所有账表都须实现的重要事件
1、 Initialize
2、 BuilderSelectFieldSQL
3、 BuilderFromWhereSQL
4、 BuilderReportSqlAndTempTable
5、 GetReportTitles
6、 GetReportHeaders
7、 GetSummaryColumnInfo
分页账表特点:
与简单账表区别在于,分页账表通过导航按钮切换帐表内容
分页账表基本原理说明:
Ø 需要提供用于导航的结果集,如下图中以语言标识为导航结果集(实现GetList方法)
Ø 显示数据需要按照导航结果过滤(实现BuilderReportSqlAndTempTable方法)
树形账表特点:
Ø 树形账表通过树节点切换账表内容
树形账表基本原理说明:
Ø 需要提供用于导航树形结果集(List<TreeNode>),如下图中以语言标识为树形结果集(实现GetTreeNodes方法)
Ø 显示数据需要按照树节点结果过滤(实现BuilderReportSqlAndTempTable方法,使用CurrentGroupID重要属性作过滤条件)
如何创建账表服务插件
Ø 创建插件类库工程
Ø 插件类库引用BOS平台组件(被引用组件在Cloud网站website\bin目录下)
Ø 修改插件类库编译输出路径为website\bin(右键插件类库,选择属性)
Ø 修改类文件继承基类,并引用基类所在命名空间
如何启用账表服务插件
插件编写完毕,类库编译通过后
进入BOS设计器,打开对应账表模型,配置账表服务插件:
公共属性
BusinessInfo
账表模型的元数据描述信息
Context
当前登录系统的上下文信息,如数据库连接信息,当前登录操作员信息等
DctSpecialTempSumTable
临时汇总数据表格
DynamicHeader
动态列头
ReportHeader
账表列头
ReportId
当前账表模型唯一标示
ReportProperty
Ø 账表属性,包含账表开发过程中的全局信息
Ø 其重要属性说明:
属性名
描述
ReportType
账表类型(默认是简单账表、如果开发的是分页或树形帐表,请在账表插件初始化事件中,对此属性进行正确赋值,否则账表引擎会默认按简单账表处理页面)
IsGroupSummary
是否支持分组汇总
IsUIDesignerColumns
账表列头是否是通过BOSIDE设计
SimpleAllCols
是否锁定账表表格列
DecimalControlFieldList
精度控制字段信息
DspInsteadColumnsInfo
列表格式化列,指示Key列被Value列内容替代
GroupSummaryInfoData
分组汇总信息
ReportTitles
账表表头字段信息
SummarySpecialFields
汇总字段信息
TempTableNameList
临时表列表
分页账表特有属性
CurrentListPosition
分页账表属性
分页账表当前页账表数据对象的位置信息,此属性与CacheMapTempTableNameList属性一起使用
CacheMapTempTableNameList
分页账表属性
记录分页账表每页账表数据对象信息,此属性与CurrentListPosition属性一起使用
CacheDataList
分页账表属性
根据账表当前页位置,获取DataRow对象
树形账表特有属性
CurrentGroupID
树形账表属性
树形账表分组标识,点击树形账表左边树时,由平台账表引擎为其赋值,其数据来源于账表插件GetTreeNodes方法返回的树节点id属性的值,对应树形账表插件在BuilderReportSqlAndTempTable方法拼接账表取数sql时,需要以CurrentGroupID作为过滤条件拼接到Sql指令的Where部分
事件
Initialize
触发时机
账表View初始化,开始初始化账表服务取数插件代理对象时
应用场景
此时账表插件基类已完成账表属性对象(ReportProperty)的创建工作
关键字
初始化
备注
一般账表插件在此事件中,对刚创建的ReportProperty做进一步初始化
案例 – 销售订单执行汇总表账表取数插件初始化
代码来源
Kingdee.K3.SCM.App.Sal.Report.SalCollectRpt
需求背景
销售订单执行汇总表初始化时,进一步初始化账表属性对象
1、 账表属性的报表类型、报表名称
2、 由于是汇总表,配置其明细表模型唯一标示和唯一标示一张明显表的字段信息(双击汇总表一行记录时,根据以上信息定位到明细表)
3、 账表属性的列替代显示信息(key:被替代显示的列,value:替代显示的列)
4、 字段精度控制描述信息(即哪个字段的精度被哪个字段所控制)
实现方案
账表服务取数插件初始化时,修改账表属性中的报表名称、明细表属性、替代显示列信息、字段精度控制信息等
示例代码
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Contracts.Report;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Contracts;
using Kingdee.K3.SCM.Sal.Report.PlugIn;
using System.Collections;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Util;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Permission;
using Kingdee.BOS.App.Core.BusinessFlow;
using Kingdee.K3.Core;
using Kingdee.BOS.Core.BusinessFlow.ServiceArgs;
using Kingdee.BOS.BusinessEntity.BusinessFlow;
using System.Data;
using Kingdee.BOS.Core.Permission.Objects;
using Kingdee.BOS.Core.CommonFilter;
namespace Kingdee.K3.SCM.App.Sal.Report
{
/// <summary>
/// 销售汇总表数据源插件
/// </summary>
public class SalCollectRpt : SysReportBaseService
{
public override void Initialize()
{
base.Initialize();
this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL;
this.ReportProperty.ReportName = "销售订单执行汇总表";
this.ReportProperty.DetailReportId = "SAL_DetailReport";
this.ReportProperty.PrimaryKeyFieldName = "FBILLNO";
this.ReportProperty.IsGroupSummary = true;
this.ReportProperty.IsUIDesignerColumns = true;
//显示替代列this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FSALEORGID", "FSALEORGNAME"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FSALEDEPTID", "FSALEDEPT"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FSALEGROUPID", "FSALEGROUP"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FSALERID", "FSALES"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FMATERIALID", "FMATERIALNUMBER"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FCURRENCYID", "FMONEYTYPE"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FCUSTID", "FCUSTOMERNUMBER"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FMATERIALGROUP", "FMATERIALGROUPNAME"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FAUXPROPID", "FAUXPROP"); this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FUNITID", "FUNITNAME");
//精度控制
List<DecimalControlField> lstDcf = new List<DecimalControlField>();
DecimalControlField dcf = new DecimalControlField();
//单价
dcf.ByDecimalControlFieldName = "FPRICE";//
dcf.DecimalControlFieldName = "FPRICEDIGITS";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
//订单
dcf.ByDecimalControlFieldName = "FSOQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FSOAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//发货单
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FSQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FSAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//出库
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FALREADYQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FALREADYAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FNOTQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FNOTAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//退货
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRETURNPQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRETURNPAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//退库
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRETURNSQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRETURNSAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//开票
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FINVOECEQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FNVOECEAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FNINVOECEQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FNNVOECEAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//收款
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRECEIPTAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FNRECEIPTAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//核销金额可能是尾差过小,就不按金额精度处理
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FCHARGEOFFAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
//应收
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRECQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRECAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRECNQTY";
dcf.DecimalControlFieldName = "FPRECISION";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FRECNAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
dcf = new DecimalControlField();
dcf.ByDecimalControlFieldName = "FWRITEOFFAMOUNT";
dcf.DecimalControlFieldName = "FAMOUNTDIGITS";
lstDcf.Add(dcf);
this.ReportProperty.DecimalControlFieldList = lstDcf;
}
}
}
GetData
备注
此方法由插件平台报表基类实现,插件不用关注
示例代码
无
GetTableName
备注
此方法由插件平台报表基类实现,插件不用关注
用于创建一张临时表,完成插件账表数据逻辑后,用此表承载账表数据
示例代码
无
BuilderReportSqlAndTempTable
触发时机
正式进入账表取数sql拼接并取数,把账表取数结果放到上一步创建的临时表中
应用场景
开始进行账表sql拼接取数,并把账表取数结果放到上一步创建的临时表中
关键字
账表取数
备注
如果此账表插件设置sql数据逻辑由插件完成(this.IsCreateTempTableByPlugin),即调用BuilderReportSqlAndTempTable接口,否则调用以下3个接口,完成账表取数逻辑的sql指令即:BuilderSelectFieldSQL、BuilderTempTableOrderBySQL、BuilderFormWhereSQL
案例 – 销售订单执行汇总表账表取数
代码来源
Kingdee.K3.SCM.App.Sal.Report.SalCollectRpt
需求背景
销售订单执行汇总表根据账表过滤条件取数
实现方案
账表插件在BuilderReportSqlAndTempTable方法中,完成账表取数并把数据填充到临时表中
示例代码
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Contracts.Report;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Contracts;
using Kingdee.K3.SCM.Sal.Report.PlugIn;
using System.Collections;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Util;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Permission;
using Kingdee.BOS.App.Core.BusinessFlow;
using Kingdee.K3.Core;
using Kingdee.BOS.Core.BusinessFlow.ServiceArgs;
using Kingdee.BOS.BusinessEntity.BusinessFlow;
using System.Data;
using Kingdee.BOS.Core.Permission.Objects;
using Kingdee.BOS.Core.CommonFilter;
namespace Kingdee.K3.SCM.App.Sal.Report
{
/// <summary>
/// 销售汇总表数据源插件
/// </summary>
public class SalCollectRpt : SysReportBaseService
{
public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
{
ModifyShowHideColumns(ref filter);
InitTables();//初始化报表使用的临时表,使用一次即删除
moreFilter = filter.FilterParameter.FilterString.Trim();//高级过滤
this.SetFilter(filter);//设置快捷页签过滤条件
DynamicObject userParameter = filter.ParameterData;
if (userParameter != null)
{
this.onTime = Convert.ToBoolean(userParameter["onTime"]);
}
DynamicObject dyFilter = filter.FilterParameter.CustomFilter;//快捷页签过滤
if (dyFilter["SaleOrgList"] == null || string.IsNullOrWhiteSpace(dyFilter["SaleOrgList"].ToString()))
{
SetRptBosTable(tableName);
return;
}
else
{
this.GetSQLWhere(); //进行过滤快捷页签汇总
List<BaseDataTempTable> listBaseDataTempTable = filter.BaseDataTempTable; // 如果设置了基础资料数据权限,则获取基础资料数据权限隔离的临时表集合 SalRptCommon.GetFilterOrder(this.Context,rptFilterTable, !string.IsNullOrWhiteSpace(moreFilter), creatWhereFirst.ToString(), this.filterOrgList, listBaseDataTempTable, "SAL_CollectReport");
// 添加基础资料数据权限隔离的临时表到待删除临时表集合
foreach (BaseDataTempTable item in listBaseDataTempTable)
{
deleteTables.Add(item.TempTable);
展开阅读全文