一个综合实例

本节的内容,可以参考CaseStudy目录下的文件:自动输入后台数据.Table

在学习事件编程的时候,我们接触到了自动输入的例子。
这个例子有一个问题,就是必须将行政区域表的所有数据加载到Foxtable,上述代码才能完成自动输入的任务,由于中国的县级行政区域不过2000多个,所以这不算大的问题。
如果基础数据表不是行政区域,而是一个有几万行的表,那么仅仅为了实现自动输入而将整个表加载到Foxtable中是得不偿失的,如果有几十万甚至过百万行的数据,那么加载整个表根本就是不现实的。

所以本节我们要学习在不加载基础数据的情况下,如何实现自动输入。

在后面的《SQL相关》会讲述一个和本节基本相同的例子,那是个完全用SQL语句实现的例子,参考:用SQL语句实现自动输入

本节不用SQL语句,采用前面介绍的DataTable的后台数据处理方法来实现同样的功能,且同样不加载行政区域表的数据,你会看到 本节的代码要简洁很多。

设计步骤:

1、在BeforeLoadInnerTable中设置代码:

If e.DataTableName = "行政区域" Then
    e.Filter =
"[_Identify] Is Null"

End
If

这个项目中的行政区域表是内部数据表,上述的代码使得打开项目后,行政区域表不会加载任何数据。

如果是外部表,参考: BeforeLoadOuterTable

2、省市列的列表项目是固定的,在项目事件AfterOpenProject加入代码:

Tables("客户").Cols("省市").Combolist = DataTables("行政区域").SQLGetComboListString("省市")
' Tables("行政区域").Visible = True '实际使用的时候,可以启用此行代码,以隐藏行政区域表

这样打开项目后,会从后台的行政区域表提取不重复的省市值作为客户表省市列的列表项目,尽管行政区域表并没有加载数据。

3、在客户表的PrepareEdit事件中加入代码:

If e.IsFocusCell Then '如果是焦点单元格
    If e.Col.Name = "县市" Then '如果正在编辑的是县市列
        e.Col.Combolist = DataTables("行政区域").SQLGetComboListString("县市", "[省市] = '" & e.Row("省市") & "'")
    End
If

End
If

这样在编辑客户表的县市列之前,会从后台的行政区域表提取该省市的县市值,作为县市列的列表项目使用。

4、最后将客户表DataColChanged事件的代码设置为:

If e.DataCol.Name = "省市" OrElse e.DataCol.Name = "县市" Then
    Dim dr As DataRow = e.DataRow
    Dim sr As DataRow
    sr = DataTables("行政区域").SQLFind("[省市] = '" & dr("省市") & "' And [县市] = '" & dr("县市") & "'") '在后台查找符合条件的行
    If sr IsNot Nothing Then '如果找到了符合条件的行
        dr("区号") = sr("区号")
        dr("邮编") = sr("邮编")
    Else
        dr("区号") = Nothing
        dr("邮编") = Nothing
    End
If

End
If

这样一旦在客户表的某行输入省市和县市两列内容后,会从后台的行政区域表查找对应的行,如果找到,则将该行的区号和邮编写入客户表中,否则清除区号和邮编。

从这个例子可以看出,采用Foxtable内置的处理后台数据的方法,和直接编写SQL语句相比,代码要简洁得多,也不需要改变原来的编程习惯。

另一种执行方式

DataTable的所有后台处理方法,当然都要基于DataTable运行,所以上面的示例中,我们加载了一个空的行政区域表,然后基于此空表处理后台的行政区域表的数据。
虽然我们可以通过代码在Foxtale的主界面中隐藏这个空表,但还是有一定程度的不便,而且有较多数量只需后台处理不需要加载数据的表时,还会加大系统对资源的消耗。
如果愿意,我们可以考虑另一种方式,通过SQL语句生成一个临时表,基于这个临时表执行后台数据处理方法。

首先我们在全局代码中定义一个变量:

Public xzqy As DataTable

然后在AfterOpenProject事件中加上代码:

Dim cmd As New SQLCommand
cmd
.ConnectionName = "数据源名称"
cmd
.CommandText = "SELECT * From {行政区域} Where [省市] Is Null"
xzqy
= cmd.ExecuteReader

上面的代码生成一个空的临时表,保存在全局变量xzqy中,这个临时表对应后台的行政区域表。

现在我们就可以通过此临时表处理后台的行政区域表的数据了,例如:

Tables("客户").Cols("省市").Combolist = xzqy.SQLGetComboListString("省市")

需要注意,如果不单单是调用后台数据,还要向后台写入数据,生成临时表的时候,必须给ExecuteReader加上参数True,例如:

Dim cmd As new SQLCommand
cmd
.ConnectionName = "数据源名称"
cmd
.CommandText = "Select * From {表名} Where [_Identify] Is Null"
Dim
dt As DataTable = cmd.ExecuteReader(True)

当然表必须有主键,才能更新其数据。

关于这种执行方式的更全面的例子,可以参考:自定义用户管理之二


本页地址:http://www.foxtable.com/webhelp/topics/2916.htm