Показать сообщение отдельно
Старый 08.10.2004, 14:07   #1  
EreminIgor is offline
EreminIgor
Участник
 
18 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
проблема с 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().

Из-за чего может быть закавыка ?

С уважением, Еремин Игорь