本案例描述:
折旧明细报表中加入字段:存放地点、成本中心部门、使用人组织三个字段。
参考社区案例:报表二次开发添加自定义字段的指导方案
步骤:
1、加入报表插件
继承原报表的类。重写BuilderReportSqlAndTempTable、GetReportHeaders、CloseReport三个方法。
customRptTempTableNames:实现在原报表的临时表中加入新的字段数据
GetReportHeaders:实现把新加的字段加在界面中展示
CloseReport:实现用完后删掉临时表
[Description("折旧明细表")]
public class CarDetailReport : DeprDetailListService
{
private string[] customRptTempTableNames;
/// <summary>
/// 在原报表临时表中加入新字段的数据
/// </summary>
/// <param name="filter"></param>
/// <param name="tableName"></param>
public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
{
// 创建临时表,用于存放自己的数据
IDBService dbservice = Kingdee.BOS.App.ServiceHelper.GetService<IDBService>();
customRptTempTableNames = dbservice.CreateTemporaryTableName(this.Context, 1);
// 获取临时表名称
string strTable = customRptTempTableNames[0];
// 把刚刚获得的临时表放进基类的方法,获取报表原始的数据
base.BuilderReportSqlAndTempTable(filter, strTable);
StringBuilder sb = new StringBuilder();
sb.AppendFormat(@"select t1.*,B.F_LSLOCATION,
D.FFULLNAME F_LSCostDept,
E.FNAME F_LS_UserOrg
into {0} -- 原有临时表
from {1} t1-- 临时表
LEFT JOIN T_FA_CARDDETAIL B ON t1.FALTERID = B.FALTERID
AND t1.FNUMBER = B.FASSETNO
LEFT JOIN t_fa_allocation C ON t1.FALTERID = C.FALTERID
AND t1.FNUMBER = C.FASSETNO
LEFT JOIN T_BD_DEPARTMENT_L D ON C.F_LSCOSTDEPT = D.FDEPTID
LEFT JOIN T_ORG_ORGANIZATIONS_L E ON C.F_LS_USERORG = E.FORGID ", tableName, strTable);
DBUtils.Execute(this.Context, sb.ToString());
}
/// <summary>
/// 这里加上对应新加的字段,不然不会在界面显示
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public override ReportHeader GetReportHeaders(IRptParams filter)
{
ReportHeader header = base.GetReportHeaders(filter);
// TODO: 添加新增字段
header.AddChild("F_LS_UserOrg", new LocaleValue("使用人组织"));
header.AddChild("F_LSCostDept", new LocaleValue("成本中心部门"));
header.AddChild("F_LSLOCATION", new LocaleValue("存放地点"));
return header;
}
/// <summary>
/// 调用完后删除临时表
/// </summary>
public override void CloseReport()
{
// 删除临时表
if (customRptTempTableNames.IsNullOrEmptyOrWhiteSpace())
{
return;
}
IDBService dbService = Kingdee.BOS.App.ServiceHelper.GetService<Kingdee.BOS.Contracts.IDBService>();
// 使用后的临时表需要删除
dbService.DeleteTemporaryTableName(this.Context, customRptTempTableNames);
base.CloseReport();
}
}
2、bos扩展报表,引入插件,并且把标准插件停用
3、发布和验证效果
3、注意点
-
字段取名需要界面、sql语句里面完全一样。
-
如果新加的字段需要过滤,要在过滤方案里面配置