Показать сообщение отдельно
Старый 11.10.2004, 16:57   #8  
EreminIgor is offline
EreminIgor
Участник
 
18 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
Решил-таки...всем кто участвовал в обсуждении большое спасибо за ответы

Упростил задачу - немного денормализовал таблицу "Генеральный договор" - храню там еще и поле "Направление", таким образом 2 join с таблицами "программа" и "направление" стали ненужными.
Запрос правильно заработал (программно), только когда стал выглядель так:

Классификатор
|
|-Статья затрат
|
|-Ген. Договор (включая поля Программа, Направление)
|
|-Объект территории
\
Территория

(то есть подчиненная относительно таблицы "Классификатор" таблица,
имеющая в свою очередь подчиненную таблицу, находится в "конце" запроса)
Видимо, запрос с двумя "ветвями" подчинения выполняется некорректно всегда.

Привожу исходный код:

static void TestQuery(Args _args)
{
Query query;
QueryRun queryRun;
QueryBuildDataSource qbDS1, qbDS2, qbDS3, qbDS4, qbDS5;
RFORProgrammeClassifierTable rFORProgrammeClassifierTable;
set dims = new set (types::string); // Declare a set of strings
str dimsStr;
int fldId, fldId2;
;

query = new Query();
//Классификатор программ
qbDS1 = query.addDataSource(tableNum(RFORProgrammeClassifierTable));
qbDS1.addRange(fieldNum(RFORProgrammeClassifierTable, RFORProgrammeClassifier));
//Ген.договор (в т.ч. программа и направление)
qbDS4 = qbDS1.addDataSource(tableNum(RFORGeneralContractTable));
qbDS4.addLink(fieldNum(RFORProgrammeClassifierTable, RFORGeneralContract), fieldNum(RFORGeneralContractTable, RFORGeneralContract));
qbDS4.joinMode(JoinMode::EXISTSJOIN);
qbDS4.fetchMode(0);
qbDS4.addRange(fieldNum(RFORGeneralContractTable, RFORProgramme));
qbDS4.addRange(fieldNum(RFORGeneralContractTable, RFORDirection));
qbDS4.addRange(fieldNum(RFORGeneralContractTable, RFORGeneralContract));
//info(qbDS1.toString());
//Статья затрат
qbDS2 = qbDS1.addDataSource(tableNum(RFORExpenceItemTable));
qbDS2.addLink(fieldNum(RFORExpenceItemTable, RFORExpenceItem), fieldNum(RFORProgrammeClassifierTable, RFORExpenceItem));
qbDS2.joinMode(JoinMode::EXISTSJOIN);
qbDS2.fetchMode(0);
qbDS2.addRange(fieldNum(RFORExpenceItemTable, RFORExpenceItem));
//info(qbDS1.toString());
//Объект
qbDS3 = qbDS1.addDataSource(tableNum(RFORTerritoryItemTable));
qbDS3.addLink(fieldNum(RFORTerritoryItemTable, RFORTerritoryItem), fieldNum(RFORProgrammeClassifierTable, RFORTerritoryItem));
qbDS3.joinMode(JoinMode::EXISTSJOIN);
qbDS3.fetchMode(0);
qbDS3.addRange(fieldNum(RFORTerritoryItemTable, RFORTerritoryItem));
//info(qbDS1.toString());
//Территория
qbDS5 = qbDS3.addDataSource(tableNum(RFORTerritoryTable));
qbDS5.addLink(fieldNum(RFORTerritoryItemTable, RFORTerritory), fieldNum(RFORTerritoryTable, RFORTerritory));
qbDS5.joinMode(JoinMode::EXISTSJOIN);
qbDS5.fetchMode(0);
qbDS5.addRange(fieldNum(RFORTerritoryTable, RFORTerritory));
//info(qbDS1.toString());


queryRun = new QueryRun(query);
if (queryRun.prompt())
{
while (queryRun.next())
{
rFORProgrammeClassifierTable = queryRun.get(tablenum(RFORProgrammeClassifierTable));
dims.add(rFORProgrammeClassifierTable.SupplAgreement[3]);
}
}

box::info(dims.toString());
}