Fill方法

假定窗口中某SQLTable,目前显示的是订单表的数据,希望单击某按钮后,能切换显示产品表的数据,显然这无法利用上一节介绍的LoadFilter和Load来实现的。
这种跨表的数据加载,可以使用Table的Fill方法,该方法可以根据指定的SQL语句,从指定数据源的指定表加载数据 ,新的数据源和数据表可以和当前不同。
SQLTable和SQLQuery类型的Table,以及副本型的Table,可以通过Fill方法动态加载数据 ,非副本的Normal型Table不能使用此方法。

语法:

Fill(SelectString, IsQuery)

或者

Fill(SelectString, ConnectionName, IsQuery)

SelectString:  Select语句
ConnectionName:可选参数,指定数据源名称
IsQuery:       逻辑型,设为True,将生成SQLQuery型Table,否则生成SQLTable型Table。

SQLTable是数据表,默认是可以编辑和保存的。
SQLQuery是查询表,默认不能编辑,通过将其AllowEdit属性设置为True,可以编辑查询结果,但不能保存编辑结果。

加载不同表的数据

我们可以在窗口打开后,使用Fill方法让Table控件加载另一个表的数据,例如:

Tables("窗口1_Table1").Fill("Select * From {客户} Where 地区 = '华北'","nwnd",True)

不管Table原来是什么类型,显示的是什么表的数据,执行上述代码后,Table将成为SQLQuery类型,并从nwnd数据源的客户表中 加载华北地区的客户显示。

需要特别注意的是,如果只想取部分列生成SQLTable,那么必须包括主键列在内,例如:

Tables("窗口1_Table1").Fill("Select [_Identify],[客户],[数量],[单价] From {订单}",False)

这里假定订单表是内部数据表,内部数据表的主键列是_Identify,如果是外部表,请使用实际的主键列名称。

如果要生成SQLQuery,则没有这个限制:

Tables("窗口1_Table1").Fill("Select [客户],[数量],[单价] From {订单}",True)

一定要注意,如果要生成SQLTable,第二个参数要设置为False,如果要生成SQLQuery,第二个参数则要设置为True,切不可搞混。

另一种使用场合

我们也可以在设计窗口的时候,将窗口的类型设置为SQLTable或SQLQuery,但并不设置Select语句,而是在窗口的AfterLoad事件中,通过代码动态合成Select语句,然后再用Fill方法加载数据。

例如上一节介绍了让Table控件只加载本月数据的方法,使用的Load和LoadFilter,如果采用Fill方法,步骤如下:

1、在设计窗口的时候,Table控件的类型根据需要设置为SQLTable或SQLQuery,但Select语句留空,不需要设置。

2、在窗口的AfterLoad事件加上代码:

Dim y As Integer = Date.Today.Year
Dim
m As Integer = Date.Today.Month
Dim
dt1 As New Date(y, m, 1)
Dim
dt2 As New Date(y, m, Date.DaysInMonth(y, m)) '获取本月的最后一天
Dim
Filter As String
Filter
= "日期 >= #" & dt1 & "# And 日期 <= #" & dt2 & "#"
Tables(
"窗口1_Table1").Fill("Select * From {订单} Where " & Filter, False)

采用
Load和LoadFilter实现的好处是我们可以在设计阶段,就可以将其它控件以可视化的方式绑定到Table控件的各列,参考:绑定到Table控件的列

采用Fill实现的好处是灵活,不单单是加载条件可以动态设置,要加载那些列,从什么数据源的什么表加载,都可以用代码动态指定,但也有坏处,就是设计窗口的时候,其他控件没办法以可视化的形式绑定到此Table控件的列。
我们只能在Fill执行之后,通过设置其它控件的BindingField属性,动态将这些控件绑定到Table控件的各列,例如在窗口的AfterLoad事件加上代码:

Tables("窗口1_Table1").Fill("Select * From {订单} Where 日期 = #" & Date.Today & "#", False)
e
.Form.Controls("DateTimePicker1").BindingField  = "窗口1_Table1.日期"
e
.Form.Controls("TextBox1").BindingField  = "窗口1_Table1.客户"

这样打开窗口后,Table控件就会显示今天的订单,并将两个控件分别绑定到日期列和客户列。

请不要滥用Fill

通过Fill生成的Table,在打开窗口后,如果需要从同一个表加载其它数据进来,请采用LoadFilter和Load,切不可再用Fill(除非需要从另一个表加载数据), 因为Fill会重新生成DataTable和Table,不仅效率低,还会导致设置好的绑定失效。

例如窗口中有个“最近七天”按钮,希望单击此按钮,加载最近七天的订单,可以将按钮的代码设置为:

Dim dt As Date = Date.Today.AddDays(-7)
DataTables
("订单").LoadFilter = "日期 > #" & dt & "#"
DataTables
("订单").Load()

总之, 只有需要从不同的表中加载数据时,使用Fill方法,如果从同一个表中加载数据,应该使用LoadFilter和Load。
 


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