简单账表开发案例【附上源码+每行代码注释】原创
6人赞赏了该文章
100次浏览
编辑于2024年12月09日 10:35:17
摘要由AI智能服务提供
本文介绍了在金蝶系统中开发一个带过滤功能的报表的步骤,包括在BOS设计器中创建简单账表,开发服务端取数插件,注册插件,新建并配置过滤界面,修改插件以支持过滤,发布报表到主控台,最后登录系统浏览报表效果。文末附有详细源码及金蝶开发教程链接。
有用
反馈
文章末尾有源码,每行代码都有注释,超详细超详细!!!!
步骤1:新建简单账表
在BOS设计器中创建一张空白简单账表,修改报表名称及属性后保存。
步骤2:开发服务端取数插件
服务端取数插件需从 `Kingdee.BOS.Contracts.Report.SysReportBaseService` 派生
步骤3:注册服务端插件
将编译后的报表插件注册到服务端插件列表。
步骤4:新建过滤界面
创建一个新的过滤界面,继承 BOS - 应用框架 - 动态表单 - 公共过滤,并绘制各个过滤条件字段。
步骤5:配置过滤界面
将新建过滤界面的标识复制到简单账表的“过滤窗口业务对象”属性上。
步骤6:修改插件以支持过滤
在 `BuilderReportSqlAndTempTable` 事件中,通过 `filter.FilterParameter` 获取过滤条件,拼装出过滤条件和排序字段。
步骤7:发布主控台
将报表发布到主控台,建议先取消权限控制以快速查看效果。
步骤8:浏览报表效果
登录 K/3 Cloud,查看报表效果,调试和修正插件问题。
附上案例源码,点击获取更多的金蝶开发教程
using Kingdee.BOS; // 引入Kingdee.BOS命名空间 using Kingdee.BOS.App.Data; // 引入Kingdee.BOS.App.Data命名空间 using Kingdee.BOS.Contracts; // 引入Kingdee.BOS.Contracts命名空间 using Kingdee.BOS.Contracts.Report; // 引入Kingdee.BOS.Contracts.Report命名空间 using Kingdee.BOS.Core.Metadata; // 引入Kingdee.BOS.Core.Metadata命名空间 using Kingdee.BOS.Core.Report; // 引入Kingdee.BOS.Core.Report命名空间 using Kingdee.BOS.Core.SqlBuilder; // 引入Kingdee.BOS.Core.SqlBuilder命名空间 using Kingdee.BOS.Orm.DataEntity; // 引入Kingdee.BOS.Orm.DataEntity命名空间 using System; // 引入System命名空间 using System.Collections.Generic; // 引入System.Collections.Generic命名空间 using System.ComponentModel; // 引入System.ComponentModel命名空间 using System.Text; // 引入System.Text命名空间 namespace Kingdee.Bos.TestPOOrderTable // 定义命名空间 { [Description("采购订单明细表")] // 为类添加描述特性 public class POOrderDetailt2 : SysReportBaseService // 定义POOrderDetailt2类,继承自SysReportBaseService { // 初始化方法 public override void Initialize() { base.Initialize(); // 调用基类初始化方法 // 设置报表类型为普通类型 this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL; this.IsCreateTempTableByPlugin = true; // 设置是否通过插件创建临时表 // 设置是否分组汇总 this.ReportProperty.IsGroupSummary = true; } // 获取过滤条件信息(构造单据信息) public override ReportTitles GetReportTitles(IRptParams filter) { ReportTitles reportTitles = new ReportTitles(); // 创建报告标题对象 DynamicObject customFilter = filter.FilterParameter.CustomFilter; // 获取自定义过滤条件 if (customFilter != null) // 如果自定义过滤条件不为空 { // 获取组织名称 string multiOrgnNameValues = this.GetMultiOrgnNameValues(customFilter["F_PAEZ_OrgId"].ToString()); // 获取起始日期 string startValue = (customFilter["FOrderStartDate"] == null) ? string.Empty : Convert.ToDateTime(customFilter["FOrderStartDate"]).ToString("yyyy-MM-dd"); // 获取结束日期 string endValue = (customFilter["FOrderEndDate"] == null) ? string.Empty : Convert.ToDateTime(customFilter["FOrderEndDate"]).ToString("yyyy-MM-dd"); // 获取单据编号 string BillNo = (Convert.ToString(customFilter["F_PoOrderBillNo"]) == "") ? string.Empty : customFilter["F_PoOrderBillNo"].ToString(); // 获取物料名称 string baseDataNameValue = this.GetBaseDataNameValue(customFilter["F_PAEZ_WLID"] as DynamicObjectCollection); // 获取供应商名称 string baseDataNameValue3 = this.GetBaseDataNameValue(customFilter["F_PAEZ_SuppId"] as DynamicObjectCollection); // 添加标题信息 reportTitles.AddTitle("F_PAEZ_Org", multiOrgnNameValues); reportTitles.AddTitle("F_PAEZ_Date", startValue + "-" + endValue); reportTitles.AddTitle("F_PAEZ_BillNo", BillNo); reportTitles.AddTitle("F_PAEZ_WLName", baseDataNameValue); reportTitles.AddTitle("F_PAEZ_GYS", baseDataNameValue3); } return reportTitles; // 返回报告标题 } // 获取组织名称 private string GetMultiOrgnNameValues(string orgIdStrings) { List<string> list = new List<string>(); // 创建组织名称列表 string result = string.Empty; // 初始化结果字符串 if (orgIdStrings.Trim().Length > 0) // 如果组织ID字符串不为空 { IQueryService service = Kingdee.BOS.Contracts.ServiceFactory.GetService<IQueryService>(base.Context); // 获取查询服务 QueryBuilderParemeter para = new QueryBuilderParemeter // 创建查询参数 { FormId = "ORG_Organizations", // 表单ID SelectItems = SelectorItemInfo.Create SelectItems = SelectorItemInfo.CreateItems("FNAME"), // 查询组织名称 FilterClauseWihtKey = string.Format(" FORGID IN ({0}) AND FLOCALEID={1}", orgIdStrings, base.Context.UserLocale.LCID) // 过滤条件,根据组织ID和区域ID }; // 获取动态对象集合 DynamicObjectCollection dynamicObjectCollection = service.GetDynamicObjectCollection(base.Context, para, null); foreach (DynamicObject current in dynamicObjectCollection) // 遍历获取到的动态对象 { list.Add(current["FNAME"].ToString()); // 将组织名称添加到列表 } if (list.Count > 0) // 如果列表不为空 { result = string.Join(",", list.ToArray()); // 将组织名称列表合并为字符串 } } return result; // 返回组织名称字符串 } // 获取基础资料名称 private string GetBaseDataNameValue(DynamicObjectCollection dyobj) { string name = ""; // 初始化名称字符串 foreach (DynamicObject dynbj in dyobj) // 遍历动态对象集合 { if (dynbj != null || !dynbj.DynamicObjectType.Properties.Contains("Name")) // 如果动态对象不为空并且包含“Name”属性 { DynamicObject dynbj2 = (DynamicObject)dynbj[2]; // 获取相关动态对象 name = name + ",'" + dynbj2["Name"].ToString() + "'"; // 将名称添加到字符串 } } if (name.Length > 0) // 如果名称字符串不为空 { name = name.Substring(1, name.Length - 1); // 去掉前导逗号 } return name; // 返回名称字符串 } // 设置单据列 public override ReportHeader GetReportHeaders(IRptParams filter) { ReportHeader header = new ReportHeader(); // 创建报表头对象 // 创建并设置各列的标题 header.AddChild("FOrgname", new LocaleValue("标题一&业务组织", this.Context.UserLocale.LCID), SqlStorageType.Sqlvarchar); // 组织名称 header.AddChild("FSuppName", new LocaleValue("标题一&客户", this.Context.UserLocale.LCID), SqlStorageType.Sqlvarchar); // 客户名称 header.AddChild("FDocumentStatus", new LocaleValue("标题一&状态", this.Context.UserLocale.LCID), SqlStorageType.Sqlvarchar); // 状态 header.AddChild("FDate", new LocaleValue("标题一&日期", this.Context.UserLocale.LCID), SqlStorageType.SqlDatetime); // 日期 header.AddChild("FBillNo", new LocaleValue("标题一&单据编号", this.Context.UserLocale.LCID), SqlStorageType.Sqlvarchar); // 单据编号 header.AddChild("FMaterialName", new LocaleValue("标题二&物料", this.Context.UserLocale.LCID), SqlStorageType.Sqlvarchar); // 物料名称 header.AddChild("FQty", new LocaleValue("标题二&数量", this.Context.UserLocale.LCID), SqlStorageType.SqlDecimal); // 数量 header.AddChild("FUnitName", new LocaleValue("标题二&单位", this.Context.UserLocale.LCID), SqlStorageType.Sqlvarchar); // 单位名称 header.AddChild("FTAXPRICE", new LocaleValue("标题二&含税价", this.Context.UserLocale.LCID), SqlStorageType.SqlDecimal); // 含税价格 header.AddChild("FALLAMOUNT", new LocaleValue("标题二&价税合计", this.Context.UserLocale.LCID), SqlStorageType.SqlDecimal); // 价税合计 return header; // 返回报表头 } // 创建临时报表 public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName) { // 获取过滤条件 string Filter = GetFilterWhere(filter); // 获取排序字段 string seqFld = string.Format(base.KSQL_SEQ, OrderColumn(filter)); // 取数SQL // SQL查询字符串,提取所需数据并将结果存入临时表 string sql = string.Format(@"/*dialect*/ select FID, FENTRYID,FPURCHASEORGID,FOrgname,FSuppName,FBILLNO,FDate,FDOCUMENTSTATUS ,FLOCALCURRID,FMATERIALID,FMaterialName,FQTY,FUnitName,FTAXPRICE,FALLAMOUNT, {0} into {1} from ( select t0.FID, t1.FENTRYID,t0.FPURCHASEORGID,t1UO_L.FNAME FOrgname,SUPP_L.FNAME FSuppName ,t0.FBILLNO ,t0.FDate ,t0.FDOCUMENTSTATUS ,t2.FLOCALCURRID ,t1.FMATERIALID ,t1M_L.FNAME as FMaterialName ,t1.FQTY ,t1U_L.FNAME as FUnitName ,t1f.FTAXPRICE ,t1f.FALLAMOUNT from T_PUR_POORDER t0 inner join T_PUR_POORDERFIN t2 on (t0.FID = t2.FID) left join T_BD_CURRENCY t20 on (t2.FLOCALCURRID = t20.FCURRENCYID) inner join T_PUR_POORDERENTRY t1 on (t0.FID = t1.FID) left join T_BD_MATERIAL_L t1M_L on (t1.FMATERIALID = t1m_l.FMATERIALID and t1M_L.FLOCALEID = 2052) inner join T_PUR_POORDERENTRY_F t1F on (t1.FENTRYID = t1f.FENTRYID) left join T_BD_UNIT t1U on (t1f.FPRICEUNITID = t1u.FUNITID) left join T_BD_UNIT_L t1U_L on (t1U.FUNITID = t1U_L.FUNITID and t1U_L.FLOCALEID = 2052) left join T_ORG_ORGANIZATIONS_L t1UO_L on (t0.FPURCHASEORGID = t1UO_L.FORGID and t1UO_L.FLOCALEID = 2052) left join T_BD_SUPPLIER_L SUPP_L on (t0.FSUPPLIERID = SUPP_L.FSUPPLIERID and SUPP_L.FLOCALEID = 2052) ) t1 {2} ", seqFld, // 排序字段 tableName, // 临时表名称 Filter // 过滤条件 ); DBUtils.ExecuteDynamicObject(this.Context, sql); // 执行SQL并动态创建报表 } // 获取过滤条件 private string GetFilterWhere(IRptParams filter) { DynamicObject customFilter = filter.FilterParameter.CustomFilter; // 获取自定义过滤条件 StringBuilder strwhere = new StringBuilder(); // 创建字符串构建器 strwhere.AppendLine("Where 1=1 "); // 初始化过滤条件 // 组织 string org = string.IsNullOrWhiteSpace(customFilter["F_PAEZ_OrgId"].ToString()) ? " " : string.Format(" AND FPURCHASEORGID IN ({0}) ", Convert.ToString(customFilter["F_PAEZ_OrgId"])); strwhere.AppendLine(org); // 添加组织过滤条件 // 日期 string startValue = (customFilter["FOrderStartDate"] == null) ? string.Empty : Convert.ToDateTime(customFilter["FOrderStartDate"]).ToString("yyyy-MM-dd"); string endValue = (customFilter["FOrderEndDate"] == null) ? string.Empty : Convert.ToDateTime(customFilter["FOrderEndDate"]).ToString("yyyy-MM-dd"); strwhere.AppendLine(string.Format(" AND FDate>='{0}' and FDate<='{1}' ", startValue, endValue)); // 添加日期过滤条件 // 物料 string baseDataNameValue = this.GetBaseDataNameValue(customFilter["F_PAEZ_WLID"] as DynamicObjectCollection); string MaterailName = string.IsNullOrWhiteSpace(baseDataNameValue) ? " " : string.Format(" AND FMaterialName IN ({0}) ", baseDataNameValue); strwhere.AppendLine(MaterailName); // 添加物料过滤条件 // 单据编号 string BillNo = (Convert.ToString(customFilter["F_PoOrderBillNo"]) == "") ? " " : " AND FBILLNO='" + customFilter["F_PoOrderBillNo"].ToString() + "' "; strwhere.AppendLine(BillNo); // 添加单据编号过滤条件 // 供应商 string baseSuppName = this.GetBaseDataNameValue(customFilter["F_PAEZ_SuppId"] as DynamicObjectCollection); string SuppName = string.IsNullOrWhiteSpace(baseSuppName) ? " " : string.Format(" AND FSuppName IN ({0}) ", baseSuppName); strwhere.AppendLine(SuppName); // 添加供应商过滤条件 // 额外过滤条件 string text2 = string.IsNullOrWhiteSpace(filter.FilterParameter.FilterString) ? " " : " AND " + filter.FilterParameter.FilterString.Replace("{ts", "").Replace("}", ""); strwhere.AppendLine(text2); // 添加额外的过滤条件 return strwhere.ToString(); // 返回构建的过滤条件字符串 } // 设置汇总列信息 public override List<SummaryField> GetSummaryColumnInfo(IRptParams filter) { var result = base.GetSummaryColumnInfo(filter); // 获取基类的汇总字段信息 result.Add(new SummaryField("FQty", Kingdee.BOS.Core.Enums.BOSEnums.Enu_SummaryType.SUM)); // 添加数量汇总 result.Add(new SummaryField("FALLAMOUNT", Kingdee.BOS.Core.Enums.BOSEnums.Enu_SummaryType.SUM)); // 添加价税合计汇总 return result; // 返回汇总字段信息 } // 排序语句 private string OrderColumn(IRptParams filter) { string OrderBy = ""; // 初始化排序字符串 string datasort = Convert.ToString(filter.FilterParameter.SortString); // 获取排序条件 if (datasort != "") // 如果有排序条件 { OrderBy = " " + datasort + " "; // 设置排序字段 } else { OrderBy = " FID "; // 默认按FID排序 } return OrderBy; // 返回排序字段 } } }
赞 6
6人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读