以文本方式查看主题 - 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
[此贴子已经被作者于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老师,您辛苦了!
经过运行您提供的代码后得到的结果与设想的的有些出入具体见下图:
请您看看哪写代码造成上述结果出现。 谢谢!!! |
||||
-- 作者: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老师,下面文件是包括录入数据和运行结果的文件。
|
||||
-- 作者: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 |