实现原理
PowerBuilder中有一种以PSR为后缀的特殊的保存报表的文件格式(本文简称PSR文件)数据窗口可以直接读取PSR文件生成报表而程序通过生成PSR文件就可以实现动态报表格式的保存
首先通过设置数据窗口对象(dataobject)中的文本列等的Resizeable和moveable属性为来实现对象位置的拖动控制通过数据窗口的Modify函数实现对象值的更改(包括增加和删除)
其次要保存报表格式在一个应用中数据窗口对象的名称总是惟一的将每一个数据窗口对象转化成PSR文件存于数据库表中在窗口打开时程序先校验报表格式是否存在如果存在将报表格式读出来放在一个临时文件当中然后设置数据窗口(datawindow)的数据对象(dataobject)为这个报表文件并提取数据 如果不存在直接提取数据即可
实现过程
建立一个数据库表用以保存报表格式文件
建立一个窗口w_temp 定义实例变量如下
string is_dwtypeis_dwobject
//保存报表中对象的类型及名称
在窗口的Open事件中加入如下代码 校验报表格式是否存在如果存在读取定义好的报表格式到数据窗口
blob emp_pic
long ll_handle
string ls_dwobjectls_reportfilels_path
ls_dwobject = dw_printdataobject
//判断是否存在该数据窗口的报表格式
select count(*) into:ll_count from dyn_report where dwobject =:ls_dwobject;
if ll_count> then
//读取报表格式文件到大文本变量
selectblob memo into:emp_pic from dyn_report where dwobject =:ls_dwobject;
//创建PSR临时文件并保存到硬盘
ls_reportfile =\temppsr
ll_handle = FileOpen(is_reportfileStreamMode!write!LockWrite!Replace!)
FileWrite(ll_handleemp_pic)
FileClose(ll_handle)
dw_printdataobject = ls_reportfile
dw_printsettransobject(sqlca)
else
Dw_printsettransobject(sqlca)
End if
Dw_printretrieve()
保存报表格式这可以通过Cb_savereport按钮的clicked事件实现
string ls_filename
long ll_count
blob Emp_id_pic
ls_filename =temppsr
//保存报表格式到硬盘临时文件
dw_printsaveas(ls_filenamePSReport! false)
sqlcaautocommit = true
select count(*) into :ll_count from dyn_report where dwobject =:is_dwobject;
if ll_count = then
insert into dyn_report(dwobjectrptitle)
values(is_dwobject:ls_filename:ls_path)
end if
//从硬盘临时文件读取数据保存到数据库表中
emp_id_pic = of_readbmpfile(ls_filename)
//该函数将二进制文件内容读到大文本对象中
UPDATEBLOB dyn_report SET memo = :Emp_id_pic where dwobject = :is_dwobject;
//更新数据库
sqlcaautocommit = false
动态报表的实现通过数据窗口dw_print的clicked事件捕获数据窗口中的对象并将对象名存放在实例变量is_dwobject中为下一步修改报表做准备
string ls_typels_dwoname
//得到对象类型和名称
ls_type = trim(upper(dwotype))
ls_dwoname = trim(dwoname)
is_dwtype = ls_type
choose case ls_type
case TEXTCommandButtonGROUPBOX
is_dwobject = ls_dwoname
//设置为可以拖动和改变大小
thismodify(ls_dwoname+Resizeable=+)
thismodify(ls_dwoname+moveable=+)
case LINE
//直线对象不能通过设置Resizeable和moveable属性进行调整必须通过其他途径
is_dwobject = ls_dwoname
case RECTANGLEELLIPSEGRAPHBITMAP
is_dwobject = ls_dwoname
thismodify(ls_dwoname+Resizeable=+)
thismodify(ls_dwoname+moveable=+)
case COLUMNCOMPUTE
is_dwobject = ls_dwoname
thismodify(ls_dwoname+Resizeable=+)
thismodify(ls_dwoname+moveable=+)
end choose
最后再通过modify()函数就可以实现基本的动态报表操作这一类的文章较多PB中也有大量的例子可直接使用在此不再赘述
在cb_exit按钮的clicked()事件中加入close(parent)
在应用的open事件中加入 open(w_temp)然后保存并运行全部工作到此结束!
本程序在PBOracle 下调试通过
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程