我在做人事管理軟體時發現乙個問題就是,工資管理中工資的發放專案經常會發生變化,而且工資專案之間的計算關係也經常發生變化,這為實際的程式設計帶來了很大的麻煩。其實實際工作中還有很多類似的情況需要解決,希望能為大家提供多一種思路以供參考。
現將我的解決方法陳述如下。
第一步,建立乙個工資表tbl_gztz,用來記錄職工的每個月的工資發放情況,其中就包括工資的發放專案。所以這個表字段應該盡量地多,你大可放在50個以上。
表結構如下:tbl_gztz
資料列名
資料列型別
資料列含義
zgbh
varchar2(10)
職工編號
mc varchar2(10)
職工名稱
yf varchar2(6)
工資月份
gz1number(12,2)
(含義見專案表下表)
gz2
number(12,2)
(含義見專案表下表)
gz3
number(12,2)
(含義見專案表下表)
gz4
number(12,2)
(含義見專案表下表)
gz5number(12,2)
(含義見專案表下表)
第二步,建立乙個工資專案登記表tbl_gzxmdy,用來記錄工資管理實際工作中的所有的工資專案和專案之間的計算關係。其中計算關係可以是簡單的四則運算,也可以包含一些函式(限於pb內容函式)。
表結構如下:
資料列名
資料列型別
資料列含義
xmvarchar2(10)
工資專案名稱
xmmc
varchar2(20)
工資專案的含義
jsgs
varchar2(40)
對應的計算關係
flag
varchar2(1)
是否啟用該項(1為啟用,0為停用)
工資的發放專案從工資發放表tbl_gztz中取出字段,這個在oracle(或其它資料)中很容易取出,然後將取出的字段插入到工資專案定義表tbl_gzxmdy中,並為每個專案定義其含義,沒有為其定義的,到時候將不顯示出來。
為了方便解釋,舉例說明比較清楚。取出發放專案欄位的sql語句如下:
select cname from col where tname = 'tbl_gztz' and coltype = 'numeric' order by colno;
工資專案資料維護舉例說明: xm
xmmc
jsgs
gz1技能工資
gz2浮動工資
gz3
保險工資
gz4
應發工資
gz1 + gz2
gz5
房租費
gz6
實發工資
gz4 - gz5
第三步,現在基礎工作已經作好,接下來就是程式實現了。
首先,定義乙個grid風格的資料視窗,資料來源選擇tbl_gztz表。並將它放到視窗中,進行一些資料庫聯接。在視窗的open事件中,先將設定好的工資發放專案進行初始化設定,設定臺頭,設定可見項。具體**如下:
dw_1.settransobject(sqlca)
string ls_xm,ls_xmmc //定義變數,存放工資專案
declare c1 cursor for //定義游標,取出工資專案的含義
select xm,xmmc from tbl_gzxmdy;
open c1 ;
fetch c1 into:ls_xm,:ls_xmmc;
//迴圈提取資料到變數中
do while sqlca.sqlcode =0
if isnull(ls_xmmc) or ls_xmmc ='' then
//對沒有定義的工資專案進行隱藏
dw_1.modify(ls_xm+".width=0")
else
//設定工資發放專案的臺頭
dw_1.modify(ls_xm+"_t.text='"+ls_xmmc+"'")
end if
fetch c1 into:ls_xm,:ls_xmmc;
loop
close c1;
dw_1.retrieve()
然後呢,當然就是對資料視窗進行設定,讓它具有自動計算功能了。
資料視窗的itemchanged事件是對每一列值發生變化時觸發的,我們只要對它進行程式設計就可以實現自動計算功能。
string ls_xm, ls_jsgs //定義變數,存放工資專案,計算公式
string ls_dwoname
double ldc_je //得到計算公式計算的結果值
this.accepttext()
declare c1 cursor for //定義游標,取出工資專案的含義
select xm,jsgs from tbl_gzxmdy;
open c1 ;
fetch c1 into:ls_xm,:ls_jsgs;
//迴圈提取資料到變數中
do while sqlca.sqlcode =0
if isnull(ls_jsgs) or ls_jsgs ='' then
else
//計算統計列結果,利用evaluate計算
ldc_je = double(dw_1.describe("evaluate(lookupdisplay('" + ls_jsgs+"')" +row+ ")"))
//設定計算結果到工資統計專案列
this.setitemnumber(row,ls_xm,ldc_je)
end if
fetch c1 into:ls_xm,:ls_jsgs;
loop
close c1;
程式已經在pb7.0+oracle8i 下測試通過。
PB中關於GetChild的用法
比如,在乙個資料視窗a中,有乙個涉及到姓名的下拉選擇列表b b可能是要展示表中的一列 b的資料要根據a的其中乙個部門來動態的過濾資料。暫且不討論部門的資料怎麼獲取的,可能是使用者自己輸入的某個值c 那麼 dwcontrol.getchild name,dwchildvariable 應當定義成 a....
PB中動態SQL處理BLOB的方式
當表名與列名在sql執行之前都是未知的時候,我仍然象平時一樣用動態的sql去操作,結果卻總是報錯,原來pb中不支援動態的selectblob這樣的語句。後來 中間過程就不說了,既浪費自己時間也浪費大家時間。找到了乙個笨辦法,原理是 在表與表之間交換資料,不管是什麼型別都不需要使用selectblob...
活動選擇問題的動態規劃解
題目大意 dp方法解活動選擇問題 解題思路 s i,j 表示所有活動的集合,即活動ai和aj之間,所有與這兩個活動 相容的活動組成的子集。c i,j 表示該集合的大小。核心內容 對問題的建模,採用該模型分析既可以使用這種dp解決,也可以類似lis問題的dp解決,還可以 貪心解決。但是所有的這些都建立...