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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.03.2013, 12:42   #1  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
Сделать левый join или сделать динамическую группировку в GRID
Добрый день!
Имеется форма, к которой привязанно 2 DataSource: SalesTable и PickingRouteid. В свойствах PickingRouteid стоит OuterJoin на вторую таблицу. В Grid просходит задвоение строк. Подскажите, пожалуйста, как сделать левый join или сделать динамическую группировку в GRID?
x++:
PickingRouteLocal.data(salesTableLocal.joinChild());


if (_record.SalesStatus == SalesStatus::Complete\Left)
{ if (pickingroutelocal.expeditionstatus == expeditionstatus::started)
_options.backColor(color1);
}

P.S. НА форуме нашел только как сделать левый Join в Отчете.
Старый 11.03.2013, 13:07   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kadet Посмотреть сообщение
В Grid просходит задвоение строк.
Один грид должен отображать результат джойна, т.е. столбцы одновременно из двух таблиц? Или два грида, под каждый DataSource (master-detail)?

Для лучшего понимания задачи приведите здесь примерный текст запроса на стандартном SQL.


Цитата:
Сообщение от kadet Посмотреть сообщение
P.S. НА форуме нашел только как сделать левый Join в Отчете.
И как? По идее датасурсы отчёта ничем не должны отличаться от датасурсов формы

Последний раз редактировалось S.Kuskov; 11.03.2013 в 13:15.
Старый 11.03.2013, 13:34   #3  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
sql:
select *
from salesTable
where salestable.salesstatus='colmpliteLeft' and salesid in
(select salesid
from salestable left join pickingrouteid on salestable.pickingid=pickingroute.pickingid
where picking.expeditionstatus in ('active', 'started')) //указаны соответсвующие значения из Base Enum.


В форме можно в свойствах таблицы, как я понял, указать.

Последний раз редактировалось kadet; 11.03.2013 в 13:39.
Старый 11.03.2013, 13:42   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я правильно понял, что подчинённая таблица нужна только для фильтрации первой, и данные из неё не отображать не нужно?

Если так, то тогда вам нужно просто заменить тип связи с OuterJoin на ExistsJoin.
Старый 11.03.2013, 13:48   #5  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
Извините , ошибся. Правильная связь: SalesTable.salesid=pickingroute.transrefid указывал для примера. Если использовать existsJoin, то не отображаются заказы, по которым еще нет маршрутов, так же как и Inner join.
Старый 11.03.2013, 14:09   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kadet Посмотреть сообщение
Если использовать existsJoin, то не отображаются заказы, по которым еще нет маршрутов, так же как и Inner join.
Так в вашем примере ограничение
Код:
where picking.expeditionstatus in ('active', 'started')
также не выберет такие заказы
нужно что-то вроде
Цитата:
where picking.expeditionstatus in ('active', 'started') or picking.expeditionstatus is not null

Последний раз редактировалось S.Kuskov; 11.03.2013 в 14:13.
Старый 11.03.2013, 14:57   #7  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
Извините, я наверно не совсем правильно задал вопрос.
Есть форма которая привязана к таблицам, одна из которых SalesTable. Через эту форму создаются маршруты, соответственно появляются новые строки в таблице PickingRoute. Я пытаюсь выделить цветом строки, для этого мне необходимо,как я понимаю, добавить таблицу PickingRoute и указать LInkType. Если я указываю OuterJoin, то происходит задвоение строк, т.к. количество созданных маршрутов может быть более 1 на заказ. Если я указываю InnerJoin или ExistsJoin, то заказы, по которым нет маршрутов, не отображаются, что в принципе логично. При этом в тексте кода я не делаю ни каких изменений, следовательно, исходя из вышесказанного, LInkType должен быть OuterJoin, а в тексте мне необходимо как-то группировать строки, или я делаю что-то в корне не верно и подход должен быть совсем другим.
Если я использую код который указан в первом сообщении, то нужные строки выделяются как положено цветом, но как решить проблему задвоения строк не могу найти.
Старый 11.03.2013, 15:22   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kadet Посмотреть сообщение
Я пытаюсь выделить цветом строки, для этого мне необходимо,как я понимаю, добавить таблицу PickingRoute и указать LInkType.
Совсем не обязательно. Информацию о наличии/отсутствии маршрута можно определять для каждой строки отдельным запросом. Будет немного медленнее, но зато можно реализовать более сложную логику и на основном запрос это не будет никак отражаться.

У метода displayOption есть входной параметр. В него передаётся курсор, цвет которого в данный момент определяется (если использовать курсор из имени датасурса, то нужного результата не добиться). Используйте значение SalesId входящего курсора для поиска строк в таблице pickingroute.

X++:
select pickingroute where pickingroute.transrefid == SalesId && ...;
if (pickingroute == NULL) {...}
Старый 11.03.2013, 15:23   #9  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от kadet Посмотреть сообщение
Извините, я наверно не совсем правильно задал вопрос.
Есть форма которая привязана к таблицам, одна из которых SalesTable. Через эту форму создаются маршруты, соответственно появляются новые строки в таблице PickingRoute. Я пытаюсь выделить цветом строки, для этого мне необходимо,как я понимаю, добавить таблицу PickingRoute и указать LInkType. Если я указываю OuterJoin, то происходит задвоение строк, т.к. количество созданных маршрутов может быть более 1 на заказ. Если я указываю InnerJoin или ExistsJoin, то заказы, по которым нет маршрутов, не отображаются, что в принципе логично. При этом в тексте кода я не делаю ни каких изменений, следовательно, исходя из вышесказанного, LInkType должен быть OuterJoin, а в тексте мне необходимо как-то группировать строки, или я делаю что-то в корне не верно и подход должен быть совсем другим.
Если я использую код который указан в первом сообщении, то нужные строки выделяются как положено цветом, но как решить проблему задвоения строк не могу найти.
Чтобы убрать задвоение (затроение, зачетверение), вам необходимо либо уточнить запрос, добавив еще какие-либо условия к вашему фильтру на форме, либо сделать на форме 2 грида со связью Master-Detail. Как это делается, можно посмотреть на форме SalesTable.
__________________
// no comments
Старый 12.03.2013, 11:56   #10  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
OuterJoin как мне представляется должен работать отлично.
Если в форме 2 датасорса SalesTable и PickingRouteid и в PickingRouteid я так понимаю нет записей, которых нет в SalesTable, то задвоение может происходить только если не установлена связь (Relation) между SalesTable и PickingRouteid по pickingroute.transrefid или динамически PickingRouteid хватает другую связь. Можно поробовать переопределить init датасорса PickingRouteid примерно так:
X++:
public void init()
{
    QueryBuildDatasource qbds;
    ;
    super();

    qbds = this.query().dataSourceTable(tableNum(PickingRouteid));
    qbds.clearDynalinks(); // долой диналинки
    qbds.clearLinks();  // ... и линки на всякий случай
    
    qbds.addLink(fieldNum(SalesTable, SalesId), fieldNum(PickingRouteid, transrefId));
}
... или на таблице PickingRouteid создать relation.
Если я неверно чего понял sorry. SalesTable у меня в AOT есть а PickingRouteid?
Старый 12.03.2013, 12:07   #11  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Если же... на одну строку SalesTable несколько строк в PickingRouteid..., то тоже решаемо...
Переопределяем все тот же init:
X++:
public void init()
{
    QueryBuildDatasource qbds;
    ;
    super();

    qbds = this.query().dataSourceTable(tableNum(PickingRouteid));
    qbds.clearDynalinks();
    qbds.clearLinks();
    qbds.orderMode(OrderMode::GroupBy);
    qbds.addSortField(fieldNum(PickingRouteid, Field1));
    qbds.addSortField(fieldNum(PickingRouteid, Field2));
    qbds.addSortField(fieldNum(PickingRouteid, Field3)); // поля выборки в группировку

    qbds.addLink(fieldNum(SalesTable, SalesId), fieldNum(PickingRouteid, transrefId));
    
    qbds = this.query().dataSourceTable(tableNum(SalesTable));
    qbds.orderMode(OrderMode::GroupBy);
    qbds.addSortField(fieldNum(SalesTable, Field1));
    qbds.addSortField(fieldNum(SalesTable, Field2));
    qbds.addSortField(fieldNum(SalesTable, Field3));  // поля выборки в группировку
}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
addicted2ax: Dynamics AX 2012 & SQL Server 2008R2: Cross Join vs. Inner Join – Houston we have *NO* Problem Blog bot DAX Blogs 0 20.12.2012 20:11
axaptapedia: Filter-by-Grid Blog bot DAX Blogs 2 30.05.2012 13:39
Возможно ли (View -> Grid) join (View -> Grid)? samolalex DAX: Программирование 0 04.10.2010 12:02
Можно ли вообще сделать JOIN временной таблицы и InventDim??? Maxim Gorbunov DAX: Программирование 9 05.03.2005 10:39
можно ли сделать с помощью join следующий запрос: SergAY DAX: Программирование 1 29.07.2003 11:39

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

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

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