关于更改当前公司(一)--ChangeCompany
AX支持多公司帳套,如果一個集團公司有多個分公司,可以通過創建多個公司帳套的方式來實現,在寫代碼的時候會遇到需要切換公司的時候,AX2009提供了兩種方式來實現多公司數據的查詢,內置方法ChangeCompany和關鍵字CrossCompany,學習筆記在這里記錄一下,這篇文章先說一下ChangeCompany.
比如有兩個公司"001"和"002",如果當前公司是"001",想切換到002公司進行查詢,這很簡單。如下代碼所示:
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的范圍之外會查詢哪個公司那?如果猜想的話,在外面應該是按照查詢當前公司的數據了。但是且慢,寫段代碼來測試一下吧。
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前面執行
Codestatic?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"的語境下查詢數據,也就是說表變量對于公司確實是先入為主的,如果想真正切換公司,需要在查詢之前清空再執行,如下所示:
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
總結
以上是生活随笔為你收集整理的关于更改当前公司(一)--ChangeCompany的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ2038 : [2009国家集训
- 下一篇: D-query SPOJ - DQUER