首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > VB > 正文
  • VB6.0开发技巧之数据报表使用技巧
      2008-5-21  来源:中国计算机报  编辑:Jsbulo  热度:

      vb 6.0专业版和企业版中的数据报表设计器与数据环境设计器是数据访问的新内容。msdn 所提供的prjnwind.vbp 示例工程在设计阶段(design time)就已将dataenvironment设为datareport的数据源,并将打印格式也设好,这种做法不太利于程序的通用性。当然,我们也可以对dataenvironment编程,在运行阶段(run time)控制数据源。其实,datareport可以完全脱离dataenvironment,而打印由动态sql生成的recordset。

      实现代码如下:

      private sub datareport_initialize()

       …

      dim adoconnectionx as new adodb.connection

      dim adorecordsetx as new adodb.recordset

      adoconnectionx.open″provider=microsoft.jet.oledb.3.51;persist security

      info=false;data source=″ & app.path & ″\xxx.mdb″

      adorecordsetx.open ″select * from表名″, adoconnectionx

      set datareportx.datasource = adorecordsetx

      ′设置 datareport 的数据源

       …

      由vb 6 所提供的datareport.sections.item(index).controls.item(index)...这样的语法不太利于编程控制数据报表设计器的专用控件的位置、大小等各种属性。但是,我们可以编程根据控件所在区域(section)和所属类别等将它们分成若干集合(collection),然后通过控制集合的元素来控制其所代表的控件。当然,在设计阶段我们要将足够多的控件绘制到datareport上备用。实现的主要部分代码如下:

      …

      ′根据控件所在区域(section)和所属类别分集合(collection)

      dim rhsec4—rptlbl—collection as new collection

      …

      ′页标头(pageheader)区域 shape(rptshape) 控件集合

      dim phsec2—rptshp—collection as new collection

      …

      ′细节(detail)区域 textbox(rpttextbox) 控件集合

      dim dsec1—rpttxt—collection as new collection

      …

      dim ctl as object

      …

      for each ctl in me.sections.item(″section1″).controls ′section1

       select case typename(ctl)

       case ″rptlabel″

      dsec1—rptlbl—collection.add ctl

       ctl.caption = ″"

       case ″rptshape″

      dsec1—rptshp—collection.add ctl

       case ″rpttextbox″

      ctl.datafield = adorecordset.fields.item(0).name

      ′先将所有textbox(rpttextbox) 控件绑定到某一字段,否则报错!

      dsec1—rpttxt—collection.add ctl

      end select

      ctl.visible = false

      next ctl

      …

      ′以下通过控制集合的元素来准确有效的控制这些元素所代表的控件。

      dim i as integer

      dim bfmt as stddataformat

      ′定义布尔(boolean)型字段的数据格式

      set bfmt = new stddataformat

      bfmt.type = fmtboolean

      bfmt.truevalue = ″是″

      bfmt.falsevalue = ″否″

      for i = 0 to 5

      ′只打印前几个字段,shape(rptshape) 控件用来显示单元格,页标头(pageheader)区域:显示列表头(caption)

      with phsec2—rptshp—collection.item(i + 1) ′单元格

       .visible = true

       if i = 0 then

       .left = 0

       else

       .left = phsec2—rptshp—collection.item(i).left + phsec2—rptshp—collection.item(i).width

       end if

       .top = 0

       .height = 400

      ′可根据字体设 单位:缇字体的高度(单位:缇)可使用 form、picturebox 的textheight 方法或 api 获得

       .width = 1500

      ′这里可根据实际情况用数组分别设置各列的列宽

      end with

      with phsec2—rptlbl—collection.item(i + 1) ′列表头标题(caption)

       .left = phsec2—rptshp—collection.item(i + 1).left + 100

       .top = phsec2—rptshp—collection.item(i + 1).top + 100

       .height = phsec2—rptshp—collection.item(i + 1).height - 180

       .width = phsec2—rptshp—collection.item(i + 1).width - 200

       .caption = adorecordsetx.fields.item(i).name

       .alignment = rptjustifycenter

       .visible = true

      end with

      ′细节(detail)区域显示:

      with dsec1—rptshp—collection.item(i + 1) ′单元格

       if i = 0 then

       dsec1—rptshp—collection.item(i + 1).left = 0

       else

      .left = dsec1—rptshp—collection.item(i).left + dsec1—rptshp—collection.item(i).width

       end if

       .top = 0

       .height = phsec2—rptshp—collection.item(i + 1).height

       .width = phsec2—rptshp—collection.item(i + 1).width

       .visible = true

      end with

      with dsec1—rpttxt—collection.item(i + 1) ′数据

       .height = dsec1—rptshp—collection.item(i + 1).height - 180

       .left = dsec1—rptshp—collection.item(i + 1).left + 100

       .top = dsec1—rptshp—collection.item(i + 1).top + 100

       .width = dsec1—rptshp—collection.item(i + 1).width - 200

       .datafield = adorecordsetx.fields.item(i).name ′重新绑定字段

       select case adorecordsetx.fields.item(i).type ′可根据字段数据类型设置数据格式

       case adbigint, adinteger, adsmallint

       .dataformat.format = ″###,##0″

      ′数字

       .alignment = rptjustifyright

       case adboolean

       set .dataformat = bfmt

      ′布尔型字段设为自定义格式

      .alignment = rptjustifycenter

       case adcurrency

      .dataformat.format = ″###,##0.00″

      ′货币

       .alignment = rptjustifyright

       case addate, addbdate, addbtimestamp

      .dataformat.format = ″long date″

      ′日期、时间

       .alignment = rptjustifyright

       case else ′其它,如:文本等

      .alignment = rptjustifyleft

       end select

      .visible = true

      end with

      next i

      datareport1.sections.item(″section2″).height = 400

      datareport1.sections.item(″section1″).height = 400

      …

      end sub

      该方案在pwin 9.x 和vb 6.0下通过。

      如果要打印分级(层)recordset ,还要在datareport 上增加分组标头和分组注脚区等,并根据控件的具体功能、用途为其定义各类控件集合,设计出更复杂的报表。