01.11.2014, 20:34 | #1 |
Участник
|
Конструкция WHERE (x==x) && (x==x). Каков аналог при использовании QUERY?
Коллеги, прошу вашей подсказки.
При использовании сиквела конструкция запроса следующая: X++: while select Table1 join Table2 where (Table1.id1 == Table2.id1) &&(Table1.id2 == Table3.id2) Каков аналог построения конструкции && при использовании QUERY ? Как продолжить или откорректировать код по аналогии с построением одной связи: X++: qbds.joinMode(JoinMode::OuterJoin); qbds.addLink(FieldNum(Table1, id1), fieldNum(Table2, id1)); ... |
|
01.11.2014, 20:49 | #2 |
Участник
|
Использовать addLink дважды?
В вашем while select примере не вижу join для Table3? Если Table3 не джойнится, а вычисляется до запроса то это не link, а range. Последний раз редактировалось S.Kuskov; 01.11.2014 в 21:01. |
|
01.11.2014, 22:21 | #3 |
Участник
|
В while select join для Table3 есть, просто я его упустил в описании.
Вариант с двумя Link подряд пробовал, но не дает нужного эффекта к сожалению. |
|
01.11.2014, 22:49 | #4 |
Участник
|
Может попробовать inner join? И еще попробуй addrange по расширенному синтаксису
|
|
02.11.2014, 01:25 | #5 |
Дмитрий Ерин
|
а они не должны быть "подряд" (если я правильно понял смысл этой фразы), так как относятся к разным datasource. Примерно так (пишу без проверки синтаксиса):
X++: ... QueryBuildDataSource qbdsTable1, qbdsTable2, qbdsTable3; qbdsTable1 = query.addDataSource(tablenum(Table1)); qbdsTable2 = qbdsTable1.addDataSource(tablenum(Table2)); qbdsTable2.joinMode(JoinMode::OuterJoin); qbdsTable2.addLink(fieldNum(Table1, id1), fieldNum(Table2, id1)); qbdsTable3 = qbdsTable1.addDataSource(tablenum(Table3)); qbdsTable3.joinMode(JoinMode::OuterJoin); qbdsTable3.addLink(fieldNum(Table1, id2), fieldNum(Table3, id2));
__________________
|
|
02.11.2014, 13:09 | #6 |
Участник
|
Ребята, я совершил ошибку, сократив свой вопрос и из-за этого тема не раскрылась и стала не совсем понятной.
Попытаюсь исправиться и подробно описать проблемку. На самом деле это задачка из учебного курса по X++ Итак, есть три таблицы: VetSpeciesTable - таблица типа животных (справочник: SpeciesID и Name). VetBreedTable - таблица пород (справочник: SpeciesID, BreedID и Name). VetCustPetTable - основная таблица (CustAccount, SpeciesID, BreedID). Есть запрос в котором проиллюстрированы все типы связей по этим таблицам. В запросе мы подтягиваем поля Name из таблиц VetSpeciesTable и VetBreedTable по соответствующим ID из таблицы VetCustPetTable: X++: { AAL_VetCustPetTable CustPetTable; AAL_VetBreedTable BreedTable; AAL_VetSpeciesTable SpeciesTable; while select CustPetTable order CustAccount join SpeciesTable where CustPetTable.SpeciesId == SpeciesTable.SpeciesId join BreedTable where (CustPetTable.SpeciesId == BreedTable.SpeciesId) &&(CustPetTable.BreedId == BreedTable.BreedId) { info(CustPetTable.CustAccount + ' - ' + int2str(CustPetTable.SpeciesId) + ' - ' + SpeciesTable.Name + ' - ' + int2str(CustPetTable.BreedId) + ' - ' + BreedTable.Name); countTable++; } } Мой вариант выдает размножение записей: X++: { Query query; QueryRun queryRun; QueryBuildDataSource dsCust, dsSpecies, dsBreed; QueryBuildRange qbr; VetCustPetTable CustPetTable; VetSpeciesTable SpeciesTable; VetBreedTable BreedTable; query = new Query(); dsCust = query.addDataSource(tableNum(VetCustPetTable)); dsSpecies = dsCust.addDataSource(tableNum(VetSpeciesTable)); dsSpecies.joinMode(JoinMode::OuterJoin); dsSpecies.addLink(FieldNum(VetCustPetTable, SpeciesId), fieldNum(VetSpeciesTable, SpeciesId)); dsBreed = dsCust.addDataSource(tableNum(VetBreedTable)); dsBreed.joinMode(JoinMode::InnerJoin); dsBreed.addLink(fieldNum(VetCustPetTable, SpeciesId), fieldNum(VetBreedTable, SpeciesId)); dsBreed.addLink(fieldNum(VetCustPetTable, BreedId), fieldNum(VetBreedTable, BreedId)); queryRun = new QueryRun(query); while (queryRun.next()) { CustPetTable = queryRun.get(TableNum(VetCustPetTable)); SpeciesTable = queryRun.get(TableNum(VetSpeciesTable)); BreedTable = queryRun.get(TableNum(VetBreedTable)); info(CustPetTable.CustAccount + ' - ' + int2str(CustPetTable.SpeciesId) + ' - ' + SpeciesTable.Name + ' - ' + int2str(CustPetTable.BreedId) + ' - ' + BreedTable.Name); countTable++; } } |
|
02.11.2014, 13:21 | #7 |
Участник
|
Добавьте
X++: dsSpecies.fetchMode(QueryFetchMode::One2One); ... dsBreed.fetchMode(QueryFetchMode::One2One); И еще. Если у вас на таблицах прописаны релейшены, то можно не вызывать addLink(), а прописать relations(true); на датасорсах
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 02.11.2014 в 13:26. |
|
|
За это сообщение автора поблагодарили: Music (1). |
02.11.2014, 13:42 | #8 |
Участник
|
Цитата:
Сообщение от AndyD
Добавьте
X++: dsSpecies.fetchMode(QueryFetchMode::One2One); ... dsBreed.fetchMode(QueryFetchMode::One2One); И еще. Если у вас на таблицах прописаны релейшены, то можно не вызывать addLink(), а прописать relations(true); на датасорсах Сработали оба варианта! Часть кода (вариант 1): X++: dsCust = query.addDataSource(tableNum(VetCustPetTable)); dsSpecies = dsCust.addDataSource(tableNum(VetSpeciesTable)); dsSpecies.joinMode(JoinMode::OuterJoin); dsSpecies.relations(true); dsSpecies.fetchMode(QueryFetchMode::One2One); dsBreed = dsCust.addDataSource(tableNum(VetBreedTable)); dsBreed.joinMode(JoinMode::OuterJoin); dsBreed.relations(true); dsBreed.fetchMode(QueryFetchMode::One2One); X++: dsCust = query.addDataSource(tableNum(VetCustPetTable)); dsSpecies = dsCust.addDataSource(tableNum(VetSpeciesTable)); dsSpecies.joinMode(JoinMode::OuterJoin); dsSpecies.fetchMode(QueryFetchMode::One2One); dsSpecies.addLink(FieldNum(VetCustPetTable, SpeciesId), fieldNum(VetSpeciesTable, SpeciesId)); dsBreed = dsCust.addDataSource(tableNum(VetBreedTable)); dsBreed.joinMode(JoinMode::OuterJoin); dsBreed.fetchMode(QueryFetchMode::One2One); dsBreed.addLink(fieldNum(VetCustPetTable, SpeciesId), fieldNum(VetBreedTable, SpeciesId)); dsBreed.addLink(fieldNum(VetCustPetTable, BreedId), fieldNum(VetBreedTable, BreedId)); Огромное спасибо всем, кто участвовал в решении проблемки!!! |
|
02.11.2014, 13:53 | #9 |
Участник
|
Ну, говоря о передвижении outer, я имел в виду - перенести добавление датасорса dsSpecies после dsBreed, а не установки связи для dsBreed в outer))
Сейчас, ваш запрос в Query не эквивалентен запросу в select - за счет отличия типа связей вы можете получить разный состав выборки записей
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|