由用友政务软件公司开发的用友政务A++5.2是一款基于Oracle平台的财务管理软件产品。该软件对辅助账以“组”的方式存储,即对会计科目指定辅助核算项,每项之间以“/”分隔,其中每个部分代表一个辅助核算。通过ODBC将数据导入到SQL Server后,下面以凭证表(VOUCHER)、余额表(BALANCE)为例,详细讲解如何拆分辅助核算项,并将凭证表、余额表转换为“单表横排”、“单表竖排”格式,以实现向A02011现场审计实施系统的导入。 一、科目表(ACCOUNT)、余额表(BALANCE)及凭证表(VOUCHER)结构 1.科目表数据示例如下:
科目表定义了每个科目的辅助核算内容,如500102020101科目(事业支出-非财政补助支出-项目支出-工资福利支出-基本工资)分别按资金来源、功能分类及项目信息内容进行辅助核算。 2.凭证表数据示例如下:
凭证表按科目表定义的辅助核算组,在辅助核算组列存储了各类辅助核算编码,并以正斜杠分割,编码顺序与科目表辅助核算项内容一一对应。 3.余额表数据示例如下:
余额表存储了每个科目各月的期初余额,辅助核算组列同样按科目表定义的辅助核算项内容、顺序反映各科目辅助余额。 为了能详细反映单位往来、个人往来、部门核算、资金来源、功能分类、项目信息、专项核算等辅助核算内容,导入辅助凭证表及辅助余额表必须对上述凭证表、余额表进行适当处理,加工成符合AO2011格式。下面将凭证表、余额表分别按“单表横排”、“单表竖排”两种方式处理为例,详细介绍辅助凭证表、辅助余额表生成方法。 二、数据处理方法 1.辅助凭证表 凭证表包含了辅助核算组,因此,它也是一张辅助凭证表。按辅助凭证表导入AO2011要求,各辅助核算内容应按辅助内容分列存储,即单位往来、个人往来、资金来源、专项核算等辅助项各占一列。为了实现上述要求,需要从凭证表中的辅助核算组中依次提取出每个辅助核算代码,普通的SQL语句较难实现,以下通过在SQL Server中编写一个UDF(用户自定义函数)实现提取功能。代码如下: CREATE FUNCTION get_new_str @v_str VARCHAR(4000), @v_sp CHAR(1), @n INT RETURNS VARCHAR(100) BEGIN DECIARE @new_str1 VARCHAR(100),@new_str2VARCHAR (4000),@s INT=1,@e INT,@count INT=1,@num INT,@chacter VARCHAR(100); DECLARE @tb AS TABLE (c INT,string VARCHAR(100)); IF RIGHT(@v_str,1)<>@v_sp SET @new_str2=CONCAT(@v_str,@v_sp); SET @new_str2=@v_str; SET @num=LEN (@new_str2)-LEN (REPLACE(@new_str2,@v_sp,’’)); WHILE @count<=@num BEGIN SELECT @e=CHARINDEX(@v_sp,@new_str2,@s); SELECT @new_str1=SUBSTRING(@new_str2,@s,@e-@s); INSERT INTO @tb(c,string)VALUES(@count,@new_str1); SELECT @s=@e+1; SELECT @count=@count+1; SET @chacter=(SELECT string FROM @tb WHERE c=@n); RETURN @chacter, 函数dbo.get_new_str有三个参数,第一个参数是要处理的字符串,第二个参数是字符串中的分隔符号,第三个参数指定需要提取哪部分字符。如:dbo.get_new_str(‘501-3201-02’,’-‘,2)是将以“-”分隔的字符串“501-3201-02”第2部分提取出来,返回字符“3201”。如果分隔符输入错误或者截取的数字无效,将返回空值。 因为该软件定义了单位往来、个人往来、部门核算、功能分类、资金来源等7个辅助核算,故辅助凭证表中要产生单位往来、个人往来、部门核算、功能分类、资金来源、项目信息、专项核算7列,分别存储各辅助核算代码。以下是将凭证表与科目表关联,调用dbo.get_new_str函数,并利用CASE语句判断,将从辅助核算组中提取的代码依次存入对应列中,示例中只对单位往来进行了拆分,其他辅助核算内容拆分原理相同,SQL语句如下: