|
|
#1 |
|
Участник
|
Коллеги, прошу вашей подсказки.
При использовании сиквела конструкция запроса следующая: 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));
... |
|
|
|
|
#2 |
|
Участник
|
Использовать addLink дважды?
В вашем while select примере не вижу join для Table3? Если Table3 не джойнится, а вычисляется до запроса то это не link, а range. Последний раз редактировалось S.Kuskov; 01.11.2014 в 21:01. |
|
|
|
|
#3 |
|
Участник
|
В while select join для Table3 есть, просто я его упустил в описании.
Вариант с двумя Link подряд пробовал, но не дает нужного эффекта к сожалению. |
|
|
|
|
#4 |
|
Участник
|
Может попробовать inner join? И еще попробуй addrange по расширенному синтаксису
|
|
|
|
|
#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));
__________________
|
|
|
|
|
#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++;
}
} |
|
|
|
|
#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). | |
|
|
#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)); Огромное спасибо всем, кто участвовал в решении проблемки!!! |
|
|
|
|
#9 |
|
Участник
|
Ну, говоря о передвижении outer, я имел в виду - перенести добавление датасорса dsSpecies после dsBreed, а не установки связи для dsBreed в outer))
Сейчас, ваш запрос в Query не эквивалентен запросу в select - за счет отличия типа связей вы можете получить разный состав выборки записей
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
|
|