根据凭证上的核算维度信息取具体的编码名称原创
金蝶云社区-战斗的凯文
战斗的凯文
18人赞赏了该文章 2306次浏览 未经作者许可,禁止转载编辑于2021年10月18日 14:25:32
封面

经常遇到有人希望根据凭证上的核算维度信息,取到具体的维度值。如凭证上某科目挂了【部门】和【城市】两个核算维度,具体是部门“采购部”和客户“长安”,而实际上该凭证只记录了由这两个维度值共同组合而成的一个ID值,无法直接得到“采购部”和“长安”,那么,到底要如何得到这两个值呢,下面的知识很重要。

凭证上记录核算维度组合信息的字段的是凭证分录表(T_GL_VOUCHERENTRY)中的FDETAILID字段,它通过外键关联的是T_BD_FLEXITEMDETAILV表的主键FID。

Image_20201223171118.png

T_BD_FLEXITEMDETAILV表是整个核算维度体系的核心。它的列是动态生成的除了FID、FOPCODE和FCALCOL三列。这些动态列对应着相应的核算维度,如FFLEX4表示“供应商”,它的值就是【供应商】表中的某个具体记录的FMASTERID或FPKID的值。也就是说,通过FFLEX4的值,可以找到供应商的编码、名称等全部信息。

Image_20211018111131.png

但如何知道每一列代码哪个核算维度呢?这就要看T_BD_FLEXITEMPROPERTY表啦,该表是系统中所有核算维度的列表,其中的FFLEXNUMBER字段记录了该维度在T_BD_FLEXITEMDETAILV表中的字段列。每增加一个核算维度,T_BD_FLEXITEMPROPERTY表就会增加一行,维度审核通过后,会自动在T_BD_FLEXITEMDETAILV表中生成相应的数据列。我们知道,核算维度的来源分为基础资料和辅助资料,在T_BD_FLEXITEMDETAILV表中,字段FVALUETYPE的值0代表基础资料,1代表辅助资料,二者最大的区别在于取数方式不同。这一点很重要。

Image_20211018111451.png

一,基础资料取数:

如何知道具体核算维度(如【客户】)最终的表呢?这就要通过T_META_LOOKUPCLASS表啦。该表中FFORMID与T_BD_FLEXITEMPROPERTY表的FVALUESOURCE字段关联,即通过【客户】的FVALUESOURCE值“BD_CUSTOMER”可以在T_META_LOOKUPCLASS表中找到对应的记录,包含对应的表名,主键字段,MASTERID字段,主键字段类型等待关键信息。根据这些信息,就可以直接查询啦。

Image_20211018112858.png

二,辅助资料取数:

辅助资料取数相对简单直接,可以直接在T_BAS_ASSISTANTDATAENTRY表中根据维度具体的ID值查询。

Image_20211018115621.png

按上面的例子,我们要取科目上挂的部门】和【城市】两个核算维度的具体数据,方法为:

1,在T_GL_VOUCHERENTRY表中查询到该科目所在的分录行,得FDETAILID字段值,假设为54321,。

2,在T_BD_FLEXITEMDETAILV表中,根据FID=54321,查询到该核算维度组合ID对应的具体维度及其值。

3,在T_BD_FLEXITEMPROPERTY表(必要时可以关联该表的多语言表——表名后加“_L”),找出部门和城市这两个维度在T_BD_FLEXITEMDETAILV表中的字段名和维度类型,如查得部门的字段名为FFLEX5,类型为基础资料,城市的字段名为FF00001,类型为辅助资料。

4,对应的,我们可以在T_BD_FLEXITEMDETAILV表中看到,该维度仅这两个字段有值,其余字段均为0或空。假设:FFLEX5的值为100001,FF00001的值为“005056942d569a3f11e3dff547a44956”(一般情况下,基础资料的ID为数值型,辅助资料的ID为GUID字符串),这就告诉我们,部门ID为100001,城市ID为“5cb035ec1cb9af”。下一步就是得到相应的表。

5,查询“采购部”信息:由于【部门】是基础资料,因此,在T_BD_FLEXITEMPROPERTY表,找到部门FVALUESOURCE值“BD_Department”,在T_META_LOOKUPCLASS表中,通过FFORMID="BD_Department",找到记录,可以看到FTABLENAME为“T_BD_DEPARTMENT”,FMASTERFIELDNAME为“FMASTERID”,根据这两项,我们可以拼成SQL查询语句:

select * from T_BD_DEPARTMENT where FMASTERID=100001

从而查询“采购部”在部门表中的所有信息。

6,查询“长安”信息,由于【城市】是辅助资料,因此可以直接查询T_BAS_ASSISTANTDATAENTRY表:

select * from T_BAS_ASSISTANTDATAENTRY where FMASTERID='005056942d569a3f11e3dff547a44956'

7,如果表得到中文名称,还需要关联相应表的多语言表,如部门的多语言表为:T_BD_DEPARTMENT_L,辅助资料的多语言表为:T_BAS_ASSISTANTDATAENTRY_L。

通过上面的方式,可以从凭证中显示的核算维度,从通过数据库查询,得到具体维度的数据。下面的模型,清晰的反应了上述表之间的关联关系,初学者可以对照阅读,便于理解。

QQ图片20211018142405.jpg


赞 18