问题一
我做<人事管理系统>报表的时候是直接在DataEnvironment1中选择source of data中的 database object项的table直接选择所用的表,而没有在sql statement中写aql语句。我现在有一个问题:我想报表每一页只显示一个员工的员工信息,并且可以直接在报表中查询(如按员工号、姓名等)所需的。请问应该如何做,我现在对sql语句不是很熟,望高手赐教。问题二
我在VB程序(已编译成EXE文件)在安装了VB6的机器上运行正常,而在没有安装VB的机器上运行时提示:运行时错误173  定义的应用程序或对象错误。请问这是怎么回事啊?

解决方案 »

  1.   

    1.你把底下的Section拉到足够下,就可以分页了,一页只有一条记录,再把数据位置调整好就可以了。并设置细节区的Keeptogether=true
    2.你需要打包,做成安装文件。
      

  2.   

    “开始”菜单里面Package & Deployment Wizard,这是vb自带的打包工具,可以把程序用到的相关dll、ocx等打成一个安装包
      

  3.   

    我想在报表上添加一个查证功能,按要求打印,请问怎么做啊
    我不会用SQL啊,能不能详点,我的数据库名为data.表名为员工基本信息,字段有员工号,姓名啊什么的
      

  4.   

    Option ExplicitDim adoConnectionX As New ADODB.Connection
    Dim adoRecordsetX As New ADODB.RecordsetPrivate Sub DataReport_Initialize()
      'printer.Orientation =
      '以下准备数据源(记录集)
      '要打印的数据源(记录集)必须是一个全局级别的,或者是本设计器模块级别的记录集
      
      '数据库使用的是 Northwind.mdb
      adoConnectionX.Open "dsn=sybase;uid=sa;pwd=abcd1234" '"Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & App.Path & "\Northwind.mdb"
      adoRecordsetX.Open "select * from STUDENTCARD", adoConnectionX
        
      Set DataReport1.DataSource = adoRecordsetX '设置 DataReport 的数据源
      
      '-------------------------------------------------------------------------
      '以下根据控件所在区域(Sections)和所属控件类别等将它们分成若干集合
      
      Dim PHSec2_RptLbl_Collection As New Collection '页标头(PageHeader)区域 Label(RptLabel) 控件集合
      Dim DSec1_RptLbl_Collection As New Collection  '细节(Detail)区域 Label(RptLabel) 控件集合
      Dim PFSec3_RptLbl_Collection As New Collection '页注脚(PageFooter)区域 Label(RptLabel) 控件
      
      Dim PHSec2_RptShp_Collection As New Collection '页标头(PageHeader)区域 Shape(RptShape) 控件集合
      Dim DSec1_RptShp_Collection As New Collection  '细节(Detail)区域 Shape(RptShape) 控件集合
      Dim PFSec3_RptShp_Collection As New Collection '页注脚(PageFooter)区域 Shape(RptShape) 控件集合
      
      Dim DSec1_RptTxt_Collection As New Collection  '细节(Detail)区域  TextBox(RptTextBox) 控件集合
                                                     'TextBox (RptTextBox) 控件只能绘制到细节(Detail)区域
      
      Dim PHSec2_RptImg_Collection As New Collection '页标头(PageHeader)区域 Image(RptImage) 控件集合
      Dim DSec1_RptImg_Collection As New Collection  '细节(Detail)区域 Image(RptImage) 控件集合
      Dim PFSec3_RptImg_Collection As New Collection '页注脚(PageFooter)区域 Image(RptImage) 控件集合
      
      Dim PHSec2_RptLine_Collection As New Collection '页标头(PageHead)区域 Line(RptLine) 控件集合
      Dim DSec1_RptLine_Collection As New Collection  '细节(Detail)区域 Line(RptLine) 控件集合
      Dim PFSec3_RptLine_Collection As New Collection '页注脚(PageFooter)区域 Line(RptLine) 控件集合
      
      Dim Ctl 'As Object
      
      For Each Ctl In DataReport1.Sections.Item("Section2").Controls  'Section2
        Select Case TypeName(Ctl)
          Case "RptLabel"
            PHSec2_RptLbl_Collection.Add Ctl
            Ctl.Caption = ""
          Case "RptShape"
            PHSec2_RptShp_Collection.Add Ctl
          Case "RptLine"
            PHSec2_RptLine_Collection.Add Ctl
          Case "RptImage"
            PHSec2_RptImg_Collection.Add Ctl
        End Select
        Ctl.Left = 0
        Ctl.Top = 0
        Ctl.Height = 300
        Ctl.Width = (Rnd + 1) * 600
        Ctl.Visible = False
      Next Ctl
      
      For Each Ctl In DataReport1.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 = adoRecordsetX.Fields.Item(0).Name '先将所有TextBox(RptTextBox) 控件绑定到某一字段
                                                                             '否则报错!
                           DSec1_RptTxt_Collection.Add Ctl
                      Case "RptLine"
                           DSec1_RptLine_Collection.Add Ctl
                      Case "RptImage"
                           DSec1_RptImg_Collection.Add Ctl
               End Select
               Ctl.Left = 0
               Ctl.Top = 0
               Ctl.Height = 400
               Ctl.Width = 600
               Ctl.Visible = False
      Next Ctl
      
      For Each Ctl In DataReport1.Sections.Item("Section3").Controls  'Section3
               Select Case TypeName(Ctl)
                      Case "RptLabel"
                           PFSec3_RptLbl_Collection.Add Ctl
                           Ctl.Caption = ""
                      Case "RptShape"
                           PFSec3_RptShp_Collection.Add Ctl
                      Case "RptLine"
                           PFSec3_RptLine_Collection.Add Ctl
                      Case "RptImage"
                           PFSec3_RptImg_Collection.Add Ctl
               End Select
               Ctl.Left = 0
               Ctl.Top = 0
               Ctl.Height = 400
               Ctl.Width = (Rnd + 1) * 600
               Ctl.Visible = False
      Next Ctl
      

  5.   

    '------------------------------------------------------------------------
      '以下可根据实际情况通过控制集合的元素来准确有效的控制这些元素所代表的控件。
      '例如:
      Dim i As Integer
      
      Dim bFmt As StdDataFormat  '定义布尔(Boolean)型字段的数据格式
      Set bFmt = New StdDataFormat
      bFmt.Type = fmtBoolean
      bFmt.TrueValue = "是"
      bFmt.FalseValue = "否"
      
      For i = 0 To 6 '只打印前七个字段
         '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 '这里可根据实际情况分别设置各列的列宽
               .BorderColor = vbRed
               .BorderStyle = rptBSSolid
               .Shape = rptShpRectangle
          End With
          With PHSec2_RptLbl_Collection.Item(i + 1) '列表头标题(Caption)
               .Visible = True
               .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
               
               .BorderStyle = rptBSSolid '调试用
               .BorderColor = vbGreen    '调试用
               .BackStyle = rptBkOpaque  '调试用
               .BackColor = vbYellow     '调试用
               
                        
               .Alignment = rptJustifyCenter
               .Font.Name = ""
      
               .Font.Size = 10
               .Font.Bold = False
               .Font.Italic = False
               .Font.Strikethrough = False
               .Font.Underline = False
               .ForeColor = vbBlue
          End With
          '细节(Detail)区域显示:
          With DSec1_RptShp_Collection.Item(i + 1) '单元格
               .Visible = True
               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
               .BorderColor = PHSec2_RptShp_Collection.Item(i + 1).BorderColor
               .BorderStyle = PHSec2_RptShp_Collection.Item(i + 1).BorderStyle
               .Shape = PHSec2_RptShp_Collection.Item(i + 1).Shape
          End With
          With DSec1_RptTxt_Collection.Item(i + 1) '数据
               .Visible = True
               .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
                      
               .Font.Name = PHSec2_RptLbl_Collection.Item(i + 1).Font.Name
               .Font.Size = PHSec2_RptLbl_Collection.Item(i + 1).Font.Size
               .Font.Bold = PHSec2_RptLbl_Collection.Item(i + 1).Font.Bold
               .Font.Italic = PHSec2_RptLbl_Collection.Item(i + 1).Font.Italic
               .Font.Strikethrough = PHSec2_RptLbl_Collection.Item(i + 1).Font.Strikethrough
               .Font.Underline = PHSec2_RptLbl_Collection.Item(i + 1).Font.Underline
               .ForeColor = PHSec2_RptLbl_Collection.Item(i + 1).ForeColor
               
               .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
              
      '         .BorderStyle = rptBSSolid '调试用
      '         .BorderColor = vbGreen    '调试用
      '         .BackStyle = rptBkOpaque  '调试用
      '         .BackColor = vbYellow     '调试用
               
      
          End With
      Next i
      
      DataReport1.Sections.Item("Section2").Height = 400
      DataReport1.Sections.Item("Section1").Height = 400
      
      'VB6 提供的控制方法不利于编程分别控制各类控件:
      Debug.Print Me.Sections.Item("Section2").Controls.Item("Label1").Caption
    End SubPrivate Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
      adoConnectionX.Close  Set adoConnectionX = Nothing
      Set adoRecordsetX = Nothing
    End Sub
      

  6.   

    我给你的这是动态创建报表的例子,包括连接数据,通过SQL语句进行数据表的检索.问题2:需要进行打包安装才可以正常使用,数据库程序,一定要将MDAC_TYP.EXE数据包带上!!