![]() |
#1 |
Злыдни
|
Запрос по трем таблицам
Доброго всем дня, господа.
У меня вот какая дурацкая проблема: есть форма, в которую в качестве источников данных добавлены таблицы ReqPO, InventDim, InventSize (не спрашивайте, зачем третья, так надо ![]() То есть: ReqPO (InventDimId) InventDim InventDim (InventSizeId) InventSize Проблема вот какая - в гриде, в котором, по идее, должны отображаться строки ReqPO, происходит задвоение, затроение (и тд) каждой строки. Причина этого ясна: InventSizeId для разных ItemId могут совпадать (в таблице InventSize). Следовательно, надо как-то связать ReqPO с InventSIze по полю ItemId. А вот теперь вопрос - как их связать так, чтоб это было красиво и грамотно? Всем заранее спасибо. PS И еще: можно как-то на форме для источников данных сделать альтернативное связывание - либо связанные поля совпадают, либо поле в главной таблице вообще не заполнено?
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
![]() |
#2 |
SAP
|
Вот то что тебе надо http://www.axaptapedia.com/Expressions_in_query_ranges
|
|
![]() |
#3 |
Злыдни
|
Спасибо, но это мне не поможет (( Если это к PS - это первое, что я сделала - попыталась через dataAreaId. Не получилось.
А по поводу главной пробелемы - это никак ее не решает, потому что явной связи ReqPO с InventSize нет, надо их сджойнить...
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
![]() |
#4 |
Участник
|
Как идея (не пробовал такого пока)
Отключить для датасорса InventSize AutoQuery=false и в init() этого датасорса написать запрос к InventSize с условием InventSize.InventSizeId == InventDim.InventSizeId and InventSize.ItemId == ReqPo.ItemId |
|
![]() |
#5 |
SAP
|
Цитата:
Как идея (не пробовал такого пока)
Отключить для датасорса InventSize AutoQuery=false и в init() этого датасорса написать запрос к InventSize с условием InventSize.InventSizeId == InventDim.InventSizeId and InventSize.ItemId == ReqPo.ItemId |
|
![]() |
#6 |
Злыдни
|
А зачем AutoQuery убивать? тогда придется ручками датасорс создавать. Прописать так связь с InventDim получится. А с Reqpo - нет, потому что при создании связи addLink-ом система ругается на ParentFieldId...
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
![]() |
#7 |
Злыдни
|
А, сообразила... ща попробую
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
![]() |
#8 |
Злыдни
|
Никак (( воспользуюсь дедовским способом, жаль.
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
![]() |
#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))); } Успехов! |
|
![]() |
#10 |
Moderator
|
У Вас DS вна форме связаны по inner join. Для того, чтобы отображалась только одна строка, измените тип связи на ExistsJoin.
__________________
Андрей. |
|
![]() |
#11 |
Moderator
|
А это уже явный OuterJoin.
__________________
Андрей. |
|
![]() |
#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))); } Успехов! Спасибо, Петр, оно заработало ![]()
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
![]() |
#13 |
Злыдни
|
Да, но проблема в том, что использовать existsJoin и outerJoin надо одновременно. То есть PS относился к первой же проблеме - чтоб отображались и те записи из ReqPO, в InventDim которых InventSizeId и не заполнен даже...
И, мне кажется, existsJoin несколько неправильно использовать, строка-то одна в гриде будет, но мне-то нужен не любой InventSize, а именно тот, у которого ItemId совпадает с ReqPOшным.
__________________
Все может быть и быть все может, все может быть или не быть, но быть того никак не может, чего совсем не может быть. |
|
|
![]() |
||||
Тема | Ответов | |||
Как собрать запрос? | 11 | |||
Почему join запрос разбивается на подзапросы!? | 59 | |||
Запрос по двум таблицам | 17 | |||
Не работает запрос на нескольких компаниях | 3 | |||
Как выполнить запрос созданный в переменной | 12 |
|