本文讨论了报表及插件开发完成后出现的数据重复问题,经排查发现正式环境下因财务暂估应付和财务应付导致数据重复。通过搜索和咨询金蝶,发现需显示暂估应付数据,提出了两种过滤方案:继承原过滤框加条件或直接在数据源过滤。同时,提供了委外订单执行表的SQL关联代码,并讨论了SQL报表开发中的注意事项,如临时表使用、关联关系及数据一致性等,最后建议根据业务需求自行开发SQL报表。
问题:
报表及插件开发好了,但是出现了问题。据业务部门反应,说数据有明显重复。于是检查了一下,本地和测试库是正常的,正式环境确实出现了。
问题的原因:上了论坛搜索这个问题的答案,也向金蝶提了单。最后也弄明白了,因为关联了应付单,在正式环境下,财务做了暂估应付和财务应付。所以放出隐藏字段立账类型,发现重复的数据,立账类型是不一样的。
需求:
只需要显示暂估应付的数据即可。那么就是加个过滤的问题。那么有以下的办法。
1.继承原来的过滤框,加过滤条件,如链接帖子。https://vip.kingdee.com/article/70516488217681664?lang=zh-CN&productLineId=1,优点,正规,可以选择过滤条件。
2.直接过滤。即原来的数据源也只是个查询的临时表,在临时表数据里过滤。优点,快。缺点,不正规。
第二张报表,委外订单执行
表关联关系sql
代码:
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
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报表的开发实践会在后续更新。慢慢学,慢慢更新。
推荐阅读
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *