DAX 2009, работа с несколькими компаниями


DAX 2009 позволяет осуществлять доступ к авторизированным данным всех компаний из форм, запросов и кода X++. Поддерживаются все типы источников данных, включая табличные коллекции и представления. Правда не поддерживаются базовые структуры типа RecordInsertList и RecordSortedList.

С точки зрения изменений в коде введены новые ключевые слова в X++ и параметры структур запросов.

Новое ключевое слово для работы с компаниями в X++:

select crosscompany custTable // выборка по всем компаниям
       join custTrans
       where custTable.AccountNum == custTrans.AccountNum;

Есть возможность фильтрации в запросе с помощью контейнеров:

CustTable custTable;
Container companies;
;
companies = ["DMO", "DAT"];  // контейнер

while select crosscompany: companies  * from custTable // фильтрация
{

   ...
}

Произошли изменения работе с запросами, добавлен параметр работы с несколькими компаниями, AllowCrossCompany (Yes, No) в AOT и структуре запросов, использовать его можно, например, так:

Query     qr = new Query();

qr.allowCrossCompany(‘True’); // 'false' является умолчательным

Получить текущее значение фильтра по компаниям, изменить и очистить его можно следующим образом:

Query     qr = new Query();
container cons;
;
cons = qr.getCompanyRange();     
// компании в обработке

qr.addCompanyRange(‘DAT’);         // добавление компании в фильтр

qr.clearCompanyRange();              // очистка списка

 

Раз есть возможность получения данных по разным компаниям в результате одного запроса, то есть и возможность смотреть данные из разных компаний в одном гриде (изменением параметра в источнике данных формы, например):

image

 

При обновлении данных, требуется доступ к реальной компании. Следовательно, необходим доступ к буферу с данными компании для обновления, для этого переключаемся в требуемую компанию и производим операцию: 

   CustTable ct;
    ttsbegin;
    while select forupdate crosscompany ct
    {
        changecompany(ct.company())
        {
            ct.CreditMax += 10;
            ct.update();
        }
    }
    ttscommit;

В коде, указанном выше, используется метод company() для идентификации текущей компании. Естественно можно было бы использовать и поле DataAreaId в качестве идентификатора, подставив ct.DataAreaId в функцию changecompany. Разница же в том, что в случае табличной коллекции, company()  вернет правильный идентификатор реальной компании, а DataAreaID будет содержать значение/идентификатор виртуальной компании или реальной компании в зависимости от типа источника данных.

 

Данная статья подготовлена с помощью Windows Live Writer.

Comments (2)

  1. А насколько корректно будет работать RLS при использовании crosscompany? Если в разных компаниях RLS настроен по-разному, и в табличной переменной, используемой в select’е, явно включено его (recordLevelSecurity(true)), будут ли использоваться в каждой компании настройки RLS, сделанные именно в ней? Или crosscompany просто добавляет лишние range’и для поля dataAreaId?..

  2. Хороший вопрос. Работает, только что проверил. Создал настройку RLS на таблицу клиентов, в одной из компаний (DMO, всего 3: DAT, DMO, DMP) установил фильтр на 2 первых клиента (всего 20). В прочих компаниях – без фильтрации.

    Запустил следующий код:

       CustTable ct;

       ;

       ct.recordLevelSecurity(true);

       while select crosscompany ct

       {

           if (ct.company() == "DMO")

               print ct.company() + " " + ct.AccountNum;

       }

       pause;

    Результат – только 2 записи по DMO.

Skip to main content