数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

在PB中如何实现数据模糊查询(五)


发布日期:2022年10月18日
 
在PB中如何实现数据模糊查询(五)
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)

上一篇:C#开源轻量级对象数据库NDatabase介绍[3]

下一篇:ETL的过程原理和数据仓库建设[2]