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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.02.2006, 09:59   #1  
korvin is offline
korvin
Участник
Аватар для korvin
 
29 / 10 (1) +
Регистрация: 16.01.2006
Адрес: Липецк
? Можно делать join таблицы к себе же через Query?
Можно делать join таблицы к себе же через Query? Если да, то киньте в меня примером пожалуйста.
__________________
Все люди равны, но некоторые равнее...
Старый 26.02.2006, 10:21   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хм. Можно, разумеется.
Делаешь 2 переменные - типа одной таблицы.
А дальше - как обычно

С Уважением,
Георгий
Старый 26.02.2006, 10:37   #3  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Что-то в этом роде...
Код:
    Query                           query = new Query();
    QueryRun                        qr;
    QueryBuildDataSource            qbds;
    QueryBuildRange                 qbr;
    TableId                         tableId;
    FieldId                         fieldId;
    FieldId                         parentFieldId;
    SalesLine                       salesLine;
    ;

    tableId = tablenum(SalesLine);
    qbds = query.AddDataSource(tableId);
    
    qbds = qbds.AddDataSource(tableId);

    parentFieldId   = fieldnum(SalesLine, SalesId);
    fieldId         = fieldnum(SalesLine, SalesId);
    qbds.addLink(parentFieldId, fieldId);
    //qbds.joinMode(JoinMode::NoExistsJoin);
    //info(qbds.toString());
    info(query.dataSourceNo(1).toString());
Даже переменная не понадобилась... только если будете юзать квериран, надо не забыть, что 2 одинаковых датасорса - тогда, возможно, и потребуется.
За это сообщение автора поблагодарили: sah (1).
Старый 27.02.2006, 09:02   #4  
korvin is offline
korvin
Участник
Аватар для korvin
 
29 / 10 (1) +
Регистрация: 16.01.2006
Адрес: Липецк
Цитата:
Сообщение от George Nordic
Код:
    Query                           query = new Query();
    QueryRun                        qr;
    QueryBuildDataSource            qbds;
    QueryBuildRange                 qbr;
    TableId                         tableId;
    FieldId                         fieldId;
    FieldId                         parentFieldId;
    SalesLine                       salesLine;
    ;

    tableId = tablenum(SalesLine);
    qbds = query.AddDataSource(tableId);
    
    qbds = qbds.AddDataSource(tableId);

    parentFieldId   = fieldnum(SalesLine, SalesId);
    fieldId         = fieldnum(SalesLine, SalesId);
    qbds.addLink(parentFieldId, fieldId);
    //qbds.joinMode(JoinMode::NoExistsJoin);
    //info(qbds.toString());
    info(query.dataSourceNo(1).toString());
Даже переменная не понадобилась... только если будете юзать квериран, надо не забыть, что 2 одинаковых датасорса - тогда, возможно, и потребуется.
Я извиняюсь за вопрос: а вы проверяли этот код, так сказать на практике ?
__________________
Все люди равны, но некоторые равнее...
Старый 27.02.2006, 09:35   #5  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Нет, а что? Он же для примера просто - с идеологической точки зрения он не имеет никакого смысла. Просто скажите какая именно задача - какие таблицы хотя бы.
Не понял - там же есть инфо, которое показывает заждойненную саму к себе таблицу. Или что-то другое требовалось?

Этот код рабочий - там просто была другая (новая, не родная) таблица, которую я заменил на стандартную.

С Уважением,
Георгий
Старый 27.02.2006, 10:14   #6  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Цитата:
Сообщение от korvin
Можно делать join таблицы к себе же через Query?
PHP код:
SELECT FROM SalesLine JOIN FROM SalesLine WHERE SalesLine.SalesId SalesLine.SalesId 
Какие еще доказательства нужны-то?
Старый 27.02.2006, 11:49   #7  
korvin is offline
korvin
Участник
Аватар для korvin
 
29 / 10 (1) +
Регистрация: 16.01.2006
Адрес: Липецк
Цитата:
Сообщение от George Nordic
PHP код:
SELECT FROM SalesLine JOIN FROM SalesLine WHERE SalesLine.SalesId SalesLine.SalesId 
Какие еще доказательства нужны-то?
У меня запрос вида:
Table1 wp0;
Table1 wp1;

/*
в таблице Table1 поля
int WareId;
int StorageId;
int PartyId;
real AmountMod;
real CostMod;
*/

select * from wp0 group by StorageId, WareId, PartyId
join sum(AmountMod), sum(CostMod) from wp1
where
(wp0.StorageId == xxx || wp0.StorageId == yyy) &&
(wp0.WareId == zzz || wp0.WareId == aaa) &&
wp1.StorageId == wp0.StorageId &&
wp1.WareId == wp0.WareId
;

Я получаю те данные которые мне нужны в задаче.
Как этот запрос сделать через Query, для того чтобы иметь изменяемое количество
условий отбора?
__________________
Все люди равны, но некоторые равнее...
Старый 27.02.2006, 12:05   #8  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хм. Честно говоря:
1) Лень возится. Честно. Может кто-то другой добъет пример через квери.
2) Непросто, потому как группировки и суммы
3) Мой вам совет - сделайте отдельно функцию, которая возвращает небходимую сумму по Table1. Эта функция может принимать параметры или запрос, и выполняться на серваке.
Это здорово упростит задачу и Вас порадует быстродействие.

Очень рекомендую именно этот способ.

С Уважением,
Георгий
Старый 27.02.2006, 13:15   #9  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Что типа этого.

PHP код:

    Query                           query 
= new Query();
    
QueryBuildDataSource            qbds1qbds2;
    ;
    
qbds1 query.AddDataSource(tablenum(Table1));
    
qbds1.ordermode(ordermode::groupby);
    
qbds1.addSortField(fieldnum(Table1StorageId));
    
qbds1.addSortField(fieldnum(Table1WareId));
    
qbds1.addSortField(fieldnum(Table1PartyId));
    
qbds1.addrange(fieldnum(Table1StorageId)).value(xxx "," yyy);
    
qbds1.addrange(fieldnum(Table1WareId)).value(zzz "," aaa);
  
    
    
qbds2 qbds1.AddDataSource(tableId);
    
qbds2.ordermode(ordermode::groupby);
    
qbds2.addSelectionField(fieldnum(Table1AmountMod), selectionField::Sum);
    
qbds2.addSelectionField(fieldnum(Table1CostMod), selectionField::Sum);
    
qbds2.addLink(fieldnum(Table1StorageId), fieldnum(Table1StorageId));
    
qbds2.addLink(fieldnum(Table1WareId), fieldnum(Table1WareId));


    
info(query.dataSourceNo(1).toString()); 
За это сообщение автора поблагодарили: korvin (1).
Старый 02.03.2006, 10:46   #10  
korvin is offline
korvin
Участник
Аватар для korvin
 
29 / 10 (1) +
Регистрация: 16.01.2006
Адрес: Липецк
Цитата:
Сообщение от raz
Что типа этого.

PHP код:

    Query                           query 
= new Query();
    
QueryBuildDataSource            qbds1qbds2;
    ;
    
qbds1 query.AddDataSource(tablenum(Table1));
    
qbds1.ordermode(ordermode::groupby);
    
qbds1.addSortField(fieldnum(Table1StorageId));
    
qbds1.addSortField(fieldnum(Table1WareId));
    
qbds1.addSortField(fieldnum(Table1PartyId));
    
qbds1.addrange(fieldnum(Table1StorageId)).value(xxx "," yyy);
    
qbds1.addrange(fieldnum(Table1WareId)).value(zzz "," aaa);
  
    
    
qbds2 qbds1.AddDataSource(tableId);
    
qbds2.ordermode(ordermode::groupby);
    
qbds2.addSelectionField(fieldnum(Table1AmountMod), selectionField::Sum);
    
qbds2.addSelectionField(fieldnum(Table1CostMod), selectionField::Sum);
    
qbds2.addLink(fieldnum(Table1StorageId), fieldnum(Table1StorageId));
    
qbds2.addLink(fieldnum(Table1WareId), fieldnum(Table1WareId));


    
info(query.dataSourceNo(1).toString()); 
Проверил, не совсем то, вернее совсем не то получается, что в задаче
__________________
Все люди равны, но некоторые равнее...
Старый 02.03.2006, 10:57   #11  
korvin is offline
korvin
Участник
Аватар для korvin
 
29 / 10 (1) +
Регистрация: 16.01.2006
Адрес: Липецк
Придётся видимо делать через XppCompiler, если никто не предложит лучшего...
__________________
Все люди равны, но некоторые равнее...
Старый 02.03.2006, 11:15   #12  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от korvin
Придётся видимо делать через XppCompiler, если никто не предложит лучшего...
Дык все правильно Вам предложили Разве что значения xxx, yyy, zzz и aaa лучше прогонять через SysQuery::value что бы спец. символы не мешали.

Цитата:
Сообщение от korvin
Проверил, не совсем то, вернее совсем не то получается, что в задаче
А что получается-то?
Старый 02.03.2006, 11:32   #13  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от korvin
Проверил, не совсем то, вернее совсем не то получается, что в задаче
А что не то?
Свиду вроде все нормально.

info вот что выдает:
SELECT * FROM Table1 GROUP BY Table1.StorageId ASC, Table1.WareId ASC, Table1.PartyId ASC WHERE ((StorageId = 000 OR StorageId = 001)) AND ((WareId = 002 OR WareId = 003)) JOIN SUM(AmountMod), SUM(CostMod) FROM Table1 WHERE Table1.StorageId = Table1.StorageId AND Table1.WareId = Table1.WareId

Планы запросов только скобками отличаются:

SELECT A.STORAGEID,A.WAREID,A.PARTYID,SUM(B.AMOUNTMOD),SUM(B.COSTMOD)
FROM TABLE1 A,TABLE1 B
WHERE ((A.DATAAREAID='DAT')
AND (((A.STORAGEID='000') OR (A.STORAGEID='001'))
AND ((A.WAREID='002') OR (A.WAREID='003'))))
AND ((B.DATAAREAID='DAT')
AND ((A.STORAGEID=B.STORAGEID)
AND (A.WAREID=B.WAREID)))
GROUP BY A.STORAGEID,A.WAREID,A.PARTYID
ORDER BY A.STORAGEID,A.WAREID,A.PARTYID OPTION(FAST 22)

SELECT A.STORAGEID,A.WAREID,A.PARTYID,SUM(B.AMOUNTMOD),SUM(B.COSTMOD)
FROM TABLE1 A,TABLE1 B
WHERE (A.DATAAREAID='DAT')
AND ((B.DATAAREAID='DAT')
AND (((((A.STORAGEID='000') OR (A.STORAGEID='001'))
AND ((A.WAREID='002') OR (A.WAREID='003')))
AND (B.STORAGEID=A.STORAGEID))
AND (B.WAREID=A.WAREID)))
GROUP BY A.STORAGEID,A.WAREID,A.PARTYID
ORDER BY A.STORAGEID,A.WAREID,A.PARTYID OPTION(FAST 22)

PHP код:
static void Job39(Args _args)
{
    
Table1                          wp0;
    
Table1                          wp1;
    
Table1                          wp0_q;
    
Table1                          wp1_q;
    
StorageId                xxx "000";
    
StorageId                yyy "001";
    
WareId                zzz "002";
    
WareId                aaa "003";

    
Query                           query = new Query();
    
QueryBuildDataSource            qbds1qbds2;

    
QueryRun                        QueryRun;
    ;
    
select from wp0 group by StorageIdWareIdPartyId
    join sum
(AmountMod), sum(CostModfrom wp1
    where
    
(wp0.StorageId == xxx || wp0.StorageId == yyy) &&
    (
wp0.WareId == zzz || wp0.WareId == aaa) &&
    
wp1.StorageId == wp0.StorageId &&
    
wp1.WareId == wp0.WareId;

    
qbds1 query.AddDataSource(tablenum(Table1));
    
qbds1.ordermode(ordermode::groupby);
    
qbds1.addSortField(fieldnum(Table1StorageId));
    
qbds1.addSortField(fieldnum(Table1WareId));
    
qbds1.addSortField(fieldnum(Table1PartyId));
    
qbds1.addrange(fieldnum(Table1StorageId)).value(xxx "," yyy);
    
qbds1.addrange(fieldnum(Table1WareId)).value(zzz "," aaa);


    
qbds2 qbds1.AddDataSource(tablenum(Table1));
    
qbds2.ordermode(ordermode::groupby);
    
qbds2.addSelectionField(fieldnum(Table1AmountMod), selectionField::Sum);
    
qbds2.addSelectionField(fieldnum(Table1CostMod), selectionField::Sum);
    
qbds2.addLink(fieldnum(Table1StorageId), fieldnum(Table1StorageId));
    
qbds2.addLink(fieldnum(Table1WareId), fieldnum(Table1WareId));

    
info(query.dataSourceNo(1).toString());

    
QueryRun = new QueryRun(query);

    
QueryRun.next();

    
wp0_q QueryRun.getNo(1);
    
wp1_q QueryRun.getNo(2);


Последний раз редактировалось raz; 02.03.2006 в 11:38.
Старый 02.03.2006, 11:51   #14  
korvin is offline
korvin
Участник
Аватар для korvin
 
29 / 10 (1) +
Регистрация: 16.01.2006
Адрес: Липецк
Цитата:
Сообщение от raz
А что не то?
Свиду вроде все нормально.

info вот что выдает:
SELECT * FROM Table1 GROUP BY Table1.StorageId ASC, Table1.WareId ASC, Table1.PartyId ASC WHERE ((StorageId = 000 OR StorageId = 001)) AND ((WareId = 002 OR WareId = 003)) JOIN SUM(AmountMod), SUM(CostMod) FROM Table1 WHERE Table1.StorageId = Table1.StorageId AND Table1.WareId = Table1.WareId

Планы запросов только скобками отличаются:

SELECT A.STORAGEID,A.WAREID,A.PARTYID,SUM(B.AMOUNTMOD),SUM(B.COSTMOD)
FROM TABLE1 A,TABLE1 B
WHERE ((A.DATAAREAID='DAT')
AND (((A.STORAGEID='000') OR (A.STORAGEID='001'))
AND ((A.WAREID='002') OR (A.WAREID='003'))))
AND ((B.DATAAREAID='DAT')
AND ((A.STORAGEID=B.STORAGEID)
AND (A.WAREID=B.WAREID)))
GROUP BY A.STORAGEID,A.WAREID,A.PARTYID
ORDER BY A.STORAGEID,A.WAREID,A.PARTYID OPTION(FAST 22)

SELECT A.STORAGEID,A.WAREID,A.PARTYID,SUM(B.AMOUNTMOD),SUM(B.COSTMOD)
FROM TABLE1 A,TABLE1 B
WHERE (A.DATAAREAID='DAT')
AND ((B.DATAAREAID='DAT')
AND (((((A.STORAGEID='000') OR (A.STORAGEID='001'))
AND ((A.WAREID='002') OR (A.WAREID='003')))
AND (B.STORAGEID=A.STORAGEID))
AND (B.WAREID=A.WAREID)))
GROUP BY A.STORAGEID,A.WAREID,A.PARTYID
ORDER BY A.STORAGEID,A.WAREID,A.PARTYID OPTION(FAST 22)

PHP код:
static void Job39(Args _args)
{
    
Table1                          wp0;
    
Table1                          wp1;
    
Table1                          wp0_q;
    
Table1                          wp1_q;
    
StorageId                xxx "000";
    
StorageId                yyy "001";
    
WareId                zzz "002";
    
WareId                aaa "003";

    
Query                           query = new Query();
    
QueryBuildDataSource            qbds1qbds2;

    
QueryRun                        QueryRun;
    ;
    
select from wp0 group by StorageIdWareIdPartyId
    join sum
(AmountMod), sum(CostModfrom wp1
    where
    
(wp0.StorageId == xxx || wp0.StorageId == yyy) &&
    (
wp0.WareId == zzz || wp0.WareId == aaa) &&
    
wp1.StorageId == wp0.StorageId &&
    
wp1.WareId == wp0.WareId;

    
qbds1 query.AddDataSource(tablenum(Table1));
    
qbds1.ordermode(ordermode::groupby);
    
qbds1.addSortField(fieldnum(Table1StorageId));
    
qbds1.addSortField(fieldnum(Table1WareId));
    
qbds1.addSortField(fieldnum(Table1PartyId));
    
qbds1.addrange(fieldnum(Table1StorageId)).value(xxx "," yyy);
    
qbds1.addrange(fieldnum(Table1WareId)).value(zzz "," aaa);


    
qbds2 qbds1.AddDataSource(tablenum(Table1));
    
qbds2.ordermode(ordermode::groupby);
    
qbds2.addSelectionField(fieldnum(Table1AmountMod), selectionField::Sum);
    
qbds2.addSelectionField(fieldnum(Table1CostMod), selectionField::Sum);
    
qbds2.addLink(fieldnum(Table1StorageId), fieldnum(Table1StorageId));
    
qbds2.addLink(fieldnum(Table1WareId), fieldnum(Table1WareId));

    
info(query.dataSourceNo(1).toString());

    
QueryRun = new QueryRun(query);

    
QueryRun.next();

    
wp0_q QueryRun.getNo(1);
    
wp1_q QueryRun.getNo(2);

Извиняюсь был неправ, ошибся у себя в условии, ваш пример отлично работает!
Беру на вооружение. Жаль только что уже сделал через XppCompiler, переработал лишнего...
__________________
Все люди равны, но некоторые равнее...
Теги
query, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Advanced query range value expressions: поле таблицы - имя вcтроенной функции year(). ATimTim DAX: Программирование 12 27.03.2009 18:16
Как подставить вычисляемое значение в Range у query Poleax DAX: Программирование 16 17.06.2008 18:52
Что и как можно резать? George Nordic DAX: Администрирование 1 11.05.2004 18:44
можно ли сделать с помощью join следующий запрос: SergAY DAX: Программирование 1 29.07.2003 11:39

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

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

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