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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.07.2004, 17:08   #1  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
Из запроса в query!!!
Как из запроса:
select AccountNum, Sum(AccountNum) from LedgerTrans group by AccountNum
сформировать соответствующий query?
За это сообщение автора поблагодарили: Dodger (1).
Старый 07.07.2004, 17:12   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
программно? вроде, никак.
а зачем?
Старый 07.07.2004, 17:17   #3  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А он у вас так выполняется?
Старый 07.07.2004, 17:20   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Не вижу разницы.
PHP код:
    Query                   query = new Query();
    
QueryBuildDataSource    qbds;
    
QueryBuildRange         qbr;
    
TableId                 tableId;
    
FieldId                 fieldId;
    
LedgerTrans             ledgerTrans;
    ;

    
tableId tablenum(LedgerTrans);
    
qbds query.AddDataSource(tableId);
    
fieldId fieldnum(LedgerTrans,AccountNum);
    
qbds.addSortField(fieldId);
    
fieldId fieldnum(LedgerTrans,AccountNum);
    
//qbr = qbds.AddRange(fieldId);
    //qbr.value( );
    
info(query.dataSourceNo(1).toString());

    while 
select AccountNum//, Sum(AccountNum)
        
from  ledgerTrans
        group by AccountNum
        
{
            
info(strfmt("%1",ledgerTrans.AccountNum));
        }

    
info("А теперь так:");

    while 
select AccountNumSum(AccountNum)
        
from  ledgerTrans
        group by AccountNum
        
{
            
info(strfmt("%1",ledgerTrans.AccountNum));
        } 
Если нужна сумма, то select однозначно.
Старый 07.07.2004, 17:21   #5  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
Допустим надо вывести все счета с количеством проводок по каждому.
Старый 07.07.2004, 17:26   #6  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
while select AccountNum, Sum(AccountNum)

from ledgerTrans

group by AccountNum

{

info(strfmt("%1",ledgerTrans.AccountNum));

}

хорошо... только как посмотреть сумму???

запрос не подходит потому, что хотелось бы юзеру дать возможность и самому поучавствовать в выборке.

Вообще хотелось бы сделать что-то вроде такого запроса:

Код:
Select acca.ANum, AccA.AccAll as A1, AccB.AccAll as A2 

From

(select AccountNum as ANUM, count(AccountNum) as AccAll from LedgerTrans 
	group by AccountNum
) AccA

inner join

(select AccountNum AS ANUM, count(AccountNum) as AccAll from LedgerTrans 
	where transdate = CONVERT(datetime,'01.01.2004',104) 
	group by AccountNum
) AccB

on ACCA.anum = accb.anum

order by acca.ANum
Есть ли возможность сделать такое через Query?
Старый 07.07.2004, 17:34   #7  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Далайте отчет. И критерии выборки будут, и группировку можно задать, и сумму будет считать автоматически.
Старый 07.07.2004, 17:38   #8  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хе-хе. Молодой человек, будьте аккуратны. Вот пример для sum и для count:

PHP код:
    LedgerTrans             ledgerTrans;
    
LedgerTrans             ledgerTransCount;
    ;

    
info("???????? ????? SUM ? COUNT:");

    while 
select AccountNum
        from  ledgerTrans
        group by AccountNum
        join  sum
(AccountNum)
            
from  ledgerTransCount
            where ledgerTransCount
.AccountNum == ledgerTrans.AccountNum
        
{
            
info(strfmt("%1 %2",ledgerTrans.AccountNum,ledgerTransCount.AccountNum));
        }

    while 
select AccountNum
        from  ledgerTrans
        group by AccountNum
        join  count
(AccountNum)
            
from  ledgerTransCount
            where ledgerTransCount
.AccountNum == ledgerTrans.AccountNum
        
{
            
info(strfmt("%1 %2",ledgerTrans.AccountNum,ledgerTransCount.AccountNum));
        } 

А то пользователи увидят СУММУ счетов вместо количества транзакций
Старый 07.07.2004, 17:50   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано pdojn
запрос не подходит потому, что хотелось бы юзеру дать возможность и самому поучавствовать в выборке.
Как это?
Запрос как раз для этого и предназначен - генерировать запрос из кода и дать возможность пользователю вставлять и заменять критерии.
Старый 07.07.2004, 17:55   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Ничего не понимаю (С) Колобки
Цитата:
Изначально опубликовано George Nordic
PHP код:
    while select AccountNum
        from  ledgerTrans
        group by AccountNum
        join  sum
(AccountNum)
            
from  ledgerTransCount
            where ledgerTransCount
.AccountNum == ledgerTrans.AccountNum
        
{
            
info(strfmt("%1 %2",ledgerTrans.AccountNum,ledgerTransCount.AccountNum));
        } 
А то пользователи увидят СУММУ счетов вместо количества транзакций]
Как это вы так лихо суммируете AccountNum, если это строковое поле?

Скажите на простом человеческом языке - что вы от нее хотите?
Старый 07.07.2004, 18:02   #11  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Многоуважаемый mazzy! Я-то от неё ничего не хочу
Вот что у меня получается:

Различие между sum и count:
Sum
Info ????????? (17:55:35) 10.100 3646.1
Info ????????? (17:55:35) 19.300 4342.5
Info ????????? (17:55:35) 20.100 502.5
Info ????????? (17:55:35) 20.200 20.2
Info ????????? (17:55:35) 20.501 2952.144
Info ????????? (17:55:35) 20.504 184.536
Info ????????? (17:55:35) 43.100 43.1
Info ????????? (17:55:35) 60.100 54090
Count:
Info ????????? (17:55:35) 10.100 361
Info ????????? (17:55:35) 19.300 225
Info ????????? (17:55:35) 20.100 25
Info ????????? (17:55:35) 20.200 1
Info ????????? (17:55:35) 20.501 144
Info ????????? (17:55:35) 20.504 9
Info ????????? (17:55:35) 43.100 1
Info ????????? (17:55:35) 60.100 900

Имхо, Oracle сам разобрался, что это за поле Ему лучше знать
Старый 07.07.2004, 18:05   #12  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А вообще, это довольно забавно - суммирование строковых полей, как пытался делать уважаемый pdojn
Цитата:
select AccountNum, Sum(AccountNum)from LedgerTrans group by AccountNum
Не проверите плиз, а как SQL к этому безобразию отнесется? Просто интересно..
Старый 07.07.2004, 18:23   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано George Nordic
Многоуважаемый mazzy! Я-то от неё ничего не хочу
Приношу свои извинения, это я автора хотел спросить.
pdojn, что вы хотите от Аксапты добиться? скажите пожалуйсат на простом русском языке.
Старый 07.07.2004, 18:27   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
на MS SQL код не выполняется

выдается ошибка
Цитата:
Невозможно выбрать запись в 'Бухгалтерские проводки' ('LedgerTrans') Документ ГК: , .
База данных SQL обнаружила ошибку.
Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
Оператор SQL: SELECT A.ACCOUNTNUM,SUM(B.ACCOUNTNUM) FROM LEDGERTRANS A,LEDGERTRANS B WHERE (A.DATAAREAID='dmo') AND ((B.DATAAREAID='dmo') AND (B.ACCOUNTNUM=A.ACCOUNTNUM)) GROUP BY A.ACCOUNTNUM ORDER BY A.ACCOUNTNUM OPTION(FAST 21)
Старый 07.07.2004, 18:29   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
а. кажется я пропустил.
Цитата:
Изначально опубликовано pdojn
Допустим надо вывести все счета с количеством проводок по каждому.
допустим вот так
http://forum.mazzy.ru/index.php?showtopic=300

это если запросом.
если select'ом в коде, то George правильно написал. Только count надо делать по RecID
Старый 07.07.2004, 18:34   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
причем можно сделать чуть оптимальнее

PHP код:
LedgerTrans             ledgerTrans;
    
LedgerTable             ledgerTable;
    ;

    
info("???????? ????? SUM ? COUNT:");

    while 
select count(recID
        
from  ledgerTable               // идем по плану счетов, а не по проводкам!!!
        
group by accountnum
        join  count
(RecID)
            
from  ledgerTrans
            where ledgerTrans
.AccountNum == ledgerTable.AccountNum
        
{
            
info(strfmt("%1 %2",ledgerTable.AccountNum,ledgerTrans.recID));
        } 
Старый 08.07.2004, 00:03   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
вот так вот будет еще лучше
PHP код:
LedgerTrans             ledgerTrans;
    ;

    while 
select count(recID
        
from  ledgerTrans
        group by accountnum
        
{
            
info(strfmt("%1 %2",ledgerTable.AccountNum,ledgerTrans.recID));
        } 
Старый 08.07.2004, 06:29   #18  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
Цитата:
Изначально опубликовано George Nordic
PHP код:
   select AccountNum
        from  ledgerTrans
        group by AccountNum
        join  count
(AccountNum)
            
from  ledgerTransCount
            where ledgerTransCount
.AccountNum == ledgerTrans.AccountNum 
Обдолбился с суммой, конечно же count...
Еще хотелось бы узнать можно ли этот запрос реализовать в АОТ или через динамическое создание запроса?
Старый 08.07.2004, 10:33   #19  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Вот так:

PHP код:
    Query                   query = new Query();
    
QueryBuildDataSource    qbds;
    
QueryBuildRange         qbr;
    
QueryRun                qr;
    
TableId                 tableId;
    
FieldId                 fieldId;
    
FieldId                 linkedfieldId;
    
LedgerTable             ledgerTable;
    
LedgerTrans             ledgerTrans;
    
LedgerTrans             ledgerTransCount;
    ;

    
info("1st method:");
    while 
select count(RecId)
        
from  ledgerTrans
        group by AccountNum
        
{
            
info(strfmt("%1  %2",ledgerTrans.AccountNumledgerTrans.RecId));
        }

    
info("2nd method:");
    
query   = new Query();
    
qbds    query.addDataSource(tableId);
    
qbr     qbds.AddRange(fieldId);
    
tableId tablenum(LedgerTrans);
    
fieldId fieldnum(LedgerTrans,AccountNum);

    while 
select AccountNum
        from  ledgerTrans
        group by AccountNum
        
{
            
qbr.value(ledgerTrans.AccountNum);
            
qr      = new QueryRun(query);
            
info(strfmt("%1  %2",ledgerTrans.AccountNumSysQuery::countTotal(qr)));
        } 
С Уважением,
Георгий.
Старый 08.07.2004, 12:49   #20  
ahtoh
Гость
 
n/a
мде...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
Изменение query запроса в локальных настройках пользователя? 3oppo DAX: Программирование 16 09.04.2008 11:15
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Как реализовать Query или View на примере такого T-SQL запроса для OLAP? sao DAX: Программирование 9 07.10.2005 18:57
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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