18.04.2007, 13:08 | #1 |
Участник
|
Помогите разобраться с запросом по РБП
Задача: вывечти с форме списка РБП только те карточки, в которых есть открытые модели.
SELECT * FROM RDeferralsTable JOIN FIRSTONLY * FROM RDeferralsBook WHERE RDeferralsTable.DeferralsId = RDeferralsBook.DeferralsId AND ((Status = В работе)) По результатам данного запроса в списке РБП выводиться столько строк РБП, сколько открытых моделей. Что неправильно в запросе? |
|
18.04.2007, 13:20 | #2 |
Участник
|
esists join для этого есть
|
|
18.04.2007, 13:47 | #3 |
Участник
|
FetchMode - это совсем другое свойство
Вам нужно свойство JoinMode |
|
18.04.2007, 13:48 | #4 |
Участник
|
уже сообразила, не успела отменить )))
|
|
18.04.2007, 16:49 | #5 |
Участник
|
Еще вопрос.
При первом входе он делает все верно. Свзявает источник ds формы и тот источник, который я указываю qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); Но стоит мне повторно обратиться к методу executeQuery на источнике формы из метода modifide на checkbox после метода super() и он видит только один источник данных в запросе в методе executeQuery. Т.е. он игнорирует qbdsStd и строчки дальше. Отладчиком он по ним идет, но query не меняет. Вообще код простой. X++: public void executeQuery() { QueryBuildDataSource qbds; QueryBuildRange qbdsrange3; QueryBuildDataSource qbds1; str _rangeClose; QueryBuildDataSource qbdsStd; QueryBuildRange qbrStatus; ; //запрос по таблице РБП qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); qbds1.clearRanges(); qbds1.clearLinks(); qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status)); /* if (Cat_OpenDef.value() == NoYes::No) { */ qbrStatus.value(enum2str(RDeferralsStatus::Open)); // } super(); } |
|
18.04.2007, 17:07 | #6 |
Участник
|
Код: public void executeQuery() { QueryBuildDataSource qbds; QueryBuildRange qbdsrange3; QueryBuildDataSource qbds1; str _rangeClose; QueryBuildDataSource qbdsStd; QueryBuildRange qbrStatus; ; //запрос по таблице РБП qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); qbds1.clearRanges(); qbds1.clearLinks(); if (!query.dataSourceTable(tableNum(RDeferralsBook))) qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status)); /* if (Cat_OpenDef.value() == NoYes::No) { */ qbrStatus.value(enum2str(RDeferralsStatus::Open)); // } super(); } Последний раз редактировалось kashperuk; 18.04.2007 в 17:15. |
|
18.04.2007, 17:19 | #7 |
----------------
|
все как всегда, если вы меняете запрос, а он не меняется, значит... вы меняете не тот запрос
if(this.queryRun()) qbds1 = this.queryRun().query().dataSourceTable(tableNum(RDeferralsTable)); else qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); |
|
18.04.2007, 17:32 | #8 |
Участник
|
X++: public void executeQuery() { QueryBuildDataSource qbds; QueryBuildRange qbdsrange3; QueryBuildDataSource qbds1; str _rangeClose; QueryBuildDataSource qbdsStd; QueryBuildRange qbrStatus; ; //запрос по таблице РБП qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); qbds1.clearRanges(); qbds1.clearLinks(); if (!this.query().dataSourceTable(tableNum(RDeferralsBook))) { if (Cat_OpenDef.value() == NoYes::No) { qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status)); qbrStatus.value(enum2str(RDeferralsStatus::Open)); } } else { qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status)); qbrStatus.value(''); } super(); } qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); расценивает как один запрос и не соединяет его с первичным запросом qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); Т.е. на выходе у него появляется 2 отдельных запроса qbds1 и qbdsStd , а они должны были соединиться. А может причина в том, что RDeferralsTable является DS формы, а RDeferralsBook - нет? Последний раз редактировалось Arahnid; 18.04.2007 в 17:40. |
|
18.04.2007, 17:51 | #9 |
Участник
|
Долго смотрел этот запрос. Честно говоря, так и не понял, что должно получиться в результате.
Если можно, расскажите словами. В любом случае, предлагаю альтернативный вариант запроса и пару вопросов: X++: public void executeQuery() { QueryBuildDataSource qbds; QueryBuildRange qbdsrange3; QueryBuildDataSource qbds1; str _rangeClose; QueryBuildDataSource qbdsStd; QueryBuildRange qbrStatus; ; //запрос по таблице РБП qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); qbds1.clearRanges(); qbds1.clearLinks(); qbdsStd = this.query().dataSourceTable(tableNum(RDeferralsBook)); if (!qbdsStd) { qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); } qbrStatus = SysQuery::findOrCreateRange(qbdsStd, fieldnum(RDeferralsBook,Status)); if (Cat_OpenDef.value() == NoYes::No) { qbrStatus.value(enum2str(RDeferralsStatus::Open)); } else { qbrStatus.value(SysQuery::valueUnlimited()); } super(); } 1. Зачем вы делаете присоединение источника из кода? 2. Почему бы не сделать это присоединение в методe init() источника? |
|
18.04.2007, 19:10 | #10 |
Участник
|
Все просто. Есть справочник. Он требует только одного источника - таблица РБП. Сейчас , если по РБП закрыты все модели в таблице моделей, то строка в форме списка РБП окрашивается в серый цвет (это прописано в методе на DS таблицы РБП), а нужно, чтоб ее не было видно.
Я предположила, что надо написать запрос в источнике формы на таблицу РБП. Чтобы определить закрыты все модели или нет, мне нужен еще один источник таблица моделей РБП. Но я не хочу корежить источник для формы, потому и не меняю его. Значит я не логично делаю? Ваш вариант, конечно, работает. Только в нем есть оговорка. Модели если нет, то в список этот РБП ни туда, ни туда не попадает. Большое спасибо, буду играть дальше. Последний раз редактировалось Arahnid; 18.04.2007 в 19:21. |
|