胡澤亮
?
實際生產中處理過戶導致的業務與財務稽核差異的一種方法
胡澤亮
中國電信河北分公司,河北 石家莊 050000
通信企業進行業務稽核,對收入的邏輯差異進行分析時常受到過戶數據的干擾。提供了一種簡單的方法通過數據庫過濾過戶數據,在稽核工作中使用數據庫工具,提高稽核工作的信息化水平。
業務稽核;數據庫;過戶
在通信企業的業務與財務稽核工作中,驗證預存平衡是其中很重要的一環,最常用的邏輯差異稽核公式為:起初余額+當月繳費-當月消費=期末余額。
日常處理過程一般是細化顆粒度到賬戶級,將每個用戶套用一遍以上的公式以便找出存在邏輯差異的賬戶。但是找出的差異賬戶大量是當月發生過戶操作,實際分析后發現可以正負相抵并不是真正的差異賬戶。本文介紹了一種使用數據庫腳本消除這種過戶產生差異的簡易方法。
首先我們舉例分析過戶導致邏輯差異的原理。
實例1:用戶A在當月操作過戶從賬戶1轉入賬戶2,同時有10元錢也從賬戶1轉入賬戶2,那么用戶與賬戶關系表中會有以下記錄(見表1)。
表1

賬戶用戶是否有效變更日期 1A否20180402 2A是20180402
假定賬戶1和賬戶2下沒有其他用戶,用戶A當月的期初余額為10,當月也沒有繳費和消費,當月邏輯差異公式為(見表2)。
表2

賬戶用戶期初余額繳費消費期末余額邏輯差異 1A1000010 2A00010﹣10
雖然賬戶1和賬戶2都有差異,但是兩個賬戶的邏輯差異正好正負相抵,差異合計為0。由此我們可以認為通過用戶A可以找到賬戶1和賬戶2之間的關聯,賬戶1和賬戶2的集合當月邏輯差異為0。
在這里我們引入一個賬戶組的概念,當月有過戶關系的賬戶的合集。如果將現有差異按照賬戶組的細粒度進行全量比對,就可剔除其中因過戶導致的合理差異。在實際生產中過戶關系遠比以上例子復雜,可能涉及多個用戶多個賬戶多次過戶,因此我們需要將以上情況考慮周全避免引入額外的差異。
以下是復雜場景下的兩個例子,我們可以試著分析如何找到關聯,組成我們需要的賬戶組。
實例2:用戶A當月有兩次過戶操作,分別是攜帶10元從賬戶1轉入賬戶2,又攜帶20元從賬戶2轉入賬戶3,那么用戶與賬戶關系表中會有以下的記錄(見表3)。
表3

賬戶用戶是否有效變更日期 1A否20180402 2A否20180403 3A是20180403
假定賬戶1、賬戶2、賬戶3下沒有其他用戶,當月也沒有繳費和消費,當月邏輯差異公式為(見表4)。
表4

用戶期初余額繳費消費期末余額邏輯差異 A1000010 A1000010 A00020﹣20
實例3:用戶A當月攜帶10元從賬戶1轉入賬戶2,用戶B當月攜帶20元從賬戶2轉入賬戶3,那么用戶與賬戶關系表中會有以下的記錄(見表5)。
表5
假定賬戶1、賬戶2、賬戶3下沒有其他用戶,當月也沒有繳費和消費,當月邏輯差異公式為(見表6)。
表6

賬戶用戶期初余額繳費消費期末余額邏輯差異 1A1000010 2A、B1000010 3B00020﹣20
在實例2中雖然用戶做了兩次過戶操作,但是仍然可以通過用戶A一次性關聯到賬戶1、賬戶2、賬戶3。在實例3中則要復雜一些,先通過用戶A關聯到賬戶1和賬戶2,再通過賬戶2找到用戶B,通過用戶B發現賬戶2和賬戶3是關聯賬戶,最終形成賬戶1、賬戶2、賬戶3的賬戶組。
在實際生產中我們無法預知實例3中的迭代關聯會出現多少次,因此需要使用腳本窮舉,直到找齊所有的關聯賬戶。
在通信企業中,Oracle是常見的數據庫,因此本文的腳本遵循Oracle數據庫的編碼格式,其他數據庫腳本可以參考修改。
首先建立中間表臨時存儲找到的關聯賬戶,其中ACCT_ID為起始賬戶id,SERV_ID為根據起始賬戶id找到的用戶id,ACCT_ID1為根據用戶id關聯到的賬戶id,note為迭代查找的次數。
create table HZL_TEMP0702_3
( city_code VARCHAR2(4),
ACCT_ID NUMBER(12),
SERV_ID NUMBER(12),
ACCT_ID1 NUMBER(12),
NOTE NUMBER
)
根據用戶和賬戶關系提取相關賬戶并插入中間表
declare[1]
i NUMBER ;
v1 number ;
v2 number ;
cursor c1 is
select city_code,acct_id from HZL_TEMP0702_2 group by city_code,acct_id ;
begin
for rec in c1 loop[2]
i:=0 ;
v1:=0 ;
v2:=0 ;
insert into HZL_TEMP0702_3
select t1.city_code,rec.acct_id,t1.serv_id,t1.acct_id,0
from month_serv_acct t1,month_serv_acct t2
where t1.fee_date=to_char(add_months(sysdate,-1),'yyyymm')
and t2.fee_date=to_char(add_months(sysdate,-1),'yyyymm')
and t1.city_code=rec.city_code
and t2.city_code=rec.city_code
and t2.acct_id =rec.acct_id and (to_char(t2.state_date,'yyyymm')=to_char(add_months(sysdate,-1),'yyyymm') or (t2.state='10A' and to_char(t2.state_date,'yyyymm')<=to_char(add_months(sysdate,-1),'yyyymm')))
and t2.serv_id=t1.serv_id and (to_char(t1.state_date,'yyyymm')=to_char(add_months(sysdate,-1),'yyyymm') or (t1.state='10A' and to_char(t1.state_date,'yyyymm')<=to_char(add_months(sysdate,-1),'yyyymm')))
group by t1.city_code,rec.acct_id,t1.serv_id,t1.acct_id ;
commit ;
begin
loop
i:=i+1;
insert into HZL_TEMP0702_3
select t1.city_code,rec.acct_id,t1.serv_id,t1.acct_id,i
from month_serv_acct t1,month_serv_acct t2
where t1.fee_date=to_char(add_months(sysdate,-1),'yyyymm')
and t2.fee_date=to_char(add_months(sysdate,-1),'yyyymm')
and t1.city_code=rec.city_code
and t2.city_code=rec.city_code
and t2.acct_id in (select distinct acct_id1 from HZL_TEMP0702_3 where acct_id=rec.acct_id and note=i-1) and (to_char(t2.state_date,'yyyymm')=to_char(add_months(sysdate,-1),'yyyymm') or (t2.state='10A' and to_char(t2.state_date,'yyyymm')<=to_char(add_months(sysdate,-1),'yyyymm')))
and t2.serv_id=t1.serv_id and (to_char(t1.state_date,'yyyymm')=to_char(add_months(sysdate,-1),'yyyymm') or (t1.state='10A' and to_char(t1.state_date,'yyyymm')<=to_char(add_months(sysdate,-1),'yyyymm')))
group by t1.city_code,rec.acct_id,t1.serv_id,t1.acct_id ;
commit ;
select count(1) into v2
from HZL_TEMP0702_3
where acct_id=rec.acct_id
and note=i ;
select count(1) into v1
from HZL_TEMP0702_3
where acct_id=rec.acct_id
and note=i-1 ;
exit when v2=v1 ;
end loop ;
commit ;
end ;
end loop ;
commit;
end ;
在這個腳本中我們加入了循環,循環的結束條件是找到的關聯賬戶數量不再增加,實現相關賬戶的窮舉。
由于最后一次循環的結果與倒數第二次的結果一致,所以需要做一次排重匯總。
create table HZL_TEMP0702_31 as
select acct_id, serv_id, acct_id1
from HZL_TEMP0702_3
group by acct_id, serv_id, acct_id1
最終HZL_TEMP0702_31這張表中ACCT_ID是起始賬戶id,ACCT_ID1是根據起始賬戶id找到的所有關聯賬戶id,形成賬戶組。我們以根據賬戶組為細粒度分組匯總已有的差異賬戶,當賬戶組下所有賬戶邏輯差異合計為0,可以認為是過戶導致的合理差異,反之則需要進一步核實是其他什么原因導致的非合理差異。
通過以上腳本分析4月份某個地市差異,執行前該地市以賬戶為細粒度共有差異2?958條,執行腳本后發現剔除過戶導致的合理差異91條,如圖1所示。

圖 1
從腳本沉淀的臨時結果表hzl_temp0416_31,隨機抽取其中起始id為13169200的賬戶組進行分析,如圖2所示。

圖 2
起始賬戶id=13169200共關聯到兩個用戶id,分別是13944547和15214681,其中用戶id=13944547的過戶操作涉及賬戶13169200、152142279、152144117,可以根據用戶與賬戶關系表中的記錄證明,如圖3所示。

圖 3
用戶id=15214681的過戶操作涉及賬戶13169200、152142810,可以根據用戶與賬戶關系表中的記錄證明,如圖4所示。

圖 4
起始賬戶id=13169200的賬戶組當月邏輯差異公式,如圖5所示。

圖 5
圖5展示的結果表明該賬戶組下所有關聯賬戶當月邏輯差異合計為0,證明之前第二節中的實例3是正確的。
經過實際驗證可見該方法最終執行結果與預期一致,滿足生產要求并具備可操作性,不失為一種能夠排除過戶導致邏輯差異的簡便易行的方法。
[1]Oracle Database Online Documentation 11g Release 2 (11.2) / SQL Language Reference[Z].
[2]Expert Indexing in Oracle Database 11g[M].
A Method of Dealing with the Difference between Business and Financial Audits in Actual Production
Hu Zeliang
China Telecom Hebei Branch, Hebei Shijiazhuang 050000
Communication companies conduct business audits, and the analysis of the logical differences in revenue is often interrupted by transfer data. The paper provides a simple way to filter data through the database, use database tools in the audit work, and improve the information level of audit work.
business audit; database; transfer
F275;TP311.13
A