志翔科技有限公司後勤網

後勤等待處理訊息站,請各位成員努力消除待工區
 
首頁首頁  會員註冊會員註冊  登入登入  

分享 | 
 

 有關自定函數

向下 
發表人內容
flying
Admin
avatar

文章數 : 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")
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 回復: 有關自定函數   周三 11月 26, 2008 11:26 am

寫function需注意
return integer 最大值將限定在32768,超越此值將變成-32xxx(負值)

*****PB預設的回傳值就是Integer*******

案例回報:
警局薪資中有到專業加給表查對應人事階等後,傳回專業加給金額的函數,因為最高等調薪已超過33000,但原函數的return type
是設定為integer,造成客戶回報金額取錯,經將return type改成long後才解決問題.
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 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為[否]
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 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()這個最後程序之內
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 207
注冊日期 : 2008-11-11

發表主題: 回復: 有關自定函數   周三 11月 26, 2008 11:31 am

Execute Immediate :mexec Using sqlca;

寫好的sql子句由程式呼叫執行

mexec為SQL 子句的字串變數
前面必須加 : 以讓PB識別為變動
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 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
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

文章數 : 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
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
 
有關自定函數
回頂端 
1頁(共1頁)

這個論壇的權限:無法 在這個版面回復文章
志翔科技有限公司後勤網 :: 後勤主題與待工區 :: 後勤標準化-
前往: