以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  如何筛选比对两个月的数据的变化情况  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=44738)

--  作者:zhangchi96
--  发布时间:2014/1/7 23:02:00
--  如何筛选比对两个月的数据的变化情况

有个表,名称“比对表”,表里显示职工两个月的资料信息

<!--StartFragment -->
 
年月 序号 姓名 职务 职称 学科 工资 奖金 合计 考核 电话
201401 1 张三 主任 一级教师 语文 2600 1800 4400 95 12345678901
201401 2 李四 副主任 一级教师 数学 2500 1700 3200 98 12345678902
201401 3 赵武 教师 二级教师 数学 2800 1000 3800 99 12345678903
201401 4 王六 教师 二级教师 外语 1500 2000 3500 90 12345678904
201402 1 张三 主任 一级教师 语文 2600 1600 4400 95 12345678901
201402 2 王六 教师 二级教师 外语 1500 2000 3500 90 12345678904
201402 3 李四 主任 高级教师 数学 2500 1700 3200 98 12345678902
201402 4 陈七 教师 一级教师 地理 1500 2000 3500 90 12345678905
201402 5 顾九 教师 二级教师 历史 1500 2000 3500 90 12345678907
 
经过处理的结果为
 
 
年月 序号 姓名 职务 职称 学科 工资 奖金 合计 考核 电话
本月新增 4 陈七 教师 一级教师 地理 1500 2000 3500 90 12345678905
本月新增 5 顾九 教师 二级教师 历史 1500 2000 3500 90 12345678907
201401 2 李四 副主任 一级教师 数学 2500 1700 3200 98 12345678902
201402 3 李四 主任 高级教师 数学 2500 1700 3200 98 12345678902
201401 1 张三 主任 一级教师 语文 2600 1800 4400 95 12345678901
201402 1 张三 主任 一级教师 语文 2600 1600 4400 95 12345678901
本月减少 3 赵武 教师 二级教师 数学 2800 1000 3800 99 12345678903
 
处理要求:
查找在201401、201402两个月份中某个人的信息是否发生变化(对“序号”“考核”“电话”列发生变化的忽略不计)
1、如果没有变化,则删除此人的两个月的信息,
2、如果有变化,则把此人的两个月信息连续显示,并把有变化的项目内容显示为红色,
3、对在201401出现,在201402未出现的,在“年月”列显示为“本月减少”
4、对在201401没有,在201402出现的。在“年月”列显示为“本月增加”
 
求代码,恳求高手指点。
 
 
[此贴子已经被作者于2014-1-7 23:09:19编辑过]

--  作者:y2287958
--  发布时间:2014/1/7 23:18:00
--  
用循环
循环过程用find查找记录
根据查找结果新增赋值

--  作者:有点甜
--  发布时间:2014/1/7 23:41:00
--  
 上传一个例子吧,简单方便快捷。
--  作者:zhangchi96
--  发布时间:2014/1/8 22:23:00
--  

想在窗体中执行后的结果样式放在电子表格里,请多指教!

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:职工信息比对问题.rar


--  作者:有点甜
--  发布时间:2014/1/8 23:51:00
--  
 感觉还是挺不容易的……

Dim t As Table = Tables("比对表")
Dim d1 As String = "201401"
Dim d2 As String = "201402"
Dim cls() As String = {"职务", "职称", "学科", "工资", "奖金", "合计", "考核"}

Dim cs1 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs1")
Dim cs2 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs2")
Dim cs3 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs3")
cs1.backcolor = Color.red
cs2.backcolor = Color.blue
cs3.backcolor = Color.green

Dim filter1 As String = "年月 = \'" & d1 & "\'"
Dim filter2 As String = "年月 = \'" & d2 & "\'"

t.Filter = filter1 & " or " & filter2
t.Sort = "姓名,年月"

Dim r1, r2 As Row
For i As Integer = 0 To t.Rows.Count - 2
    r1 = t.Rows(i)
    r2 = t.Rows(i+1)
    
    If r1("姓名") = r2("姓名") Then \'对比
        For Each c As String In cls
            If r1(c) <> r2(c) Then
                t.Grid.SetCellStyle(i+2,t.Cols(c).Index+1,cs3)
            End If
        Next
        i += 1
    Else
        If r1("年月") = d1 Then \'减少
            For j As Integer = 2 To t.Cols.Count - 1
                t.Grid.SetCellStyle(i+1,j+1,cs2)
            Next
        Else If r1("年月") = d2 Then \'新增
            For j As Integer = 2 To t.Cols.Count - 1
                t.Grid.SetCellStyle(i+1,j+1,cs1)
            Next
        End If
    End If
Next

r1 = t.Rows(t.Rows.Count-2)
r2 = t.Rows(t.Rows.Count-1)

If r1("姓名") = r2("姓名") Then \'对比
    For Each c As String In cls
        If r1(c) <> r2(c) Then
            t.Grid.SetCellStyle(t.Rows.Count,t.Cols(c).Index+1,cs3)
        End If
    Next
Else
    If r2("年月") = d1 Then \'减少
        For j As Integer = 2 To t.Cols.Count - 1
            t.Grid.SetCellStyle(t.Rows.count,j+1,cs2)
        Next
    Else If r2("年月") = d2 Then \'新增
        For j As Integer = 2 To t.Cols.Count - 1
            t.Grid.SetCellStyle(t.Rows.Count,j+1,cs1)
        Next
    End If
End If
[此贴子已经被作者于2014-1-8 23:55:19编辑过]

--  作者:zhangchi96
--  发布时间:2014/1/9 22:07:00
--  

      太震惊了,我也只是想想,没想到真能写出这样的代码,能认真看懂了也需要好几天,还真不容易,感谢专家“有点甜”的辛勤劳作,佩服“有点甜”的睿智。

      代码确实看上去太难了,以致于想看懂了改改都没法了,所以只要再麻烦专家“有点甜”了

 

      请修改:

      原先要求里提到的,对于“考核”列的变化是要忽略的,姓名“王六”的信息除了“考核”列变化外其余没有变化,因此王六的信息视为没有变动,既然“王六”的信息没有变动,则有关“王六”的两个月的信息都需要删除,能帮我修改一下吗?


--  作者:有点甜
--  发布时间:2014/1/9 22:37:00
--  
 简单改一下,其实你只要修改前面的4行代码就可以使用了

Dim t As Table = Tables("比对表")
Dim d1 As String = "201401"
Dim d2 As String = "201402"
Dim cls() As String = {"职务", "职称", "学科", "工资", "奖金", "合计"}

Dim delCount As Integer = 0
Dim cs1 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs1")
Dim cs2 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs2")
Dim cs3 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs3")
cs1.backcolor = Color.red
cs2.backcolor = Color.blue
cs3.backcolor = Color.green

Dim filter1 As String = "年月 = \'" & d1 & "\'"
Dim filter2 As String = "年月 = \'" & d2 & "\'"

t.Filter = filter1 & " or " & filter2
t.Sort = "姓名,年月"

Dim r1, r2 As Row
Dim i As Integer = 0
Do While i < t.Rows.Count - 1
    r1 = t.Rows(i)
    r2 = t.Rows(i+1)
    
    If r1("姓名") = r2("姓名") Then \'对比
        Dim changed As Boolean = False
        For Each c As String In cls
            If r1(c) <> r2(c) Then
                t.Grid.SetCellStyle(i+2,t.Cols(c).Index+1,cs3)
                changed = True
            End If
        Next
        If changed = False Then
            r1.Delete
            r2.Delete
            delcount += 2
        Else
            i += 2
        End If
    Else
        If r1("年月") = d1 Then \'减少
            For j As Integer = 2 To t.Cols.Count - 1
                t.Grid.SetCellStyle(i+1,j+1,cs2)
            Next
        Else If r1("年月") = d2 Then \'新增
            For j As Integer = 2 To t.Cols.Count - 1
                t.Grid.SetCellStyle(i+1,j+1,cs1)
            Next
        End If
        i += 1
    End If
Loop

r1 = t.Rows(t.Rows.Count-2)
r2 = t.Rows(t.Rows.Count-1)

If r1("姓名") = r2("姓名") Then \'对比
    For Each c As String In cls
        If r1(c) <> r2(c) Then
            t.Grid.SetCellStyle(t.Rows.Count,t.Cols(c).Index+1,cs3)
        End If
    Next
Else
    If r2("年月") = d1 Then \'减少
        For j As Integer = 2 To t.Cols.Count - 1
            t.Grid.SetCellStyle(t.Rows.count,j+1,cs2)
        Next
    Else If r2("年月") = d2 Then \'新增
        For j As Integer = 2 To t.Cols.Count - 1
            t.Grid.SetCellStyle(t.Rows.Count,j+1,cs1)
        Next
    End If
End If

--  作者:zhangchi96
--  发布时间:2014/1/12 11:06:00
--  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:职工信息.table

发现两个小问题,已上传了新的附件:

1、列名称为两行时,原来的列名“职务”,改为“职务_评定”,这时得到的结果有变化:所有颜色向上偏移了一行(原来第一行是红色的,现在“职务_评定”的“评定”两字变红色了),改了好几次参数,都因为代码的逻辑复杂,没有成功.

2、当201401和201402的数据全部相同时,有出错信息,我想是不是在

    r1 = t.Rows(t.Rows.Count-2)   这句话前面加上 if t.Rows.Count>1 then    .....end if 这样的判断

 

请指教!

[此贴子已经被作者于2014-1-12 12:09:32编辑过]

--  作者:y2287958
--  发布时间:2014/1/12 19:33:00
--  

附件是俺的做法

看看是否符合你的要求,代码比较简单易懂。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:职工信息.table


--  作者:有点甜
--  发布时间:2014/1/12 19:49:00
--  
 9楼比较好。改了一下之前的代码

Dim t As Table = Tables("备份")
Dim d1 As String = "201401"
Dim d2 As String = "201402"
Dim cls() As String = {"职务_评定", "职称", "学科", "工资", "奖金", "合计"}

Dim delCount As Integer = 0
Dim cs1 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs1")
Dim cs2 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs2")
Dim cs3 As C1.Win.C1FlexGrid.CellStyle = t.grid.Styles.Add("cs3")
cs1.backcolor = Color.red
cs2.backcolor = Color.blue
cs3.backcolor = Color.green

Dim filter1 As String = "年月 = \'" & d1 & "\'"
Dim filter2 As String = "年月 = \'" & d2 & "\'"

t.Filter = filter1 & " or " & filter2
t.Sort = "姓名,年月"

Dim r1, r2 As Row
Dim i As Integer = 0
Do While i < t.Rows.Count - 1
    r1 = t.Rows(i)
    r2 = t.Rows(i+1)
    
    If r1("姓名") = r2("姓名") Then \'对比
        Dim changed As Boolean = False
        For Each c As String In cls
            If r1(c) <> r2(c) Then
                t.Grid.SetCellStyle(i+t.HeaderRows,t.Cols(c).Index+1,cs3)
                changed = True
            End If
        Next
        If changed = False Then
            r1.Delete
            r2.Delete
            delcount += 2
        Else
            i += 2
        End If
    Else
        If r1("年月") = d1 Then \'减少
            For j As Integer = 2 To t.Cols.Count - 1
                t.Grid.SetCellStyle(i+t.HeaderRows,j+1,cs2)
            Next
        Else If r1("年月") = d2 Then \'新增
            For j As Integer = 2 To t.Cols.Count - 1
                t.Grid.SetCellStyle(i+t.HeaderRows,j+1,cs1)
            Next
        End If
        i += 1
    End If
Loop

r1 = t.Rows(t.Rows.Count-2)
r2 = t.Rows(t.Rows.Count-1)

If r1("姓名") = r2("姓名") Then \'对比
    For Each c As String In cls
        If r1(c) <> r2(c) Then
            t.Grid.SetCellStyle(t.Rows.Count+t.HeaderRows-1,t.Cols(c).Index+1,cs3)
        End If
    Next
Else
    If r2("年月") = d1 Then \'减少
        For j As Integer = 2 To t.Cols.Count - 1
            t.Grid.SetCellStyle(t.Rows.count+t.HeaderRows-1,j+1,cs2)
        Next
    Else If r2("年月") = d2 Then \'新增
        For j As Integer = 2 To t.Cols.Count - 1
            t.Grid.SetCellStyle(t.Rows.Count+t.HeaderRows-1,j+1,cs1)
        Next
    End If
End If