[摘 要] 本文在闡述總賬與損益表結構的基礎上,分析用Visual FoxPro設計與編制損益表的基本原理,探討實現損益表信息處理的過程和方法,并提供了相應的程序代碼。
[關鍵詞] 損益表;信息處理;Visual FoxPro程序設計
[中圖分類號]F232[文獻標識碼]A[文章編號]1673-0194(2008)05-0011-03
損益表也被稱為利潤表,它是報告企業經營成果信息的工具,其格式因企業而異。這里以某企業月度損益表的編制為基礎,以Visual FoxPro(簡稱VFP)為數據庫管理系統,分析與說明多步驟式企業損益表的編制原理和實現方法,文中所述程序代碼已通過上機驗證。
1 數據表及其結構設計
一般來說,損益表中包括項目、行次、本月數、本年累計數等信息內容,多步驟式損益表是運用會計規則中的配比規則,在損益表中分別列示出營業收入、營業利潤、利潤總額及凈利潤,從而分步驟計算出企業在某個會計期間內的損益。
由于損益表中的信息是根據總賬中的損益類數據編制和生成的,因此,必須明確總賬與損益表的數據結構。假定總賬的結構為zz.dbf{rq(D8),zzh(C11),kmbh(C4),kmmc(C16),jffs(N12.2),dffs(N12.2),jdfx(C1),ye(N12.2)},字段rq、zzh、kmbh、kmmc、jffs、dffs、jdfx、ye分別對應于日期、總賬號、科目編號、科目名稱、借方發生額、貸方發生額、借貸方向、余額,D、C、N分別表示日期型、字符型、數值型,數字表示字段寬度,小數點右邊的數字表示小數位數,zz.dbf是總賬的文件名。
根據實際需要,將損益表的結構設計為syb.dbf{xm(C46),hc(C2),bys(N12.2),ljs(N12.2),kmbh(C8),bz(C1)},字段xm、hc、bys、ljs、kmbh、bz分別表示項目、行次、本月數、本年累計數、科目編號、標志,syb.dbf是損益表的文件名。在syb.dbf中設置kmbh與bz字段主要是為了便于程序的設計。
2 編制損益表的基本原理
2. 1預置syb.dbf中相關字段的信息內容
損益表中的xm(項目)、hc(行次)、kmbh(科目編號)、bz(標志)需要預置,如表1所示。其中,“營業收入”項目的kmbh由總賬中主營業務收入的科目編號6001和其他業務收入的科目編號6051構成,“營業成本”項目的kmbh由總賬中主營業務成本的科目編號6401和其他業務支出的科目編號6402構成,其他由4位數字組成的kmbh與總賬中對應科目的科目編號一致。需要引起注意的是,預置科目編號時一定要與總賬中使用的科目編號一致,這里采用了2007新會計制度科目表中對應的科目編號。

損益表的bys(本月數)和ljs(本年累計數)將由程序自動生成。
2. 2根據總賬求本月數和本年累計數的值
如果損益表syb.dbf中bz字段的值為d,則對應科目的bys(本月數)等于總賬中某會計期間內相應科目的貸方發生額減去其借方發生額(“主營業務收入”、“其他業務收入”等科目的bys也可等于總賬中對應科目的貸方發生額,因為這些科目只能發生在貸方,其借方發生額必為0);如果bz字段的值為j,則對應科目的bys等于總賬中同一會計期間內相應科目的借方發生額減去其貸方發生額(“主營業務成本”、“其他業務支出”等科目的bys也可等于總賬中對應科目的借方發生額,因為這些科目只能發生在借方,其貸方發生額必為0)。這些科目的ljs(本年累計數)均取自總賬中特定會計期間內對應科目的ye(余額)。
對于kmbh長度為8及kmbh預置為h的項目,其bys和ljs分別由以下公式求出:①營業收入=主營業務收入+其他業務收入;②營業成本=主營業務成本+其他業務支出;③營業利潤=營業收入-營業成本-營業稅金及附加-銷售費用-管理費用-財務費用-資產減值損失+公允價值變動收益+投資收益;④利潤總額=營業利潤+營業外收入-營業外支出;⑤凈利潤=利潤總額-所得稅。
收入類科目(或項目)的bys或ljs為負數表示虧損(如投資收益、營業利潤等),支出類科目的bys或ljs為負數表示收益(如財務費用)。
2. 3根據syb.dbf生成并保存符合要求的損益表
由于最終的損益表中不需要列示“科目編號”和“標志”信息,因此,需要以編制好的syb.dbf為基礎,生成只包含“項目”、“行次”、“本月數”、“本年累計數”的、以一個具體名字保存的損益表文件。
3 編制損益表的實現方法
3. 1用戶界面及功能設計
編制損益表時必須先確定會計期間,因此,需要設計一個可以輸入或選擇會計期間的表單,作為生成損益表的用戶界面,如圖1所示。其中,Text1、Text2是文本框控件的Name屬性,“確定”、“退出”是命令按鈕的Caption屬性。

此表單運行后,Text1、Text2文本框將直接顯示總賬中最近一次登賬所屬的年份和月份,用戶可以修改或不修改此會計期間,單擊“確定”按鈕就自動生成并保存相應會計期間的損益表(其文件名以類似于syb2007-7.dbf的形式保存,表示損益表的會計期間是2007年7月),單擊“退出”按鈕則釋放表單。
3. 2表單的初始化過程及代碼設計
為使表單啟動后,Text1、Text2中直接顯示與總賬中最后一條記錄的rq(日期)對應的年份和月份,可在表單的Init(初始化)過程中打開總賬表,然后定位于末記錄,再將Text1、Text2的Value屬性分別設置為末記錄對應rq中的年份和月份(注意轉換為字符型數據并去掉前導及后導空格),最后需關閉總賬表。表單的Init過程對應的VFP程序代碼如下:
use zz
go bott
thisform.text1.value=allt(str(year(rq)))
thisform.text2.value=allt(str(month(rq)))
use
3. 3“確定”按鈕的Click過程及代碼設計
3. 3. 1“確定”按鈕的Click過程
表單運行期間,單擊“確定”按鈕時,由VFP程序自動生成指定會計期間的損益表。為防止命令執行的結果傳送到相關的窗口或界面,需使用set命令將talk設置為off。為使生成并保存某會計期間的損益表時,能直接覆蓋可能已存在的該會計期間的損益表文件名,也需要使用set命令將safety設置為off。為生成符合要求的損益表,可在1區打開總賬表,在2區打開損益表,具體過程如圖2所示。

3. 3. 2“確定”按鈕的Click過程代碼
依據圖2所述的生成損益表的N-S圖,“確定”按鈕的Click過程對應的VFP程序代碼如下(程序中的分號為續行符,表示注釋):
set talk off
set safety off
sele 1
use zz
set filter to year(rq)=val(thisform.text1.value) and month(rq)=val(thisform.text2.value)
go top
sele 2
use syb
repl all bys with 0
repl all ljs with 0
go top
do while .not. eof()
kmbh1=allt(kmbh)
length=len(kmbh1)
do case
case length=4
sele 1
loca for allt(kmbh) =kmbh1
if found()
bys1=iif(b->bz='d',dffs-jffs,jffs-dffs)
ljs1=ye
else
bys1=0
ljs1=0
endif
sele 2
repl bys with bys1,ljs with ljs1
case length=8
declare sz(2),sz1(2)
i=1
do while i<=2
sele 1
loca for allt(kmbh) =subs(kmbh1,4*i-3,4)
if found()
sz(i)=iif(b->bz=\"d\",dffs,jffs)
sz1(i)=ye
else
sz(i)=0
sz1(i)=0
endif
i=i+1
enddo
sele 2
repl bys with sz(1)+sz(2),ljs with sz1(1)+sz1(2)
case length=1
r=recn()
sum bys,ljs to bys1,ljs1 for bz='d'
sum bys,ljs to bys2,ljs2 for bz='j'
go r
repl bys with bys1-bys2,ljs with ljs1-ljs2
endc
skip
endd
copy to \"syb\"+allt(thisform.text1.value)+\"-\"+allt(thisform.text2.value)+\".dbf\";
fields xm,hc,bys,ljs生成的損益表以類似于syb2007-7.dbf的形式保存
messagebox(\"生成損益表結束!\",48,\"提示\")
sele xm as \"項目\",hc as \"行次\",bys as \"本月數\",ljs as \"本年累計數\" from;
\"syb\"+allt(thisform.text1.value)+\"-\"+allt(thisform.text2.value)+\".dbf\"
close databases
set safety on
set talk on
3. 3. 3損益表的完善
上述程序運行后,生成的損益表中有些項目的本月數與本年累計數可能為0.00。如果希望值為0.00的數據顯示為空白,可將以上程序(3.3.2節)中copy to \"syb\"+allt(thisform.text1.value)+\"-\"+allt(thisform.text2.value)+\".dbf\" fields xm,hc,bys,ljs的部分替換為以下代碼(限于篇幅,不再贅述):
copy stru to \"syb\"+allt(thisform.text1.value)+\"-\"+allt(thisform.text2.value) fields xm,hc,bys,ljs
sele 2
go top
sele 3
use \"syb\"+allt(thisform.text1.value)+\"-\"+allt(thisform.text2.value)
do while not eof(2)
appe blank
repl xm with syb.xm,hc with syb.hc
if syb.bys<>0
repl bys with syb.bys
endif
if syb.ljs<>0
repl ljs with syb.ljs
endif
sele syb
skip
sele 3
enddo
3. 4“退出”按鈕的Click過程代碼
表單運行期間,單擊“退出”按鈕將釋放表單,其VFP代碼對應如下:thisform.release。
主要參考文獻
[1] 《企業會計準則第30號——財務報表列報》應用指南[EB/OL]. http://www. casc. gov. cn/wjk/200611/30. pdf,2007-05-12.
[2] 2007新舊會計科目對照表[EB/OL]. http://club. kuaijiren. com/read.php?tid=77636,2007-08-13.
[3] 2007新會計制度科目表[EB/OL]. http://www. uuhsd. com/bbs/simple/index. php?t4367. html,2007-08-13.