以文本方式查看主题

-  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

 

 

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:底色标注今天修改内容.rar

[此贴子已经被作者于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多多集成更多东西,简化操作难度,方便使用才是硬道理。

       学习靠自己,咨询还是要靠大家了,呵呵。