父表与子表同步加载之一

假定有两个表,分别是订单和订单明细,两者通过"订单ID"列关联起来,订单是父表,订单明细是子表,因为每个订单对应有若干订单明细。
由于数据量比较大,决定采用动态加载,每次只加载一定数量的订单进行处理,显然作为一个合格的系统,应该同时加载这些订单的订单明细。

要完成这样的任务很简单,只需在订单表的AfterLoad事件中加入以下代码即可:

If DataTables("订单").DataRows.Count = 0 Then '如果订单表没有数据
    DataTables(
"订单明细").LoadFilter = "订单ID Is Null" '不加载订单明细
Else
    Dim 
ids As String
    For Each 
dr As DataRow In DataTables("订单").DataRows
        
ids = ids & "," & dr("订单ID")
    Next
    
idsids.Trim(",")
    DataTables(
"订单明细").LoadFilter = "订单ID In (" & ids & ")"
End If
DataTables(
"订单明细").Load()

每次订单表加载数据后,都会触发AfterLoad事件,执行上述代码。
上述代码会自动扫描已加载订单的订单ID,并合成订单明细表的加载条件,最后重新加载订单明细表。
假定订单表加载了6个订单,其订单ID分别为1、2、6、7、8、9,显然上述代码为订单明细表合成的加载条件为:订单ID In (1,2,6,7,8,9),这样重新加载订单明细表时,将只加载这6个订单的订单明细。

可见代码的关键在于In运算符,在学习SQL语句的时候,我们会介绍此运算符。

上面的代码假定订单ID是整数型,如果订单ID是字符型,那么代码应该改为:

If DataTables("订单").DataRows.Count = 0 Then '如果订单表没有数据
    DataTables(
"订单明细").LoadFilter = "订单ID Is Null" '不加载订单明细
Else
    Dim 
ids As String
    For Each 
dr As DataRow In DataTables("订单").DataRows
        
ids = ids & ",'" & dr("订单ID") & "'"
    Next
    
idsids.Trim(",")
    DataTables(
"订单明细").LoadFilter = "订单ID In (" & ids & ")"
End If
DataTables(
"订单明细").Load()

我们在编写表达式的时候,始终要记得字符用单引号括起来,而数值则可直接使用,帮助没有办法在每次编写此类代码的时候,分别为每种数据类型提供一个例子,希望大家自己多加留意。
 

示例

下面我们来一个具体的例子,订单表采用加载树加载,按年月每页加载100个订单,并同步加载这100个订单的订单明细:

设计步骤:

1、首先将BeforeLoadInnerTable事件代码设置为:

Select Case e.DataTableName
   
Case "订单","订单明细"
        e.Filter =
"[_Identify] Is Null"
End
Select

确保订单表和订单明细表在初始状态不会加载任何数据。

2、然后在AfterOpenProject事件中加入代码:

Tables("订单").OpenLoadTree("订购日期 YM",120,100,True)

这样项目打开后,将自动显示订单表的加载树,每页加载100行,并自动加载第一页数据。

3、将订单表的AfterLoad事件设置为(假定订单ID是整数型):

If DataTables("订单").DataRows.Count = 0 Then '如果订单表没有数据
    DataTables(
"订单明细").LoadFilter = "订单ID Is Null" '不加载订单明细
Else
    Dim 
ids As String
    For Each 
dr As DataRow In DataTables("订单").DataRows
        
ids = ids & "," & dr("订单ID")
    Next
    
idsids.Trim(",")
    DataTables(
"订单明细").LoadFilter = "订单ID In (" & ids & ")"
End If
DataTables(
"订单明细").Load()

至此,我们这个关联加载系统已经完工,前后不过16行代码。

提示:

上面的例子是针对内部数据表的,如果使用的是外部数据源,那么第一步可以省略,只需在设置外部数据表的时候,将加载条件设置为:[_Identify] Is Null


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