报表插件实践第二弹原创
金蝶云社区-abstrct
abstrct
88人赞赏了该文章 338次浏览 未经作者许可,禁止转载编辑于2024年09月13日 12:44:12
summary-icon摘要由AI智能服务提供

本文讨论了报表及插件开发完成后出现的数据重复问题,经排查发现正式环境下因财务暂估应付和财务应付导致数据重复。通过搜索和咨询金蝶,发现需显示暂估应付数据,提出了两种过滤方案:继承原过滤框加条件或直接在数据源过滤。同时,提供了委外订单执行表的SQL关联代码,并讨论了SQL报表开发中的注意事项,如临时表使用、关联关系及数据一致性等,最后建议根据业务需求自行开发SQL报表。

  1. 问题:

    报表及插件开发好了,但是出现了问题。据业务部门反应,说数据有明显重复。于是检查了一下,本地和测试库是正常的,正式环境确实出现了。

    问题的原因:上了论坛搜索这个问题的答案,也向金蝶提了单。最后也弄明白了,因为关联了应付单,在正式环境下,财务做了暂估应付和财务应付。所以放出隐藏字段立账类型,发现重复的数据,立账类型是不一样的。


  2. 需求:

    只需要显示暂估应付的数据即可。那么就是加个过滤的问题。那么有以下的办法。

    1.继承原来的过滤框,加过滤条件,如链接帖子。https://vip.kingdee.com/article/70516488217681664?lang=zh-CN&productLineId=1,优点,正规,可以选择过滤条件。

    2.直接过滤。即原来的数据源也只是个查询的临时表,在临时表数据里过滤。优点,快。缺点,不正规。

  3. 第二张报表,委外订单执行

    表关联关系sql



  4. 代码:

  5. select * from T_SUB_REQORDERENTRY t2 left join T_SUB_REQORDER t3 on t2.fid=t3.FID
    left join t_PUR_POOrderEntry_lk t4 on t4.FSID=t2.FENTRYID and t4.FSBILLID=t2.FID and  t4.FRULEID='PUR_SUBREQORDER-PurchaseOrder' and t4.FSTABLENAME='T_SUB_REQORDERENTRY'
    left join T_PUR_POORDERENTRY t5 on t4.FENTRYID=t5.FENTRYID
    left join T_PUR_POORDER t6 on t5.FID=t6.FID
    left join T_PUR_ReceiveEntry_LK t7 on t7.FSID=t5.FENTRYID   and t7.FRULEID='PUR_PurchaseOrder-PUR_ReceiveBill' and t7.FSTABLENAME='t_PUR_POOrderEntry'
    left join T_PUR_ReceiveEntry t8 on t8.FENTRYID=t7.FENTRYID
    left join T_PUR_Receive t9 on t8.FID=t9.FID
    left join T_STK_INSTOCKENTRY_LK t10 on t10.FSID=t8.FENTRYID and t10.FRULEID='PUR_ReceiveBill-STK_InStock' and t10.FSTABLENAME='T_PUR_ReceiveEntry'
    left join T_STK_INSTOCKENTRY t11 on t11.FENTRYID=t10.FENTRYID
    left join t_STK_InStock t12 on t11.fid=t12.FID
  6. using Kingdee.BOS.App.Data;
    using Kingdee.BOS.Contracts;
    using Kingdee.BOS.Core.Metadata.Util;
    using Kingdee.BOS.Core.Report;
    using Kingdee.BOS.Util;
    using Kingdee.K3.MFG.SUB.App.ReportPlugIn.ROExecute;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MUY.K3.App.Report.MUY_PUR_PurReqExecuteRpt
    {
        [Description("委外订单执行明细"),HotUpdate]
        public class SRWX_SUB_ROExecuteDetailRpt: ROExecuteDetailRpt
        {
            //定义临时表
            private string[] TempTableName;
            public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
            {
                IDBService dbservice = Kingdee.BOS.App.ServiceHelper.GetService<IDBService>();
                TempTableName = dbservice.CreateTemporaryTableName(this.Context, 1);
                string strTable = TempTableName[0];
                base.BuilderReportSqlAndTempTable(filter, strTable);
                StringBuilder sb = new StringBuilder();
                string strSql = string.Format(@"select t9.FDATE as F_SRWX_DATE_IN, t12.FDATE as F_SRWX_DATE_STOCK_IN,t1.* INTO {1} FROM {0} t1 
    left join T_SUB_REQORDER t3 on t1.frobillno=t3.fbillno and t1.frobillid=t3.fid 
    left join T_SUB_REQORDERENTRY t2 on t2.FID=t3.FID and  t1.frobillid=t2.fid and t2.fseq=t1.froentryseq
    left join t_PUR_POOrderEntry_lk t4 on t4.FSID=t2.FENTRYID and t4.FSBILLID=t2.FID and  t4.FRULEID='PUR_SUBREQORDER-PurchaseOrder' and t4.FSTABLENAME='T_SUB_REQORDERENTRY'
    left join T_PUR_POORDERENTRY t5 on t4.FENTRYID=t5.FENTRYID
    left join T_PUR_POORDER t6 on t5.FID=t6.FID
    left join T_PUR_ReceiveEntry_LK t7 on t7.FSID=t5.FENTRYID   and t7.FRULEID='PUR_PurchaseOrder-PUR_ReceiveBill' and t7.FSTABLENAME='t_PUR_POOrderEntry'
    left join T_PUR_ReceiveEntry t8 on t8.FENTRYID=t7.FENTRYID
    left join T_PUR_Receive t9 on t8.FID=t9.FID
    left join T_STK_INSTOCKENTRY_LK t10 on t10.FSID=t8.FENTRYID and t10.FRULEID='PUR_ReceiveBill-STK_InStock' and t10.FSTABLENAME='T_PUR_ReceiveEntry'
    left join T_STK_INSTOCKENTRY t11 on t11.FENTRYID=t10.FENTRYID
    left join t_STK_InStock t12 on t11.fid=t12.FID", strTable, tableName);
                DBUtils.Execute(this.Context, strSql);
            }
    
            public override void CloseReport()
            {
                //删除临时表
                if (TempTableName == null || TempTableName.Length == 0)
                {
                    return;
                }
                IDBService dbservice = Kingdee.BOS.App.ServiceHelper.GetService<IDBService>();
                dbservice.DeleteTemporaryTableName(this.Context, TempTableName);
                base.CloseReport();
            }
        }
    }

   遇到的问题总结:和原来临时表t1关系来源:刚开始写的是t1.fbillno=fbillno至于后来写正确了,是调试时查的临时表,这个总的来说是sql问题。

    关联时,不能直接套用,具体怎么关联,见

base.BuilderReportSqlAndTempTable(filter, strTable);

    strtable生成的临时表数据。    

关联关系时:1.fruleid   2.源单业务对象即fstablename确保数据一致性。

临时表数据的结构:点开最前面的单据编号,全流程跟踪,这些关联的表数据不是全部都有,但是表是已经关联了的。

最后:账表符合金蝶的标准,但不是 符合所有公司的业务报表。最好还是自己开发sql报表。sql报表的开发实践会在后续更新。慢慢学,慢慢更新。





图标赞 88
88人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0