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方法,步骤如下:
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。