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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.02.2007, 18:17   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Angry Глюки в Query с разными типами Join (в т.ч. NonExistsJoin) к одной таблице
Есть несколько компаний, которые "торгуют" между собой через intercompany, и внешние контрагенты, которые торгуют с этими компаниями. Необходимо вывести в отчет проводки только по этим внешним контрагентам, сгруппировав проводки по одному и тому же контрагенту в разных компаниях по внешнему коду. Т.е. внешний контрагент может в разных компаниях называться по-разному, но внешний код у него везде будет одинаковый. Так вот, чтобы отфильтровать контрагентов из справочника поставщиков, которые завязаны на внутренние компании, решил сделать, если упрощенно, примерно следующее:
PHP код:
select    *
from      vendtrans v
join      vendtable t           on v
.dataareaid    t.dataareaid      and
                                   
v.accountnum    t.accountnum
join      extcodevaluetable e   on t
.dataareaid    e.dataareaid      and
                                   
t.recid         e.extcoderelationrecid  and
                                   
e.extcoderelationtableid 505      and
                                   
e.extcodeid     'vendExtCodeId'
left join gatewayorgref r       on v.dataareaid    r.dataareaid      and
                                   
v.accountnum    r.refid           and
                                   
r.reftype       2
left join gatewayorganization o on r
.dataareaid    o.dataareaid      and
                                   
r.gatewayorgid  o.gatewayorgid    and
                                   
o.active        1                 and
                                   
o.intercompanyorg 1
where     o
.gatewayorgid is null 
Здесь 'vendExtCodeId' - название внешнего кода для таблицы поставщиков, 505 == tablenum(VendTable), 2 == SysActionRefTypes::Vend, 1 == NoYes::Yes, всякие лишние группировки и выборки полей для простоты опущены. В Аксапте это все реализовано через Query, таблицы Gateway* цепляются через NonExistsJoin. Так вот, в SQL это все прекрасно отрабатывает, но когда дело доходит до Query, то вылезает непонятный глюк: либо не работает фильтр по GatewayOrganization, либо не выбирается VendTable и, соотв., внешний код - в зависимости от того, какую таблицу первой цеплять к VendTrans. Для тестирования написал небольшой job'ик, просьба посмотреть, у одного ли меня такие глюки, и посоветовать, что с этим делать При запуске job спрашивает, в каком порядке цеплять таблицы, в зависимости от этого результат у меня разный
X++:
static void testJoins(Args _args)
{
    VendTrans               vt;
    VendTable               vtbl;
    ExtCodeValueTable       extcvt;
    QueryRun                qr;
    Query                   query = new Query();
    QueryBuildDataSource    qbds, qbdsT;

    void joinGatewayOrg()
    {
        // filter out intercompany contragents
        qbds = qbdsT.addDataSource(tablenum(GatewayOrgRef));
        qbds.joinMode(JoinMode::NoExistsJoin);
        qbds.fetchMode(QueryFetchMode::One2One);
        qbds.addLink(fieldnum(VendTrans, AccountNum), fieldnum(GatewayOrgRef, RefId));
        qbds.addRange(fieldnum(GatewayOrgRef, RefType)).value(queryValue(SysActionRefTypes::Vend));
        qbds = qbds.addDataSource(tablenum(GatewayOrganization));
        qbds.fetchMode(QueryFetchMode::One2One);
        qbds.addLink(fieldnum(GatewayOrgRef, GatewayOrgId), fieldnum(GatewayOrganization, GatewayOrgId));
        qbds.addRange(fieldnum(GatewayOrganization, InterCompanyOrg)).value(queryValue(NoYes::Yes));
        qbds.addRange(fieldnum(GatewayOrganization, Active)).value(queryValue(NoYes::Yes));
    }
    void joinExtCodeValue()
    {
        ExtCodeId   extCodeId;
        ;
        extCodeId = (select firstonly ExtCodeId from ExtCodeTable
                   where ExtCodeTable.ExtCodeTableId == tablenum(VendTable)).extcodeId;
        info(strfmt(@"For table '%1' ExtCodeId = '%2'", tablestr(VendTable), extCodeId));
        // join vendtable p on v.accountnum = p.accountnum
        qbds = qbdsT.addDataSource(tablenum(VendTable));
        qbds.joinMode(JoinMode::InnerJoin);
        qbds.fetchMode(QueryFetchMode::One2One);
        qbds.relations(false);
        qbds.addLink(fieldnum(VendTrans, AccountNum), fieldnum(VendTable, AccountNum));
        // join extcodevaluetable e on p.tableid = e.extCodeRelationTableId and 
        //      p.recid = e.extCodeRelationRecId and e.extcodeid = ExtCodeId
        qbds = qbds.addDataSource(tablenum(ExtCodeValueTable));
        qbds.fetchMode(QueryFetchMode::One2One);
        qbds.addLink(fieldnum(VendTable, RecId), fieldnum(ExtCodeValueTable, ExtCodeRelationRecId));
        qbds.addRange(fieldnum(ExtCodeValueTable, ExtCodeRelationTableId)).value(queryValue(tablenum(VendTable)));
        qbds.addRange(fieldnum(ExtCodeValueTable, ExtCodeId)).value(extCodeId);
    }
    ;
    // select * from vendtrans v
    qbdsT = query.addDataSource(tablenum(VendTrans));
    qbdsT.addSortField(fieldnum(VendTrans, AccountNum));
    qbdsT.addSortField(fieldnum(VendTrans, TransDate));
    if (Box::yesNo(@"NonExists join first?", DialogButton::Yes) == DialogButton::Yes)
    {
        joinGatewayOrg();
        joinExtCodeValue();
    } else
    {
        joinExtCodeValue();
        joinGatewayOrg();
    }
    qr = new QueryRun(query);
    while(qr.next())
    {
        vt      = qr.get(tablenum(VendTrans));
        vtbl    = qr.get(tablenum(VendTable));
        extcvt  = qr.get(tablenum(ExtCodeValueTable));
        info(strfmt("%1 %2 name='%3', extCode='%4' %5", vt.TransDate, vt.AccountNum, vtbl.Name,
                    extcvt.ExtCodeValue, (vt.Invoice ? vt.Invoice : vt.Txt)));
    }
}
Может, я вообще все неправильно делаю, и надо фильтровать как-то иначе?..
Axapta 3.0 SP5 KR2, SQL Server 2005 SP1
Старый 12.02.2007, 21:44   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Так вот, в SQL это все прекрасно отрабатывает, но когда дело доходит до Query
Ужас какой-то...
1. Может стоит накидать запрос в АОТ мышкой, а в коде написать
X++:
Query q = new Query(querystr(mySuperQuery))
А range вставлять конструкцией SysQuery::findOrCreateRange(...)

2. Вместо одного суперзапроса в многопользовательской системе лучше делать несколько небольших. См. aEremenko: Ресурс заблокирован, ждите...

3. Ваш select не эквивалентен Query. В select вы получаете выборку из одного большого union'а. В Query вы прицепили две таблицы к одной ведущей. Порядок обхода будет другим. См. Руководство разработчика. Раздел по ключевому слову "Sequencing of retrieved records".
__________________
полезное на axForum, github, vk, coub.
Старый 13.02.2007, 00:21   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от mazzy Посмотреть сообщение
Ужас какой-то...
1. Может стоит накидать запрос в АОТ мышкой. А range вставлять конструкцией SysQuery::findOrCreateRange(...)
Низзя Да, этот совет уже можно записывать в FAQ и давать ссылку вместо многократного повторения, но в реальном классе, генерирующем отчет, вместо fieldnum(VendTrans, AccountNum) фигурирует this.contragentFieldAccount(), чтобы не писать два идентичных класса для поставщиков/клиентов...
Цитата:
2. Вместо одного суперзапроса в многопользовательской системе лучше делать несколько небольших. См. aEremenko: Ресурс заблокирован, ждите...
Во-первых, у меня уже и так куча подзапросов, поскольку реально для получения необходимых данных используется порядка 9 таблиц, что парсер запросов переварить никак не может. Во-вторых, у меня нет ни одной записи (select forupdate), так что блокировки тут ни при чем. В-третьих, отчет и так генерится по годичному обороту в 6 компаниях вместе с выплевыванием в Excel секунд за 5-7. Другое дело, что сейчас в него попадают лишние проводки
Цитата:
3. Ваш select не эквивалентен Query. В select вы получаете выборку из одного большого union'а. В Query вы прицепили две таблицы к одной ведущей. Порядок обхода будет другим. См. Руководство разработчика. Раздел по ключевому слову "Sequencing of retrieved records".
То, что не эквивалентен, - это понятно. В запросах и так нельзя адекватно отразить многое из обычного SQL; вопрос в том, почему запрос не работает так, как надо
Старый 13.02.2007, 08:44   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Низзя
Как скажете.
Но следуя за российским кодом вы плохому учитесь.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
вопрос в том, почему запрос не работает так, как надо
Я же написал:

Цитата:
Сообщение от mazzy Посмотреть сообщение
В Query вы прицепили две таблицы к одной ведущей. Порядок обхода будет другим. См. Руководство разработчика. Раздел по ключевому слову "Sequencing of retrieved records".
Впрочем, как вам будет угодно.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: gl00mie (3).
Старый 13.02.2007, 11:17   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от mazzy Посмотреть сообщение
следуя за российским кодом вы плохому учитесь.
Т.е. вместо того, чтобы делать по аналогии, скажем, с RLedgerSheetEngine_Turnover*, надо делать два идентичных класса и два идентичных Query на поставщиков/покупателей?.. Зачем же тогда те же Map'ы для таблиц придумали?.. Или учиться плохому - это именно использовать подстановки кодов полей, а использовать Map'ы - это нормально (видел кучу классов в SYS-слое, которые так делают)? Или же надо делать два идентичных Query и один класс, который выбирает их в зависимости от ситуации и обрабатывает через Map'ы CustVend*?..
Мне просто интересно: как обычно поступают в случае обработки данных по покупателям/поставщикам: ограничиваются только использованием Map CustVend*, а Query строят отдельно в AOT, или же позволяют себе параметрическое задание таблиц/полей для программно создаваемого Query вместо жесткого прописывания их в коде?
Цитата:
Я же написал:
Цитата:
В Query вы прицепили две таблицы к одной ведущей. Порядок обхода будет другим. См. Руководство разработчика. Раздел по ключевому слову "Sequencing of retrieved records".
Посмотрим, что написано в руководстве:
PHP код:
??????????????
?
DataSource A?
??????????????
      ?  ??????????????
      ????
DataSource B?
      ?  ??????????????
      ?  ??????????????
      ????
DataSource C?
         ??????????????
In an inner jointhe records to be fetched in following sequence:
A1B1C1A2B2C3..... AnBnCn
In an exist join
the records to be fetched in following sequence:
A1A2A3A4..... An 
Из этого можно сделать вывод, что в моем случае, поскольку GatewayOrg* цепляется к VendTrans через NonExistsJoin, то записи VendTable и ExtCodeValueTable вообще не будут выбраны...
Впрочем, это натолкнуло на кое-какие мысли, в результате чего запрос-таки заработал, как надо Я просто прицепил GatewayOrgRef не к VendTrans, а к VendTable:
PHP код:
VendTrans
?ij?VendTable
    
?ij??ExtCodeValueTable
    
?nej?GatewayOrgRef
         
?ij?GatewayOrganization 
X++:
static void testJoins(Args _args)
{
    VendTrans               vt;
    VendTable               vtbl;
    ExtCodeValueTable       extcvt;
    QueryRun                qr;
    Query                   query = new Query();
    QueryBuildDataSource    qbds, qbdsT;
    ExtCodeId   extCodeId;
    ;
    extCodeId = (select firstonly ExtCodeId from ExtCodeTable
               where ExtCodeTable.ExtCodeTableId == tablenum(VendTable)).extcodeId;
    info(strfmt(@"For table '%1' ExtCodeId = '%2'", tablestr(VendTable), extCodeId));
    qbds = query.addDataSource(tablenum(VendTrans));
    qbds.addSortField(fieldnum(VendTrans, AccountNum));
    qbds.addSortField(fieldnum(VendTrans, TransDate));
    qbdsT = qbds.addDataSource(tablenum(VendTable));
    qbdsT.fetchMode(QueryFetchMode::One2One);
    qbdsT.relations(false);
    qbdsT.addLink(fieldnum(VendTrans, AccountNum),     
                  fieldnum(VendTable, AccountNum));
    qbds = qbdsT.addDataSource(tablenum(ExtCodeValueTable));
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.addLink(fieldnum(VendTable, RecId),           
                 fieldnum(ExtCodeValueTable, ExtCodeRelationRecId));
    qbds.addRange(fieldnum(ExtCodeValueTable, ExtCodeRelationTableId)).value(queryValue(tablenum(VendTable)));
    qbds.addRange(fieldnum(ExtCodeValueTable, ExtCodeId)).value(extCodeId);
    // filter out intercompany contragents
    qbds = qbdsT.addDataSource(tablenum(GatewayOrgRef));
    qbds.joinMode(JoinMode::NoExistsJoin);
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.addLink(fieldnum(VendTrans, AccountNum),      
                 fieldnum(GatewayOrgRef, RefId));
    qbds.addRange(fieldnum(GatewayOrgRef, RefType)).value(queryValue(SysActionRefTypes::Vend));
    qbds = qbds.addDataSource(tablenum(GatewayOrganization));
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.addLink(fieldnum(GatewayOrgRef, GatewayOrgId),
                 fieldnum(GatewayOrganization, GatewayOrgId));
    qbds.addRange(fieldnum(GatewayOrganization, InterCompanyOrg)).value(queryValue(NoYes::Yes));
    qbds.addRange(fieldnum(GatewayOrganization, Active)).value(queryValue(NoYes::Yes));

    qr = new QueryRun(query);
    while(qr.next())
    {
        vt      = qr.get(tablenum(VendTrans));
        vtbl    = qr.get(tablenum(VendTable));
        extcvt  = qr.get(tablenum(ExtCodeValueTable));
        info(strfmt(@"%1 %2 name='%3', extCode='%4' %5", vt.TransDate, vt.AccountNum, vtbl.Name,
                    extcvt.ExtCodeValue, (vt.Invoice ? vt.Invoice : vt.Txt)));
    }
}

Последний раз редактировалось gl00mie; 13.02.2007 в 11:20. Причина: typo
Старый 13.02.2007, 11:48   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Т.е. вместо того, чтобы делать по аналогии, скажем, с RLedgerSheetEngine_Turnover*
Опять же - дело хозяйское.

Если кто-то хочет услышать, то рискну дать совет - не делайте по аналогии с объектами, у которых есть префикс R или суффикс _ru. Среди объектов с префиксом R или суффиксом _ru есть примеры грамотного программирования. Но с огромной вероятностью вы натолкнетесь на антипаттерн.

И уж ни в коем случае не берите за основу RLedgerSheet..., не берите за основу объекты, которые тянут данные на клиента и держат их в свопе клиента. Не берите за основу объекты, в которых так много избыточного программирования (см предыдущий пост). Не берите за основу объекты с нестандартным интерфейсом, в которых нет поиска, нет сортировки, нет работы с секьюрити, нет работы с rls, нет автоотчетов, а контролы создаются динамически... По крайней мере не начинайте с таких объектов.
__________________
полезное на axForum, github, vk, coub.
Старый 13.02.2007, 13:49   #7  
sharp is offline
sharp
Участник
 
41 / 16 (1) ++
Регистрация: 22.12.2006
Если клиент хочет получить определенный функционал, а наиболее близкое подобное решение RLedgerSheet..., к примеру, то как можно не брать его за основу?
Не больше ли получится избыточного программирования.
А отсутствие автоотчетов - так ли это критично?
Старый 13.02.2007, 14:22   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от sharp Посмотреть сообщение
Если клиент хочет получить определенный функционал, а наиболее близкое подобное решение RLedgerSheet...
Клиент не может сформулировать свою хотелку таким образом.
Подумайте над этим.

Наводящие вопросы: кто может сформлировать ТЗ именно так? Какие цели достигает этот кто-то формулируя ТЗ именно так?

Цитата:
Сообщение от sharp Посмотреть сообщение
отсутствие автоотчетов - так ли это критично?
В самом деле...
Ну, не сможет пользователь сам делать отчеты...
Ну, должен будет обращаться за каждым чихом к программисту...
Действительно, "так ли это критично?"
__________________
полезное на axForum, github, vk, coub.
Старый 14.02.2007, 11:57   #9  
sharp is offline
sharp
Участник
 
41 / 16 (1) ++
Регистрация: 22.12.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
Клиент не может сформулировать свою хотелку таким образом.
Подумайте над этим.
Ну почему это так нереально? Использовать не только наработки движка но и в первую очередь визуальный интерфейс готовый. Не может клиент попросить сделать "по аналогии"? Я ни в коем случае не наставиваю на идеальности R~ наработок. Уж если сам вижу порой отступление от бестпрактикс, представляю взгляд на это человека с Вашим опытом Но и не в R~ - порой еще бОльшие отступления от практик встречаются. К примеру, гантовский движок.

Цитата:
Сообщение от mazzy Посмотреть сообщение
В самом деле...
Ну, не сможет пользователь сам делать отчеты...
Ну, должен будет обращаться за каждым чихом к программисту...
Действительно, "так ли это критично?"
Автоотчеты обсуждаются крайне редко либо потому что их важность никто под сомнение не ставит, либо потому что конечный пользователь все таки ими не так уж часто. Если объективно в целом имеет место первое- обязательно приму к сведению.
Старый 14.02.2007, 12:22   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от sharp Посмотреть сообщение
Ну почему это так нереально? Использовать не только наработки движка но и в первую очередь визуальный интерфейс готовый. Не может клиент попросить сделать "по аналогии"?
Может. Из-за этого автора этого творения хочется сначала напинать, потом задушить, потом зарезать, потом оживить и повторить процедуру.

Хочу только отметить, что клиент может попросить сделать не по аналогии с классом как вы сказали, а по аналогии с внешним видом и поведением. Только программист может поставить задачу - сделать класс по аналогии с другим классом.


Цитата:
Сообщение от sharp Посмотреть сообщение
либо потому что конечный пользователь все таки ими не так уж часто
Пользуются нечасто, поскольку им их не показывают.

Вы наверное забыли, но автоотчеты 1) показывают те записи, которые видны на экране, 2) позволяют подводить итоги.

Вы попробуйте показать как при помощи автоотчетом получать итоги по заказу, закупке, журналу... И у вас перестанут просить добавить поле с суммой на форму... Открытые строки заказов/закупок, бюджеты, проводки... В сводном планировании это вообще незаменимая штука... Научите пользователей добавлять таблицы в фильтры... Научите пользователей записывать свои сложные фильтры... Это-ж просто праздник какой-то...

А если вы научите пользователей указывать пустой шаблон (чтобы не было header'а с компанией), то пользователь сможет записывать результаты в текстовый файл без примесей. А если вы научите сразу указывать у файла расширение xls, то пользователь сможет быстро и без дополнительных диалогов открывать результаты в Excel...

Скорее всего, не обсуждается, поскольку описано http://axapta.mazzy.ru/lib/autoreport/
__________________
полезное на axForum, github, vk, coub.
Старый 14.02.2007, 13:22   #11  
sharp is offline
sharp
Участник
 
41 / 16 (1) ++
Регистрация: 22.12.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
а по аналогии с внешним видом и поведением.
Именно это я и подразумевал под визуальным интерфейсом, просто Вы сформулировали правильно.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Пользуются нечасто, поскольку им их не показывают.
И все таки у меня сомнения, базовая ли это вещь.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Научите пользователей записывать свои сложные фильтры... Это-ж просто праздник какой-то...
Это и в базовом тренинге есть. Действительно, базис.
Кстати, почему так мало функционала где фильтры не привязываются к пользователю а доступны для всех. Только в расчетах с персоналом где-то встречалось. По идее, удобная штука.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Скорее всего, не обсуждается, поскольку описано http://axapta.mazzy.ru/lib/autoreport/
Вопросов по работе, конечно, не возникнет, а вот по поводу области применения...
Сводное планирование - да, им не будет заниматься человек, неспособный сложными фильтрами оперировать. Скорее всего вещь незаменимая.
Теги
ax3.0, шаблон

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Двойной Outer Join в Query LTA DAX: Программирование 2 21.01.2020 09:28
Как сдлеать join по одной таблице, а курсор по другой cerbo DAX: Программирование 9 03.10.2008 09:29
Join в Query konopello DAX: Программирование 2 19.04.2007 13:52
Вопрос по query и join tischenko DAX: Программирование 2 20.07.2005 13:05
Join трех таблиц (две к одной) ATimTim DAX: Программирование 25 03.02.2005 11:31

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

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

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