2014-02-28 23:43:21
众所周知,在SQL语句中,按照一定的排序,运用最小值函数(MIN)、最大值函数(MAX)和计数函数(COUNT),我们可以得出指定的某类单据或票据是否存在断号的情况。如果要检查产品销售收入明细账记录中所登记发票是否存在缺号(以审计署中级计算机培训大纲中的模板财务数据U8-999帐套为例),需要通过SQL语句查询其凭证号断号情况,可以写具体语句如下实现: SELECT coutbillsign,最小票据号=MIN(coutid),最大票据号=MAX(coutid),票据张数=COUNT(*) FROM GL_accvouch WHERE ccode LIKE ''501%'' AND mc>0 GROUP BY coutbillsign 通过以上SQL语句,我们可以得出如下结果:
通过查询结果很容易看出,发票类型为26的发票,最小编号为fp52301,最大编号为fp52324,票据张数应该为24张,但该帐套中只有23张,缺失1张。以上提出的问题已经解决,是发票类型为26的发票存在断号的情况。但如果该问题继续深入下去,缺失的是哪一张?这样该怎么办呢,把所有的该类型票据全部用SQL语句排列出来,人工查找出断号的哪张?如果是数据量小,这也不失为一种办法。但如果对方是海量数据,并且缺失的是大量的票据号的话,以上SQL语句只能揭示票据断号的情况,但并不能准确的反映出具体断号的票据类型及票据号。这样在后期的审计取证查证时就会消耗掉我们大量的时间和精力,这时我们就应该思考是否能应用SQL的强大查询及检索功能来实现我们上述的审计思路,能否高效的查找出断号的票据。因为是要对连续编号的票据进行比对,所以游标在有条件的重复比对及查询功能为我们解决这个问题打开了解决之路。我们就以游标对上述问题进行试解,查找出断号的哪些票据编号,游标语句如下: DECLARE FP CURSOR FOR SELECT coutbillsign,MIN(coutid),MAX(coutid) FROM GL_accvouch WHERE ccode LIKE ''501%'' AND mc>0 GROUP BY coutbillsign DECLARE @LX CHAR(2),@ZX VARCHAR(10),@ZD VARCHAR(10) OPEN FP FETCH NEXT FROM FP INTO @LX,@ZX,@ZD PRINT ''票据类型 缺失的票据号'' PRINT ''======================='' WHILE @@FETCH_STATUS=0 BEGIN DECLARE @XH INT,@HM VARCHAR(10) SET @XH=CAST(RIGHT(@ZX,5) AS INT) WHILE @XH<=CAST(RIGHT(@ZD,5) AS INT) BEGIN SET @HM=LEFT(@ZX,LEN(@ZX)-LEN(CAST(@XH AS VARCHAR(10))))+CAST(@XH AS VARCHAR(10)) IF NOT EXISTS(SELECT * FROM GL_accvouch WHERE ccode LIKE ''501%'' AND mc>0 AND coutbillsign=@LX AND coutid=@HM) PRINT @LX+SPACE(12)+@HM SET @XH=@XH+1 END FETCH NEXT FROM FP INTO @LX,@ZX,@ZD END CLOSE FP DEALLOCATE FP 查询结果如下: ![]() 在上述游标中,我们设定了一个@XH的变量,让他的初始值等于我们要查找断号票据的最小号,然后每次加1再与票据一一进行比对,直到查找到对应不上的哪张票据,并将他显示出来。 这样,我们成功地利用游标找到了那张缺失票号的票据类型及票据号,如果在审计实务中我们就可以直接在大量的原始单据中直接进行查证及取证,极大的提高了工作效率。同样我们可以依据上述游标原理,高效对记账凭证、记账凭证所附原始单据、税务发票等连续编号的票据的断号情况进行检索。(梁小虎) |
||||||||||||||||
(本文内容仅为作者个人观点,不代表任何审计机关和本网站的观点,未经许可,不得转载) |