志翔科技有限公司後勤網

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

分享 | 
 

 存檔驗證 -- SQL子句輸入注意事項

向下 
發表人內容
flying
Admin
avatar

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

發表主題: 存檔驗證 -- SQL子句輸入注意事項   周四 11月 20, 2008 12:49 am

如果驗證子句是輸入select 搭配 [指定欄位],需注意:

因為存檔驗證並未規劃測試用欄位的回傳型態,而是利用資料視窗中的 [欄位名稱]的型態來判斷,如下式的select trantype .....,則存檔驗證 的資料視窗 [欄位名稱] ,最好也是指向與資料庫同一個對映欄位,資料視窗的欄位在編排時也許會帶 table_ 開頭,例如 ictrammt_trantype,如果不帶 table_開頭字,就變成 trantype ,但最好用系統提供的欄位選單選擇.

select trantype from ictype where rstat<>'D' and trantype= [系統運算 資料視窗 欄位名稱 ictrammt_trantype 後的值]

上述子句的測試欄位為trantype,在等號右邊,系統會取資料視窗上該 [欄位名稱]的值填入,而形成完整子句,並用 [欄位名稱]的型態來接收判斷值,所以此種驗證規則的 [欄位名稱]一定要填資料視窗欄位.不宜用 * 號或其他資料視窗中不存在的欄位名稱.以免型態不在預設的幾種範圍內,而無法做判斷,造成系統驗證結果不對.



如果驗證子句是輸入 select count(*) from ....,需注意:

系統固定用數值型態來判斷, [欄位名稱]只是用來視需要填到SQL子句右邊用而已.不再做為回傳值的判斷型態用.
下列為判斷是否資料存在的一種寫法,以count(*)去計算資料筆數.

select count(*) from sysdat where sysno='IC' and substring(dw_this.tdate,1,10)>= dbo.fn_GetTraYMD(sdate,9,1) and substring(dw_this.tdate,1,10)<= dbo.fn_GetTraYMD(tdate,9,1)

以上當SQL回傳值>0,表示有找到資料.


搭配上述的SQL右端不需再組合的子句, [欄位名稱] 適合填 * 號,且 [驗證規則值]應保持空白,當系統偵測不到 [欄位名稱]的型態且[驗證規則值]空白 ,也就不會去取換算值填於上述SQL子句之右,




如果找到資料是要過關可存檔的,則此筆驗證規則的 [否定] 要打勾.表示找到資料 [不要] 阻擋存檔.


如果有填 [驗證規則值],則本來要取 [欄位名稱]作取值來放置到SQL右邊的,會改用 [驗證規則值]取運算值來放.且目前系統是固定用字串型態來組SQL子句.


flying 在 周四 11月 20, 2008 1:36 am 作了第 1 次修改
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

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

發表主題: 回復: 存檔驗證 -- SQL子句輸入注意事項   周四 11月 20, 2008 1:19 am

動態SQL判斷式如下,ls_sqlstr= [驗證規則或SQL]+ ( [欄位名稱] 的值 或 [驗證規則值] 的運算值),由前段程式運算後組合成完整的SQL子句.
lb_find=true代表找到,至於找到後要不要攔截存檔,由 [否定]勾選決定, [否定]打勾則表示不攔截.
ls_rule=[驗證規則或SQL]的內容字串.
ls_type為 [欄位名稱]的型態.由資料視窗取[欄位名稱]判斷.但若是select count(*)開頭的,則固定為 "deci"

DECLARE check1cur DYNAMIC CURSOR FOR SQLSA ;
 PREPARE SQLSA FROM :ls_sqlstr USING mtransobj ;
 OPEN DYNAMIC check1cur ;
 if mtransobj.sqlcode = -1 then
  messagebox(回報SQL子句錯誤)
 else
  CHOOSE CASE mid(ls_type,1,4)
  CASE "char"
    FETCH check1cur INTO :ls_strvalue;
    if mtransobj.sqlcode=0 then
    lb_find=true
    end if
  CASE "deci"
    FETCH check1cur INTO :ld_decvalue;
    如果是統計筆數的,大於0就算找到
    if pos(ls_rule,"select")>0 and pos(ls_rule,"count(")>0 then
     if ld_decvalue>0 then
     lb_find=true
     end if
   else
     if mtransobj.sqlcode=0 then
      lb_find=true
    end if
   end if
 CASE "date"
   FETCH check1cur INTO :ld_datevalue;
   if mtransobj.sqlcode=0 then
    lb_find=true
   end if
  END CHOOSE
 end if
close check1cur ;
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
flying
Admin
avatar

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

發表主題: 回復: 存檔驗證 -- SQL子句輸入注意事項   周四 11月 20, 2008 1:26 am

若 [驗證規則或SQL] select 開頭的,表示採用資料庫欄位運算式,或呼叫pb function的方法,系統會將運算式直接拿來判斷,且不會用到 [欄位名稱] [驗證規則值] 等內容.

下列驗證規則為資料視窗的運算式

trim(invoiceno)='' or isnull(invoiceno)

order_qty>0

eta=datetime('')
回頂端 向下
檢視會員個人資料 http://idon.666forum.net
 
存檔驗證 -- SQL子句輸入注意事項
回頂端 
1頁(共1頁)

這個論壇的權限:無法 在這個版面回復文章
志翔科技有限公司後勤網 :: 系統主題 :: MIS設定窗-
前往: