[摘 要] 本文論述通用工資管理軟件設計的難點#65380;設計思路和可視開發工具的選擇#65377;最后給出通用工資管理軟件的主要界面并公開其源代碼#65377;
[關鍵詞] 通用工資管理軟件;工資主文件;工資報表;計算機軟件;VFP
[中圖分類號]F232[文獻標識碼]A[文章編號]1673-0194(2007)06-0014-04
一#65380; 前 言
近20多年來,計算機應用水平有了較大的提高#65377;計算機語言也從單一的BASIC 發展到現在的Visual Basic7.0 #65380;Visual FoxPro 7.0 #65380;PowerBuilder 8.0 #65380;Delphi 6.0等常用的10多種#65377;人們也可以用以上語言來開發一般的專用軟件,如僅適用某一具體單位的工資管理軟件#65377;對于適用于任何單位的通用工資管理軟件,其設計難度自然較大#65377;筆者查閱了大量有關的文獻#65380;教材和專著,未發現用可視化開發工具來開發通用工資管理軟件方面知識的詳細介紹#65377;雖然市場上有通用工資管理軟件出售,但出于自身的利益考慮,不公開其源代碼#65377;通用工資管理軟雖屬一個小軟件,但其開發方法與技術遠遠難于其他軟件#65377;如果能學會開發通用工資管理軟件,對于開發其他軟件#65380;深入理解可視化開發工具和軟件人才的培養都是大有裨益的#65377;
二#65380; 軟件開發難點
作為通用工資管理軟件,要適應各行各業用戶進行使用#65377;不同的單位,其工資項目是大相徑庭的#65377;專用工資軟件,由于了解所開發單位的具體情況,可以事先將工資項目確定下來,以后的編程是比較簡單的,但當工資項目發生變化時,必須要修改源程序代碼,可是這一點,對于通用軟件來講是絕對行不通的#65377;通用工資軟件的工資項目只能固定少部分常用項目,如編號#65380;姓名#65380;部門#65380;工資(即基本工資)#65380;計發#65380;計扣#65380;實發等#65377;其他項目由用戶自己去定義#65377;由于工資項目事先確定不下來,所以工資主文件的結構,只能包含以上工資項目,待用戶自己定義工資項目后,再由程序代碼完成對工資主文件結構的修改#65377;隨著時間的推移,用戶工資情況發生變化,這時再修改以前的工資項目#65377;從上述分析來看,工資主文件的結構是動態的,用戶需要經常對其進行增刪,所以工資主文件的結構確定不下來#65377;由于工資項目不能確定,工資報表打印內容同樣確定不下來#65377;這就是開發通用工資管理軟件的難點所在#65377;
三#65380; 軟件開發思路
工資主文件的結構要在程序運行過程中經常修改,修改后還要將原來工資主文件中的數據復制回來#65377;對工資項目的修改涉及在原工資主文件中字段的增加#65380;插入和刪除#65377;增加是將要增加的項目放在原工資文件的字段的最后面;插入是將工資項目插在某兩個字段之間#65377;
首先要解決的問題是數據的組織方式#65377;由于工資數據結構不復雜,可以用文件組織方式或數據庫組織方式#65377;如果用文件方式,隨時修改工資項目,以及將讀取工資數據用表格方式顯示#65380;統計,是比較困難的#65377;這時最好用數據庫方式#65377;先建一個可以確定的工資項目的表,以后由用戶在其基礎上進行修改#65377;其次就是如何對工資主文件的結構進行修改#65377;方案有二:一是直接修改,二是間接修改#65377;直接修改就是在原工資主文件上直接添加#65380;插入和刪除#65377;這是最省事的一種方式#65377;但所有的數據庫語言和SQL語言只能對其文件結構有添加和刪除的語句,而沒有能在兩字段間插入新字段的語句#65377;對文件結構進行添加只能增加在原文件結構最后面,這對工資數據文件來說顯然是不妥的#65377;既然直接修改方式不行,那只好采用間接的方式了#65377;先建工資結構文件,工資結構文件中只記載工資主文件中有哪些字段#65380;類型#65380;長度#65380;小數位信息,而沒有工資實際數據#65377;用戶修改工資項目本質上就是在工資結構文件中增加#65380;插入和刪除工資項目#65377;工資項目修改后,由工資結構文件,創建新的工資主文件#65377;這時新的工資主文件中還沒有工資數據,僅有結構,然后再將原工資主文件中的數據復制到新的工資主文件中去,刪除老的工資主文件,完成對主文件的結構修改和數據的添加#65377;第三是工資報表打印問題#65377;由于工資項目需要隨時由用戶進行修改,在程序設計時,不能直接將工資項目字段名寫進程序,而要根據當時工資項目情況,通過函數的測示,測出當時情況下,工資字段名以及它的類型與長度,然后再編寫相應的工資報表打印程序#65377;最后是開發工具的選擇#65377;針對上述一系列的要求,開發工具應能根據用戶的確定的工資項目完成創建工資主文件,不同結構表之間的數據復制,表字段名和字段個數的測試#65377;經過比較與分析,Visual FoxPro 6.0可以勝任,而其他工具就比較困難了 #65377;
四#65380; 主要界面與程序
1. 工資項目結構文件與主文件
(1) 工資項目結構文件jg.dbf

(2) 工資主文件salary.dbf
編號+姓名+部門+工資+津貼+計發+養老+水電+計扣+實發
以上是兩表初始表內容,用戶在首次用該軟件時,對jg.dbf表進行修改,然后由jg.dbf 創建新的工資主文件,將salary.dbf中的工資數據復制到新的工資主文件中(首次使用時salary. dbf表中沒有數據)#65377;刪除salary.dbf文件,再將新的工資文件改名為salary.dbf#65377;這樣更新了原工資主文件,并復制了原來的數據#65377;
2. 編輯工資項目的界面

主要控件及代碼
(1)表格控件grid1
grid1_AfterRowColChange
if reccount( )<>0
if lower(field_type)="n"
thisform.optgrp1.option1.value=1
thisform.optgrp1.option2.value=0
else
thisform.optgrp1.option1.value=0
thisform.optgrp1.option2.value=1
endif
thisform.spinner1.value=field_len
thisform.spinner2.value=field_dec
endif
thisform.refresh
本段代碼的功能:當行列發生變化時,刷新選項按鈕和微調按鈕的值#65377;與表格中所選中的工資項目同步#65377;
(2)選項按鈕 optgrp1
optgrp1_init
if lower(field_type)="n"
thisform.optgrp1.option1.value=1
thisform.optgrp1.option2.value=0
else
thisform.optgrp1.option1.value=0
thisform.optgrp1.option2.value=1
endif
thisform.refresh
本段代碼是給選項按鈕賦初值#65377;
Optgrp1_InterActiveChange
if reccount( )<>0
if thisform.optgrp1.option1.value=1
replace field_type with "n"
else
replace field_type with "c"
endif
endif
本段代碼的作用是當選項按鈕值發生變化時,更新工資項目文件jg.dbf#65377;
(3) 微機按鈕spinner1和spinner2
spinner1_init
if reccount( )<>0
this.value=field_len
endif
本段代碼的作用是給選項按鈕賦初值#65377;
spinner1_InterActiveChange
if reccount( )<>0
replace field_len with this.value
endif
本段代碼的作用是當微調按鈕值發生變化時,即時更新表jg.dbf中項目長度的值#65377;
spinner2的功能與spinner1類似,不再贅述#65377;
(4)命令按鈕組 cmdgrp1
cmdadd(增加)_click
append blank
thisform.refresh
cmdinsert(插入)_click
insert blank before
thisform.refresh
cmddelete(刪除)_click
Ifalltrim(field_name)=“編號” or alltrim(field_name)=“姓名”;
or alltrim(field_name)=“部門”or alltrim(field_name)=“工資”;
or alltrim(field_name)=“計發”or alltrim(field_name)=“計扣”;
or alltrim(field_name)=“實發”
messagebox(“此工資項目不能刪除!”,0+16,"錯誤提示")
else
yn=messagebox(“你真要刪除此工資項目嗎?”,4+32,“提示信息”)
if yn=6
dele
thisform.refresh
endif
endif
以上代碼的作用是完成對工資項目進行增加#65380;插入和刪除#65377;為了完成對工資項目的插入,對jg.dbf中的字段不能進行索引#65377;
(5)用jg.dbf對salary.dbf文件更新并復制數據的程序
use jg
copy to jg_tmp fields field_name,field_type,field_len,field_dec
create wage_tmp from jg_tmp
use wage_tmp
append from salary
close all
erase salary.dbf
renamewage_tmp.dbf to salary.dbf
erase jg_tmp.dbf
3. 工資報表界面

此工資報表,在原工資項目文件的基礎上,增加了一項“考勤”#65377;此界面上的按鈕“?”用于輸入工資項的固定值,如考勤每人100元#65377;也可通過此按鈕給某一工資項清零#65377;工資報表的計發#65380;計扣和實發在表格grid1_init事件中進行自動計算#65377;當修改某一個值時,自動刷新#65377;此界面功能強,操作方便,深受用戶歡迎#65377;
4. 工資報表打印程序
由于工資項目的不確定性,在此不能用VFP的報表生成系統自動生成打印程序#65377;而需要手工編程序解決#65377;程序中用到Field( )#65380;Fcount( )和Count( )等函數#65377;由于文章的篇幅所限,在此就不提供詳細的打印程序了#65377;
五#65380;結束語
本軟件是筆者長期知識的積累和艱辛開發之果,這次將設計思想與核心源代碼公布于眾,其目的就是希望有志于軟件開發的年輕人能從中有所領悟#65380;有所幫助,同時也希望同行批評指正#65377;
主要參考文獻
[1] 史濟民. VFP及其應用系統開發[M]. 北京:清華大學出版社,2003.
[2] 黃梯云. 管理信息系統[M]. 北京:高等教育出版社,2005.
[3] Kenneth C Laudon. Management Information System[M]. Pearson Education Company,2001.