23.08.2007, 15:52 | #1 |
Злыдни
|
Запрос по трем таблицам
Доброго всем дня, господа.
У меня вот какая дурацкая проблема: есть форма, в которую в качестве источников данных добавлены таблицы ReqPO, InventDim, InventSize (не спрашивайте, зачем третья, так надо ). InventDim связан с ReqPO innerjoin-ом, аналогично связан InventSize с InventDim. То есть: ReqPO (InventDimId) InventDim InventDim (InventSizeId) InventSize Проблема вот какая - в гриде, в котором, по идее, должны отображаться строки ReqPO, происходит задвоение, затроение (и тд) каждой строки. Причина этого ясна: InventSizeId для разных ItemId могут совпадать (в таблице InventSize). Следовательно, надо как-то связать ReqPO с InventSIze по полю ItemId. А вот теперь вопрос - как их связать так, чтоб это было красиво и грамотно? Всем заранее спасибо. PS И еще: можно как-то на форме для источников данных сделать альтернативное связывание - либо связанные поля совпадают, либо поле в главной таблице вообще не заполнено?
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
23.08.2007, 16:21 | #2 |
SAP
|
Вот то что тебе надо http://www.axaptapedia.com/Expressions_in_query_ranges
|
|
23.08.2007, 16:28 | #3 |
Злыдни
|
Спасибо, но это мне не поможет (( Если это к PS - это первое, что я сделала - попыталась через dataAreaId. Не получилось.
А по поводу главной пробелемы - это никак ее не решает, потому что явной связи ReqPO с InventSize нет, надо их сджойнить...
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
23.08.2007, 16:38 | #4 |
Участник
|
Как идея (не пробовал такого пока)
Отключить для датасорса InventSize AutoQuery=false и в init() этого датасорса написать запрос к InventSize с условием InventSize.InventSizeId == InventDim.InventSizeId and InventSize.ItemId == ReqPo.ItemId |
|
23.08.2007, 16:45 | #5 |
SAP
|
Цитата:
Как идея (не пробовал такого пока)
Отключить для датасорса InventSize AutoQuery=false и в init() этого датасорса написать запрос к InventSize с условием InventSize.InventSizeId == InventDim.InventSizeId and InventSize.ItemId == ReqPo.ItemId |
|
23.08.2007, 16:54 | #6 |
Злыдни
|
А зачем AutoQuery убивать? тогда придется ручками датасорс создавать. Прописать так связь с InventDim получится. А с Reqpo - нет, потому что при создании связи addLink-ом система ругается на ParentFieldId...
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
23.08.2007, 16:56 | #7 |
Злыдни
|
А, сообразила... ща попробую
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
23.08.2007, 17:18 | #8 |
Злыдни
|
Никак (( воспользуюсь дедовским способом, жаль.
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
23.08.2007, 18:17 | #9 |
Участник
|
Извините, возможно сбил вас с верного пути, который указал konopello. Вот код, который работает для таблицы InventTrans. Надо поменять только на вашу ReqPo:
X++: public void init() { QueryBuildDataSource inventColorDataSource; QueryBuildRange inventColorItemRange; ; super(); inventColorDataSource = this.query().dataSourceTable(tableNum(InventColor)); inventColorItemRange = inventColorDataSource.addRange(fieldNum(InventColor, DataAreaId)); inventColorItemRange.value(strFmt('((%1.%2 == %3.%4)))', inventColor_ds.name(), fieldStr(InventColor, ItemId), inventTrans_ds.name(), fieldStr(InventTrans, ItemId))); } Успехов! |
|
24.08.2007, 10:01 | #10 |
Moderator
|
У Вас DS вна форме связаны по inner join. Для того, чтобы отображалась только одна строка, измените тип связи на ExistsJoin.
__________________
Андрей. |
|
24.08.2007, 10:07 | #11 |
Moderator
|
А это уже явный OuterJoin.
__________________
Андрей. |
|
24.08.2007, 11:00 | #12 |
Злыдни
|
Цитата:
Сообщение от petr
Извините, возможно сбил вас с верного пути, который указал konopello. Вот код, который работает для таблицы InventTrans. Надо поменять только на вашу ReqPo:
X++: public void init() { QueryBuildDataSource inventColorDataSource; QueryBuildRange inventColorItemRange; ; super(); inventColorDataSource = this.query().dataSourceTable(tableNum(InventColor)); inventColorItemRange = inventColorDataSource.addRange(fieldNum(InventColor, DataAreaId)); inventColorItemRange.value(strFmt('((%1.%2 == %3.%4)))', inventColor_ds.name(), fieldStr(InventColor, ItemId), inventTrans_ds.name(), fieldStr(InventTrans, ItemId))); } Успехов! Спасибо, Петр, оно заработало Оказалось, что дохло оно из-за того, что ReqPO тоже был привязан... к сгруппированному ReqPO (ReqPOGroup). Сильно систему клинило...
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
24.08.2007, 11:07 | #13 |
Злыдни
|
Да, но проблема в том, что использовать existsJoin и outerJoin надо одновременно. То есть PS относился к первой же проблеме - чтоб отображались и те записи из ReqPO, в InventDim которых InventSizeId и не заполнен даже...
И, мне кажется, existsJoin несколько неправильно использовать, строка-то одна в гриде будет, но мне-то нужен не любой InventSize, а именно тот, у которого ItemId совпадает с ReqPOшным.
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Как собрать запрос? | 11 | |||
Почему join запрос разбивается на подзапросы!? | 59 | |||
Запрос по двум таблицам | 17 | |||
Не работает запрос на нескольких компаниях | 3 | |||
Как выполнить запрос созданный в переменной | 12 |
|