PB中關(guān)于動(dòng)態(tài)工資項(xiàng)目問(wèn)題的解決辦法
2024-07-21 02:10:12
供稿:網(wǎng)友
本文來(lái)源于網(wǎng)頁(yè)設(shè)計(jì)愛(ài)好者web開(kāi)發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問(wèn)。我在做人事管理軟件時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題就是,工資管理中工資的發(fā)放項(xiàng)目經(jīng)常會(huì)發(fā)生變化,而且工資項(xiàng)目之間的計(jì)算關(guān)系也經(jīng)常發(fā)生變化,這為實(shí)際的編程帶來(lái)了很大的麻煩。其實(shí)實(shí)際工作中還有很多類(lèi)似的情況需要解決,希望能為大家提供多一種思路以供參考。 現(xiàn)將我的解決方法陳述如下?! 〉谝徊?,創(chuàng)建一個(gè)工資表tbl_gztz,用來(lái)記錄職工的每個(gè)月的工資發(fā)放情況,其中就包括工資的發(fā)放項(xiàng)目。所以這個(gè)表字段應(yīng)該盡量地多,你大可放在50個(gè)以上。
表結(jié)構(gòu)如下:tbl_gztz
數(shù)據(jù)列名 數(shù)據(jù)列類(lèi)型 數(shù)據(jù)列含義 zgbh varchar2(10) 職工編號(hào) mc varchar2(10) 職工名稱 yf varchar2(6) 工資月份 gz1 number(12,2) (含義見(jiàn)項(xiàng)目表下表) gz2 number(12,2) (含義見(jiàn)項(xiàng)目表下表) gz3 number(12,2) (含義見(jiàn)項(xiàng)目表下表) gz4 number(12,2) (含義見(jiàn)項(xiàng)目表下表) gz5 number(12,2) (含義見(jiàn)項(xiàng)目表下表)
第二步,創(chuàng)建一個(gè)工資項(xiàng)目登記表tbl_gzxmdy,用來(lái)記錄工資管理實(shí)際工作中的所有的工資項(xiàng)目和項(xiàng)目之間的計(jì)算關(guān)系。其中計(jì)算關(guān)系可以是簡(jiǎn)單的四則運(yùn)算,也可以包含一些函數(shù)(限于pb內(nèi)容函數(shù))。
表結(jié)構(gòu)如下:
數(shù)據(jù)列名 數(shù)據(jù)列類(lèi)型 數(shù)據(jù)列含義 xm varchar2(10) 工資項(xiàng)目名稱 xmmc varchar2(20) 工資項(xiàng)目的含義 jsgs varchar2(40) 對(duì)應(yīng)的計(jì)算關(guān)系 flag varchar2(1) 是否啟用該項(xiàng)(1為啟用,0為停用)
工資的發(fā)放項(xiàng)目從工資發(fā)放表tbl_gztz中取出字段,這個(gè)在oracle(或其它數(shù)據(jù))中很容易取出,然后將取出的字段插入到工資項(xiàng)目定義表tbl_gzxmdy中,并為每個(gè)項(xiàng)目定義其含義,沒(méi)有為其定義的,到時(shí)候?qū)⒉伙@示出來(lái)?! 榱朔奖憬忉?zhuān)e例說(shuō)明比較清楚。取出發(fā)放項(xiàng)目字段的sql語(yǔ)句如下:select cname from col where tname = 'tbl_gztz' and coltype = 'numeric' order by colno;
工資項(xiàng)目數(shù)據(jù)維護(hù)舉例說(shuō)明:
xm xmmc jsgs gz1 技能工資 gz2 浮動(dòng)工資 gz3 保險(xiǎn)工資 gz4 應(yīng)發(fā)工資 gz1 + gz2 gz5 房租費(fèi) gz6 實(shí)發(fā)工資 gz4 - gz5
第三步,現(xiàn)在基礎(chǔ)工作已經(jīng)作好,接下來(lái)就是程序?qū)崿F(xiàn)了?! ∈紫龋x一個(gè)grid風(fēng)格的數(shù)據(jù)窗口,數(shù)據(jù)源選擇tbl_gztz表。并將它放到窗口中,進(jìn)行一些數(shù)據(jù)庫(kù)聯(lián)接。在窗口的open事件中,先將設(shè)置好的工資發(fā)放項(xiàng)目進(jìn)行初始化設(shè)置,設(shè)置臺(tái)頭,設(shè)置可見(jiàn)項(xiàng)。具體代碼如下:
dw_1.settransobject(sqlca)string ls_xm,ls_xmmc //定義變量,存放工資項(xiàng)目declare c1 cursor for //定義游標(biāo),取出工資項(xiàng)目的含義select xm,xmmc from tbl_gzxmdy; open c1 ; fetch c1 into:ls_xm,:ls_xmmc; //循環(huán)提取數(shù)據(jù)到變量中 do while sqlca.sqlcode =0 if isnull(ls_xmmc) or ls_xmmc ='' then //對(duì)沒(méi)有定義的工資項(xiàng)目進(jìn)行隱藏 dw_1.modify(ls_xm+".width=0") else //設(shè)置工資發(fā)放項(xiàng)目的臺(tái)頭 dw_1.modify(ls_xm+"_t.text='"+ls_xmmc+"'") end if fetch c1 into:ls_xm,:ls_xmmc; loopclose c1;dw_1.retrieve()
然后呢,當(dāng)然就是對(duì)數(shù)據(jù)窗口進(jìn)行設(shè)置,讓它具有自動(dòng)計(jì)算功能了。數(shù)據(jù)窗口的itemchanged事件是對(duì)每一列值發(fā)生變化時(shí)觸發(fā)的,我們只要對(duì)它進(jìn)行編程就可以實(shí)現(xiàn)自動(dòng)計(jì)算功能。
string ls_xm, ls_jsgs //定義變量,存放工資項(xiàng)目,計(jì)算公式string ls_dwonamedouble ldc_je //得到計(jì)算公式計(jì)算的結(jié)果值
this.accepttext()declare c1 cursor for //定義游標(biāo),取出工資項(xiàng)目的含義select xm,jsgs from tbl_gzxmdy;open c1 ;fetch c1 into:ls_xm,:ls_jsgs;//循環(huán)提取數(shù)據(jù)到變量中do while sqlca.sqlcode =0 if isnull(ls_jsgs) or ls_jsgs ='' then else //計(jì)算統(tǒng)計(jì)列結(jié)果,利用evaluate計(jì)算 ldc_je = double(dw_1.describe("evaluate(lookupdisplay('" + ls_jsgs+"')" +row+ ")")) //設(shè)置計(jì)算結(jié)果到工資統(tǒng)計(jì)項(xiàng)目列 this.setitemnumber(row,ls_xm,ldc_je) end if fetch c1 into:ls_xm,:ls_jsgs;loopclose c1;
程序已經(jīng)在pb7.0+oracle8i 下測(cè)試通過(guò)。