非空检查的问题

ronglei12 2006-11-27 10:01:58
我建立了一个数据窗口,有两个字段:bmno和bmmc.我想在增加或者修改记录的时候不能让它们为空,于是在数据窗口的column specification的属性中相应字段的valadition设置为:not isnull(gettext()),valadition message设置为'不能为空',可是在运行的时候当上述字段为空的时候还是能通过啊.请教各位高手应该怎么设置呢?
我把如下这段代码加到itemchanged和rowfocuschanged事件里面,均能通过编译,但是达不到效果.请问是为什么啊?
if dw_1.getitemstring(row,1)='' then
messagebox('','')
return 1
end if
我对getitemstring()的理解是:row表示当前行,1表示第一列,所以焦点离开当前行第一列的时候触发事件.可是没有.
...全文
220 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ronglei12 2006-12-01
  • 打赏
  • 举报
回复
楼上的有个问题想请教啊,那个gf_token函数是怎么定义的啊?
iamx 2006-11-29
  • 打赏
  • 举报
回复
Itemchanged 事件就是这样的,你不输入值,也就没有 Change,当然不会触发啦。PB就是这样,没办法的啦。
另外,上面写的代码是有问题的,如果列 1 原来是 'abc', 当你清掉它时,焦点移动到其他列,应该没有messagebox弹出的。应该这样写:

string ls_temp
if dwo.name = 'xxx' then //假设列 1 是 xxx
ls_temp = data

if ls_temp ='' Or Isnull(ls_temp) then
messagebox('','')
return 2
end if
end if
ronglei12 2006-11-29
  • 打赏
  • 举报
回复
感谢jackiecheng001提供的说明哦.今天又试了下,觉得在itemchange事件中写脚本不行.因为当用户修改已有数据的时候,这样做可以,但是新增加一行数据的时候什么也不输入就离开,就不会触发该事件.在rowfocuschanged事件中也不行.这样写当焦点离开当前列的时候会触发事件,但是当增加一行,焦点到新列的时候就会触发该事件.我想的是当焦点离开当前列的时候再做检查.看了下losefocus,好象不是用来做这个的.哪位高手指点下啊.
lmcsdn 2006-11-29
  • 打赏
  • 举报
回复
/*
非空检查
描述:
ad_store = Dw
al_row = 发生行
说明:
dw.tag = 列名称
dw.visible = true
*/
Integer li_maxcol
Integer li_i
String ls_column
String ls_type
String ls_valus

ad_store.accepttext()
li_maxcol = integer(ad_store.object.DataWindow.Column.Count)
for li_i = 1 to li_maxcol
if ad_store.Describe("#"+string(li_i)+".Visible") = '1' and ad_store.Describe("#"+string(li_i)+".tabsequence") <> '0' then
ls_column = ad_store.Describe("#"+string(li_i)+".Name")
ls_type = String(ad_store.Describe("#"+string(li_i)+".ColType"))

if pos(ls_type,"(") > 0 then
ls_type = gf_token(ls_type,"(",1)
end if

Choose Case ls_type
Case "char"
ls_valus = ad_store.getitemstring(al_row , ls_column)
Case "date"
ls_valus = String(ad_store.GetItemDate(al_row , ls_column))
Case "datetime"
ls_valus = String(ad_store.GetItemDateTime(al_row , ls_column))
Case "time"
ls_valus = String(ad_store.GetItemtime(al_row , ls_column))
Case "number","long","ulong","real"
ls_valus = String(ad_store.GetItemnumber(al_row , ls_column))
Case "decimal"
ls_valus = String(ad_store.GetItemDecimal(al_row , ls_column))
End choose

if isnull(ls_valus) or len(trim(ls_valus)) = 0 then
messagebox("ϵͳÌáʾ", ad_store.Describe("#"+string(li_i)+".tag") + "Ϊ¿Õ !")
ad_store.setfocus()
ad_store.SetColumn(ls_column)
return False
end if
end if
next
Return True
仰天长啸qsx 2006-11-29
  • 打赏
  • 举报
回复
写个数据校验函数,在update前调用不就可以了,用不着在这费这么大的心思
31737951 2006-11-29
  • 打赏
  • 举报
回复
直接把数据库加个默认值不是更简单,再设置成不为空,数据库一级的没必要放到程序控制把
youqiong 2006-11-29
  • 打赏
  • 举报
回复
Itemchanged 里面写
string ls_str
ls_str = dw_1.getitemstring( row, "列名/列号" )
IF IsNull( ls_str ) OR Len( ls_str ) < 1 THEN
MessageBox("","****值不能为空")
RETURN
END IF
xueru9999 2006-11-28
  • 打赏
  • 举报
回复
查看返回值
polestarxu 2006-11-28
  • 打赏
  • 举报
回复
捕捉系统级错误
try
//代码
catch(runtimeerror ,rte)
messagebox('提示',rte.getmessage())
end try
borderland 2006-11-28
  • 打赏
  • 举报
回复
为什么我在ItemChanged里编写了出错message,还是会出现系统默认得message
信息呢?有什么办法改一下呢?
leyueming 2006-11-28
  • 打赏
  • 举报
回复
看看上上楼的就行了
0 (Default) Accept the data value
1 Reject the data value and do not allow focus to change
2 Reject the data value but allow the focus to change
leyueming 2006-11-28
  • 打赏
  • 举报
回复
rowfocuschanged事件
里写代码当然会出现这种情况啊
jackiecheng001 2006-11-28
  • 打赏
  • 举报
回复
string ls_temp
ls_temp = dw_1.getitemstring(row,1)

if ls_temp ='' Or Isnull(ls_temp) then
messagebox('','')
return 2
end if

ItemChanged return code:
Set the return code to affect the outcome of the event:

0 (Default) Accept the data value
1 Reject the data value and do not allow focus to change
2 Reject the data value but allow the focus to change
ronglei12 2006-11-27
  • 打赏
  • 举报
回复
谢谢楼上的,按照你说的,新的问题又出现了.当我把光标从第一列(第一列什么都没有输)转到第二列的时候,对话框弹出,说明事件触发了,但是在点完对话框后,光标还是移动到了第二列,并没有停留在第一列,而且当我试图再把光标点回第一列的时候,又弹出该对话框,又触发了该事件.好象脚本中的return 1没有起作用一样啊
polestarxu 2006-11-27
  • 打赏
  • 举报
回复
空,还有可能是null
string ls_temp
ls_temp = dw_1.getitemstring(row,1)

if ls_temp ='' Or Isnull(ls_temp) then
messagebox('','')
return 1
end if

1,079

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧