| 志翔科技有限公司後勤網 後勤等待處理訊息站,請各位成員努力消除待工區 |
| | 有關自定函數 | |
| | 發表人 | 內容 |
---|
flying Admin
文章數 : 207 注冊日期 : 2008-11-11
| 主題: 有關自定函數 周三 11月 26, 2008 11:19 am | |
| 自定系統函數為支援[欄位互動][輸入檢驗]等系統劇本呼叫使用,供各專案系統共用呼叫,此篇將逐一列舉其名單與運用
calnumsum(mcalstring)
函數說明:此函數加逐一加總以逗點分開的欄位,但須限定數值欄位,所有欄位湊成一文字串參數傳入,最後回傳加總數值 緣由:當一串數值欄位相加時,若其中一個欄位值為NULL時,將造成所有欄位加總也變成NULL 但數個欄位加總對於系統劇本而言是常用的,為此衍生出此函數,只要將所要加總欄位以逗點分開傳入當作參數 此函數將逐一拆解各欄位,碰到某欄位是NULL時,將改以0代替,這樣就可得到正確加總值.
注意:當欄位是扣項時,該欄位前需置放減號
範例:放在薪資所得稅系統的欄位互動劇本
calnumsum("monthtot,endtot,examgtot,othertot,-minus,-minus2")
calnumsum("monthtax,endtax,examgtax,othertax") | |
| | | flying Admin
文章數 : 207 注冊日期 : 2008-11-11
| 主題: 回復: 有關自定函數 周三 11月 26, 2008 11:26 am | |
| 寫function需注意 return integer 最大值將限定在32768,超越此值將變成-32xxx(負值)
*****PB預設的回傳值就是Integer*******
案例回報: 警局薪資中有到專業加給表查對應人事階等後,傳回專業加給金額的函數,因為最高等調薪已超過33000,但原函數的return type 是設定為integer,造成客戶回報金額取錯,經將return type改成long後才解決問題. | |
| | | flying Admin
文章數 : 207 注冊日期 : 2008-11-11
| 主題: 回復: 有關自定函數 周三 11月 26, 2008 11:27 am | |
| messagebox()常用參數 para1:視窗抬頭區文字 para2:內容字串
一般內容字串會丟出一些含變數字串,如果運算結果含到NULL,則整個字串會相等於NULL, 將造成整個messagebox()無法秀出的現象.
exp1. messagebox("注意,"+ls_type,"必須是數值欄位~n~n方能執行計算",stopsign!) 其中ls_type就是變數 ~n是換行指令
stopsigh!表出現驚嘆符號
exp2. li_all=MessageBox("注意", "成批算出所有人差額?(若否將只算指標該員)", Exclamation!, YesNo!, 1)
Exclamation!為問號 YesNo!為附帶[是],[否]詢問鈕 最後的1為預設按鈕為[是] li_all=1為[是] li_all=2為[否] | |
| | | flying Admin
文章數 : 207 注冊日期 : 2008-11-11
| 主題: 回復: 有關自定函數 周三 11月 26, 2008 11:31 am | |
| 所在系統:公務薪資系統 問題描述:
取得在職月數後除以12,表示年終獎金發放時可分得的月份比例數,是以在職月數計算的 discount=get_month(在職月數)/12 表示某人離職前在該年的在職月數,需除以12,來計算該人的年終月支薪額部分金額 月支薪俸 mmonthmon=round(getmonthmon(此人月支單月應領)*discount,0) 表示依比例算出的月支薪額需要再做四捨五入的計算 例如其單月月支=34290,在職月數等於1,其年終月支應領=34290*1/12 系統根據程式碼,將產生算法程序如下 discount=1/12=0.08333333333333 本來為循環小數,但到小數12位後小數被截斷 mmonth=round(34290*0.08333333333333,0)=round(2857.499999999999)=2857
但如果以計算機算34290/12將等於2857.5,再四捨五入後得到2858
錯誤解析:
將在職月數除以12後放到某一decimal型態變數的做法是常見的,但過程忽略PB處理小數型態變數的處理過程 碰到循環小數時將產生誤差 正確的做法是避免掉中間過程的除法,而將算式改成 discount=get_month(在職月數) mmonthmon=round(getmonthmon(此人月支單月應領)*discount/12,0)
將除以12的位置放在round()這個最後程序之內 | |
| | | flying Admin
文章數 : 207 注冊日期 : 2008-11-11
| 主題: 回復: 有關自定函數 周三 11月 26, 2008 11:31 am | |
| Execute Immediate :mexec Using sqlca;
寫好的sql子句由程式呼叫執行
mexec為SQL 子句的字串變數 前面必須加 : 以讓PB識別為變動 | |
| | | flying Admin
文章數 : 207 注冊日期 : 2008-11-11
| 主題: 回復: 有關自定函數 周三 11月 26, 2008 11:33 am | |
| 函數:get_newitemno():自動幫分公司取得產品編號 主旨:利用global變數gs_branch分公司代號,以自動產生該分公司的產品流水序號 說明:產品編號為七碼設定,分公司代號占掉一碼,另有6個碼可做流水號空間,若未來仍塞滿,只要更改分公司代號, 又可獲得6位數空間使用,此程序用典型的動態SQL執行取得同一分公司代碼下最大產品序號,加一號即為新品編號
string ls_sqlstr,ls_no,ls_temp long li_loop,li_last,li_test ****動態SQL的字串子句,將產品編號以遞減排列,這樣最大號會排第一順位,一下子就取得 ls_sqlstr="select item_id from item where item_id like '"+trim(gs_branch)+"%' order by item_id desc;" li_last=0 //如果查無既存資料,最後產品號以零處理 ****呼叫cursor執行動態SQL DECLARE last_no_value DYNAMIC CURSOR FOR SQLSA ; PREPARE SQLSA FROM :ls_sqlstr USING SQLCA ; OPEN DYNAMIC last_no_value; if sqlca.sqlcode= -1 then //檢查是否CURSOR開啟成功 messagebox("發現錯誤 OPEN ,無法編號","sql="+ls_sqlstr+"~n~n"+sqlca.sqlerrtext) // "~n"代表換行指令 else fetch last_no_value into :ls_no; //執行動態SQL後會傳回最大產品流水號 li_loop=sqlca.sqlcode if li_loop=0 then //代表有成功執行並找到 ls_temp=mid(ls_no,2) //第二碼開始的6-code為流水號 li_test=long(ls_temp) if li_test>0 and li_test<999999 then li_last=li_test end if end if ls_no=trim(gs_branch)+right(string(li_last+1000001,"#######"),6) //遞增一號為新品流水編號,中間並以0填滿 end if close last_no_value; //一定要關閉CURSOR return ls_no | |
| | | flying Admin
文章數 : 207 注冊日期 : 2008-11-11
| 主題: 回復: 有關自定函數 周三 11月 26, 2008 11:36 am | |
| 自baseman找出身份證號為A123456789的人員其專業加給碼sprom select sprom from baseman where id='A123456789';
若該碼為null或不在0與6之間之位元, 則以0字元視之 if isnull(msprom) or pos("0123456",msprom)=0 then msprom='0'
注意:null常招至無從判斷if then或執行函數造成失敗,故須作例外處理 exp. null+100=null 而非 100 | |
| | | | 有關自定函數 | |
|
| |
|