pb自定义报表:PB动态报表格式自由定义的实现

  在通常Server/Client方式MIS开发中总是有没完没了报表需要制作调试报表花费时间也是最多而且乏味还常常不能满足客户要求要是能够让用户自己调整报表格式和内容然后将它保存下来下次启动时它自动保存了报表格式那有多好本人通过如下思路方法最终实现了用要求

  PB(PowerBuilder)有种以PSR结尾特殊保存报表文件格式(本文简称作PSR文件)根据数据窗口可以直接读取PSR文件生成报表原理通过生成PSR文件实现动态报表格式保存

  、实现原理:

  PB中报表其实就相当于是数据窗口

  第动态报表实现通过设置数据窗口对象(dataobject)中文本、列等Resizeable和moveable属性为1来实现对象位置拖动控制通过数据窗口Mody实现对象值更改(包括增加和删除)

  第 2步报表格式保存个应用当中数据窗口对象名称总是唯将每个数据窗口对象转化成PSR文件存于数据库表中在窗口打开时先校验报表格式是否存在如果存在先将报表格式读取出来放在个临时文件当中然后设置数据窗口(datawindow)数据对象(dataobject)为这个报表文件然后提取数据;如果不存在直接提取数据即可

   2、实现过程:

  1、建立个数据库表用以保存报表格式文件

表名:dyn_report
Dwobject Varchar2(20) 数据窗口对象名称 Primary key
Rptitle Varchar2(80) 报表标题名称  
Memo Long raw 报表格式

  2、建立个窗口w_temp 定义例子变量如下:

   is_dwtypeis_dwobject //保存报表中对象类型及名称

Control控件名称 Control控件含义
Dw_pr 数据窗口对象
Cb_exit 退出按钮
Cb_savereport 报表格式保存按钮

  3、在窗口OPEN事件中加入如下代码, 校验报表格式是否存在如果存在读取定义好报表格式到数据窗口

    blob emp_pic
   long ll_handle
   ls_dwobject,ls_reportfile,ls_path
   ls_dwobject = dw_pr.dataobject
   //判断是否存在该数据窗口报表格式
   select count(*) o:ll_count from dyn_report where dwobject =:ls_dwobject;
   ll_count>0 then
     //读取报表格式文件到大文本变量
     selectblob memo o:emp_pic from dyn_report where dwobject =:ls_dwobject;
     //创建psr临时文件到硬盘
     ls_reportfile = '\temp7089.psr'
     ll_handle = FileOpen(is_reportfile,StreamMode!,write!,LockWrite!,Replace!)
     FileWrite(ll_handle,emp_pic)
     FileClose(ll_handle)
     dw_pr.dataobject = ls_reportfile
     dw_pr.transobject(sqlca)
  
     Dw_pr.transobject(sqlca)
   End
   Dw_pr.retrieve


  4、报表格式保存通过Cb_savereport按钮clicked实现

     ls_filename
   long ll_count
   blob Emp_id_pic
   ls_filename = "temp70201.psr"
   //保存报表格式到硬盘临时文件
   dw_pr.saveas(ls_filename,PSReport! ,false)
   sqlca.autocommit = true
   select count(*) o :ll_count from dyn_report where dwobject =:is_dwobject;
   ll_count =0 then
     insert o dyn_report(dwobject,rptitle)
     values(:is_dwobject,:ls_filename,:ls_path);
   end
   //从硬盘临时文件读取数据保存到数据库表中
   emp_id_pic = of_readbmpfile(ls_filename)//该将 2进制文件内容读到大文本对象中
   //更新数据库
   UPDATEBLOB dyn_report SET memo = :Emp_id_pic where dwobject = :is_dwobject;
   sqlca.autocommit = false


  5、动态报表实现通过数据窗口dw_prclicked事件捕获数据窗口中对象并将对象名存放在实现变量is_dwobject中为下步修改报表作准备

     ls_type,ls_dwoname
   //得到对象类型和名称
   ls_type = trim(upper(dwo.type))
   ls_dwoname = trim(dwo.name)
   is_dwtype = ls_type
   choose ls_type
      "TEXT","CommandButton","GROUPBOX"
       is_dwobject = ls_dwoname
       //设置为可以拖动和改变大小其它类同
       this.mody(ls_dwoname+".Resizeable='"+"1'")
       this.mody(ls_dwoname+".moveable="+"1")
     "LINE" //直线对象不能通过设置Resizeable和moveable属性进行调整,必须通过其它路径
       is_dwobject = ls_dwoname
     "RECTANGLE","ELLIPSE","GRAPH","BITMAP"
       is_dwobject = ls_dwoname
       this.mody(ls_dwoname+".Resizeable='"+"1'")
       this.mody(ls_dwoname+".moveable='"+"1'")
     "COLUMN","COMPUTE"
       is_dwobject = ls_dwoname
       this.mody(ls_dwoname+".Resizeable='"+"1'")
       this.mody(ls_dwoname+".moveable='"+"1'")
   end choose


  然后再通过mody可以实现基本动态报表操作文章较多PB中也有大量例子可直接使用在此这不再累述

  6、在cb_exit按钮clicked事件中加入:close(parent)

  7、在应用open事件中加入: open(w_temp)然后保存并运行大功告成啦!

  8、本在PB7.0加Oracle8.05下调试通过

Tags:  pb自定义函数 pb报表 pb设置日期格式 pb自定义报表

延伸阅读

最新评论

发表评论