Visual Basic 6 中的报告生成:生成报告时,我只在报告的记录中看到第一个学生的姓名

Posted

技术标签:

【中文标题】Visual Basic 6 中的报告生成:生成报告时,我只在报告的记录中看到第一个学生的姓名【英文标题】:Report Generation in Visual Basic 6: when the report is generated I only see the name of the first student in the record in the report 【发布时间】:2013-11-13 17:42:49 【问题描述】:

我正在使用 VB 开发一个自动化系统,该项目正处于最后阶段。 我正在研究报告生成。我面临的问题是,我想创建一个基于学生班级的全年报告。但是,当生成报告时,我只能看到报告中记录中第一个学生的姓名,或者如果我使用循环,我只能看到最后一个学生的姓名。

仅供参考,我将 ADODB 与 Access 数据库一起使用,并使用 ADODB.RecordSet 读取数据。

我的报告生成部分如下所示:

Set RS1 = New ADODB.recordSet
    RS1.Open "SELECT * FROM RECORDS WHERE sClass = '" & ClassBox.Text & "';", connection, 3, adLockOptimistic
    If Not RS1.EOF Then
        Set DataReport2.DataSource = RS1.DataSource
    End If
    RS1.MoveFirst

    Do Until RS1.EOF
    DataReport2.Sections("Section1").Controls("NameLbl").Caption = CStr(RS1!sName)
    DataReport2.Sections("Section1").Controls("SectionLbl").Caption = CStr(RS1!sSection)
    DataReport2.Sections("Section1").Controls("ClassLbl").Caption = CStr(RS1!sClass)

    DataReport2.Sections("Section1").Controls("JanLbl").Caption = CStr(RS1!January)
    DataReport2.Sections("Section1").Controls("FebLbl").Caption = CStr(RS1!February)
    DataReport2.Sections("Section1").Controls("MarLbl").Caption = CStr(RS1!March)
    DataReport2.Sections("Section1").Controls("AprLbl").Caption = CStr(RS1!April)
    DataReport2.Sections("Section1").Controls("MayLbl").Caption = CStr(RS1!May)
    DataReport2.Sections("Section1").Controls("JunLbl").Caption = CStr(RS1!June)
    DataReport2.Sections("Section1").Controls("JulLbl").Caption = CStr(RS1!July)
    DataReport2.Sections("Section1").Controls("AugLbl").Caption = CStr(RS1!August)
    DataReport2.Sections("Section1").Controls("SepLbl").Caption = CStr(RS1!September)
    DataReport2.Sections("Section1").Controls("OctLbl").Caption = CStr(RS1!October)
    DataReport2.Sections("Section1").Controls("NovLbl").Caption = CStr(RS1!November)
    DataReport2.Sections("Section1").Controls("DecLbl").Caption = CStr(RS1!December)
    DataReport2.Sections("Section1").Controls("TotalLbl").Caption = CStr(Val(RS1!January) + Val(RS1!February) + _
    Val(RS1!March) + Val(RS1!April) + Val(RS1!May) + Val(RS1!June) + Val(RS1!July) + Val(RS1!August) + _
    Val(RS1!September) + Val(RS1!October) + Val(RS1!November) + Val(RS1!December))
    RS1.MoveNext
    Loop
    DataReport2.Show

我想要的是创建报告,其中报告包含学生的姓名和详细信息,基于我的搜索条件,在这种情况下是班级。

【问题讨论】:

我不知道DataReport2是什么,但是需要将报表中的字段绑定到RS1中的字段。报告将负责读取数据。您只需设置报告控件的文本并在每次迭代时覆盖值。 DataReport2是Vb-6自带的报表生成工具。我知道这些字段正在被覆盖,而这正是我的问题所在。如何将“绑定”作为数据显示在“过滤”而不是“原样”的基础上。 在报表设计器中,在详细信息部分放置一个文本框,并将其DataField 属性设置为记录集中字段的名称。对要显示的每个字段重复此操作。 “过滤”将由您的查询处理。 【参考方案1】:

您可以尝试修改现有代码。如果您的控件有DataField(这取决于所使用的控件),您可以尝试设置它而不是Caption 属性。我还修改了您的查询以添加 SUM(January, ...) 字段。我相信如果您喜欢这种方法,您也可以在报告中添加一个公式字段来执行此操作。我只添加了续行,因此查询不会永远向右滚动。

Set RS1 = New ADODB.recordSet
RS1.Open "SELECT sName, sSection, sClass, January, February, March, April, " _
    & "May, June, July, August, September, October, November, December, " _
    & "(January + February + March + April + May + " _
    & "June + July + August + September + October + " _
    & "November + December) AS MonthTotal FROM RECORDS " _
    & "WHERE sClass = '" & ClassBox.Text & "'", connection, 3, adLockOptimistic

' RS1.MoveFirst - not needed

DataReport2.Sections("Section1").Controls("NameLbl").DataField = "sName"
DataReport2.Sections("Section1").Controls("SectionLbl").DataField = "sSection"
DataReport2.Sections("Section1").Controls("ClassLbl").DataField = "sClass"

DataReport2.Sections("Section1").Controls("JanLbl").DataField= "January"
DataReport2.Sections("Section1").Controls("FebLbl").DataField = "February"
DataReport2.Sections("Section1").Controls("MarLbl").DataField = "March"
DataReport2.Sections("Section1").Controls("AprLbl").DataField = "April"
DataReport2.Sections("Section1").Controls("MayLbl").DataField = "May"
DataReport2.Sections("Section1").Controls("JunLbl").DataField = "June"
DataReport2.Sections("Section1").Controls("JulLbl").DataField = "July"
DataReport2.Sections("Section1").Controls("AugLbl").DataField = "August"
DataReport2.Sections("Section1").Controls("SepLbl").DataField = "September"
DataReport2.Sections("Section1").Controls("OctLbl").DataField = "October"
DataReport2.Sections("Section1").Controls("NovLbl").DataField = "November"
DataReport2.Sections("Section1").Controls("DecLbl").DataField = "December"
DataReport2.Sections("Section1").Controls("TotalLbl").DataField = "MonthTotal"
If Not RS1.EOF Then
    Set DataReport2.DataSource = RS1
    DataReport2.Show
End If

【讨论】:

查询部分出现问题并被标记为红色。即 RS.Open "" 部分 您的查询有问题! @Priyabrata 我再次更新了查询。您的 OP 是如何将记录绑定到报告的问题。如果我的查询导致您无法纠正的错误,请至少发布您遇到的错误。 我在您的帖子中添加了屏幕截图。不是显示了吗?? 让我们continue this discussion in chat

以上是关于Visual Basic 6 中的报告生成:生成报告时,我只在报告的记录中看到第一个学生的姓名的主要内容,如果未能解决你的问题,请参考以下文章

从单元测试生成管理器报告(Visual Studio)

cmake basic

从 Visual Studio 生成声纳报告

Visual Basic 6.0(VB6.0)详细安装过程

Visual Basic 6.0 ActiveReports打印对话框打印机按钮

Visual Basic 6 中的 ADODB 连接字符串