pb11.2build8949 数据窗口dw limit问题

sun1976 2010-06-02 06:01:04
pb11.2的字符集合pb8等之前版本不同,在数据窗口的edit的limit出现如下问题
1、limit是生成数据窗口时根据数据库的字符型字段长度自动生成的,例如person_name varchar2(60) ,这个dw列就limit60
2、以前输60个英文字符或者30个汉字后,就再输不进去,现在输30汉字后还能继续输入,能输到60个汉字
3、当有汉字输入时,实际长度有可能超过了limit的限制,一但update就出错了,超长数据库不能接受更新。

请问有什么办法能让limit和原来低一样仍控制字节数而不是11.2版的控制字符数?
我现在没有好办法,只好自己在dw控件editchanged里写脚本处理,虽然可写在祖先对象中,但系统里有很多地方把这个事件代码屏蔽了,查找起来依然很费劲
有没有pb补丁或者pb什么设置可以达到目的或者有改动量比较小的做法?


谢谢
如果你也遇到同样问题但没解决,请帮顶,谢谢

我在editchanged处理如下:
string ls_name
long ll_limit,ll_datalen,ll_pos,ll_left
string ls_left,ls_right

ls_name=dwo.name
ll_limit=long(this.Describe(ls_name+".Edit.Limit"))
if ll_limit>0 then
ll_datalen= lena(data)
if ll_datalen>ll_limit then
ll_pos=this.position()
ls_right=mid(data,ll_pos,ll_datalen)
ls_left=left(data,ll_pos -1)
ll_left=len(ls_left)
do while lena(ls_left)>ll_limit -lena(ls_right) and ll_left>=0
ll_left=ll_left -1
ls_left=left(ls_left,ll_left)
ll_left=len(ls_left)
loop
ll_pos=len(ls_left)
this.setitem(row,ls_name,ls_left+ls_right)
this.selecttext(ll_pos+1,0)
return 1
end if
...全文
493 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun1976 2010-06-12
  • 打赏
  • 举报
回复
谢谢兄弟们关注帮忙
最后还是在pfc的u_dw加editchanged代码了
crazyrcd 2010-06-11
  • 打赏
  • 举报
回复
不懂,帮顶
lovemoreh 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yh10231033 的回复:]
这个问题,我遇到过,我的解决方式是在行中插入一个计算列compute_1,值:lena(你的列),然后在你那个列上设置下,比如背景色,或则前景色,设置:如果compute_1的值大于limit则显示为警告色,否则正常颜色
[/Quote]
个人认为这个比较好。
bombshell 2010-06-11
  • 打赏
  • 举报
回复
学习了,帮顶
yh10231033 2010-06-10
  • 打赏
  • 举报
回复
这个问题,我遇到过,我的解决方式是在行中插入一个计算列compute_1,值:lena(你的列),然后在你那个列上设置下,比如背景色,或则前景色,设置:如果compute_1的值大于limit则显示为警告色,否则正常颜色
永生天地 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 sun1976 的回复:]
pb11.2的字符集合pb8等之前版本不同,在数据窗口的edit的limit出现如下问题
1、limit是生成数据窗口时根据数据库的字符型字段长度自动生成的,例如person_name varchar2(60) ,这个dw列就limit60
2、以前输60个英文字符或者30个汉字后,就再输不进去,现在输30汉字后还能继续输入,能输到60个汉字
3、当有汉字输入时,实际长度有可能超过了limi……
[/Quote]

更正一下,limit设置的意图原本就是限制输入的字符个数的,这个可以看pb的帮助上介绍

由于在pb10以前的版本都是采用ANSI的编码,所以在计算字符个数时汉字就算为2个,刚好可以和数据库的varchar对应,但是如果用nvarchar那就对应不上了。
而在pb10以后采用了unicode编码,计算汉字为1个字符,刚好可以和数据库的nvarchar对应,但不能和varchar对应

所以这个问题就是一个对limit参数的理解问题了。因此不能用limit来作为数据库字段的长度限制,只是用户输入字符个数的限制,所以你的editchanged的用法应该是最贴切的做法了
ahder 2010-06-10
  • 打赏
  • 举报
回复
学习了。。。。。。。。
sun1976 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jimwoo 的回复:]
需要数据库里把字段类型改成nchar, nvarchar。这样汉字和字母就一致了
[/Quote]
这个不会出不友好的提示了,但会造成实际输入的汉字超过原来的设计长度,很多接口就不得不修改了

lovemoreh 2010-06-04
  • 打赏
  • 举报
回复
在你的威逼下顶你一次,行不?

呵呵。

尽管Sybase声称PB10后的版本处理字符,都是用Unicode方式,但是,很多方面还是处理不完善的。为什么汉字是用Unicode方式,ASCII字符还是用ANSI。


[Quote=引用 3 楼 lovemoreh 的回复:]
我没有想明白,为什么不直接修改limit的值呢?
[/Quote]这是半夜不清醒,关机之后才想明白,英文字符与汉字不同。
sun1976 2010-06-04
  • 打赏
  • 举报
回复
再顶最后一次
gui41021 2010-06-04
  • 打赏
  • 举报
回复
学习了,遇到过这个问题,各种超长。。后来统统扩了次位数,唉
永生天地 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jimwoo 的回复:]
需要数据库里把字段类型改成nchar, nvarchar。这样汉字和字母就一致了
[/Quote]

实在没办法,就得改数据库
jimwoo 2010-06-04
  • 打赏
  • 举报
回复
需要数据库里把字段类型改成nchar, nvarchar。这样汉字和字母就一致了
dawugui 2010-06-03
  • 打赏
  • 举报
回复
还未用过pb11,帮顶.
永生天地 2010-06-03
  • 打赏
  • 举报
回复
这个变为按字符个数算了,

我在pb115里试试
sun1976 2010-06-03
  • 打赏
  • 举报
回复
写代码解决我能做到
发此贴目的是如何不写代码解决
谢谢各位
editchanged改进
string ls_name
long ll_limit,ll_datalen,ll_pos,ll_left
string ls_left,ls_right

ls_name=dwo.name
ll_limit=long(this.Describe(ls_name+".Edit.Limit"))
if ll_limit>0 then
ll_datalen= lena(data)
if ll_datalen>ll_limit then
ll_pos=this.position()
ls_right=mid(data,ll_pos,ll_datalen)
ls_left=left(data,ll_pos -1)
ll_left=len(ls_left)
do while lena(ls_left)>ll_limit -lena(ls_right) and ll_left>=0
ll_left=ll_left -1
ls_left=left(ls_left,ll_left)
ll_left=len(ls_left)
loop
ll_pos=len(ls_left)
this.setitem(row,ls_name,ls_left+ls_right)
this.selecttext(ll_pos+1,0)
data=ls_left+ls_right
end if


撸过才知道 2010-06-03
  • 打赏
  • 举报
回复
我觉得这个问题你可以这样解决
如果你的DW都是继承的话就好一些,可以在基类的updatestarte事件里检查字符串长度是否大于最大长度来解决这个问题,或者是统一写一个函数来解决这个问题
具体的话,可以遍历检测或者setfilter检测

只一个思路,我还没具体做过,你可以试下,期待结果
sun1976 2010-06-03
  • 打赏
  • 举报
回复
谢谢各位关注!

回复我没有想明白,为什么不直接修改limit的值呢?
1因为数据窗口很多,挨个改很麻烦
2因为可以输入汉字也可以输入英文字符,如果60改30,那么输汉字是可以控制不超长了,但是本来能输60英文的不就只能输30个字母了吗?就不符合要求了

所以不能通过简单改limit解决
wag_enu 2010-06-03
  • 打赏
  • 举报
回复
实在不行自定义一个DW 控件,在里面实现对相关字段的limit 属性做修改...
new4everlau 2010-06-03
  • 打赏
  • 举报
回复
没找到有效的控制方式,帮顶贴!
加载更多回复(2)

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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