实现原理
PowerBuilder中有一种以PSR为后缀的特殊的保存报表的文件格式(本文简称PSR文件) 数据窗口可以直接读取PSR文件生成报表 而程序通过生成PSR文件 就可以实现动态报表格式的保存
首先 通过设置数据窗口对象(dataobject)中的文本 列等的Resizeable和moveable属性为 来实现对象位置的拖动控制 通过数据窗口的Modify函数实现对象值的更改(包括增加和删除)
其次要保存报表格式 在一个应用中 数据窗口对象的名称总是惟一的 将每一个数据窗口对象转化成PSR文件存于数据库表中 在窗口打开时 程序先校验报表格式是否存在 如果存在 将报表格式读出来放在一个临时文件当中 然后设置数据窗口(datawindow)的数据对象(dataobject)为这个报表文件 并提取数据 如果不存在 直接提取数据即可
实现过程
建立一个数据库表用以保存报表格式文件
建立一个窗口w_temp 定义实例变量如下
string is_dwtype is_dwobject
//保存报表中对象的类型及名称
在窗口的Open事件中加入如下代码 校验报表格式是否存在 如果存在 读取定义好的报表格式到数据窗口
blob emp_pic
long ll_handle
string ls_dwobject ls_reportfile ls_path
ls_dwobject = dw_print dataobject
//判断是否存在该数据窗口的报表格式
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 = \temp psr
ll_handle = FileOpen(is_reportfile StreamMode! write! LockWrite! Replace!)
FileWrite(ll_handle emp_pic)
FileClose(ll_handle)
dw_print dataobject = ls_reportfile
dw_print settransobject(sqlca)
else
Dw_print settransobject(sqlca)
End if
Dw_print retrieve()
保存报表格式 这可以通过Cb_savereport按钮的clicked事件实现
string ls_filename
long ll_count
blob Emp_id_pic
ls_filename = temp psr
//保存报表格式到硬盘临时文件
dw_print saveas(ls_filename PSReport! false)
sqlca automit = true
select count(*) into :ll_count from dyn_report where dwobject =:is_dwobject
if ll_count = then
insert into dyn_report(dwobject rptitle)
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
//更新数据库
sqlca automit = false
动态报表的实现 通过数据窗口dw_print的clicked事件捕获数据窗口中的对象 并将对象名存放在实例变量is_dwobject中 为下一步修改报表做准备
string ls_type ls_dwoname
//得到对象类型和名称
ls_type = trim(upper(dwo type))
ls_dwoname = trim(dwo name)
is_dwtype = ls_type
choose case ls_type
case TEXT CommandButton GROUPBOX
is_dwobject = ls_dwoname
//设置为可以拖动和改变大小
this modify(ls_dwoname+ Resizeable= + )
this modify(ls_dwoname+ moveable= + )
case LINE
//直线对象不能通过设置Resizeable和moveable属性进行调整 必须通过其他途径
is_dwobject = ls_dwoname
case RECTANGLE ELLIPSE GRAPH BITMAP
is_dwobject = ls_dwoname
this modify(ls_dwoname+ Resizeable= + )
this modify(ls_dwoname+ moveable= + )
case COLUMN PUTE
is_dwobject = ls_dwoname
this modify(ls_dwoname+ Resizeable= + )
this modify(ls_dwoname+ moveable= + )
end choose
最后再通过modify()函数就可以实现基本的动态报表 *** 作 这一类的文章较多 PB中也有大量的例子可直接使用 在此不再赘述
在cb_exit按钮的clicked()事件中加入 close(parent)
在应用的open事件中加入 open(w_temp) 然后保存并运行 全部工作到此结束!
本程序在PB Oracle 下调试通过
编辑推荐
ASP NET开发培训视频教程
lishixinzhi/Article/program/PB/201311/24637如何用PB实现统计报表的功能?
你首先要建立存储这些收入支出资料的表,然后根据这些表拉出你需要的datawindow,右侧放一个datawindow控件(dw_1),收入做一个d_rep_in,支出做一个d_rep_out,合计做一个d_rep_sum,当你点"收入"时可以这样写:
dw_1.dataobject='d_rep_in'
dw_1.settransobject(sqlca)
dw_1.retrieve()可以按月份抓取当月的资料,当然我只说个基本的框架
当你点"支出","合计"同上.具体的做法可以再详细说出你的需求.
希望对你有所帮助!
“统计报表的实现”如何翻译?realization of statistics report forms
如何用Inventor BOM生成分类统计报表找您的经销商,联络“BOM后处理”功能的购买或者其它...是要花钱的。建议楼主报表还是自己用报表软件分开做的好。像我用的finereport,专门的报表软件,网上有免费版的可以下载,功能也很强大了,希望可以帮到你。
如何做统计报表您要做的是什么行业的统计报表? 既然没有说清楚,那么,我用一个实例来回答您,您可以仿造样式,自己收集数据来做。 【工业销售产值统计报表】工业销售产值是指以货币表现的工业企业在一定时期销售本企业生产的工业产品或提供的工业性作业的总量。主要构成:1、已销售的成品、半成品价值;2、对外提供的工业性作业价值;3、提供给本企业非工业部门的产品和工业性作业价值以及自制设备的价值。 固定资产净值年平均余额=(年初固定资产净值+年末固定资产净值)÷2 流动资产年平均余额=(年初流动资产余额+年末流动资产余额)÷2 。
电子统计表:用exce或者WPS做, 方法:新建工作簿,填写统计项目,输入要统计的内容。如果要计算用公式和图表,选中区域插入图标,选择一个样式即可。
统计报表是按统一规定的表格形式,统一的报送程序和报表时间,自下而上提供基础统计资料,是一种具有法律性质的报表。统计报表是一种以全面调查为主的调查方式。它是由 *** 主管部门根据统计法规,以条统计表格形式和行政手段自上而下布置,而后由企,事业单位自下而上层层汇总上报逐级提供基本统计数据的一种调查方式。统计报表制度是一种自上而下布置,自下而上通过填制统计报表搜集数据的制度。
如何设置统计报表视图中的删除:新增的统计报表在角色权限中自动删除 视图中的禁用:统计中不显示新增的统计报表 第三步:点击界面最上端,左侧的 新增 按钮,输入统计报表的名称,点击
如何用EXCEL实现统计计票功能?高级筛选能
统计报表的特点统一性是统计报表的基本特点。具体表现为:
(1)统计报表的内容和报送的时间是由国家强制规定的,以保证调查资料的统一性。
(2)统计报表的指标含义,计算方法、口径是全国统一的。
首先数据窗口上定义两个参数:datetime
ldt_begin
datetime
ldt_end
然后数据窗口语句:
select
序号
员工编号
员工姓名
性别
出生日期
工作日期
from
员工信息表
where
工作日期
>=
:ldt_begin
and
工作日期
<=
:ldt_end
定义实例变量:
datetime
id_begin,id_end
id_begin
获取你的起始时间
id_begin=datetime(date(开始时间),00:00:00)
id_end
获取你的截止时间
id_end=datetime(date(截止时间),23:59:59)
//关于你怎么获取你的开始时间,截止时间你自己写吧,比较好的办法是搞个万年历的时间控件
窗口的open事件中写入:dw_1.settransobject(sqlca)
生成报表的click事件中写入:dw_1.retrieve(id_begin,id_end)
打印报表:dw_1.print()
退出:close(parent)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)