AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.06.2009, 19:20   #1  
nano3 is offline
nano3
Участник
 
57 / 24 (1) +++
Регистрация: 21.03.2007
связанные данные из разных компаний
DAX 2009
Kernel version: 5.0.1000.52
Application version: 5.0.1000.52
SP: SP1
SQL 2005

Привет, всем
Подскажите, пожалуйста, может ли отработать данный запрос
X++:
    query = new Query();
    query.allowCrossCompany(true);
    qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral");
    qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig");

    qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, SBA_CentralSalesLine), "SalesLineCentral");
    qbsSalesLineOrig.addRange(fieldnum(salesLine, SBA_CentralSalesLine)).value(SysQuery::valueNotEmptyString());
при условии что запись SalesLineCentral из компании A, а запись из SalesLineOrig из компании B?
Пробовал задавать Range для dataareaid, query.addCompanyRange() успехов не принесло.
Старый 23.06.2009, 00:09   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
По-моему, нельзя
Axapta добавляет в запросе на сервер A.DATAAREAID = B.DATAAREAID к любым линкам или рэйнжам

Отличие allowCrossCompany() от обычных запросов в том, что либо вовсе не указывается в выборке компания (если не использовать вызовы addCompanyRange()), либо добавляется условие DataAreaID IN (список компаний, добавленных с помощью addCompanyRange()) на каждую таблицу, участвующую в запросе.
К связям же между таблицами в любом случае добавляется условие равенства DATAAREAID

PS. Можно создать таблицу, в которой указано поле связи (recId из первой компании), добавлены два поля для кодов компаний и отключено свойство SaveDataPerCompany
Если связь делать не напрямую, а через эту таблицу (для одной связи можно прописать релейшен на таблице с участием нужного кода компании, а связь с другой таблицей делать через расширенный рэйнж), то получить записи из разных компаний получится
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 23.06.2009 в 00:37.
За это сообщение автора поблагодарили: lev (2), PavelX (2), nano3 (1), S.Kuskov (5).
Старый 23.06.2009, 10:40   #3  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Axapta добавляет в запросе на сервер A.DATAAREAID = B.DATAAREAID к любым линкам или рэйнжам
С этим не согласен. Ахарта добавляет не равенство DataareaId, а автоматически накладывает рэйнджи по коду компании, например
A.DATAAREAID = 'dat' AND B.DATAAREAID = 'tst'. Естественно, коды компаний могут быть разными при использовании виртуальных компаний.
__________________
Андрей.
Старый 23.06.2009, 11:03   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
С этим не согласен. Ахарта добавляет не равенство DataareaId, а автоматически накладывает рэйнджи по коду компании, например
A.DATAAREAID = 'dat' AND B.DATAAREAID = 'tst'. Естественно, коды компаний могут быть разными при использовании виртуальных компаний.
Абсолютно верно, условия "A.DATAAREAID = B.DATAAREAID" Аксапта не порождает...
Другое дело, что ни то, ни другое не поможет топикстартеру решить его проблему в том виде, как он хочет.
__________________
Zhirenkov Vitaly
Старый 23.06.2009, 11:30   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Хм.

Выше приведенный запрос по SalesLine будет выглядеть примерно так
X++:
SELECT *
FROM SalesLine A, SalesLine B
WHERE A.RecId = B.SBA_CentralSalesLine and A.DataAreaId = B.DataAreaId and not (B.SBA_CentralSalesLine = 0)
Если использовать addCompanyRange(), то запрос будет выглядеть так
X++:
SELECT *
FROM SalesLine A, SalesLine B
WHERE A.DataAreaId in ( ) and B.DataAreaId in ( ) and A.RecId = B.SBA_CentralSalesLine and A.DataAreaId = B.DataAreaId and not (B.SBA_CentralSalesLine = 0)
PS. Это по DAX2009 TAP4
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Dron AKA andy (2).
Старый 23.06.2009, 11:38   #6  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
А, не заметил, что это ж для DAX2009, да еще и с новой для меня функцией allowCrossCompany()
__________________
Андрей.
Старый 23.06.2009, 11:42   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Жалко
Я уже думал, что что-то проглядел и можно для каждой таблицы указывать свою компанию
__________________
Axapta v.3.0 sp5 kr2
Старый 23.06.2009, 12:05   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Хотя, с другой стороны, если не использовать allowCrossCompany() и связь нужна только между двумя компаниями, то можно сделать так
X++:
    SalesLine SalesLineA;
    SalesLine SalesLineB;
    QueryRun qr;
    ;
    SalesLineA.company('A');
    SalesLineB.company('B');
    query = new Query();
    qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral");
    qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig");

    qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, SBA_CentralSalesLine), "SalesLineCentral");
    qbsSalesLineOrig.addRange(fieldnum(salesLine, SBA_CentralSalesLine)).value(SysQuery::valueNotEmptyString());
    qr = new QueryRun(query);
    qr.setCursor(SalesLineA, 1);
    qr.setCursor(SalesLineB, 2);
Этот код будет работать и в Ax 3.0 тоже
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось Dron AKA andy; 23.06.2009 в 15:49.
За это сообщение автора поблагодарили: Logger (7), MironovI (4), AlexArh (1).
Старый 23.06.2009, 14:28   #9  
nano3 is offline
nano3
Участник
 
57 / 24 (1) +++
Регистрация: 21.03.2007
Цитата:
Сообщение от AndyD Посмотреть сообщение
По-моему, нельзя
PS. Можно создать таблицу, в которой указано поле связи (recId из первой компании), добавлены два поля для кодов компаний и отключено свойство SaveDataPerCompany
Если связь делать не напрямую, а через эту таблицу (для одной связи можно прописать релейшен на таблице с участием нужного кода компании, а связь с другой таблицей делать через расширенный рэйнж), то получить записи из разных компаний получится
Сделал как вы посоветовали - работает! Большое всем спасибо за участие!
Старый 23.06.2009, 14:39   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Не могу отредактировать предыдущее сообщение.

В предыдущем примере надо убрать query.allowCrossCompany(true).
__________________
Axapta v.3.0 sp5 kr2
Старый 23.06.2009, 15:27   #11  
Vals is offline
Vals
Аманд
Аватар для Vals
Компания АМАНД
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2009
 
1,766 / 507 (20) +++++++
Регистрация: 27.02.2002
Адрес: Pass partout, Москва
Просто ремарка: Обратите внимание, что в системе существует функциональность и запросы по работе с дургими компаниями, например:
- Можно посмотреть заказы/закупки в другой компани
- Можно посмотреть производства
- Можно посмотреть В наличии с учётом остатков другой компании и т.д.

Всё это просматривается по кнопочке "Внутрихолдинговый".

При этом в 4.0 это хорошо работало. Я не проверял, но в 2009 должно быть как минимум аналогично.
Поэтому проверьте, возможно, Вам подойдёт то, что уже есть. Ищите информацию по AIF

Последний раз редактировалось Vals; 23.06.2009 в 15:44.
За это сообщение автора поблагодарили: nano3 (1).
Старый 23.06.2009, 15:50   #12  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Не могу отредактировать предыдущее сообщение.

В предыдущем примере надо убрать query.allowCrossCompany(true).
Убрал.
__________________
Андрей.
Старый 24.06.2009, 12:02   #13  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
:(
Тема интересна, но...
хм.... убрал ^^... получаю
"Невозможно сменить компанию в "Строки заказа" ("SalesLine") Буфер содержит запись, которая относится к другой компании."
ax3.0 sp5 kr2...
Что делаю не так ?
Старый 24.06.2009, 12:04   #14  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
Сценарий в AX 4.0
Цитата:
Сообщение от AndyD Посмотреть сообщение
Хотя, с другой стороны, если не использовать allowCrossCompany() и связь нужна только между двумя компаниями, то можно сделать так
X++:
    SalesLine SalesLineA;
    SalesLine SalesLineB;
    QueryRun qr;
    ;
    SalesLineA.company('A');
    SalesLineB.company('B');
    query = new Query();
    qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral");
    qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig");

    qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, SBA_CentralSalesLine), "SalesLineCentral");
    qbsSalesLineOrig.addRange(fieldnum(salesLine, SBA_CentralSalesLine)).value(SysQuery::valueNotEmptyString());
    qr = new QueryRun(query);
    qr.setCursor(SalesLineA, 1);
    qr.setCursor(SalesLineB, 2);
Этот код будет работать и в Ax 3.0 тоже

как вариант реализации - использование метода QueryBuildDataSource.company( CompanyId )?
Тестировался примерно похожий сценарий на AX 4.0: имеются 2 компании DMO и TST, которые не входят в виртуальную. В справочнике групп складских моделей (InventModelGroup) помимо всего прочего есть группа с кодом 'Основная' (своя в каждой из компаний) и в справочнике номеклатур (InventTable) свой набор позиций с этой группой.

В компании TST выполняется выборка данных:
X++:
    select inventTable
        where   inventTable.ItemType    ==  ItemType::BOM
        join    inventModelGroup
            where   inventModelGroup.ModelGroupId   ==  inventTable.ModelGroupId    &&
                    inventModelGroup.InventModel    ==  InventModel::FIFO
тестовый job:
X++:
static void jbCheckCompany(Args _args)
{
    QueryBuildDataSource    qbdsInventTable ;
    QueryBuildDataSource    qbdsInventModelGroup;
    Query                   query = new Query() ;
 
    void inventTableFromQuery( Query _query )
    {
        InventTable         inventTable ;
        InventModelGroup    inventModelGroup    ;
        QueryRun            queryRun    ;
        CompanyId           companyIdInventTable = _query.dataSourceTable( tableNum( InventTable ) ).company() ;
        ;
        
        setPrefix( strfmt( "Company: %1", companyIdInventTable ? companyIdInventTable : curext() ) ) ;
        queryRun = new QueryRun( _query ) ;
        while( queryRun.next() )
        {
            inventTable = queryRun.get( tableNum( InventTable ) ) ;
            inventModelGroup = queryRun.get( tableNum( InventModelGroup ) ) ;
            info( strfmt( "InventTable [%1]: %2 - %3 (InventModelGroup [%4]: %5)",
                                inventTable.dataAreaId,
                                inventTable.ItemId,
                                inventTable.ItemName,
                                inventModelGroup.dataAreaId,
                                inventModelGroup.ModelGroupId ) ) ;
        }
    }
    ;
    
    qbdsInventTable = query.addDataSource( tableNum( InventTable ) ) ;
    qbdsInventTable.addSelectionField( fieldNum( InventTable, ItemId ) ) ;
    qbdsInventTable.addSelectionField( fieldNum( InventTable, ItemName ) ) ;
    qbdsInventTable.addRange( fieldNum( InventTable, ItemType ) ).value( SysQuery::value( ItemType::BOM ) ) ;
    
    qbdsInventModelGroup = qbdsInventTable.addDataSource( tableNum( InventModelGroup ) ) ;
    qbdsInventModelGroup.fetchMode( QueryFetchMode::One2One ) ;
    qbdsInventModelGroup.addLink( fieldNum( InventTable, ModelGroupId ), fieldNum( InventModelGroup, ModelGroupId ) ) ;
    qbdsInventModelGroup.addSelectionField( fieldNum( InventModelGroup, ModelGroupId ) ) ;
    qbdsInventModelGroup.addRange( fieldNum( InventModelGroup, InventModel ) ).value( SysQuery::value( InventModel::FIFO ) ) ;

    info( 'InventTable cross company select' ) ;
    inventTableFromQuery( query ) ;
 
    query.dataSourceTable( tableNum( InventTable ) ).company( 'dmo' ) ;
    inventTableFromQuery( query ) ;
}
Получались результаты вида:
Цитата:
InventTable cross company select
- Company: tst
-- InventTable [tst]: P-2000/B - Окрашенная подставка 2000 Черный (InventModelGroup [tst]: Основная)
-- InventTable [tst]: P-2000/R - Окрашен. подставка 2000 красный (InventModelGroup [tst]: DEF)
-- InventTable [tst]: P-2000/W - Окрашен. подставка 2000 белый (InventModelGroup [tst]: DEF)
-- InventTable [tst]: PB-модел_ламп - Включено моделирование лампы (InventModelGroup [tst]: DEF)
-- InventTable [tst]: PB-Моделир_абажура - Включено моделирование абажура (InventModelGroup [tst]: DEF)
-- InventTable [tst]: А-абажур/R30 - Абажур для лампы, красный, 30 см (InventModelGroup [tst]: DEF)
- Company: dmo
-- InventTable [dmo]: 1 - Светильник Ramzes (InventModelGroup [tst]: Основная)
-- InventTable [dmo]: 2 - Светильник Ramzes (InventModelGroup [tst]: Основная)
-- InventTable [dmo]: Лампа - Лампа для светильника (InventModelGroup [tst]: Основная)
-- InventTable [dmo]: с1_Кофеварка007 - Кофеварка007 (InventModelGroup [tst]: Основная)
-- InventTable [dmo]: Светильник Ramzes - Светильник Ramzes (InventModelGroup [tst]: Основная)
-- InventTable [dmo]: Светильник RamzesSup - Светильник RamzesSuper (InventModelGroup [tst]: Основная)
План выполнения запроса в первом случае был:
Цитата:
SELECT A.ITEMID,A.ITEMNAME,A.RECID,B.MODELGROUPID,101090
FROM INVENTTABLE A,INVENTMODELGROUP B
WHERE ((A.DATAAREAID=N'tst') AND (A.ITEMTYPE=1)) AND ((B.DATAAREAID=N'tst') AND ((B.INVENTMODEL=0) AND (A.MODELGROUPID=B.MODELGROUPID)))
ORDER BY A.DATAAREAID,A.ITEMTYPE,A.ITEMID
во втором:
Цитата:
SELECT A.ITEMID,A.ITEMNAME,A.RECID,B.MODELGROUPID,101090
FROM INVENTTABLE A,INVENTMODELGROUP B
WHERE ((A.DATAAREAID=N'dmo') AND (A.ITEMTYPE=1)) AND ((B.DATAAREAID=N'tst') AND ((B.INVENTMODEL=0) AND (A.MODELGROUPID=B.MODELGROUPID)))
ORDER BY A.DATAAREAID,A.ITEMTYPE,A.ITEMID
Миниатюры
Нажмите на изображение для увеличения
Название: inventtable_tst.JPG
Просмотров: 324
Размер:	49.4 Кб
ID:	4806   Нажмите на изображение для увеличения
Название: inventtable_dmo.JPG
Просмотров: 354
Размер:	51.3 Кб
ID:	4807  

Нажмите на изображение для увеличения
Название: inventtable_query.JPG
Просмотров: 333
Размер:	78.7 Кб
ID:	4809  
__________________
Dynamics AX 4.0 SP2
За это сообщение автора поблагодарили: AndyD (5).
Старый 24.06.2009, 12:38   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от DocSerzh Посмотреть сообщение
Тема интересна, но...
хм.... убрал ^^... получаю
"Невозможно сменить компанию в "Строки заказа" ("SalesLine") Буфер содержит запись, которая относится к другой компании."
ax3.0 sp5 kr2...
Что делаю не так ?
Приведите, пожалуйста, код.
В моей конфигурации все работает
__________________
Axapta v.3.0 sp5 kr2
Старый 24.06.2009, 14:18   #16  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
?
Цитата:
Сообщение от AndyD Посмотреть сообщение
Приведите, пожалуйста, код.
В моей конфигурации все работает
X++:
static void test(Args _args)
{
    query query;
    SalesLine SalesLineA;
    SalesLine SalesLineB;
    QueryRun qr;
    QueryBuildDataSource  qbsSalesLineCentral, qbsSalesLineOrig;
    ;
    SalesLineA.company('A');
    SalesLineB.company('B');
    query = new Query();
    //query.allowCrossCompany(true);
    qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral");
    qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig");

    qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, Salesid));
    qbsSalesLineOrig.addRange(fieldnum(salesLine, Salesid)).value(SysQuery::valueNotEmptyString());
    qr = new QueryRun(query);
    qr.setCursor(SalesLineA, 1);
    qr.setCursor(SalesLineB, 2);
}
Старый 24.06.2009, 14:26   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Хм.
А компании A и B у вас заведены? Надо указывать существующие.
Кроме того, связывать recId с SalesId как-то неправильно
__________________
Axapta v.3.0 sp5 kr2
Старый 24.06.2009, 14:39   #18  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
Цитата:
Сообщение от AndyD Посмотреть сообщение
Хм.
А компании A и B у вас заведены? Надо указывать существующие.
Кроме того, связывать recId с SalesId как-то неправильно
>> Надо указывать существующие.
Нет, не заведены.Ок, щас попробую рабочие.

>> Кроме того, связывать recId с SalesId как-то неправильно.
Это просто не удачный пример , хотя сообщение об ошибке немного не то сообщает.

Ок, пасибо, сейчас проверю еще раз..
Теги
ax2009, ax3.0, company, компания

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Холдинг как одна или несколько компаний в Аксапте? skof DAX: Прочие вопросы 27 31.07.2009 09:47
Произвольное объединение компаний для отчетов и операций в них gl00mie DAX: Программирование 11 07.08.2006 14:22
Данный из разных компаний в WebForm kashperuk DAX: Программирование 0 14.06.2006 01:11
Копирование компаний zarik DAX: Прочие вопросы 4 08.06.2006 17:32
Данные из всех компаний zipo DAX: Программирование 18 16.05.2006 23:26
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:59.