报表制作,好长时间了,都还没有解决,希望高人多帮忙!!!!

时间:2021-12-15 11:39:17

ks表:
(科目:语文、数学、物理、化学、政治、英语)(从6科中,任选4样参加考试,每人选4科,必须是4科)
考号     姓名     科目  成绩
1        A      数学  90
1        A      语文  60
1        A      政治  90
1        A      化学  60
2        B      化学  90
2        B      物理  60
2        B      数学  90
2        B      语文  60



做成如下格式的报表:
考号   姓名    数学  语文  政治  化学
1      A     90    60    90   60

考号   姓名    化学  物理  数学  语文
1      A     90    60    90   60 
 
不要这种格式:
考号   姓名   语文  数学  物理  化学  政治  英语
1      A     60    90        60   90 
2      B     60    90   60   90

(科目顺序无要求,)

15 个解决方案

#1


这个按考号分组就行了吧

#2


引用楼主 benqlch 的帖子:
..........

做成如下格式的报表: 
考号   姓名    数学  语文  政治  化学 
1      A     90    60    90   60 

考号   姓名    化学  物理  数学  语文 
1      A     90    60    90   60  

...........


第二条应该是这样的吧:
考号   姓名    化学  物理  数学  语文 
2      B     90    60    90   60  


另外需要知道的是:每个考号的成绩是连续存放的吗?

#3


引用楼主 benqlch 的帖子:
ks表: 
(科目:语文、数学、物理、化学、政治、英语)(从6科中,任选4样参加考试,每人选4科,必须是4科) 
考号     姓名     科目  成绩 
1        A      数学  90 
1        A      语文  60 
1        A      政治  90 
1        A      化学  60 
2        B      化学  90 
2        B      物理  60 
2        B      数学  90 
2        B      语文  60 


做成如下格式的报表: 
考号   姓名    数学…

不要下面的格式就自己用代码一个一个地填充报表吧。。

#4


考号   姓名   语文  数学  物理  化学  政治  英语 
1      A     60    90        60   90  
2      B     60    90   60   90 
这种格式 显示然后用记录集 一条多打个标题就可以了吧  不是很难 就是上面的结果需要用交叉表 你的数据库是sql_server吗  报表控件用的什么

#5


VB+access,存放按考号

#6


至于报表用什么报表都可以

#7


DataReport的方法:

在ACCESS数据库中添加一个临时表tmp_ks
字段:ID(自动编号)、codes(这个保存编号用来分组)、code(你的编号字段)、s_name(你的姓名字段)、A、B、C、D分别是你6选4的成绩信息

DataReport中添加一个分组标头,上面放一个reptextbox;细节部分加6个reptextbox,添加代码:

Option Explicit


Private Sub DataReport_Initialize()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim Sql As String, strSql As String
    Dim sName As String, sValue As String
    Dim i As Integer

    
    '连接数据库,打开记录集
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
    cn.Provider = "MSDataShape"      '一定要这句,因为要用到ADO的SHAPE命令
    cn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0; " _
        & "Data Source=" & App.Path & "\Northwind.mdb;Persist " _
        & "Security Info=False;Jet OLEDB:Database Password=zxcvbnm"
    'rs.CursorLocation = adUseClient
    Sql = "SELECT code,s_name," _
        & "max(iif(course='数学',score,'')) AS 数学," _
        & "max(iif(course='语文',score,'')) AS 语文," _
        & "max(iif(course='物理',score,'')) AS 物理," _
        & "max(iif(course='化学',score,'')) AS 化学," _
        & "max(iif(course='政治',score,'')) AS 政治," _
        & "max(iif(course='外语',score,'')) AS 外语 " _
        & "FROM ks " _
        & "GROUP BY code, s_name;"
    rs.Open Sql, cn, adOpenKeyset, adLockOptimistic
    
    Sql = "DELETE FROM tmp_ks"
    cn.Execute Sql              '先删除临时表中信息
    
    '将信息归纳导入临时表
    While Not rs.EOF
        sName = ""
        sValue = ""
        For i = 2 To rs.Fields.Count - 1
            If Format(rs.Fields(i)) <> "" Then
                sName = sName & ",'" & rs.Fields(i).Name & "'"
                sValue = sValue & ",'" & rs.Fields(i).Value & "'"
            End If
        Next
        
        Sql = "insert into tmp_ks(codes,code,s_name,A,B,C,D) values " & _
            "('" & rs!code & "','考号','姓名'" & sName & ")"
        cn.Execute Sql
        
        Sql = "insert into tmp_ks(codes,code,s_name,A,B,C,D) values " & _
            "('" & rs!code & "','" & rs!code & "','" & rs!s_name & "'" & sValue & ")"
        cn.Execute Sql
        
        rs.MoveNext
    Wend
    Set rs = Nothing
    
    '打开临时表记录集
    Sql = "SELECT codes,code,s_name,A,B,C,D FROM tmp_ks ORDER BY ID"
   '用SHAPE命令分组
    strSql = "SHAPE {" & Sql & "} " & _
        "AS rst COMPUTE rst BY codes "
    Set rs = New ADODB.Recordset
    rs.Open strSql, cn, adOpenStatic, adLockReadOnly
    
    Set DataReport1.DataSource = rs
    
    '设置报表控件属性
        '分组标头,不用设置DataMember
    DataReport1.Sections("Section6").Controls("text1").DataField = "codes"
    DataReport1.Sections("Section6").Controls("text1").Visible = False     '隐藏分组信息
        '细节标头
    DataReport1.Sections("Section1").Controls("text2").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text2").DataField = "code"
    DataReport1.Sections("Section1").Controls("text3").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text3").DataField = "s_name"
    DataReport1.Sections("Section1").Controls("text4").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text4").DataField = "A"
    DataReport1.Sections("Section1").Controls("text5").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text5").DataField = "B"
    DataReport1.Sections("Section1").Controls("text6").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text6").DataField = "C"
    DataReport1.Sections("Section1").Controls("text7").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text7").DataField = "D"
    
End Sub



你可以用其它报表工具或EXCEL做,这样比较好控制格式
DataReport有一定的局限性,这儿只是一个思路

#8


有没有源文件给我一个啊!!QQ37894162

#9


你留个信箱,我发给你

#10


access的?没用过,算了。
如果是Excel的就太容易搞定了。

#11


我的想法是将8科分别赋一个值:1、2、4、8、16、32 然后再建立一个临时表:字段2个:科目值、考号,然后把成绩库中的考生通过考号排序并取得他的科目取值,然后把四科的值和写入临时表的科目值,把考号写入临时表的考号。例如语1、数2、外4、政8、物16、化32,则某考生考了语、数、外、化,科目值则是:39。得到一个可以按科目值排序的临时表,打印报表时,先从临时表中取得科目值相同的学生的考生号,这样就能再根据考号去查询数据库,从而打印报表。如果还无法解决可以联系我。

#12


学习

#13


我想了一个笨办法,在下面表修改.

考号   姓名   语文  数学  物理  化学  政治  英语 
1      A     60    90        60   90  
2      B     60    90   60   90 

VB+ACCESS+activereport 中
使用 textbox  lable 的
width visible (内容为空是width=0  visible 不可见)
left确定位置



经验证,可行.
就不要临时表了>

各大虾可行不???????????????!!!!!!!!!!!!!


有要源码的:QQ37894162

#14


引用 13 楼 benqlch 的回复:
..........

经验证,可行. 
就不要临时表了> 

各大虾可行不???????????????!!!!!!!!!!!!! 


能正确得出结果就行,能正确、高效的得出结果更行。
不能得出正确结果就不行,有时正确、有时出错也不行。

解决同一个问题,有多种方法。
区别在于:
有的方法正确,有的方法错误。
有的方法简单,有的方法复杂。
有的方法逻辑清晰,有的方法令人‘费解’。
有的方法高效、快速,有的方法耗资、耗时。

#15


估计你现在要解决的问题是怎样把所有四科考试相同的考号找出来,再打印在一起。如果你仅仅是打印一个考生分数条,每个考生都要打印考试科目为表头。那就容易了。你那种方法就能解决。

#1


这个按考号分组就行了吧

#2


引用楼主 benqlch 的帖子:
..........

做成如下格式的报表: 
考号   姓名    数学  语文  政治  化学 
1      A     90    60    90   60 

考号   姓名    化学  物理  数学  语文 
1      A     90    60    90   60  

...........


第二条应该是这样的吧:
考号   姓名    化学  物理  数学  语文 
2      B     90    60    90   60  


另外需要知道的是:每个考号的成绩是连续存放的吗?

#3


引用楼主 benqlch 的帖子:
ks表: 
(科目:语文、数学、物理、化学、政治、英语)(从6科中,任选4样参加考试,每人选4科,必须是4科) 
考号     姓名     科目  成绩 
1        A      数学  90 
1        A      语文  60 
1        A      政治  90 
1        A      化学  60 
2        B      化学  90 
2        B      物理  60 
2        B      数学  90 
2        B      语文  60 


做成如下格式的报表: 
考号   姓名    数学…

不要下面的格式就自己用代码一个一个地填充报表吧。。

#4


考号   姓名   语文  数学  物理  化学  政治  英语 
1      A     60    90        60   90  
2      B     60    90   60   90 
这种格式 显示然后用记录集 一条多打个标题就可以了吧  不是很难 就是上面的结果需要用交叉表 你的数据库是sql_server吗  报表控件用的什么

#5


VB+access,存放按考号

#6


至于报表用什么报表都可以

#7


DataReport的方法:

在ACCESS数据库中添加一个临时表tmp_ks
字段:ID(自动编号)、codes(这个保存编号用来分组)、code(你的编号字段)、s_name(你的姓名字段)、A、B、C、D分别是你6选4的成绩信息

DataReport中添加一个分组标头,上面放一个reptextbox;细节部分加6个reptextbox,添加代码:

Option Explicit


Private Sub DataReport_Initialize()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim Sql As String, strSql As String
    Dim sName As String, sValue As String
    Dim i As Integer

    
    '连接数据库,打开记录集
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
    cn.Provider = "MSDataShape"      '一定要这句,因为要用到ADO的SHAPE命令
    cn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0; " _
        & "Data Source=" & App.Path & "\Northwind.mdb;Persist " _
        & "Security Info=False;Jet OLEDB:Database Password=zxcvbnm"
    'rs.CursorLocation = adUseClient
    Sql = "SELECT code,s_name," _
        & "max(iif(course='数学',score,'')) AS 数学," _
        & "max(iif(course='语文',score,'')) AS 语文," _
        & "max(iif(course='物理',score,'')) AS 物理," _
        & "max(iif(course='化学',score,'')) AS 化学," _
        & "max(iif(course='政治',score,'')) AS 政治," _
        & "max(iif(course='外语',score,'')) AS 外语 " _
        & "FROM ks " _
        & "GROUP BY code, s_name;"
    rs.Open Sql, cn, adOpenKeyset, adLockOptimistic
    
    Sql = "DELETE FROM tmp_ks"
    cn.Execute Sql              '先删除临时表中信息
    
    '将信息归纳导入临时表
    While Not rs.EOF
        sName = ""
        sValue = ""
        For i = 2 To rs.Fields.Count - 1
            If Format(rs.Fields(i)) <> "" Then
                sName = sName & ",'" & rs.Fields(i).Name & "'"
                sValue = sValue & ",'" & rs.Fields(i).Value & "'"
            End If
        Next
        
        Sql = "insert into tmp_ks(codes,code,s_name,A,B,C,D) values " & _
            "('" & rs!code & "','考号','姓名'" & sName & ")"
        cn.Execute Sql
        
        Sql = "insert into tmp_ks(codes,code,s_name,A,B,C,D) values " & _
            "('" & rs!code & "','" & rs!code & "','" & rs!s_name & "'" & sValue & ")"
        cn.Execute Sql
        
        rs.MoveNext
    Wend
    Set rs = Nothing
    
    '打开临时表记录集
    Sql = "SELECT codes,code,s_name,A,B,C,D FROM tmp_ks ORDER BY ID"
   '用SHAPE命令分组
    strSql = "SHAPE {" & Sql & "} " & _
        "AS rst COMPUTE rst BY codes "
    Set rs = New ADODB.Recordset
    rs.Open strSql, cn, adOpenStatic, adLockReadOnly
    
    Set DataReport1.DataSource = rs
    
    '设置报表控件属性
        '分组标头,不用设置DataMember
    DataReport1.Sections("Section6").Controls("text1").DataField = "codes"
    DataReport1.Sections("Section6").Controls("text1").Visible = False     '隐藏分组信息
        '细节标头
    DataReport1.Sections("Section1").Controls("text2").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text2").DataField = "code"
    DataReport1.Sections("Section1").Controls("text3").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text3").DataField = "s_name"
    DataReport1.Sections("Section1").Controls("text4").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text4").DataField = "A"
    DataReport1.Sections("Section1").Controls("text5").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text5").DataField = "B"
    DataReport1.Sections("Section1").Controls("text6").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text6").DataField = "C"
    DataReport1.Sections("Section1").Controls("text7").DataMember = "rst"
    DataReport1.Sections("Section1").Controls("text7").DataField = "D"
    
End Sub



你可以用其它报表工具或EXCEL做,这样比较好控制格式
DataReport有一定的局限性,这儿只是一个思路

#8


有没有源文件给我一个啊!!QQ37894162

#9


你留个信箱,我发给你

#10


access的?没用过,算了。
如果是Excel的就太容易搞定了。

#11


我的想法是将8科分别赋一个值:1、2、4、8、16、32 然后再建立一个临时表:字段2个:科目值、考号,然后把成绩库中的考生通过考号排序并取得他的科目取值,然后把四科的值和写入临时表的科目值,把考号写入临时表的考号。例如语1、数2、外4、政8、物16、化32,则某考生考了语、数、外、化,科目值则是:39。得到一个可以按科目值排序的临时表,打印报表时,先从临时表中取得科目值相同的学生的考生号,这样就能再根据考号去查询数据库,从而打印报表。如果还无法解决可以联系我。

#12


学习

#13


我想了一个笨办法,在下面表修改.

考号   姓名   语文  数学  物理  化学  政治  英语 
1      A     60    90        60   90  
2      B     60    90   60   90 

VB+ACCESS+activereport 中
使用 textbox  lable 的
width visible (内容为空是width=0  visible 不可见)
left确定位置



经验证,可行.
就不要临时表了>

各大虾可行不???????????????!!!!!!!!!!!!!


有要源码的:QQ37894162

#14


引用 13 楼 benqlch 的回复:
..........

经验证,可行. 
就不要临时表了> 

各大虾可行不???????????????!!!!!!!!!!!!! 


能正确得出结果就行,能正确、高效的得出结果更行。
不能得出正确结果就不行,有时正确、有时出错也不行。

解决同一个问题,有多种方法。
区别在于:
有的方法正确,有的方法错误。
有的方法简单,有的方法复杂。
有的方法逻辑清晰,有的方法令人‘费解’。
有的方法高效、快速,有的方法耗资、耗时。

#15


估计你现在要解决的问题是怎样把所有四科考试相同的考号找出来,再打印在一起。如果你仅仅是打印一个考生分数条,每个考生都要打印考试科目为表头。那就容易了。你那种方法就能解决。