Foxtable(狐表)用户栏目专家坐堂 → 如何筛选比对两个月的数据的变化情况


  共有7034人关注过本帖树形打印复制链接

主题:如何筛选比对两个月的数据的变化情况

帅哥哟,离线,有人找我吗?
zhangchi96
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
如何筛选比对两个月的数据的变化情况  发帖心情 Post By: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:4752 积分:34568 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By:2014/1/7 23:18:00 [只看该作者]

用循环
循环过程用find查找记录
根据查找结果新增赋值

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/1/7 23:41:00 [只看该作者]

 上传一个例子吧,简单方便快捷。

 回到顶部
帅哥哟,离线,有人找我吗?
zhangchi96
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2014/1/8 22:23:00 [只看该作者]

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

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


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2014/1/9 22:07:00 [只看该作者]

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

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

 

      请修改:

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


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  8楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:4752 积分:34568 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By:2014/1/12 19:33:00 [只看该作者]

附件是俺的做法

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

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


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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


 回到顶部
总数 15 1 2 下一页