关于更改当前公司(一)--ChangeCompany

AX支持多公司帐套,如果一个集团公司有多个分公司,可以通过创建多个公司帐套的方式来实现,在写代码的时候会遇到需要切换公司的时候,AX2009提供了两种方式来实现多公司数据的查询,内置方法ChangeCompany和关键字CrossCompany,学习笔记在这里记录一下,这篇文章先说一下ChangeCompany.
比如有两个公司"001"和"002",如果当前公司是"001",想切换到002公司进行查询,这很简单。如下代码所示:

ContractedBlock.gif ExpandedBlockStart.gif Code
static void ChangeCompanyDEMO(Args _args)
{
    SalesTable      salesTable;
    ;

    ChangeCompany(
'002')
    {
        select 
* from salesTable;
        
        print salesTable.SalesId;
        pause;
    }

}

AX里的多公司帐套实现是通过在表中的字段DataAreaId来实现的,我们可以猜想,它的ChangeCompany的实现原理无非就是在构造SQL查询语句的时候,考虑了当前的语境的DataAreaId,至于AX在哪里存放当前语境下的DataAreaId以及ChangeCompany是如何更改的,可能是有一个全局变量,或许是其他什么方式,没看到相关文档,也就无从考证了,不过我们可以通过运行的SQL确认DataAreaId的改变,如下所示:

SQL 语句:  SELECT  A.SALESID, FROM  SALESTABLE A  WHERE  (DATAAREAID = N ' 002 ' [ ID=721, 已重用=否 ]

接下来一个问题就是salesTable这个变量如果在ChangeCompany的范围之外会查询哪个公司那?如果猜想的话,在外面应该是按照查询当前公司的数据了。但是且慢,写段代码来测试一下吧。

ContractedBlock.gif ExpandedBlockStart.gif Code
static void ChangeCompanyDEMO(Args _args)
{
    SalesTable      salesTable;
    ;

    ChangeCompany(
'002')
    {
        
select  forceLiterals * from salesTable;
        
        
print salesTable.SalesId,'  ',salesTable.dataAreaId;
        
//pause;
    }
    
    
select  forceLiterals * from salesTable;
    
print salesTable.SalesId,'  ',salesTable.dataAreaId;
    
    pause;

}

无论是从打印的结果还是从执行的SQL语句都可以看出,查询的都是"002"公司的数据,难道salesTable这表变量还有先来后到,从一而终之说?把后面这段代码放到ChangeCompany前面执行

ContractedBlock.gif ExpandedBlockStart.gif Code
static void ChangeCompanyDEMO(Args _args)
{
    SalesTable      salesTable;
    ;

    
select  forceLiterals * from salesTable;
    
print salesTable.SalesId,'  ',salesTable.dataAreaId;
    
    
    ChangeCompany(
'002')
    {
        
select  forceLiterals * from salesTable;
        
        
print salesTable.SalesId,'  ',salesTable.dataAreaId;
        
//pause;
    }
    
    pause;

}

从执行的结果看,都是在公司"001"的语境下查询数据,也就是说表变量对于公司确实是先入为主的,如果想真正切换公司,需要在查询之前清空再执行,如下所示:

ContractedBlock.gif ExpandedBlockStart.gif Code
static void ChangeCompanyDEMO(Args _args)
{
    SalesTable      salesTable;
    ;

    
select  forceLiterals * from salesTable;
    
print salesTable.SalesId,'  ',salesTable.dataAreaId;
    
    
    ChangeCompany(
'002')
    {
        salesTable 
= null;
        
        
select  forceLiterals * from salesTable;
        
        
print salesTable.SalesId,'  ',salesTable.dataAreaId;
        
//pause;
    }
    
    pause;

}

这样就可以遵循各自的语境了。

转载于:https://www.cnblogs.com/Farseer1215/archive/2009/11/15/1603561.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值