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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.07.2004, 08:16   #1  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Пожалуйста, помогите с запросом
Ситуация такая. Есть некоторая таблица JournalRequest, в которой есть поле UserCode.

Данные в таблице простые: для UserCode = '0001' одна запись, для '0002' - две и для '0003' - три.

Хотелось бы сделать запрос (с помощью Query или через АОТ), который бы выдавал количество записей для каждого UserCode, типа:

0001 1
0002 2
0003 3

Пытаюсь так:
PHP код:
    Query                query =  new Query();
    
QueryBuildDataSource qbd,qbd2;
    ;

    
qbd query.addDataSource(tableNum(JournalRequest));
    
qbd.OrderMode(OrderMode::GroupBy);
    
qbd.addSortField(fieldNum(JournalRequest,UserCode));
    
qbd.addSelectionField(fieldNum(JournalRequest,UserCode));

    
qbd2 qbd.addDataSource(tableNum(JournalRequest));
    
qbd2.OrderMode(OrderMode::GroupBy);
    
qbd2.addSortField(fieldNum(JournalRequest,UserCode));
    
qbd2.addSelectionField(fieldNum(JournalRequest,UserCode),SelectionField::Count);

    
qbd2.addLink(fieldNum(JournalRequest,UserCode),
           
fieldNum(JournalRequest,UserCode));
    
qbd2.joinMode(JoinMode::InnerJoin); 
Сейчас, после такого цикла по результатам:
PHP код:
    while (query.next())
    {
      
JournalRequest query.get(tableNum(JournalRequest),1);
      
jr2 query.get(tableNum(JournalRequest),2);

      
info(" " JournalRequest.UserCode " " jr2.UserCode);
    } 
Выдается следующее:

0001 2
0002 3
0003

Видимо, где-то косяк при соединении таблиц. Не могу понять где
Старый 08.07.2004, 08:51   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Проще надо быть
PHP код:
    Query                query =  new Query();
    
QueryBuildDataSource qbd;
    ;

    
qbd query.addDataSource(tableNum(JournalRequest));
    
qbd.OrderMode(OrderMode::GroupBy);
    
qbd.addSortField(fieldNum(JournalRequestUserCode));
    
qbd.addSelectionField(fieldNum(JournalRequestRecId), SelectionField::COUNT); 
Старый 08.07.2004, 09:03   #3  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Я дал упрощенный вариант. Мне бы хотелось джойнить с таблицами, и в подчиненных таблицах задавать разные условия.

PHP код:
JournalRequest  -(1)----(М)- Count (JournalRequest) /с одним условием
            
|-(1)--------(М)- Count (JournalRequest) / с другим условием
            
\-(1)--------(М)- Count (JournalRequest) / с третьим условием 
Прошу прощения за дурной рисунок, надеюсь смысл понятен

Ну и соответственно чтобы выдавалось что-то типа

0001 1 4 7
0002 2 5 8
0003 3 6 9

Попытался поджойнить с первой таблицей, сразу же не получилось

А с помощью того варианта, который Вы предложили, так не получится
Старый 08.07.2004, 09:53   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Есть такой язык для описания запросов, придуман фирмой IBM, называется SQL. Выразите на нем человеческими словами, что Вы хотите получить от запроса, и Вам сразу будет легче!
Уважаемый chel! Это ни в коем разе не "наезд", а хороший совет - когда я (или пользователь) не могу (может) точно сформулировать, что он хочет получить, надо сначала надо точно сформулировать (можно сначала просто по-русски) критерии выбора, потом переложить на SQL, потом выполнить данный запрос (в джобе или обозревателе таблиц, если простой) и только потом прекладывать на Query, который, увы, не всесилен...

А чем Вам не угодил select?
Попробуйте сначала написать запрос с его помощью. И покажите нам - так легче будет разобраться....

С Уважением,
Георгий.
Старый 08.07.2004, 09:57   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Сомневаюсь, что это возможно.

Может стоит поискать другие пути решения исходной задачи?
Старый 08.07.2004, 10:27   #6  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Уважаемый Георгий! Я давно уже привык выражать свои мысли в первую очередь на этом замечательном языке Вот только перевести свои мысли в не менее замечательный Query у меня почему-то не получается

PHP код:
Select a.usercoded.c1d.c2 from

(select usercode 
from techsupportjournalrequest 
group by usercode
A

inner join

(select b.usercodeb.c1 as c1c.c2 as c2 from

(select usercodecount(usercode) as C1
from techsupportjournalrequest 
where receivedate between convert
(datetime'01.01.2003'104) and convert(datetime'31.12.2003'104)
group by usercode
B

full outer join

(select usercodecount(usercode) as C2
from techsupportjournalrequest 
where dateperformed between convert
(datetime'01.01.2003'104) and convert(datetime'31.12.2003'104)
group by usercode
C

on b
.usercode c.usercode

D

on a
.usercode d.usercode 
диалект MS SQL 2000
Старый 08.07.2004, 10:33   #7  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
А насчет того, чем мне не угодил select:

1. Раз уж мне дается визуальный инструмент (Query), который на первый взгляд достаточно удобен, надо в нем разобраться и пользоваться им.
2. В Query (то есть в QueryRun) мне очень понравился метод prompt. Можно самому формы не городить.
Старый 08.07.2004, 10:49   #8  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Спешу Вас разочаровать - вряд ли получиться. 1) Где-то на форуме проходила информация, что торйной query "не жилец" - очень медленно выполняется. Точно не помню, но какие-то траблы были. 2) с Group by тоже проблемы... используется order by 3) Даже если что-то подобное и удасться сделать, то уж очень все громоздко будет. Можно сделать так: содать query (простой, только с теми параметрами, которые влияют на запрос), -> queryrun -> запустить -> prompt -> получить все параметры, которые ввел пользователь, и на основании их уже комбинировать простые selectы или query.

С наилучшими пожеланиями,
Георгий.
Старый 08.07.2004, 11:20   #9  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Георгий, спасибо
Старый 08.07.2004, 15:10   #10  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано George Nordic
Спешу Вас разочаровать - вряд ли получиться. 1) Где-то на форуме проходила информация, что торйной query "не жилец" - очень медленно выполняется. Точно не помню, но какие-то траблы были. 2) с Group by тоже проблемы... используется order by 3) Даже если что-то подобное и удасться сделать, то уж очень все громоздко будет. Можно сделать так: содать query (простой, только с теми параметрами, которые влияют на запрос), -> queryrun -> запустить -> prompt -> получить все параметры, которые ввел пользователь, и на основании их уже комбинировать простые selectы или query.

С наилучшими пожеланиями,
Георгий.
А посоветуйте пожалуйста, как можно результаты while .. select запихнуть в Grid. Насколько я успел разобраться, Grid требует DataSource, которого у меня нет. TableControl и ListControl не подходят, т.к. из них нельзя скопировать данные в Excel.
Старый 08.07.2004, 15:28   #11  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хм. Как нет? есть же таблица (несколько таблиц) связанных по какому-либо принципу. Или одна, но на ней есть display методы, по которым она выбирает даннык в другой. На ей основе и делаете грид.
Старый 08.07.2004, 15:37   #12  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
В особо сложных случаях, когда нужна форма с хитрой выборкой - выручают временные таблицы. Которые и лежат под гридом.

А если данные надо в Ексель, так может их сразу туда? Без форм и пр..
Старый 08.07.2004, 15:58   #13  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Честно говоря, не рекомендовал бы злоупотреблять темповыми таблицами. Только в случае очень тяжелых запросов по многим таблицам, расчетных полей или суммирования (группировки полей для суммирования из разных таблиц). Легкость использования темповых таблиц перерастает в привычку использовать их по любому поводу, так что не удивляйтесь, если скоро в репозитарии у Вас будет несколько сотен таблиц с префиксом tmp
display - методы удобны, кэшируются и для этого и придуманы.
Старый 08.07.2004, 16:00   #14  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано George Nordic
Хм. Как нет? есть же таблица (несколько таблиц) связанных по какому-либо принципу. Или одна, но на ней есть display методы, по которым она выбирает даннык в другой. На ей основе и делаете грид.
Вот Вы видели мой запрос - какую таблицу можно использовать как датасорс?

Цитата:
Изначально опубликовано AlGol
В особо сложных случаях, когда нужна форма с хитрой выборкой - выручают временные таблицы. Которые и лежат под гридом.
О! А это идея. Спасибо, выручили. Айм хэппи!
Старый 08.07.2004, 16:04   #15  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
techsupportjournalrequest - ведь все данные стояться на основании запроса именно к этой таблице?
Старый 08.07.2004, 16:21   #16  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано George Nordic
techsupportjournalrequest - ведь все данные стояться на основании запроса именно к этой таблице?
Я наверно чего-то не понимаю
Ведь несколько строк исходной таблицы сворачиваются в одну строку, полученную в результате запроса.
Старый 08.07.2004, 16:55   #17  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
То, что данная таблица находиться в датасорсе, не означает что будут выведены все записи из неё
Переопределите её query... Перекройте executeQuery, наконец! Много разных вариантов...
Старый 08.07.2004, 17:39   #18  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано George Nordic
То, что данная таблица находиться в датасорсе, не означает что будут выведены все записи из неё
Переопределите её query... Перекройте executeQuery, наконец! Много разных вариантов...
Я наверное уже надоел
Я бы рад перекрыть executeQuery, но мой запрос не представляется в виде query. Видимо, придется обойтись временной таблицей.
Очень большое спасибо за помощь.
Старый 08.07.2004, 17:40   #19  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да, думаю, что в Вашем случае это может быть оправдано.

Удачи!

С Уважением,
Георгий.
Старый 12.07.2004, 11:53   #20  
Лютый is offline
Лютый
Участник
Аватар для Лютый
 
18 / 10 (1) +
Регистрация: 12.07.2004
Адрес: Екатеринбург
На сколько я понял из кода, вы пытаетесь соеденить UserCode и сумма(UserCode),
причем указываете, что они должны совпадать :

.......
qbd.addSelectionField(fieldNum(JournalRequest,UserCode));
......
qbd2.addSelectionField(fieldNum(JournalRequest,UserCode),SelectionField::Count);

qbd2.addLink(fieldNum(JournalRequest,UserCode),
fieldNum(JournalRequest,UserCode));

Связывать нужно по UserCode, а вычислять количество строк по recid, в этом случае
код будет выглядеть так:

qbd = query.addDataSource(tableNum(JournalRequest));
qbd.OrderMode(OrderMode::GroupBy);
qbd.addSortField(fieldNum(JournalRequest,UserCode));
qbd.addSelectionField(fieldNum(JournalRequest,UserCode));

qbd2 = qbd.addDataSource(tableNum(JournalRequest));
qbd2.OrderMode(OrderMode::GroupBy);
qbd2.addSortField(fieldNum(JournalRequest,UserCode));
// zev ---- >
// qbd2.addSelectionField(fieldNum(JournalRequest,UserCode),SelectionField::Count);
qbd2.addSelectionField(fieldNum(JournalRequest,UserCode));
qbd2.addSelectionField(fieldNum(JournalRequest, RecId), SelectionField::COUNT);
// <--- zev
qbd2.addLink(fieldNum(JournalRequest,UserCode),
fieldNum(JournalRequest,UserCode));
qbd2.joinMode(JoinMode::InnerJoin);
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помогите с запросом к полю-контейнеру. Silphidae DAX: Программирование 3 17.11.2008 17:04
Помогите с запросом.. DarkBear DAX: Программирование 2 15.08.2005 13:38
Помогите с SQL запросом malex DAX: Программирование 8 26.07.2005 13:43
Помогите пожалуйста с запросом... velk DAX: Программирование 18 20.10.2004 08:44
Помогите пожалуйста! dunno DAX: Функционал 16 23.02.2004 16:56

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

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

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