二开科目余额表,增加字段显示额外信息原创
金蝶云社区-战斗的凯文
战斗的凯文
1人赞赏了该文章 1,280次浏览 未经作者许可,禁止转载编辑于2021年09月26日 16:11:34

经常遇到有二开咨询科目余额表二开的问题,这里以科目上挂银行账号维度,需要增加显示对应的开户行名称为例,介绍科目余额表二开的步骤和关键点:


首先,定义插件类,继承自SysReportBaseService。
注意,该插件需要挂在官方插件之后,否则取不到数。

public class MyAccountBlancerServicePlugIn : SysReportBaseService

{}


然后,覆写下面的方面,在此方法中获得账表对应的临时表:方法第二个参数tableName,该临时表中保存了科目余额表完成取数后的所有数据。二开插件从该表取数后加工出自己想要的数据。

public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)

{

    1,在表中增加一列,用到保存要显示的开户行名称信息:Alter Table Add FMyNewFiled NVARCHAR(50) NULL DEFAULT ' '。

    2,从银行账号表T_CN_BANKACNT中查询出所有账号及其对应的开户行,以银行账号为键存于字典中备用。

    3,循环临时表中的每一行,取出科目(FACCOUNTID),检查当科目上挂了银行账号时,再取核算维度编码字段(FDETAILNUMBER),如果发现编码中包含银行账号类的编码,将其取出来,从字典找到其对应的开户行信息,填于新增字段(FMyNewFiled)中。

}


最后,增加表头列,以便在界面上显示出新增字段。

public override ReportHeader GetReportHeaders(IRptParams filter)

{

  this.ReportHeader.AddChild('FMyNewFiled', new LocaleValue("开户行", this.Context.UserLocale.LCID));

  return this.ReportHeader;

}

三步完成,就这么简单。其中,如何判断科目是否挂银行账号核算维度和如何判断核算维度编码字段中是否包含银行账号类编码是本次二开的技术难点:


1,如何判断科目是否挂银行账号核算维度?

--所有挂银行账号核算维度的科目

SELECT DISTINCT AF.FACCTID FROM T_BD_ACCOUNTFLEXENTRY AF

JOIN T_BD_FLEXITEMPROPERTY P ON AF.FFLEXITEMPROPERTYID=P.FID

JOIN TempTable B ON B.FACCOUNTID=AF.FACCTID 

WHERE P.FVALUESOURCE='CN_BANKACNT'


2,如何判断核算维度编码字段中是否包含银行账号类编码?

根据临时表中的FDETAILID数据来判断.下面的语句找出所有录入了银行账号的维度。

--需先查T_BD_FLEXITEMPROPERTY表,得到银行账号对应的字段名称,此处记为FFLEXN

SELECT DISTINCT B.FDETAILID FROM T_BD_FLEXITEMDETAILV FD

JOIN TempTable B ON B.FDETAILID=FD.FID

WHERE FD.FFLEXN>0


其实,上面标红色文字部分完全可以不用那麻烦,之所以写出来,是因为这样对不熟悉系统的开发来说,更加简单理解。当熟悉系统后,还有另一种方法,在临时表中增加FMYNEWFIELD字段后,直接更新开户行数据到字段中:

MERGE INTO TEMPTABLE TT

USING (

    SELECT B.FDETAILID,AF.FACCTID,ISNULL(AC.开户行,' ') AS FBANKNAME FROM TEMPTABLE B

        JOIN T_BD_ACCOUNTFLEXENTRY AF ON B.FACCOUNTID=AF.FACCTID

        JOIN T_BD_FLEXITEMPROPERTY P ON AF.FFLEXITEMPROPERTYID=P.FID

        JOIN T_BD_FLEXITEMDETAILV FD ON B.FDETAILID=FD.FID

        JOIN T_CN_BANKACNT AC ON AC.FBANKACNTID=FD.FFLEXN

    WHERE P.FVALUESOURCE='CN_BANKACNT' AND FD.FFLEXN>0

) T0 ON TT.FACCOUNTID=T0.FACCTID AND TT.FDETAILID=T0.FDETAILID

WHEN MATCHED THEN 

UPDATE SET TT.FMYNEWFIELD=T0.FBANKNAME;

这种方法更加直接简便,直接在数据库中用一条SQL语句完成更新,省时省力,推荐使用。


如果觉得我的文字对你有帮助,记得点赞加收藏。

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

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

请选择打赏金币数 *

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