![]() |
#8 |
Участник
|
Решил-таки...всем кто участвовал в обсуждении большое спасибо за ответы
Упростил задачу - немного денормализовал таблицу "Генеральный договор" - храню там еще и поле "Направление", таким образом 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()); } |
|