hur.cn - 华软网

 热门搜索

Nested report 中字段的读取与赋值

  作者:未知    来源:网络    更新时间:2018/10/12
我有一段代码,是PB6.5的,用了N久都没有问题,升级到9.0后就出问题了:
for i = 1 to dw_report.rowcount()
  for j = 1 to dlcount
    itemno = dw_report.object.d_1[i].object.itemno[j]
    ....
  next  
next 
说明一下:dw_report是个报表,其中它的对象中有一个嵌套报表D_1 . itemno是这个嵌套报表中的列名. dlcount 是这个嵌套报表中的行数(尝试时绝对有值,肉眼看来)
结果, 在 itemno = dw_report.object.d_1[i].object.itemno[j] 这行犯错了.
我查了下帮助,用法上没有问题呀,以前在PB6.5下用得好好的,都用了几年了.
不知哪位能够提供点意见? 谢谢

------华软网友回答------
可能是PB9的bug
------华软网友回复------
以前也是有这个苦恼,帮助上查获得的,就是欠好用
那这样说是9的bug了,由于我没试6.5,所以一直以为
是PB的BUG,
由于Nested report名是不确定的,因此用了以下方法,
///////////////////////////////////////////////////////////


string   ls_datawindowobjects
string   ls_object
string   ls_colname,ls_type

ls_datawindowobjects = dw_1.object.datawindow.objects

Do 
ls_object = f_get_token(ls_datawindowobjects, "~t")
IF ls_object = "" THEN EXIT

ls_type = dw_1.Describe(ls_object + ".type")
If ls_type  = 'report' Then 
ls_colname =  dw_1.Describe(ls_object + ".name")
EXIT
End If
Loop Until ls_object = ""

datawindowchild ldwc_temp
//以下是小刀以前提供的方法,
dw_1.modify("datawindow.processing = '5'")
dw_1.getchild(ls_colname,ldwc_temp)
//我的方法
dw_2.dataobject = dw_1.Describe(ls_colname + ".DataObject")


messagebox(ldwc_temp.getitemstring(1,col),'')

////////////////////////////////////////////
//f_get_token函数:
////////////////////////////////////////////
global type f_get_token from function_object
end type

forward prototypes
global function string f_get_token (ref string source, string separator)
end prototypes

global function string f_get_token (ref string source, string separator);//取得字符串source中separator子串前的字符
int  p
string  ret

p = Pos(source, separator) // 取得separator子串在source中的位置

if p = 0 then // 无separator, 
ret = source // 将source写入前往值
source = ""
else
ret = Mid(source, 1, p - 1) // 取得字符串source中separator子串前的字符
source = Right(source, Len(source) - p)
end if

return ret


end function
------华软网友回复------
dlcount是从何而来?我预计是你的j超越范围了。
另外在pb9中也是能够正常运行的
------华软网友回复------
dlcount 是从数据库中读取到的,一定有,而且肉眼看来有这么多行的,就算我改成 1 都不行的.

to   hygougou(狗狗):
你的方法我知道,是根据一个传说中的sybase不支持的方法强行修改数据窗口的类型以期骗过PB来取得dw_child. 不过这个措施其实没多大用处. 我没有举行详细的尝试过,不过就以理推断,当这个父DW中只有一个子嵌套report时是可行的. 而如果父DW有N行,而每行都有嵌套report时则是不准的.举例说,我第一行的nested report有3行,第二行的nested report有5行,第三行的nested report有2行,... 然后用上述这类措施取得的dw_child 能想象得出它有几多行吗? 

而对于 nested report,其它的属性赋值或取值则照旧和原来6.5的一样,取值就不行,不知是否是BUG. 
今天还发现一个更要命的BUG,在原来的PB9.0上,用OLEDB连接SQL,用存储进程生成数据窗口,它的语法类似于:execute dbo.query_test;1;0 @itemno =:itemno . 而当我下了个9.03 build8565的补钉后,语法酿成了 execute dbo.query_test;1 @itemno =:itemno (存储进程名与参数之间少了个;0).于是,在运行时,以前的生成的数据窗口犯错了.真晕

------华软网友回复------
to   hygougou(狗狗):
我說錯了,應該說是小刀的方法用的是根据一个传说中的sybase不支持的方法强行修改数据窗口的类型以期骗过PB来取得dw_child
------华软网友回复------
通过这样取report名----ls_colname =  dw_1.Describe(ls_object + ".name")

就能够发现这个名字是不固定的,所以PB上帮助的用法用不可,楼主能够交个尝试

汇报给SYABASE,让他们尽快出9.04补钉:),我只打到902,不想再打了
------华软网友回复------
建议dlcount从嵌套报表中取(增加一个合计计算)再试试。

------华软网友回复------
TO whchen(土龙) :
我没法取啊,哪怕我用  itemno = dw_report.object.d_1[1].object.itemno[1] 都会犯错啊 . 

TO  hygougou(狗狗) :
我的嵌套报表的名字是固定的,我不是在写通用的方法,我是已经给nested命名了的,难道你的意思是说,即使我给了它命名,PB也会给我另起名字?那不是很惨?要是我有两个以上的嵌套报表,我怎么知道哪一个对哪一个? 我尝试一下看看

------华软网友回复------
哈哈,一觉梦醒,没问题了,应该是打了补钉的缘故,而我用另外一台机用没打过补钉的PB9来跑,却仍有毛病. 我打的是9.03 build 8565
------华软网友回复------
即使我给了它命名,PB也会给我另起名字?那不是很惨?
-----------------------
正是~~
-----------------------
哈哈,一觉梦醒,没问题了,应该是打了补钉的缘故,而我用另外一台机用没打过补钉的PB9来跑,却仍有毛病. 我打的是9.03 build 8565
-------------------------------

那祝贺了:)      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。