用SQL从科目余额表取数方法详解
前方
本文带你全面了解星空企业版余额表及其取数方法。包括五大余额表的家族组成,表结构中列与行的数据关系,大家最关注的核算维度组合ID解析及与明细账结合查询的技巧等。
1,余额表家族成员
我们知道,科目余额数据来源于凭证,凭证通过过账操作,得到各明细科目及其上级科目的累计余额数据,相关数据保存在我们熟知的科目余额表(T_GL_BALANCE)表中,相似的,如果凭证上的科目启用了数量,那么,过账的同时,还会累计出数量余额,其数据保存在数量余额表(T_GL_BALANCEQTY)中,如果科目是损益类科目,也会将数据统计到损益余额表(T_GL_BALANCEPROFIT)中。这就是传说中的三大余额表。
事实上,自从星空系统支持调整期后,如果对应的账簿启用了调整期,那么除了正常期间过账数据产生的三大余额表,还有包含调整期数据的调整期余额表(T_GL_BALANCEADJUST)和调整期数量余额表(T_GL_BALANCEQTYADJUST),它们分别用来存放包含了调整期科目数据的余额和数量余额。也就是说,对于启用了调整期的账簿来说,其普通余额表T_GL_BALANCE和T_GL_BALANCEQTY是调整期的两个余额表T_GL_BALANCEADJUST和T_GL_BALANCEADJUSTQTY的子集。因此,账表取数时,如果需要包含调整期凭证的数据,就要从调整期余额表取数,否则就从普通余额表取。
这就是余额表家族的五大成员。如下图所示:
2,科目余额表的结构
科目余额表家族,从字段上来说,都包含了以下字段,且这些字段做为主键使用:
账簿(FACCOUNTBOOKID)
年度(FYEAR)
期间(FPERIOD)
科目(FACCOUNTID)
维度组合ID(FDETAILID)
币别(FCURRENCYID)
如下图所示:(如无特殊,本文以最常用的T_GL_BALANCE表举例)
除了这些字段以后,各表具体数据字段不同,具体记录了对应的金额和数量,大家可以参考BOS设计器来了解各字段的具体内容。
需要强调的是:
1)关于借贷:余额表中,期初期末余额没有区分专门的借方和贷方,它们是根据数据的正负来表示借方和贷方的,即正借负贷。其它字段均有专门的借贷字段,“DEBIT”表示借方,“CREDIT”表示贷方。
2)关于原币和本位币:带“FOR”的表示原币,不带的即为本位币。如:“FDEBITFOR”表示借方原币
3)关于本年累计:“YTD”表示本年累计,如“FYTDCTEDIT”表示本年累计贷方本位币
具体如下图所示:
从行数据来看,科目余额表不仅记录了明细科目的具体数据,还保存了上级科目的汇总数据。
1)币别的汇总
如下图所示:
币别为0的行,是综合本位币行,它的数据是所有不为0的行数据换算成本位币后的汇总。如第36行,是37,38两行不同币别本位币数据的和。第39行是第40行本位币数据的和。
2)核算维度的汇总
FDETAILID不为0的行(39-46行)为该科目(4099)各维度的数据,而FDETAILID为0的行(36-38行)为FDETAILID不为0的行(39-46行)数据的在不同币别上的汇总。如,其中,第38行是币别为1的所有维度组合的和,第38行是币别为7的所有维度组合的和。而第36行,则是所有维度组合,所有币别的汇总之和。
如果科目未挂维度,则FDETAILID恒为0,也就是它该科目无维度组合明细。
3)科目的汇总
对于非一级科目,必然会存在上级科目,上级科目是对其所有下级科目在各维度组合ID,各币别上数据的汇总。如:4001科目有10个下级科目,则4001的余额数据是对这10个下级科目,按不同的维度和币别分别汇总后的数据。
对于多级科目,以此类推,从明细科目的维度和币别开始累计,直到一级科目为止。
3,核算维度组合ID解析
凭证和余额表中,核算维度都是以组合ID(FDETAILID)的形式出现,它代表了科目上挂的各维度上录入的具体的值,但在解析前无法直观知道具体是哪些维度,它们的值分别是什么,必须通过维度解析后才能知道。
核算维度组合ID(FDETAILID)字段的解析,可以参考以下文章:
根据凭证上的核算维度信息取具体的编码名称 (kingdee.com)
这篇文章介绍的核算维度背后各相关表的关联关系和实现组合的原理,非常适合维度新人阅读。
如果你对核算维度组合ID已有了解,并对核算维度背后的主要表有所了解,可以直接参数以下文章:
4,与明细账结合查询
余额表实质是凭证明细数据的汇总,因此,财务在看某行余额的本期发生额数据的时候,往往还想一起看一下对应的当期具体凭证明细记录。这就需要有关联余额表和凭证表来共同取数了。
示例如下:
SELECT B.FNUMBER,T.FYEAR,T.FPERIOD,A.FNUMBER,AL.FFULLNAME,T.FDETAILID,CL.FNAME FCURRENCYID, VL.FNAME FVCHGROUP,T.FVOUCHERGROUPNO,T.FENTRYSEQ,T.FDATE, T.FBEGINBALANCE,T.FDEBIT,T.FCREDIT,T.FENDBALANCE,T.FINDEX FROM( SELECT B.FACCOUNTBOOKID,B.FYEAR,B.FPERIOD,B.FACCOUNTID,B.FDETAILID,B.FCURRENCYID, 0 FVOUCHERGROUPID,0 FVOUCHERGROUPNO,0 FENTRYSEQ,'' FDATE, B.FBEGINBALANCE,B.FDEBIT,B.FCREDIT,B.FENDBALANCE,1 FINDEX FROM T_GL_BALANCE B WHERE B.FACCOUNTBOOKID=697382 AND B.FYEAR=2014 AND B.FPERIOD=2 AND B.FCURRENCYID<>0 UNION SELECT V.FACCOUNTBOOKID,V.FYEAR,V.FPERIOD,VE.FACCOUNTID,VE.FDETAILID,VE.FCURRENCYID, V.FVOUCHERGROUPID,V.FVOUCHERGROUPNO,VE.FENTRYSEQ,V.FDATE,0,VE.FDEBIT,VE.FCREDIT,0,0 FINDEX FROM T_GL_VOUCHER V JOIN T_GL_VOUCHERENTRY VE ON V.FVOUCHERID=VE.FVOUCHERID AND V.FPOSTED='1' AND V.FINVALID='0' WHERE V.FACCOUNTBOOKID=697382 AND V.FYEAR=2014 AND V.FPERIOD=2 AND VE.FCURRENCYID=1 ) T INNER JOIN T_BD_ACCOUNT A ON A.FACCTID=T.FACCOUNTID LEFT JOIN T_BD_ACCOUNTBOOK B ON B.FBOOKID=T.FACCOUNTBOOKID LEFT JOIN T_BD_CURRENCY_L CL ON CL.FCURRENCYID=T.FCURRENCYID AND CL.FLOCALEID=2052 LEFT JOIN T_BD_VOUCHERGROUP_L VL ON VL.FVCHGROUPID=T.FVOUCHERGROUPID AND VL.FLOCALEID=2052 LEFT JOIN T_BD_ACCOUNT_L AL ON AL.FACCTID=T.FACCOUNTID AND AL.FLOCALEID=2052 WHERE A.FNUMBER LIKE '1812%' ORDER BY B.FNUMBER,T.FYEAR,T.FPERIOD,A.FNUMBER,T.FDETAILID,T.FCURRENCYID ,T.FINDEX DESC, T.FVOUCHERGROUPID,T.FVOUCHERGROUPNO,T.FENTRYSEQ,T.FDATE
注意:上图中,FINDEX为0的是明细上的明细分录行数据,为1的是余额表中对这些明细行的汇总,同时,还包含了核算维度组合ID和汇总。由于这里取的币别都是1(人民币)因此,本次查询未体现各币别汇总为综合本位币的关系。
PS:余额表保存的是已过账凭证的数据,如需查询包含未过账凭证的余额数据,则需要调用官方提供的虚拟过账方法,暂时无法直接通过SQL语句取到数,详细请参考:【二开指导】如何取科目余额数据 (kingdee.com) 及 总账凭证虚拟过账参数说明 (kingdee.com)
用SQL从科目余额表取数方法详解
本文2024-09-16 18:06:11发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-19959.html