|
26.10.2010, 17:57 | #1 |
Участник
|
Как программно убрать Range
Здравия всем.
Столкнулся со следующей ситуацией: есть класс наследник RunBaseBatch. В нем используется Query, созданный в AOT. В диалоге я хочу убрать возможность пользователем задавать Range, ибо делаю это программно. Но проблема в том, что пока я не очищу используемый запрос и ранее используемый запрос (нажав на кнопку "выбрать" и далее, кнопкой "очистить") в классе далее запрос не отрабатывает, и выводит ошибку о невозможности выбрать запись в одной из таблиц. Как мне программно "обнулить" этот запрос? |
|
26.10.2010, 18:30 | #2 |
Участник
|
Цитата:
Сообщение от Prophetic
Но проблема в том, что пока я не очищу используемый запрос и ранее используемый запрос (нажав на кнопку "выбрать" и далее, кнопкой "очистить") в классе далее запрос не отрабатывает, и выводит ошибку о невозможности выбрать запись в одной из таблиц.
Как мне программно "обнулить" этот запрос? Если речь идет именно об избыточном Range, то укажите ему пустую строку "". Пустая строка эквивалентна отсутствию Range Если речь идет о том, чтобы зафиксировать ваше условие в Range, то в свойстве Status программно задайте hidden или Locked. пример в \Classes\CustInterestCreate\queryBuildUpdate X++: protected void queryBuildUpdate() { QueryBuildRange rangeCanBeReversed; ; ... rangeCanBeReversed = queryRun.query().dataSourceTable(tablenum(CustSettlement)).addRange(fieldnum(CustSettlement, CanBeReversed)); rangeCanBeReversed.value(queryValue(NoYes::Yes)); rangeCanBeReversed.status(RangeStatus::Hidden); ... } |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
10.11.2010, 12:10 | #3 |
Участник
|
Они возвращаются...
Здравия, уважаемые.
Всем спасибо за ответы, однако, пришлось вернуться к старой проблеме. Дело в том, что я в классе поставил showQueryValues = true, в результате опять появились поля на форме для выбора значений и стала возникать ошибка. Повторяю эксперимент: удаляю критерии в диалоге (удаляю вообще строки в таблице критериев) , и ошибка не возникает. Ставлю showQueryValues = false, а затем возвращаю в true, критерии заново появляются с пустыми значениями и при работе с классом появляется та же проблема. Приведу её: Код: Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Не удалось привязать составной идентификатор "B.ITEMID". Оператор SQL: SELECT A.ITEMID FROM INVENTTABLE A WHERE (A.DATAAREAID=?) AND EXISTS (SELECT 'x' FROM CUSTINVOICETRANS B,INVENTDIM C WHERE ((B.DATAAREAID=?) AND (((B.INVOICEDATE>=?) AND (B.INVOICEDATE<=?)) AND (A.ITEMID=B.ITEMID))) AND ((C.DATAAREAID=?) AND ((((C.INVENTLOCATIONID=?) OR (C.INVENTLOCATIONID=?)) OR (C.INVENTLOCATIONID=?)) AND (B.INVENTDIMID=C.INVENTDIMID))) GROUP BY B.ITEMID,B.INVOICEDATE) GROUP BY A.ITEMID,B.ITEMID,B.INVOICEDATE ORDER BY A.ITEMID Цитата:
Я так и сделал: X++: qbrItem = qr.dataSourceTable(tablenum(InventTable)).addRange(fieldnum(InventTable,ItemId)); qbrItem.value(""); qbrItem.status(RangeStatus::Hidden); // qbrItem.status(RangeStatus::Locked); Что делать? |
|
10.11.2010, 12:36 | #4 |
Участник
|
Цитата:
Попробуйте очистить xLastValue и запустить снова. (Если LastValue вам ни о чем не говорит, то зайдите в Параметры \ Использование данных \ Кнопка Сброс) |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
10.11.2010, 14:29 | #5 |
Участник
|
xLastValue действительно ни о чём не говорит. Вопрос то остался: есть ли возможность программно очистить xLastValue и только для текущего запроса?
|
|
10.11.2010, 14:38 | #6 |
Участник
|
Цитата:
делайте что Владимир Максимов говорит. тогда не нужны костыли в виде "программно очистить" а вообще читайте про паттерн pack/unpack и про работу с sysLastValue. |
|
26.10.2010, 18:38 | #7 |
Axapta
|
Не очень понял вопроса, может невнимательно прочитал. showQueryValues = false не спасет?
|
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
27.10.2010, 10:21 | #8 |
Участник
|
У датасорса есть метод clearRanges, очищающий значения всех ranges.
Но в вашем случае мне кажется проблема в том, что у пользователей сохранились старые значения введенных параметров запроса, достаточно будет удалить их по всем пользователям в меню сервис-средства разработки-объекты приложения-использование данных.
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
10.11.2010, 13:50 | #9 |
Участник
|
Или увеличте номер версии. В ClassDeclaration для константы CurrentVersion увеличить ее значение.
При любой модификации, которая затрагивает данные сохраняемые/восстанавливаемые в кеше через методы pack/unpack требуется либо очищать кеш, либо увеличивать значение константы CurrentVersion |
|
|
За это сообщение автора поблагодарили: mazzy (2), Prophetic (1). |
10.11.2010, 15:42 | #10 |
----------------
|
Мне кажется, что никакие танцы с простыми способами решения проблемы не помогут.
Я не представляю, что нужно сделать с запросом, чтобы состав полей в GROUP BY и ORDER BY отличались, и чтобы там были поля из вложенного запроса по EXISTS. И вообще-то, зачем в EXISTS конструкция GROUP BY? Prophetic, лучше расскажите, как Вы формируете и модифицируете свой query. |
|
10.11.2010, 17:28 | #11 |
Участник
|
Цитата:
Сообщение от Wamr
Мне кажется, что никакие танцы с простыми способами решения проблемы не помогут.
Я не представляю, что нужно сделать с запросом, чтобы состав полей в GROUP BY и ORDER BY отличались, и чтобы там были поля из вложенного запроса по EXISTS. И вообще-то, зачем в EXISTS конструкция GROUP BY? Prophetic, лучше расскажите, как Вы формируете и модифицируете свой query. |
|
10.11.2010, 19:22 | #12 |
----------------
|
дык может поправить запрос?
|
|
11.11.2010, 09:53 | #13 |
Участник
|
Запрос на картинке. Что-нибудь посоветуете?
К сожалению, проблема не исправилась с помощью удаления сохранённых значений, как советовал уважаемый Mazzy. По-прежнему, запрос отрабатывает только если я вручную удаляю строки критериев. |
|
11.11.2010, 10:07 | #14 |
Участник
|
Цитата:
выкладывайте свой класс. лучше не картинкой, а нормальным проектом. |
|
11.11.2010, 12:10 | #15 |
Участник
|
Цитата:
Использование: X++: while (itemQueryRun.next()) { ... } Ещё раз проверил -- убиваю критерии (строки в таблице критериев), и все работает. |
|
11.11.2010, 13:37 | #16 |
Участник
|
Неправда.
Если вы используете runBaseBatch, то у вас работает паттерн pack/unpack (о котором вам говорили в самом начале, и о котором вы так и не прочитали, похоже). pack/unpack вполне может модифицировать запрос. вполне возможно, что вы работаете со старой версией запроса, а не с той, которая написана в коде. Либо таки осознайте что вам советуют. Либо таки выложите проект, чтобы для вас осознали другие. Либо громко крикните, что Аксапта мастдайный отстой и оставайтесь с "неизвестной" ошибкой. |
|
11.11.2010, 12:25 | #17 |
----------------
|
интересно посмотреть свойства узлов CustInvoiceTrans & InventDim
и хотелось бы видеть все раскрытые узлы Sorting & Ranges |
|
11.11.2010, 14:57 | #18 |
Участник
|
Вот они. Вроде все просто.
|
|
11.11.2010, 13:01 | #19 |
MCTS
|
Цитата:
Как мне программно "обнулить" этот запрос?
X++: protected void initQuery() { Query localQuery = new Query(querystr(InventTableCustTrans)); ; // Здесь измените ренджи как Вам надо у этого localQuery queryRun = new QueryRun(localQuery); } Хотя это конечно не корректное решение проблемы. По хорошему надо разобраться почему появляется такая ошибка. |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
11.11.2010, 13:38 | #20 |
Участник
|
Угу. Пошла хирургия при неизвестном диагнозе.
|
|
|
За это сообщение автора поблагодарили: PavelX (1). |
|
|