关于用户对象的,我很急,谢谢!!!

ceileng888 2004-10-06 10:29:00
关于用户对象的,我建了一个datawindow型的用户对象想把它做成一个通用查询窗体,用户对象里写了个接收datawindow参数的函数,在往这个函数传一个datawindow参数,编译都能通过,但在运行时系统报错“Null object reference at line 33 in open event of object w_query.”。我猜想是用户对象没接收到datawindow参数或函数没有得到返回值,各位高手能知到是哪出问题了吗?我不知该如何解决?我很急,谢谢!!!
...全文
158 25 打赏 收藏 举报
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lzheng2001 2004-10-08
  • 打赏
  • 举报
回复
收邮件吧
ceileng888 2004-10-08
  • 打赏
  • 举报
回复
太感谢lzheng2001(1加1=0) 兄啦,你真是大好人啊。小弟敬侯回复!!!
ceileng888 2004-10-08
  • 打赏
  • 举报
回复
函数:f_sys_replace()
参数:string source_string
string replaced_string
string replace_string
返回值:string


String target_string
Integer loca, beg_pos
Integer source_len, target_len
Integer replaced_len, replace_len

IF IsNull(source_string) THEN source_string = ""
IF source_string = "" THEN Return ""
source_len = Len(source_string)

IF IsNull(replaced_string) THEN replaced_string = ""
IF replaced_string = "" THEN Return source_string
replaced_len = Len(replaced_string)

IF IsNull(replace_string) THEN replace_string = ""
replace_len = Len(replace_string)

target_string = source_string
target_len = source_len
beg_pos = 1
loca = Pos(target_string, replaced_string, beg_pos)
Do While loca > 0
target_string = Replace(target_string, loca, replaced_len, replace_string)
target_len = target_len - replaced_len + replace_len
beg_pos = loca + replace_len + 1
IF beg_pos > target_len THEN Exit
loca = Pos(target_string, replaced_string, beg_pos)
Loop

Return target_string
lzheng2001 2004-10-08
  • 打赏
  • 举报
回复
1. 还差一个函数 f_sys_replace

ceileng888 2004-10-08
  • 打赏
  • 举报
回复
谢谢lzheng2001 (100)兄的帮助,主要问题以经解决啦!非常感谢lzheng2001 (100)兄的敬业精神与热心帮助!!!
ceileng888 2004-10-07
  • 打赏
  • 举报
回复
这回那个错误没有啦,但是uo_query.uf_ini_query(dw_1)函数并没有执行对dw_1参数的处理.在数据窗口可视用户对象做的通用查询窗体并没有显示uo_query.uf_ini_query(dw_1)函数的处理结果返回给数据窗口用户对象,但也没报错,我不知到uo_query.uf_ini_query(dw_1)函数到底执没执行.请lzheng2001(1加1=0) 在指教一番,小弟愿再送100分.

放出代码:w_query的open()事件
integer ll_colcount
integer i
integer nrow
string ls_colcount
string ls_colname
string ls_coltype
dw_1.settransobject(SQLCA)
dw_1.retrieve()
is_originalsqlselect=dw_1.describe("datawindow.table.select")
ls_colcount = dw_1.describe("datawindow.column.count")
ll_colcount = integer(ls_colcount)
for i = 1 to ll_colcount
ls_colname = dw_1.describe("#" + string(i) + ".name")
ls_coltype = dw_1.describe(ls_colname + ".edit.style")


choose case Lower(ls_coltype)
case "ddlb","editmask"
case else
dw_1.modify(ls_colname + ".edit.autoselect=no")
dw_1.modify(ls_colname + ".edit.FocusRectangle=no")
dw_1.modify(ls_colname + ".edit.displayonly=yes")
end choose
dw_1.modify(ls_colname + ".background.color=" + &
"'0~tif(mod(getrow(),2)=0, 14675436,13624000)'")
dw_1.modify("datawindow.grid.columnMove=no")
next
IF NOT IsValid(uo_query) THEN
uo_query = create uo_query_set
END IF
uo_query.uf_ini_query(dw_1)
if uo_query.rowcount()>0 then
nrow = 1
else
nrow = uo_query.insertrow(0)
end if
uo_query.setitem(nrow, "andor","AND")
uo_query.setitem(nrow, "field","TableName")
uo_query.setitem(nrow, "target","Person")
uo_query.setitem(nrow, "prompt","Person")
uo_query.setitem(nrow, "datatype","nvarchar")
--------------------------------------------------------------------------------------------

uf_ini_query(dw_result)函数代码:

String fname
string fpmpt
string fvalue
string ftype
string m_string
string checkboxtext
int i,cnt
column_number=integer(dw_result.describe("datawindow.column.count"))
if IsNull(column_number) then column_number=0
if column_number<1 then return
i=1;cnt=0
do while i<=column_number
fname=dw_result.describe("#"+string(i)+".name")
fpmpt=dw_result.describe(fname+"_t.text")
if fpmpt = "!" or fpmpt = "?" then fpmpt = ""
if fpmpt <> "" then
fpmpt=f_sys_replace(fpmpt, ": ", "")
fpmpt=f_sys_replace(fpmpt, ":", "")
fpmpt=f_sys_replace(fpmpt, " ", "")
fpmpt=f_sys_replace(fpmpt, " ", "")
fpmpt=f_sys_replace(fpmpt, "/", "-")
fpmpt=f_sys_replace(fpmpt, "~r", "-")
end if
fvalue=dw_result.describe(fname + ".Values")
if fvalue = "!" or fvalue = "?" then fvalue = ""
if fvalue <> "" or fpmpt <> "" then
checkboxtext = dw_result.describe(fname + ".CheckBox.Text")
if checkboxtext = "!" or checkboxtext = "?" then
checkboxtext=""
end if
if checkboxtext <> "" then
fpmpt = checkboxtext
fvalue = &
"选中~t"+dw_result.describe(fname + ".checkbox.on")+"/"&
+"不选~t"+dw_result.describe(fname+".checkbox.off")+"/"
checkboxtext=dw_result.describe(fname + ".checkbox.other")
if checkboxtext = "!" or checkboxtext = "?" then
checkboxtext = ""
end if
if checkboxtext <> "" then
fvalue = fvalue + "三态~t" + checkboxtext + "/"
end if
end if
cnt ++
column_name[cnt] = fname
column_type[cnt] = dw_result.describe("#"+string(i) + ".Coltype")
if fpmpt = "" then
column_pmpt[cnt] = fname
else
column_pmpt[cnt] = fpmpt
end if
column_value[cnt] = fvalue
end if
i++
loop
m_string = ""
for i = 1 to cnt
m_string = m_string + column_pmpt[i] + "~t" + column_name[i] + "/"
next
this.modify("field.Values='" + m_string + "'")



luotitan 2004-10-07
  • 打赏
  • 举报
回复
出现这种错误的情况很多。
贴代码!
pbtech 2004-10-07
  • 打赏
  • 举报
回复
Null object reference at line 33 in open event of object w_query

这个错误就是,你无法正常传递数据窗口

lzheng2001 2004-10-07
  • 打赏
  • 举报
回复
是标题为"请教问题"的那个邮件吧,已收! 楼主请改回密码
lzheng2001 2004-10-07
  • 打赏
  • 举报
回复
还是把代码贴出来看看吧,尤其是w_query的open事件!可能不是楼主说的那回事
圣殿骑士18 2004-10-07
  • 打赏
  • 举报
回复
你把调用这个函数的代码贴出来,看看.
ceileng888 2004-10-07
  • 打赏
  • 举报
回复
要不我把这程序的PBL放在我的邮箱里,如过lzheng2001(1加1=0)兄不闲麻烦的话请到我的邮箱下载一下,这样咱俩都省事一些了(ceileng@126.com)网址是www.126.com 用户名:ceileng 密码:server 邮件名称是:请教问题。lzheng2001(1加1=0)兄自己随便连接一个数据表就行,我是用的sql server.拜托lzheng2001(1加1=0)兄啦,我是找不出原因啦,也不报错,哈哈。小弟无以为报,就只能多给些分啦。衷心感谢!敬盼回复!!!
ceileng888 2004-10-07
  • 打赏
  • 举报
回复
那我说明一下哈,我想用数据窗口可视用户对象做一个通用查询窗体.它获得另一个窗体(w_query)的DW,并把他交给uf_ini_query(dw_1)函数处理,把另一窗体(w_query)的dw的字段,数据类型,数据列文本对象的文本(数据列名提示fpmpt,仅起到提示做用,不考虑也罢)取出来传递给用户对象,我在数据窗口用户对象加载了一个外部数据源的数据窗口对象,表结构[andor(和,或),field(字段,保存传递DW的字段),operand(比较符),target(查询目标),propmt(存储查询值)]用户对象的field列保存参数DW的字段列.在用户对象的field列(是下拉列表)选择字段列,在operand列(是下拉列表)选择比较符,在target列输入查询内容.andor列(是下拉列表)选择(and或or).点击查询按扭触发ue_build_query自定义事件,事件里引用了uf_get_query()函数(作用:重新组合用户操作用户对象上的控件所产生的SQL查询语句)把新的SQL查询语句通过ue_build_query事件返回给w_query窗体dw_1控件,并产生查询结果.
hzhxxx 2004-10-07
  • 打赏
  • 举报
回复
佩服楼主 ,凌晨 2 点

回复人: ceileng888() ( ) 信誉:100 2004-10-07 02:07:00 得分: 0

应该是你的那个 自己的用户对象没有 create

所有的用户对象都需要创建采可以使用,有的是系统创建,一般你自己的用户
对象需要自己创建,使用前最好用 IsValid() 判断

用户对象使用规则

//使用前,先创建
IF NOT IsValid(your userobject instance) THEN
your user instance = create your userobject
END IF

//一些处理
....


//用完了销毁
IF IsValid(your userobject instance) THEN
DESTROY your user instance
END IF

对于经常使用的用户对象,可以搞成全局的实例,在应用的 open 事件中实例化
在应用的 close 中 destroy


lzheng2001 2004-10-07
  • 打赏
  • 举报
回复
这么多代码真是晕呀! 楼主能具体说说想实现什么功能吗? 传一个DW入UO里的目的是什么? 执行这个函数后你想得到什么结果? fpmpt变量能用中文解释一下吗
ceileng888 2004-10-07
  • 打赏
  • 举报
回复
一般来说在一个窗体中添加一个数据窗口可视用户对象是不是就自动生成数据窗口控件啊?
我在调试过程中发现在用户对象中取得了uf_ini_query(dw_1)函数返回了用户对象需要的变量,但是在
装载用户对象的数据窗口控件却没得到这些变量,所以,可能就没有数据显示出来,请问数据窗口可视用户对象和装载它的数据窗口控件是什么关系?怎样才能让数据窗口控件获得这些变量.是用户对象在窗体上还需要实例化吗?我感觉pb会自动实例化吧?小弟初学PB,基础知识不扎实,还请各位能不胜其烦帮我解答一些问题,特别感谢lzheng2001(1加1=0)兄的帮助,他帮我解决了不少问题.再次感谢!!!
等这个问题解决完啦,我会再贴个贴子散分,
ceileng888 2004-10-07
  • 打赏
  • 举报
回复
谢谢 lzheng2001(1加1=0)兄的耐心指点,小第不胜感激!那个问题我重做了个用户对象,改成reference啦,但还是不能把结果显示在用户对象.现在是DW_RESULT参数以经被传递进uf_ini_query()
函数啦,通过测试函数返回了一些结果.取得了DW_RESULT数据窗口参数的列名column_name,数据类型column_value.我认为问题还是出在uf_ini_query()函数本身,函数并没有把取得参数的相关变量返回到用户对象本身.

uf_ini_query(dw_1)函数
String fname
string fpmpt
string fvalue
string ftype
string m_string
string checkboxtext
int i,cnt
column_number=integer(dw_result.describe("datawindow.column.count"))
if IsNull(column_number) then column_number=0
if column_number<1 then return
i=1;cnt=0
do while i<=column_number
fname=dw_result.describe("#"+string(i)+".name")
fpmpt=dw_result.describe(fname+"_t.text")
if fpmpt = "!" or fpmpt = "?" then fpmpt = ""
if fpmpt <> "" then
fpmpt=f_sys_replace(fpmpt, ": ", "")
fpmpt=f_sys_replace(fpmpt, ":", "")
fpmpt=f_sys_replace(fpmpt, " ", "")
fpmpt=f_sys_replace(fpmpt, " ", "")
fpmpt=f_sys_replace(fpmpt, "/", "-")
fpmpt=f_sys_replace(fpmpt, "~r", "-")
end if
fvalue=dw_result.describe(fname + ".Values")
if fvalue = "!" or fvalue = "?" then fvalue = ""
if fvalue <> "" or fpmpt <> "" then
checkboxtext = dw_result.describe(fname + ".CheckBox.Text")
if checkboxtext = "!" or checkboxtext = "?" then
checkboxtext=""
end if
if checkboxtext <> "" then
fpmpt = checkboxtext
fvalue = &
"选中~t"+dw_result.describe(fname + ".checkbox.on")+"/"&
+"不选~t"+dw_result.describe(fname+".checkbox.off")+"/"
checkboxtext=dw_result.describe(fname + ".checkbox.other")
if checkboxtext = "!" or checkboxtext = "?" then
checkboxtext = ""
end if
if checkboxtext <> "" then
fvalue = fvalue + "三态~t" + checkboxtext + "/"
end if
end if
cnt ++
column_name[cnt] = fname
column_type[cnt] = dw_result.describe("#"+string(i) + ".Coltype")
if fpmpt = "" then
column_pmpt[cnt] = fname
else
column_pmpt[cnt] = fpmpt
end if
column_value[cnt] = fvalue
end if
i++
loop
m_string = ""
for i = 1 to cnt
m_string = m_string + column_name[i] + "/"

next
this.modify("field.Value='" + m_string + "'")
------------------------------------------------------------------------
m_string变量取得的值为:"number/tablename/chinesename/columnsname/chinesecname/demo/"
我认为this.modify("field.Value='" + m_string + "'")这条语句有问题并没有把m_string字符串
通过modify()方法更新到用户对象的field字段中去.我把this.modify("field.Value='" + m_string + "'")这句话放到for循环里去也不行.我在数据窗口用户对象加载的数据窗口对象为外部数据源.请lzheng2001(1加1=0)兄再给帮帮忙!!!谢谢!!!!!

lzheng2001 2004-10-07
  • 打赏
  • 举报
回复
我把DW_RESULT设成reference后,为啥PB8.0不让保存呢?
=============
不会吧,有什么提示信息?


wjlforever 2004-10-07
  • 打赏
  • 举报
回复
你那个query的窗口要单独的打开!
用button写open(w_query)
uf_ini_query(dw_1)中的dw_1是你在你的另一个窗口中的!
不能在同一个窗口中!
ceileng888 2004-10-07
  • 打赏
  • 举报
回复
还得请问lzheng2001(1加1=0) 我把DW_RESULT设成reference后,为啥PB8.0不让保存呢?
加载更多回复(5)
相关推荐
发帖
DataWindow

603

社区成员

PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
帖子事件
创建了帖子
2004-10-06 10:29
社区公告
暂无公告