23.03.2007, 13:23 | #21 |
Участник
|
Нет, поняла, что без помощи умных людей не обойдусь. Причина в том, что на мне висит ТЗ и уже замечание делали, что так долго делаю. А как его быстро сделать, если ничего не знаешь!!!
Мне помощь вот какого рода нужна: создала в АОТ запрос. На форму визуализировать я его смогла. Создала метод initQuery, в нем написала Query |
|
23.03.2007, 13:27 | #22 |
Участник
|
А чего сделать-то надо?
|
|
23.03.2007, 13:37 | #23 |
Участник
|
Поняла, что нужна помощь умных людей. Проблема в том, что на мне висит ТЗ, у которого срок: 7 марта. Сделали скидку на недоученность, но сдавать нужно, а я в кверах ни бум-бум. Подскажите как делать, а хелп я обязательно прочту, как только это ТЗ сдам
Создала метод initQuery в котором написано X++: Query q; ; q = new Query('VendTrans_ContractTable); // и еще одна строчка, которую я к сожалению не помню, а посмотреть негде //(я дома) X++: this.initQuery;
return QueryRun; Итого: на диалоговой форме запрос выводится, в кнопку "Выбор" зайти могу, но введенные в запросе значения на диалоговой форме не показываются. И самый главный вопрос: что делать с этим дальше? Смысл запроса - фильтр для моей временной таблицы. Временная таблица tempTable в которой есть поля AccountNum, TransDate, RContractNumber, ContractDate. Запрос состоит из таблицы VendTrans и к ней привязана RContractTable. Мне нужно отфильтровать свою tempTable по тем полям, которые я написала выше, а они как раз и вводятся в запросе. Блин, по-моему завернула, но проще объяснить не могу. Я понимаю, что наглею, просто помощь ОЧЕНЬ нужна. Если бы не подгоняли - я бы сама разобралась. И буду дальше сама разбираться |
|
23.03.2007, 13:38 | #24 |
Участник
|
Упс, забыла в коде кавычку закрыть
|
|
23.03.2007, 13:39 | #25 |
Участник
|
А еще во время быстрого ответа нажала кнопку TAB, а потом пробел и отправила обрезанное сообщение... Черт, надо успокоиться
|
|
23.03.2007, 13:47 | #26 |
Участник
|
Очень хочется Вам помочь, хотя и очень запутанно написали.
Поэтому попробую хотя бы так: см. класс Tutorial_RunbaseForm - в нем есть источник (Номенклатуры), по нему фильтруется, значения после кнопки выбор подтягиваются и т.д. Собственно, сделайте по образу и подобию. (это совет и на будущие лета) |
|
23.03.2007, 13:51 | #27 |
Участник
|
+ объясню, какая сейчас ошибка у вас.
Вы ваш код initQuery() добавили в метод queryRun(), который вызывается каждый раз при обращении к запросу. И каждый раз вы его перестраиваете заново. То есть после выбора значений фильтров в форме (по кнопке Выбор) запрос опять перестраивается заново без учета выбранных фильтров. Исправить это можно одним из двух способов: 1. перенести метод initQuery в метод initParmDefault, как это сделано в приведенном выше классе. 2. добавить проверку вида if (!queryRun) this.initQuery(); обеспечивая тем самым вызов генерации запроса только первый раз (когда запрос еще не сформирован) первый вариант имхо предпочтительние. И при этом будет работать кнопка "Сброс" без доп. телодвижений |
|
23.03.2007, 14:23 | #28 |
Axapta
|
Сразу же бросилось в глаза...Обращу ваше внимание, что надо делать так:
X++: q = new Query(queryStr(VendTrans_ContractTable)); |
|
23.03.2007, 20:00 | #29 |
Участник
|
Ладно, подождем до понедельника, на работе проверю и потом отреагирую.
kashperuk, oip, за советы спасибо |
|
26.03.2007, 07:18 | #30 |
Участник
|
не получается где сохраняется вид запроса? У меня на форму выходит старый запрос, который я писала кодом (а не в АОТ). Отличаются тем, что в запросе из АОТ у меня таблица "Договоры" вложена в "Проводки по поставщикам", а в старом они независимые.
Код для Query: X++: public void initParmDefault() { this.initQuery(); super(); } X++: void initQuery() { Query q; ; q = new Query(querystr(VendTrans_ContractTable)); qr = new QueryRun(q); } X++: public QueryRun queryRun() { return qr; } X++: public container pack() { return [#CurrentVersion, #CurrentList, qr.pack()]; } X++: public boolean unpack(container _packedClass) { Version version = RunBase::getVersion(_packedClass); container packedQuery; switch (version) { case #CurrentVersion : [version, #CurrentList, packedQuery] = _packedClass; if (sysQuery::isPackedOk(packedQuery)) qr = new QueryRun(packedQuery); else this.initQuery(); break; default: return false; } return true; } Может где-нибудь в пак/анпак указывать? И что указывать? Когда открываю класс и захожу в "Выбор" мне в выборе запроса выводится "Ранее использованный запрос". Меняю на "Используемый запрос", но ничего не меняется Последний раз редактировалось Tiruvileijadal'; 26.03.2007 в 07:23. Причина: ошибки в словах |
|
26.03.2007, 07:56 | #31 |
Участник
|
Умные люди, объясните пожалуйста феномен: скопировала полностью свой класс в новый (но не дублированием, а созданием методов один за другим) и стал выводиться мой родной запрос!!! Вот это что за издевательство такое? Щас расплачусь, блин...
|
|
26.03.2007, 10:06 | #32 |
Участник
|
а если старому CurrentVersion увеличить на единичку? может старый класс запаковал старый запрос?
|
|
26.03.2007, 10:08 | #33 |
Участник
|
Не переживайте, все работает очень даже корректно.
Объяснения: В механизме работы RunBase* классов предусмотрен механизм сохранения пользователских выборов в диалоге перед отчетом. Все настройки сохраняются в конкретной версии (это у вас зашито в макросе CurrentVersion в classDeclaration). То есть, если версия текущего исполняемого кода текущая, то подтягиваются настройки запроса и т.д. из таблицы SysLastValue. Вы изменили метод initQuery(), который вызывается в случае, если запрос не существует. Но так как версию вы не изменяли, то он подтягивается из настроек, и соответственно, существует. Существует 2 способа решения этого: 1. Увеличить на 1 значение CurrentValue в classDeclaration. Тогда в методе unpack проверка версии не пройдет, и вызовется ваш initQuery 2. Удалить пользовательские настройки этого класса для вашего пользователя из таблицы SysLastValue. (доступ есть из средств разработки - Использование данных) Ну, также можно пересоздать класс заново , при этом настройки для уже нового класса найдены не будут, и вызоветься построение запроса. Теперь думаю все должно стать понятно |
|
26.03.2007, 11:02 | #34 |
Участник
|
Едем дальше. Есть метод, в котором сборная солянка:
X++: public void getQueryData() { VendTrans vT; RContractTable rCT; str a; ; qbds = qR.query().dataSourceNo(1); qbr = q.dataSourceNo(1).rangeField(fieldNum(VendTrans, AccountNum)); qbr.value(); } |
|
26.03.2007, 11:05 | #35 |
Участник
|
X++: public void getQueryData() { ; qbds = qR.query().dataSourceNo(1); qbr = qbds.rangeField(fieldNum(VendTrans, AccountNum)); info(qbr.value()); } |
|
26.03.2007, 11:51 | #36 |
Участник
|
X++: class LedgVend_Schet66_67_Report extends RunBaseBatch { sysQueryRun qr; Query q; QueryBuildDataSource qbds; ... УРА!! Все получилось. Но есть еще такой вопрос: как сделать в запросе так, чтобы в выпадающем списке полей вложенной таблицы RContractTable выводились значения, соответствующие полю основной таблицы VendTrans (это когда на форме нажимаешь кнопку "Выбор" и там вводишь всякие значения)? И реально ли такое в АКСАПТА вообще в принципе? См. запрос на рисунке. |
|