11.03.2013, 12:42 | #1 |
Участник
|
Сделать левый 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 |
Участник
|
Один грид должен отображать результат джойна, т.е. столбцы одновременно из двух таблиц? Или два грида, под каждый DataSource (master-detail)?
Для лучшего понимания задачи приведите здесь примерный текст запроса на стандартном SQL. И как? По идее датасурсы отчёта ничем не должны отличаться от датасурсов формы Последний раз редактировалось S.Kuskov; 11.03.2013 в 13:15. |
|
11.03.2013, 13:34 | #3 |
Участник
|
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 |
Участник
|
Я правильно понял, что подчинённая таблица нужна только для фильтрации первой, и данные из неё не отображать не нужно?
Если так, то тогда вам нужно просто заменить тип связи с OuterJoin на ExistsJoin. |
|
11.03.2013, 13:48 | #5 |
Участник
|
Извините , ошибся. Правильная связь: SalesTable.salesid=pickingroute.transrefid указывал для примера. Если использовать existsJoin, то не отображаются заказы, по которым еще нет маршрутов, так же как и Inner join.
|
|
11.03.2013, 14:09 | #6 |
Участник
|
Цитата:
Код: 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 |
Участник
|
Извините, я наверно не совсем правильно задал вопрос.
Есть форма которая привязана к таблицам, одна из которых SalesTable. Через эту форму создаются маршруты, соответственно появляются новые строки в таблице PickingRoute. Я пытаюсь выделить цветом строки, для этого мне необходимо,как я понимаю, добавить таблицу PickingRoute и указать LInkType. Если я указываю OuterJoin, то происходит задвоение строк, т.к. количество созданных маршрутов может быть более 1 на заказ. Если я указываю InnerJoin или ExistsJoin, то заказы, по которым нет маршрутов, не отображаются, что в принципе логично. При этом в тексте кода я не делаю ни каких изменений, следовательно, исходя из вышесказанного, LInkType должен быть OuterJoin, а в тексте мне необходимо как-то группировать строки, или я делаю что-то в корне не верно и подход должен быть совсем другим. Если я использую код который указан в первом сообщении, то нужные строки выделяются как положено цветом, но как решить проблему задвоения строк не могу найти. |
|
11.03.2013, 15:22 | #8 |
Участник
|
Цитата:
У метода displayOption есть входной параметр. В него передаётся курсор, цвет которого в данный момент определяется (если использовать курсор из имени датасурса, то нужного результата не добиться). Используйте значение SalesId входящего курсора для поиска строк в таблице pickingroute. X++: select pickingroute where pickingroute.transrefid == SalesId && ...; if (pickingroute == NULL) {...} |
|
11.03.2013, 15:23 | #9 |
Участник
|
Цитата:
Сообщение от kadet
Извините, я наверно не совсем правильно задал вопрос.
Есть форма которая привязана к таблицам, одна из которых SalesTable. Через эту форму создаются маршруты, соответственно появляются новые строки в таблице PickingRoute. Я пытаюсь выделить цветом строки, для этого мне необходимо,как я понимаю, добавить таблицу PickingRoute и указать LInkType. Если я указываю OuterJoin, то происходит задвоение строк, т.к. количество созданных маршрутов может быть более 1 на заказ. Если я указываю InnerJoin или ExistsJoin, то заказы, по которым нет маршрутов, не отображаются, что в принципе логично. При этом в тексте кода я не делаю ни каких изменений, следовательно, исходя из вышесказанного, LInkType должен быть OuterJoin, а в тексте мне необходимо как-то группировать строки, или я делаю что-то в корне не верно и подход должен быть совсем другим. Если я использую код который указан в первом сообщении, то нужные строки выделяются как положено цветом, но как решить проблему задвоения строк не могу найти.
__________________
// no comments |
|
12.03.2013, 11:56 | #10 |
Участник
|
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)); } Если я неверно чего понял sorry. SalesTable у меня в AOT есть а PickingRouteid? |
|
12.03.2013, 12:07 | #11 |
Участник
|
Если же... на одну строку 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)); // поля выборки в группировку } |
|
|
|