怎样让datareport打印一个查询?条件由textbox输入。

xinb 2000-08-15 08:24:00
好象不能在程序中指定datareport的datasource,
数据环境设计里的sql又不能用变量。
...全文
191 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
playyuer 2000-08-16
  • 打赏
  • 举报
回复
直接使用 ADODB.Recordset 作为 DataReport 的 DataSource
欢迎访问 Http://simideal.top263.net
参阅《VB 6之数据报表使用技巧》
(这里有许多 DataReport 相关内容及例程下载)
于溪

  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 上增加分组标头和分组注脚区等,并根据控件的具体功能、用途为其定义各类控件集合,设计出更复杂的报表。

playyuer 2000-08-16
  • 打赏
  • 举报
回复
直接使用 ADODB.Recordset 做 DataReport 的 DataSource
欢迎访问 http://simideal.top263.net 有更多 DataReport 的相关内容!

VB 6之数据报表使用技巧 (例程下载)

于溪

  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 上增加分组标头和分组注脚区等,并根据控件的具体功能、用途为其定义各类控件集合,设计出更复杂的报表。
playyuer 2000-08-16
  • 打赏
  • 举报
回复
直接使用 ADODB.Recordset 作为 DataReport 的 DataSource
欢迎访问 Http://simideal.top263.net
参阅《VB 6之数据报表使用技巧》
(这里有许多 DataReport 相关内容及例程下载)
lty 2000-08-15
  • 打赏
  • 举报
回复
Access数据库的用查询对象可以附带参数。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧