熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

在PB中如何實現數據模糊查詢(五)

2022-06-13   來源: SQL語言 
     DataWindow: dw_where的 ue_where 事件

    功能形成WHERE子句並更新語法框

    string hzcol ywcol sValue sType // sWhere
    //sWhere 現為實例變量在wroot_query中為局部變量
    string sOper sLog sLeft_khsRight_kh tmpsValue
    long left_khright_kh //左右括號數
    integer i rownum delnum // typenum
    dwItemStatus l_status
    if ib_changed = true then
    ib_changed = false
    else
    return
    end if
    rownum = dw_whereRowCount()
    //去掉dw_where中MaxEditRow行以前所有中間為空或
    //者輸入不完整的行 並更新MaxEditRow
    i =
    delnum =
    DO WHILE i <= MaxEditRow
    l_status = dw_whereGetItemStatus(i Primary!)
    if l_status <> New! then
    hzcol = GetItemString(icolumn)
    sValue = GetItemString(ivalue)
    if (hzcol = or isnull(hzcol)) or (sValue = or isnull(sValue)) then
    dw_whereDeleteRow(i)
    delnum +=
    MaxEditRow +=
    Continue
    end if
    else
    dw_whereDeleteRow(i)
    delnum +=
    MaxEditRow +=
    Continue
    end if
    i +=
    LOOP
    For i = to DelNum
    dw_whereInsertRow()
    Next
    //檢查左右括號是否匹配 即其數量是否一樣多
    For i = to MaxEditRow
    l_status = dw_whereGetItemStatus(i Primary!)
    if l_status <> New! then
    left_kh += inv_stringof_countoccurrences(GetItemString(iprecol)()
    right_kh += inv_stringof_countoccurrences(GetItemString(ivalue)))
    end if
    Next
    i = left_kh right_kh
    if i <> then
    if i > then
    sValue = 查詢條件中左括號比右括號多了 + String(i) +
    else
    sValue = 查詢條件中左括號比右括號少了 + String(i) +
    end if
    if MessageBox(綜合查詢輸入錯誤sValue + 請改正 + &
    ~r~n~r~n否則所有查詢條件將被忽略None!OKCancel!)= then
    return
    else
    dw_wheresetfocus()
    return
    end if
    end if
    //形成WHERE子句並更新語法框
    sWhere =
    For i = to MaxEditRow
    hzcol = GetItemString(icolumn)
    sOper = space() + GetItemString(ioperator) + space()
    // 去掉空格鍵
    sValue = Trim(GetItemString(ivalue))
    sLeft_kh = GetItemString(iprecol) //保存左括號
    if isNull(sLeft_kh) then sLeft_kh =
    if Pos(sValue)) > then //保存右括號
    sRight_kh = Right(sValue(Len(sValue) Pos(sValue)) + ))
    else
    sRight_kh =
    end if
    sValue = inv_stringof_globalreplace(sValue) //去掉sValue中的單引號
    sValue = inv_stringof_globalreplace(sValue) //去掉sValue中的雙引號
    sValue = inv_stringof_globalreplace(sValue)) //去掉sValue中的右括號
    sLog = GetItemString(ilogical)
    if sLog = or isNull(sLog) then
    sLog = and
    dw_whereSetItem(ilogicaland)
    end if
    ywcol = wf_getYwName(hzcol) //表名列名
    sType = lower(wf_getYwType(hzcol))
    CHOOSE CASE sType
    CASE charcharacterstringncharnvarcharvarchartime
    if trim(sOper) = like or trim(sOper) = not like then
    sWhere += ( + sLeft_kh + ywcol + sOper + % + sValue + %) + sRight_kh + sLog
    else
    sWhere += ( + sLeft_kh + ywcol + sOper + + sValue + ) + sRight_kh + sLog
    end if
    CASE numericdecimaldecimalndecdoubleintegerintsmallint&
    numberlongrealuintulongunsignedintunsignedintegerunsignedlong
    if trim(sOper) = like or trim(sOper) = not like then
    if MessageBox(提示信息hzcol + 不是字符型不能使用<含有>或<不含有>操作符 + &
    ~r~n~r~n請改正; 否則所有查詢條件將被忽略None!OKCancel!)= then
    return
    else
    dw_wheresetfocus()
    return
    end if
    end if
    if isNumber(sValue) then
    sWhere += ( + sLeft_kh + ywcol + sOper + sValue + ) + sRight_kh + sLog
    else
    if MessageBox(綜合查詢輸入錯誤hzcol + 的值應為數字型請改正 + &
    ~r~n~r~n否則所有查詢條件將被忽略None!OKCancel!)= then
    Return
    else
    dw_wheresetfocus()
    return
    end if
    end if
    CASE datedatetimedatetimnsmalldatetimetimestamp
    if trim(sOper) = like or trim(sOper) = not like then
    if MessageBox(提示信息hzcol + 不是字符型不能使用<含有>或<不含有>操作符 + &
    ~r~n~r~n請改正; 否則所有查詢條件將被忽略None!OKCancel!)= then
    return
    else
    dw_wheresetfocus()
    return
    end if
    end if
    if sType = date then
    if not isdate(sValue) then
    if MessageBox(綜合查詢輸入錯誤hzcol + 的值應為日期型請改正; + &
    ~r~n~r~n否則所有查詢條件將被忽略None!OKCancel!)= then
    Return
    else
    dw_wheresetfocus()
    return
    end if
    end if
    sValue = wf_dateconvert(sValue)
    sWhere += ( + sLeft_kh + ywcol + sOper + + sValue + ) + sRight_kh + sLog
    else
    //datetime型的字段在sybase中轉換為字符串的類型
    sValue = wf_datetime(sValue)
    if sValue = error then
    if MessageBox(綜合查詢輸入錯誤hzcol + 的值應為日期時間型請改正 + &
    ~r~n~r~n否則所有查詢條件將被忽略None!OKCancel!)= then
    Return
    else
    dw_wheresetfocus()
    return
    end if
    end if
    sWhere += ( + sLeft_kh + convert(varchar()+ywcol+) + sOper + +sValue+) + sRight_kh +
    sLog
    end if
    CASE ELSE
    beep()
    MessageBox(綜合查詢sType + 這個數據類型未在本模塊中定義)
    Return
    END CHOOSE
    Next
    //去掉最後一個邏輯符
    Long pok pp
    pp =
    DO WHILE True
    pok = pp
    pp = Pos(sWhere ) pp + )
    if pp = then Exit
    LOOP
    if pok > then sWhere = Trim(Left(sWhere pok))
    return
    //最後一個邏輯符去掉結束
    //至此 用戶的WHERE語句部分已經形成完畢於sWhere中

     DataWindow: dw_where的 ue_mousemove 事件

    功能控制鼠標的移動

    string s_object
    s_object = ThisGetObjectAtPointer()
    if left(s_object) = value then
    MainWindowSetMicroHelp(此時按鼠標右鍵可粘貼現有值)
    else
    MainWindowSetMicroHelp(准備好)
    end if

     DataWindow: dw_where的ue_retrieve事件

    功能對數據窗口進行查詢詳細請見代碼

    // 如果數據窗口dw_result上並無ue_action_refresh事件
    // 則用戶必須重載本事件編寫自己的腳本
    // 如:
    // dw_resultretrieve()
    //
    // 或者如果數據窗口dw_result有retrieve參數
    // 則用戶也必須重載本事件編寫自己的腳本
    // 如:
    // string ls_id
    // ls_id =
    // dw_resultretrieve(ls_id)
    dw_resulttriggerevent(ue_action_refresh)


From:http://tw.wingwit.com/Article/program/SQL/201311/16218.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.