02.05.2012, 15:02 | #21 |
Участник
|
Цитата:
public void executeQuery() { QueryBuildDataSource qbds = this.query().dataSourceTable(tablenum(myTable)); ; if (radioCharGroup.text() == '<Пусто>') { findOrCreateRange_W(qbds, fieldnum(myTable, key), SysQuery::valueEmptyString()); } else findOrCreateRange_W(qbds, fieldnum(myTable, key), radioCharGroup.text()); super(); this.filltmptable(); } filltmptable(); и до и после super() ставил. Результат одинаковый. в filltmptable() пытаюсь соединить их. P.S. Похоже что действительно что-то не то с кодом, написанным до меня. Эти старые фильтры как то не хотять жить с моей временной таблицей. Поразбираюсь. Последний раз редактировалось uskutus; 02.05.2012 в 15:51. |
|
02.05.2012, 17:22 | #22 |
Участник
|
Закомментировал старые фильтры. Декларативный join с временной таблицей работает нормально. Если включить эти фильтры, то без всякого моего кода будет ошибка времени выполнения "QueryBuildRange - объект не инизиализирован." еще на этапе init.
Если убрать все фильтры, декларативный join и попробовать программно: qbds = this.query().dataSourceTable(tablenum(mytmptable)); qbds = qbds.addDataSource(tablenum(myTable)); - "QueryBuildDataSource, объект не инициализирован." qbds.addLink(fieldnum(myTable, key), fieldnum(myTmpTable, key)); qbds.joinMode(JoinMode::InnerJoin); Видимо явления одного порядка. Еще вот так попробовал: qbds = this.query().dataSourceTable(tablenum(mytmptable)); qbds = this.query().addDataSource(tablenum(myTable)); Ошибка - "Источник данных не входит в состав родительского источника данных." Эта ошибка уже возникает в Classes\info\View. Последний раз редактировалось uskutus; 02.05.2012 в 17:37. |
|
03.05.2012, 08:11 | #23 |
Участник
|
Цитата:
findOrCreateRange_W(qbds, fieldnum(myTable, key), SysQuery::valueEmptyString()); ? А на какой строчке в методе init() выдаётся ошибка? |
|
03.05.2012, 09:31 | #24 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Т.е. это ещё до той ошибки в executeQuery на строке
findOrCreateRange_W(qbds, fieldnum(myTable, key), SysQuery::valueEmptyString()); ? А на какой строчке в методе init() выдаётся ошибка? Поставил datasourcetable, ошибка исчезла. Правда теперь функции findOrCreateRange_W не ограничивают запрос. tmpTable pаполняю в executequery ее датасоурса. Попробую разобраться. А не дадите ссылочку, с описанием что делает SetCursor ? Ни в MSDN ни в встроенной справке не нашел. |
|
03.05.2012, 10:35 | #25 |
Administrator
|
Цитата:
1) В поиске по АОТ / по перекрестным ссылкам 2) В гугле. Например, здесь: http://www.cnblogs.com/Jimmyx/archiv...7/2030411.html
__________________
Возможно сделать все. Вопрос времени |
|
03.05.2012, 10:43 | #26 |
Участник
|
Цитата:
Классы Query, QueryBuildDataSource, QueryBuildRange реализуют/формируют структуру запроса. Класс QueryRun реализует обход/цикл по сформированному запросу (Query) На форме перебор записей/обход запроса реализуется ядром системы самостоятельно, без вмешательства прораммиста и явного использования QueryRun. Датасурс формы (FormDataSource, котрый лежит на форме в узле DataSource) выполняет одновременно и роль элемента query (QueryBuildDatasource) и табличного курсора (Common), через который осуществляется доступ к активной строке таблицы. На самом деле и при использовании QueryRun неявно создаются подобные табличные курсоры, связанные с каждым QueryBuildDatasource. Именно их возвращает метод queryRun.get(). Метод queryRun.setCursor() позволяет подменить автоматически созданный при инициализации queryRun курсор на свой. Это в частности позволяет подсовывать в QueryRun курсоры от временных таблиц или осуществлять вот такие штуки queryRun метод get При работе с датасурсами формы нет необходимости в использовании setCursor для связи источника с временной таблицей, т.к. имея непосредственный доступ к табличному курсору источника, связь с временными данными можно сделать через setTmpData. Каждый раз при объявлении курсора временной таблицы или при вызове метода common.setTmp (преобразовании постоянного курсора во временный) система создаёт отдельный временный буфер данных. Для каждого курсора даже одного и того же типа, будет создан независимый от других курсоров буфер. Метод setTmpData позволяет несколько табличных курсоров связать с одним временным буфером данных. Не путайте с простым присваиванием одного курсора другому. Курсоры, связанные через setTmpData, могут независимо друг от друга перемещаться по данным (т.е. select одного курсора не изменит позицию и выборку другого). В тоже время setTmpData не выполняет копирования данных (происходит именно назначение курсору ссылки на буфер) - это означает, что изменение данных (вставка/изменение/удаление) через один из курсоров будет непосредственно отражаться на всех остальных курсорах связанных с тем же временным буфером. |
|
|
За это сообщение автора поблагодарили: sukhanchik (2), driller (2), AndyPanda (0). |
03.05.2012, 11:09 | #27 |
Участник
|
Всем спасибо. С ошибкой в
qbds = this.query().dataSourceTable(tablenum(mytmptable)); qbds = qbds.addDataSource(tablenum(myTable)); - "QueryBuildDataSource, объект не инициализирован." вроде разобрался. Этот код был в executequery mytable. Наоборот было нельзя, т.к. временные таблицы не должны быть вложенными. Поставил в executequery mytmptable, ошибка исчезла. Еще много чего не работает. Будем дальше познавать тайны аксапты) |
|
03.05.2012, 17:07 | #28 |
Участник
|
Очередная проблема. После джойна с временной таблицей, невозможно выбрать ни одну запись в гриде. Сразу курсор перескакивает на первую запись.
|
|
03.05.2012, 17:54 | #29 |
Участник
|
|
|
04.05.2012, 09:35 | #30 |
Участник
|
|
|