Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
foxtable有自动标注已修改过单元格并用红色白字显示的功能。但是一保存数据色彩消失,同时导出为Excel时也无法保存显示色彩。
但有些时候,比如一家公司的办事机构,每天都需要更新报表,按常规的做法,用Excel记录,每天发报表,有更新内容的单元格用色彩标注出来。
现在用foxtable,我们可以做到让有更新的单元格自动显示更新,而且可以显示当天的更新内容,无论是否保存数据或是多次打开项目,都可以实时显示当天的更新内容的单元格。且可以实时跟综每一个单元格什么时候由谁进行了更新,更新前的内容以及更新后的内容等。虽然暂时不是很好用,但是基本上也是可以解决一些问题。目前还在抽空学习,希望大家也多帮忙指教。
现在自己瞎弄了一下,基本上可以满足要求。思路是这样子的,在原有报表上新增加两列,一列用于记录历史操作的记录(什么时候由谁更新了什么内容,更新前后的内容等),另一列用于记录该单元格是什么时候更新的,就是它的最近的更新时间。
附上附件,请各位指教,我不太会编程,业余学习的,不好的地方还请各位多指点。
现在还有一些问题存在问题:
1、显示单元格只能显示最新的更新日期并标色,不能做到想找哪一天的更新内容就显示那一天的更新内容,就算在这一天之后该单元格有再次更新过;
2、假如,有一个单元格里面有一值“已验收”,我该成了“已回款”,这时单元格标注了底色,但是当我发现改错了的时候,又改回了“已验收”虽然已经改回了原来的值,但是还是显示标注的底色,而无法做到改如果改回原值就不会显示标注;
请问各位有无更好的方法,包括代码的优化等。
在窗口右侧文本框中输入想查看的日期并回车确定。就可以查看内容的最近修改日期。(其中暂时有2011-11-17,2011-11-18,2011-11-19,2011-11-20可供选择,每一日期都有底色标注。)
请注意,因为新建一个项目的关系,个别代码中的备注信息没有按新命名的列进行更新,看本贴的代码更准。
以下为表结构:
表A
工程编号() ----> 字符型(50)
工程名称() ----> 字符型(50)
工程监理单位() ----> 字符型(50)
工程进度() ----> 字符型(50)
操作历史记录() ----> 字符型(536870910)
内容修改时间() ----> 字符型(536870910)
请注意:该实例是提前自定义了样式,名为“标注底色”,以下是输出代码:
项目事件
AfterOpenProject
Forms("窗口1").Open
表事件
表A_DataColChanging
If e.DataCol.Name <> "内容修改时间" Then '如果选中的列不是"备注"
'********************************************************************************************************
If e.DataRow.isnull("内容修改时间") Or e.DataRow("内容修改时间") = "" Then '如果"内容修改时间"列内容为空
For Each col As DataCol In e.DataTable.DataCols '历遍表中的每一列
If col.Name <> "内容修改时间" '排除掉表中的"内容修改时间"列
e.DataTable .DataCols("内容修改时间").AllowEdit = True '解锁"内容修改时间"列
e.DataRow("内容修改时间") = e.DataRow("内容修改时间") & "[" & col.Name & "]" & "修改时间:" & "0001-01-01" '按特定的格式填入内容
e.DataTable .DataCols("内容修改时间").AllowEdit = False '锁"内容修改时间"列
End If
Next
End If
'**************************************************************************************************
If e.DataRow("内容修改时间") <> "" Then '如果"内容修改时间"列不为空
Dim 备注内容 As String = e.DataRow("内容修改时间") '定义字符串"备注内容"取内容修改时间列中的内容
'---------------------------------------------------------------------------------
If e.OldValue <> e.NewValue Then '如果旧值与新值不相等,说明有修改
Dim str1 As String = "[" & e.DataCol.Name & "]" & "修改时间:"
Dim 修改位置 As Integer = 备注内容.IndexOf(str1) + str1.Length 'str1的起始位置+str1的长度,即定位所修改的列记录日期的起始位置
Dim 原日期 As String = 备注内容.SubString(修改位置,10) '记录下"内容修改时间"列中目前修改列的原来记录日期
Dim 需修改内容 As String = str1 & 原日期 '如要替换的内容
'###################################################################################
If 备注内容.Contains(str1) Then '确认"内容修改时间"列是否包含str1的内容
Dim 修改后内容 As String = 备注内容.Replace(需修改内容,str1 & CStr(Date.Today)) '用今天的日期更新掉原来的记录日期
e.DataTable .DataCols("内容修改时间").AllowEdit = True '解锁"备注"列
e.DataRow("内容修改时间") = 修改后内容 '重新给"内容修改时间"列内容
e.DataTable .DataCols("内容修改时间").AllowEdit = False '锁"内容修改时间"列
End If
'###################################################################################
'---------------------------------------------------------------------------------
End If
End If
'********************************************************************************************************
End If
表A_DataColChanged
If e.DataCol.Name <> "操作历史记录" And e.NewValue <> e.OldValue Then '非选择"操作历史记录列",输入值与原来不一致
'以下语句为记录操作记录
If e.DataCol.Name <> "内容修改时间" Then
e.DataRow("操作历史记录") = e.DataRow("操作历史记录") & User.Name & "|" & CStr(Date.Now) & "|修改了站点:|" & e.DataRow("工程名称") & "|" & e.DataCol.Name & "|原来是:|" & cstr(e.OldValue) & "|修改后是:|" & CStr(e.NewValue) & vbcrlf
End If
End If
表A_DataRowAdded
If e.DataRow.isnull("内容修改时间") Or e.DataRow("内容修改时间") = "" Then '如果"内容修改时间"列内容为空
For Each col As DataCol In e.DataTable.DataCols '历遍表中的每一列
If col.Name <> "内容修改时间" '排除掉表中的"内容修改时间"列
e.DataTable .DataCols("内容修改时间").AllowEdit = True '解锁"备注"列
e.DataRow("内容修改时间") = e.DataRow("内容修改时间") & "[" & col.Name & "]" & "修改时间:" & "0001-01-01" '按特定的格式填入内容
e.DataTable .DataCols("内容修改时间").AllowEdit = False '锁"内容修改时间"列
End If
Next
End If
表A_DrawCell
Dim 备注内容 As String = e.Row("内容修改时间")
For R As Integer = 0 To e.Table.Rows.Count
For Each cl As Col In e.Table.Cols
If cl.Name <> "内容修改时间" Then
Dim 位置 As Integer = 备注内容.IndexOf(e.col.Name) + e.col.Name.Length + 6 '"]修改时间:"
Dim 记录日期 As String = 备注内容.SubString(位置,10)
If 记录日期 = Vars("内容修改记录日期") Then
e.Style = "标注底色"
End If
End If
Next
Next
窗口与控件事件
窗口1_AfterLoad
Vars("内容修改记录日期") = CStr(Date.Today)
窗口1_Button1_Click
With Forms("窗口1").Controls("TextBox1")
If .value = "" Then
.value = CStr(Date.Today)
Vars("内容修改记录日期") = .value
Else
Vars("内容修改记录日期") = .value
End If
End With
Dim tbname As String = Vars("内容修改记录日期") & CurrentTable.Name
Dim flg As New SaveExcelFlags
flg.RowNumber = True
flg.CellStyle = True
flg.MergedRanges = True
CurrentTable.SaveExcel("C:工程进度跟综表.xls",tbname,flg)
窗口1_Button2_Click
With Forms("窗口1").Controls("TextBox1")
.value = CStr(Date.Today)
Vars("内容修改记录日期") = .value
End With
CurrentTable.Refresh
窗口1_TextBox1_ValueChanged
With Forms("窗口1").Controls("TextBox1")
Vars("内容修改记录日期") = .value
End With
CurrentTable.Refresh
下载信息 [文件大小: 下载次数: ] | |
![]() |
你的两个问题,都应该用独立的表来记载第一次保存后的修改情况,这样就可以记录所有修改的情况;如果改表有一修改前的列,那么就可以恢复任何一次修改前原来的内容了。
当然,简单的记录修改情况,你的例子是很不错的。 不过无法记载删除行的情况吧。
谢谢您的意见。
有点明白您的意思,您是指初期建立表格后,输入内容,然后复制一个一模一样的表,但是表名不同,复制出来的那个表可以做为参照表(把参照表隐藏),在录入表修改内容并标注底色前,除了判断输入前和输入后的数值是否一样?也可以外加判断输入的内容是否和原始的表格中内容一致。如果出现单元格前后输入内容虽不一致,但是与原始记录一致的情况,即不进行标注底色。
至于记录删除行,这个项目是没有做相关的记录。那么是否也可在删除行的同时,将删除的行的内容复制到另一个表(隐藏起来的参照表),就可以跟综到每一步具体的操作了。
还有顺带问一下:我们把列的类型设置为“备注型”,那么,究竟“备注类型”的列每个单元格能够存多少内容呢?有没有限制呀?打个比方,只是打个简单的比方,一个表每天都有大量的操作,记录个一年,还能正常存入吗?(不考虑数据库大小)像这样的方式记录,对于系统的性能影响大不大?
听说微软的数据库容量太大时性能下降很历害。
(举的例子有点极端,不过一般有些记录收集个一两年的还是有必要的,当然具体还是看需求吗!)
才刚开始学习,什么都不懂,还有靠各位多帮忙指点呀~!先在此谢过。
其实,foxtable是挺不错的,可以实现很多的东西。只是这学习过程还是有点久,不过比起其他的编程软件,也快多了。毕竟很多功能只需要我们去组织起来。
其实foxtable还可以内建类似手机短信编码转换函数等,通过串口外加手机或是GSM MODEN,可以实现短信群发,短信通知,远程短信操作等。
毕竟使用人员不可能像真正的软件工程师那样,为了一个算法去慢慢研究,所以还是要靠foxtable多多集成更多东西,简化操作难度,方便使用才是硬道理。
学习靠自己,咨询还是要靠大家了,呵呵。