以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]如何分类统计答题错误信息  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=88986)

--  作者:33chyh
--  发布时间:2016/8/12 21:17:00
--  [求助]如何分类统计答题错误信息
 

大红袍老师您好!

很感谢您一直以来的无私、耐心、细致地指导,使我在实现自己目标的路上克服了一个又一个困难。目前遇到一个比较复杂问题,不知道在“卷1答”的datacolchanged事件中编写怎样的代码才能实现如下复杂的功能:

1、统计客观题出现问题的人数并将对应学生姓名进行统计。

具体设想是将下图中1表中每个同学的三道客观题答案与客观题答案表中对应的答案进行对比,找到它们之间的不同点后统计对应错误选项人数和学生姓名,将这些信息写入“卷1统”表对应的单元格中。例如,李雷同学的1表中客观题1”列的录入结果是“abc”,而客观题答案表中的客观题1”列是“ab”,那么它们之间的不同点是c。在“卷1统”表“错误人数”列和统计号为“C1”行交叉的单元格中计数为1;将字符“李雷”填到“错误学生”列和统计号为“C1”行交叉的单元格中。艾华同学的1表中客观题1”列的录入结果是“cd”,而客观题答案表中的客观题1”列是“ab”,那么它们之间的不同点是abcd。在“卷1统”表“错误人数”列和统计号为“A1”行交叉的单元格中计数为1,“错误人数”列和统计号为“B1”行交叉的单元格中计数1 ,“错误人数”列和统计号为“C1”行交叉的单元格中计数2 ,“错误人数”列和统计号为“D1”行交叉的单元格中计数1;将字符“艾华”追加填到“错误学生”列和统计号分别为“A1”、“B1”、“C1”、“D1”行交叉的单元格中。

2统计主观题出现问题的人数并将对应学生姓名进行统计。

只有当“卷1答”表中各“主观题”的答案为“F”时,在“卷1统”表中“错误人数”列和对应统计号的交叉单元格中计数,在“错误学生”列和对应统计号的交叉单元格中追加学生姓名。例如李雷在“卷1答”表中“主观题1”的答案为“F”,则在“卷1统”表中“错误人数”列和对应统计号为“主观1”的交叉单元格中计数为1,“错误学生”列和对应统计号为“主观1”的交叉单元格中追加学生姓名“李雷”。其他同学的主观题答案只有为“F”时进行上述统计。

具体图示和文件如下


此主题相关图片如下:8.jpg
按此在新窗口浏览图片
 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:管理项目3.foxdb

[此贴子已经被作者于2016/8/12 21:17:44编辑过]

--  作者:Hyphen
--  发布时间:2016/8/13 14:31:00
--  
Dim dr As Row = Tables("客观题答案").Rows(0)
Dim lst1 As new List(of String)
Dim lst2 As new List(of String)
For Each r As Row In Tables("卷1答").Rows
    For Each c As Col In Tables("卷1答").Cols
        If r.IsNull(c.Name) Then Continue For
        If c.Name.StartsWith("客观题") Then
            
            lst1.Clear
            lst2.Clear
            Dim v As String = r(c.Name)
            For i As Integer = 0 To v.Length-1
                lst1.Add(v(i))
            Next
            v = dr(c.Name)
            For j As Integer = 0 To v.Length-1
                If lst1.Contains(v(j)) Then
                    lst1.Remove(v(j))
                Else
                    lst2.Add(v(j))
                End If
            Next
            lst1.AddRange(lst2.ToArray())
            For Each s As String In lst1
                Dim filter = "统计号 = \'" & c.Name.Replace("客观题","") & s.ToUpper() & "\'"
                Dim drt As DataRow = DataTables("卷1统").Find(filter)
                drt("错误人数") = drt("错误人数")+1
                drt("错误学生") = (drt("错误学生") & "," & r("姓名")).trimstart(",")
            Next
        ElseIf c.Name.StartsWith("主观题") Then
            If r(c.Name) = "F" Then
                Dim filter = "统计号 = \'" & c.Name.Replace("观题","") &  "\'"
                Dim drt As DataRow = DataTables("卷1统").Find(filter)
                drt("错误人数") = drt("错误人数")+1
                drt("错误学生") = (drt("错误学生") & "," & r("姓名")).trimstart(",")
            End If
        End If
    Next
Next

--  作者:33chyh
--  发布时间:2016/8/13 16:25:00
--  
Hyphen老师,您辛苦了!
经过运行您提供的代码后得到的结果与设想的的有些出入具体见下图: 


图片点击可在新窗口打开查看此主题相关图片如下:11.jpg
图片点击可在新窗口打开查看

请您看看哪写代码造成上述结果出现。

谢谢!!!


--  作者:Hyphen
--  发布时间:2016/8/13 16:28:00
--  
上传包含数据的完整例子
--  作者:Hyphen
--  发布时间:2016/8/13 16:31:00
--  
如果重复执行,先清空表的数据DataTables("卷1统").DeleteFor("")
--  作者:33chyh
--  发布时间:2016/8/13 17:00:00
--  

Hyphen老师,下面文件是包括录入数据和运行结果的文件。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目3.foxdb


 


--  作者:Hyphen
--  发布时间:2016/8/13 17:14:00
--  
2楼代码测试没有问题,结果和6楼项目数据一样。

代码放到命令行执行,或者写按钮事件执行,不能放到表事件中

--  作者:33chyh
--  发布时间:2016/8/13 17:22:00
--  
Hyphen老师您好!按照您建议的做后,能达到要求。目前还没有到设置按钮那个程度,我想在datacolchanged事件中运行。请您再帮我看看!
--  作者:33chyh
--  发布时间:2016/8/13 17:35:00
--  
其他统计程序的代码也都在“卷1答”的datacolchanged事件中。
--  作者:大红袍
--  发布时间:2016/8/14 12:53:00
--  
Dim dr As Row = Tables("客观题答案").Rows(0)
Dim lst1 As new List(of String)
Dim lst2 As new List(of String)
For Each r As Row In Tables("卷1答").Rows
    For Each c As Col In Tables("卷1答").Cols
        If r.IsNull(c.Name) Then Continue For
        If c.Name.StartsWith("客观题") Then
           
            lst1.Clear
            lst2.Clear
            Dim v As String = r(c.Name)
            For i As Integer = 0 To v.Length-1
                lst1.Add(v(i))
            Next
            v = dr(c.Name)
            For j As Integer = 0 To v.Length-1
                If lst1.Contains(v(j)) Then
                    lst1.Remove(v(j))
                Else
                    lst2.Add(v(j))
                End If
            Next
            lst1.AddRange(lst2.ToArray())
            For Each s As String In lst1
                Dim filter = "统计号 = \'" & c.Name.Replace("客观题","") & s.ToUpper() & "\'"
                Dim drt As DataRow = DataTables("卷1统").Find(filter)
                If drt("错误学生").Contains(r("姓名")) = False Then
                    drt("错误人数") = drt("错误人数")+1
                   
                    drt("错误学生") = (drt("错误学生") & "," & r("姓名")).trimstart(",")
                End If
            Next
        ElseIf c.Name.StartsWith("主观题") Then
            If r(c.Name) = "F" Then
                Dim filter = "统计号 = \'" & c.Name.Replace("观题","") &  "\'"
                Dim drt As DataRow = DataTables("卷1统").Find(filter)
                If drt("错误学生").Contains(r("姓名")) = False Then
                    drt("错误人数") = drt("错误人数")+1
                    drt("错误学生") = (drt("错误学生") & "," & r("姓名")).trimstart(",")
                end if
            End If
        End If
    Next
Next