AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 26.02.2006, 09:59   #1  
korvin ist offline
korvin
Участник
Benutzerbild von korvin
 
29 / 10 (1) +
Registriert seit: 16.01.2006
Ort: Липецк
? Можно делать join таблицы к себе же через Query?
Можно делать join таблицы к себе же через Query? Если да, то киньте в меня примером пожалуйста.
__________________
Все люди равны, но некоторые равнее...
Alt 26.02.2006, 10:21   #2  
George Nordic ist offline
George Nordic
Модератор
Benutzerbild von George Nordic
Злыдни
 
4.480 / 1255 (50) ++++++++
Registriert seit: 17.12.2003
Ort: Moscow
Blog-Einträge: 9
Хм. Можно, разумеется.
Делаешь 2 переменные - типа одной таблицы.
А дальше - как обычно

С Уважением,
Георгий
Alt 26.02.2006, 10:37   #3  
George Nordic ist offline
George Nordic
Модератор
Benutzerbild von George Nordic
Злыдни
 
4.480 / 1255 (50) ++++++++
Registriert seit: 17.12.2003
Ort: Moscow
Blog-Einträge: 9
Что-то в этом роде...
Code:
    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 одинаковых датасорса - тогда, возможно, и потребуется.
This post has been rated by: sah (1).
Alt 27.02.2006, 09:02   #4  
korvin ist offline
korvin
Участник
Benutzerbild von korvin
 
29 / 10 (1) +
Registriert seit: 16.01.2006
Ort: Липецк
Zitat:
Zitat von George Nordic
Code:
    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 одинаковых датасорса - тогда, возможно, и потребуется.
Я извиняюсь за вопрос: а вы проверяли этот код, так сказать на практике ?
__________________
Все люди равны, но некоторые равнее...
Alt 27.02.2006, 09:35   #5  
George Nordic ist offline
George Nordic
Модератор
Benutzerbild von George Nordic
Злыдни
 
4.480 / 1255 (50) ++++++++
Registriert seit: 17.12.2003
Ort: Moscow
Blog-Einträge: 9
Нет, а что? Он же для примера просто - с идеологической точки зрения он не имеет никакого смысла. Просто скажите какая именно задача - какие таблицы хотя бы.
Не понял - там же есть инфо, которое показывает заждойненную саму к себе таблицу. Или что-то другое требовалось?

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

С Уважением,
Георгий
Alt 27.02.2006, 10:14   #6  
George Nordic ist offline
George Nordic
Модератор
Benutzerbild von George Nordic
Злыдни
 
4.480 / 1255 (50) ++++++++
Registriert seit: 17.12.2003
Ort: Moscow
Blog-Einträge: 9
Zitat:
Zitat von korvin
Можно делать join таблицы к себе же через Query?
PHP-Code:
SELECT FROM SalesLine JOIN FROM SalesLine WHERE SalesLine.SalesId SalesLine.SalesId 
Какие еще доказательства нужны-то?
Alt 27.02.2006, 11:49   #7  
korvin ist offline
korvin
Участник
Benutzerbild von korvin
 
29 / 10 (1) +
Registriert seit: 16.01.2006
Ort: Липецк
Zitat:
Zitat von George Nordic
PHP-Code:
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, для того чтобы иметь изменяемое количество
условий отбора?
__________________
Все люди равны, но некоторые равнее...
Alt 27.02.2006, 12:05   #8  
George Nordic ist offline
George Nordic
Модератор
Benutzerbild von George Nordic
Злыдни
 
4.480 / 1255 (50) ++++++++
Registriert seit: 17.12.2003
Ort: Moscow
Blog-Einträge: 9
Хм. Честно говоря:
1) Лень возится. Честно. Может кто-то другой добъет пример через квери.
2) Непросто, потому как группировки и суммы
3) Мой вам совет - сделайте отдельно функцию, которая возвращает небходимую сумму по Table1. Эта функция может принимать параметры или запрос, и выполняться на серваке.
Это здорово упростит задачу и Вас порадует быстродействие.

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

С Уважением,
Георгий
Alt 27.02.2006, 13:15   #9  
raz ist offline
raz
NavAx
Benutzerbild von raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1.497 / 1096 (39) ++++++++
Registriert seit: 22.07.2003
Ort: МО
Что типа этого.

PHP-Code:

    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()); 
This post has been rated by: korvin (1).
Alt 02.03.2006, 10:46   #10  
korvin ist offline
korvin
Участник
Benutzerbild von korvin
 
29 / 10 (1) +
Registriert seit: 16.01.2006
Ort: Липецк
Zitat:
Zitat von raz
Что типа этого.

PHP-Code:

    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()); 
Проверил, не совсем то, вернее совсем не то получается, что в задаче
__________________
Все люди равны, но некоторые равнее...
Alt 02.03.2006, 10:57   #11  
korvin ist offline
korvin
Участник
Benutzerbild von korvin
 
29 / 10 (1) +
Registriert seit: 16.01.2006
Ort: Липецк
Придётся видимо делать через XppCompiler, если никто не предложит лучшего...
__________________
Все люди равны, но некоторые равнее...
Alt 02.03.2006, 11:15   #12  
vallys ist offline
vallys
Developer
 
146 / 108 (0) +++++
Registriert seit: 18.01.2005
Zitat:
Zitat von korvin
Придётся видимо делать через XppCompiler, если никто не предложит лучшего...
Дык все правильно Вам предложили Разве что значения xxx, yyy, zzz и aaa лучше прогонять через SysQuery::value что бы спец. символы не мешали.

Zitat:
Zitat von korvin
Проверил, не совсем то, вернее совсем не то получается, что в задаче
А что получается-то?
Alt 02.03.2006, 11:32   #13  
raz ist offline
raz
NavAx
Benutzerbild von raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1.497 / 1096 (39) ++++++++
Registriert seit: 22.07.2003
Ort: МО
Zitat:
Zitat von 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-Code:
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);


Geändert von raz (02.03.2006 um 11:38 Uhr)
Alt 02.03.2006, 11:51   #14  
korvin ist offline
korvin
Участник
Benutzerbild von korvin
 
29 / 10 (1) +
Registriert seit: 16.01.2006
Ort: Липецк
Zitat:
Zitat von 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-Code:
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, переработал лишнего...
__________________
Все люди равны, но некоторые равнее...
Stichworte
query, программно

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 18:53 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.