简单账表开发案例【附上源码+每行代码注释】原创
金蝶云社区-云社区用户E4s92748
云社区用户E4s92748
6人赞赏了该文章 100次浏览 未经作者许可,禁止转载编辑于2024年12月09日 10:35:17
summary-icon摘要由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人打赏
还没有人打赏,快来当第一个打赏的人吧!