以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 关于自动标注今天修改内容并保存为EXCEL的例子,请大虾们给提意见并优化,或是增加更多功能。 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=14466) |
||||
-- 作者:liguichuan -- 发布时间:2011/11/20 16:16:00 -- 关于自动标注今天修改内容并保存为EXCEL的例子,请大虾们给提意见并优化,或是增加更多功能。 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
[此贴子已经被作者于2011-11-20 16:21:11编辑过]
|
||||
-- 作者:e-png -- 发布时间:2011/11/20 19:23:00 -- 你的两个问题,都应该用独立的表来记载第一次保存后的修改情况,这样就可以记录所有修改的情况;如果改表有一修改前的列,那么就可以恢复任何一次修改前原来的内容了。
当然,简单的记录修改情况,你的例子是很不错的。 不过无法记载删除行的情况吧。 |
||||
-- 作者:liguichuan -- 发布时间:2011/11/20 19:48:00 -- 谢谢您的意见。 有点明白您的意思,您是指初期建立表格后,输入内容,然后复制一个一模一样的表,但是表名不同,复制出来的那个表可以做为参照表(把参照表隐藏),在录入表修改内容并标注底色前,除了判断输入前和输入后的数值是否一样?也可以外加判断输入的内容是否和原始的表格中内容一致。如果出现单元格前后输入内容虽不一致,但是与原始记录一致的情况,即不进行标注底色。 至于记录删除行,这个项目是没有做相关的记录。那么是否也可在删除行的同时,将删除的行的内容复制到另一个表(隐藏起来的参照表),就可以跟综到每一步具体的操作了。 还有顺带问一下:我们把列的类型设置为“备注型”,那么,究竟“备注类型”的列每个单元格能够存多少内容呢?有没有限制呀?打个比方,只是打个简单的比方,一个表每天都有大量的操作,记录个一年,还能正常存入吗?(不考虑数据库大小)像这样的方式记录,对于系统的性能影响大不大? 听说微软的数据库容量太大时性能下降很历害。 (举的例子有点极端,不过一般有些记录收集个一两年的还是有必要的,当然具体还是看需求吗!) |
||||
-- 作者:小猪鑫鑫 -- 发布时间:2011/11/20 19:54:00 -- 楼主:感觉你的这个小项目挺不错的,学习了 |
||||
-- 作者:liguichuan -- 发布时间:2011/11/20 20:10:00 -- 才刚开始学习,什么都不懂,还有靠各位多帮忙指点呀~!先在此谢过。 其实,foxtable是挺不错的,可以实现很多的东西。只是这学习过程还是有点久,不过比起其他的编程软件,也快多了。毕竟很多功能只需要我们去组织起来。 其实foxtable还可以内建类似手机短信编码转换函数等,通过串口外加手机或是GSM MODEN,可以实现短信群发,短信通知,远程短信操作等。 毕竟使用人员不可能像真正的软件工程师那样,为了一个算法去慢慢研究,所以还是要靠foxtable多多集成更多东西,简化操作难度,方便使用才是硬道理。 学习靠自己,咨询还是要靠大家了,呵呵。 |