FormDataSource初探(三)

FormDataSource之间的连接
单个FormDataSource介绍完后,需要关注的是多个FormDataSource之间的连接.
教程中提到的几种连接方式这里就不再赘述了,教程中介绍的蛮详细,从FormDataSource构造Query的方式可以将教程中提到的连接方式分为两类:
一类是Join类型的,比如InnerJoin,OuterJoin等
另一类是动态连接类型的,比如Active,Delayed等
对这两种类型的连接方式处理,AX是完全不同的,先说第一类连接方式,以InnerJoin为例.
其实这两类的区别就在构造FormDataSource的Query的方式上,Join类型的所有的FormDataSource的Table以Join的方式连接起来构造一个Query,所有的FormDataSource的ExcuteQuery方法执行的都是这个Query.
创建一个Form,包含三个FormDataSource:InventTable,InventSum,InventtDim,其中InventSum InnerJoin InventTable,InventDim InnerJoin InventSum.这样按照设想的话,出来的语句应该如下:
None.gif SELECT   *   FROM  INVENTTABLE A
None.gif
INNER   JOIN  INVENTSUM B  ON  A.ITEMID  =  B.ITEMID
None.gif
INNER   JOIN  INVENTDIM C  ON  B.INVENTDIMID  =  B.INVENTDIMID
还是通过跟踪SQL的方式来追踪AX自己实现的SQL,可以看到如下语句
None.gif Database : Microsoft SQL Server
None.gifSQL statement: 
SELECT   *   FROM  INVENTTABLE A(NOLOCK) ,INVENTSUM B(NOLOCK) ,INVENTDIM C(NOLOCK)   WHERE  (A.DATAAREAID = ' lgt ' AND  ((B.DATAAREAID = ' lgt ' AND  (A.ITEMID = B.ITEMID))  AND  ((C.DATAAREAID = ' lgt ' AND  (B.INVENTDIMID = C.INVENTDIMID))  ORDER   BY  A.DATAAREAID,A.ITEMID  OPTION (FAST  1 [ ID=14, Reused=No ]
None.gifCall stack:
None.gif\Classes\QueryRun\
next
None.gif\Classes\FormDataSource\executeQuery
None.gif\Forms\Form3\Data Sources\InventTable\Methods\executeQuery 
-  line  3
None.gif
跟设想的情况是一样的.
我们知道Form的init在执行super()的时候会调用FormDataSource的init方法,那么在Join类型的情况下,调用各个FormDataSource的init方法的顺序是怎样的那?
我找了半天也没有看到相关文档,我试验的结果是创建DataSource的时候,哪个先创建哪个的init方法先被调用,我自己创建了两个Form,各自有两个FormDataSource InventTable和InventSum,设置等都完全一样,但一个先创建InventTable,一个先创建InventSum,结果其中一个先调用InventTable的Init方法,另一个先调用InventSum的Init方法.
接下来的问题是ExcuteQuery方法的执行,ExcuteQuery的第一次执行是有FormRun的Run方法触发的(当然AutoSearch要保留默认值),那么各个FormDataSource的ExcuteQuery执行顺序有没有规律可循?答案跟Init是一样的,哪个DataSource先创建就先调用哪个的ExcuteQuery方法.那么既然在这种情况下只有一个Query,ExcuetQuery执行多次做啥子?
ExcuteQuery虽然被多次执行了,但真正从数据库中取数据只发生在最根结点的数据源的ExcuteQuery方法.这个也可以通过跟踪SQL语句的方式知道.
OK,第一种方式就介绍到这里.
第二种方式相对简单很多,每个FormDataSource都会对应一个Query,在窗体初始化时,会执行主表的ExcuteQuery方法,从表的ExcuteQuery方法是通过调用从表的LinkActive方法调用的,以后每次主表的当前行变化触发Active方法时都会调用从表的LinkActive方法,从而执行从表的ExcuteQuery方法.下面是SalesTable窗体在加载时执行的SQL语句,从中就可以看出其执行过程.
SalesTable:
None.gif Database : Microsoft SQL Server
None.gifSQL statement: 
SELECT   *   FROM  SALESTABLE A  WHERE  (DATAAREAID = ?)  ORDER   BY  A.DATAAREAID,A.SALESID  OPTION (FAST  1 [ ID=3, Reused=No ]
None.gifCall stack:
None.gif\Classes\QueryRun\
next
None.gif\Classes\FormDataSource\executeQuery
None.gif\Forms\Form5\Data Sources\SalesTable\Methods\executeQuery 
-  line  3
SalesLine:
None.gif Database : Microsoft SQL Server
None.gifSQL statement: 
SELECT   *   FROM  SALESLINE A  WHERE  ((DATAAREAID = ?)  AND  (SALESID = ?))  ORDER   BY  A.DATAAREAID,A.SALESID,A.LINENUM  OPTION (FAST  1 [ ID=4, Reused=No ]
None.gifCall stack:
None.gif\Classes\QueryRun\
next
None.gif\Classes\FormDataSource\executeQuery
None.gif\Forms\Form5\Data Sources\SalesLine\Methods\executeQuery 
-  line  5
None.gif\Classes\FormDataSource\linkActive
None.gif\Forms\Form5\Data Sources\SalesLine\Methods\linkActive 
-  line  3

转载于:https://www.cnblogs.com/Farseer1215/archive/2007/01/09/615728.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值