08.10.2004, 14:07 | #1 |
Участник
|
проблема с query
Помогите разобраться с запросом….
Есть таблицы с такими связями: Классификатор | |-Статья затрат | | |-Объект территории | \ | Территория |-Ген. Договор \ Программа \ Направление Суть в том, что нужно сделать inner join по всем таблицам, чтобы пользователь при вызове prompt() мог ввести что угодно (range) в любой из таблиц и потом надо выбрать список значений одного из полей таблицы Классификатор. Вот текст запроса (построен по примерам с axforum, проблема – в qbDS6) Query query; QueryRun queryRun; QueryBuildDataSource qbDS1, qbDS2, qbDS3, qbDS4, qbDS5, qbDS6, qbDS7; 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)); //Статья затрат qbDS2 = qbDS1.addDataSource(tableNum(RFORExpenceItemTable)); qbDS2.addLink(fieldNum(RFORProgrammeClassifierTable, RFORExpenceItem), fieldNum(RFORExpenceItemTable, RFORExpenceItem)); qbDS2.joinMode(JoinMode::EXISTSJOIN); qbDS2.fetchMode(0); //info(qbDS1.toString()); //Объект qbDS3 = qbDS1.addDataSource(tableNum(RFORTerritoryItemTable)); qbDS3.addLink(fieldNum(RFORTerritoryItemTable, RFORTerritoryItem), fieldNum(RFORProgrammeClassifierTable, RFORTerritoryItem)); qbDS3.joinMode(JoinMode::EXISTSJOIN); qbDS3.fetchMode(0); //info(qbDS1.toString()); //Территория qbDS5 = qbDS3.addDataSource(tableNum(RFORTerritoryTable)); qbDS5.addLink(fieldNum(RFORTerritoryTable, RFORTerritory), fieldNum(RFORTerritoryItemTable, RFORTerritory)); qbDS5.joinMode(JoinMode::EXISTSJOIN); qbDS5.fetchMode(0); //info(qbDS1.toString()); //Ген.договор qbDS4 = qbDS1.addDataSource(tableNum(RFORGeneralContractTable)); qbDS4.addLink(fieldNum(RFORGeneralContractTable, RFORGeneralContract), fieldNum(RFORProgrammeClassifierTable, RFORGeneralContract)); qbDS4.joinMode(JoinMode::EXISTSJOIN); qbDS4.fetchMode(0); //info(qbDS1.toString()); //Программа qbDS6 = qbDS4.addDataSource(tableNum(RFORProgrammeTable)); fldId = fieldext2id(fieldName2Id(tablenum(RFORProgrammeTable), "RFORProgramme")); fldId2 = fieldext2id(fieldName2Id(tablenum(RFORGeneralContractTable), "RFORProgramme")); qbDS6.addLink(fldId, fldId2); qbDS6.joinMode(JoinMode::EXISTSJOIN); qbDS6.fetchMode(0); info(qbDS1.toString()); связь в qbDS6 должна проходить по полям RFORProgramme но проходит по другим – запрос генерится такой: SELECT * FROM RFORProgrammeClassifierTable EXISTS JOIN * FROM RFORExpenceItemTable WHERE RFORProgrammeClassifierTable.RFORExpenceItem = RFORExpenceItemTable.RFORExpenceItem EXISTS JOIN * FROM RFORTerritoryItemTable WHERE RFORProgrammeClassifierTable.RFORTerritoryItem = RFORTerritoryItemTable.RFORTerritoryItem EXISTS JOIN * FROM RFORTerritoryTable WHERE RFORTerritoryItemTable.RFORTerritory = RFORTerritoryTable.RFORTerritory EXISTS JOIN * FROM RFORGeneralContractTable WHERE RFORProgrammeClassifierTable.RFORGeneralContract = RFORGeneralContractTable.RFORGeneralContract EXISTS JOIN * FROM RFORProgrammeTable WHERE RFORGeneralContractTable.RFORGeneralContract = RFORProgrammeTable.RFORDirection То есть поля связываются RFORGeneralContractTable.RFORGeneralContract = RFORProgrammeTable.RFORDirection А надо RFORGeneralContractTable. RFORProgramme = RFORProgrammeTable. RFORProgramme Цивилизованный путь через qbDS6.addLink(fieldNum(RFORGeneralContractTable, RFORProgamme), fieldNum(RFORProgammeTable, RFORProgamme)); приводит к тому же результату, что и через fieldName2Id(). Из-за чего может быть закавыка ? С уважением, Еремин Игорь |
|