19.09.2012, 13:16 | #1 |
Участник
|
Помогите новичку
Помогите пожалуйста. Недавно занимаюсь Axapta. На форме имеется grid с данными. Нужно добавить колонку "маркировка" (checkbox) и кнопки "маркировать всё" и "отмена маркировки". Не получается написать методы на эти кнопки, ведь источника данных нет.
|
|
19.09.2012, 13:21 | #2 |
Программатор
|
Расчеты с клиентами/Клиенты кнопка функции - сопоставление открытых проводок. Там увидите чекбокс. Ковыряйте как он сделан
|
|
19.09.2012, 13:21 | #3 |
Участник
|
А тогда чьи данные отображает grid?
UPD: А понял. Источник есть, но в этом источнике нет поля отвечающего за галки. Так? Тогда Sada вам правильный пример подсказал. Последний раз редактировалось S.Kuskov; 19.09.2012 в 13:27. |
|
19.09.2012, 13:28 | #4 |
Участник
|
|
|
19.09.2012, 13:54 | #5 |
Участник
|
Цитата:
При выборе способа решения данной задачи стоит обратить внимание на следующие вопросы: 1) Должен ли интерфейс быть многопользовательским? Как должна вести себя система, если два пользователя начнут совместно ставить галки. 2) Должна ли информация о выборе сохраняться между сеансами работы пользователя, т.е после закрытия формы (специально или в случае ошибки)? 3) Должен ли интерфейс отображающий выбор пользователя позволять сортировать и фильтровать по столбцу с галками? 4) Вопрос производительности может быть актуален в случае большого числа маркеруемых записей 5) Способ дальнейшего использования/обработки маркированных данных. 6) Настройка прав доступа. P.S.: axaptapedia: Tutorial Form MultiSelectCheckBox |
|
19.09.2012, 14:48 | #6 |
северный Будда
|
А нельзя ли просто мультиселектом обойтись?
__________________
С уважением, Вячеслав |
|
19.09.2012, 15:19 | #7 |
Участник
|
|
|
20.09.2012, 06:32 | #8 |
северный Будда
|
Два "если" в одном предложении
но я согласен, что это зависит от задачи
__________________
С уважением, Вячеслав |
|
20.09.2012, 07:32 | #9 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: ice (1). |
20.09.2012, 13:09 | #10 |
Программатор
|
if (true)
"Неудобно" |
|
20.09.2012, 19:11 | #11 |
Участник
|
В общем, если отбросить всякие "если" Вам нужен edit метод, который отображает\изменяет наличие вашей записи в числе выбраных.
В качестве хранилища скорее всего - Set(приведу ссылку ниже) в качестве ключа - скорее всего RecId(уникальный идентификатор записи в таблице), в редких случаях, когда, допустим, ещё нужно что-то сделать со всеми невыбранными записями используют Map, где ключ RecId или уникальный идентификатор, а значение - состояние - выбран или нет(enum NoYes). Так же Map может подойти, если Вы храните только выбранные записи, но хотите хранить вместе с ключем выбранной записи ещё и какие-то о ней дополнительные сведенья(чтобы не лезть потом запросом в базу и не доставать эти данные заново). Но, повторюсь, скорее всего вам нужен Set (http://www.axaptapedia.com/index.php?title=Set_Class) в качестве хранилища. Логика такая: если RecId записи в Set - запись выбрана, RecId записи вне Set - запись не выбрана. Добавление, удаление и проверка соответственно производятся методами Set: add, remove, in. Управлять добавлением, удалением и отображением (проверкой элемента в множестве выбранных записей) должен edit метод(http://www.axaptapedia.com/index.php?title=Edit_method), к которому вы привяжете соответствующий чекбокс грида(свойство контрола - dataMethod), сам эдит метод создайте на источнике данных(посмотрите по выше приведенной ссылке, чем отличаются эдит методы, объявленные в разных местах). Set должен у вас храниться глобально, то есть объявлять его переменную нужно на уровне classDeclaration формы, ну и конечно же инициализировать до первого использования, то есть на init формы. Ссылки на стандарт Вам уже дали, я постарался более-менее объяснить как это работает. Удачи!
__________________
Axapta has seduced me deadly! |
|
21.09.2012, 15:49 | #12 |
Участник
|
HorrR, спасибо за объяснения, может ответите еще на несколько вопросов, аксапту изучаю всего 2 недели, поэтому много непонятного:
1)как перебрать все чекбоксы в цикле, чтоб все их отметить 2)как чекбоксы связаны с записями таблицы |
|
21.09.2012, 16:40 | #13 |
Участник
|
Nikit, вы какой вариант реализации выбрали? Через set + edit method?
Спрашиваю, потому что от этого зависят ответы на вопросы, которые вы задали. Предположу что за основу выбран именно этот вариант. Тогда 1)как перебрать все чекбоксы в цикле, чтоб все их отметить Для того чтобы "отметить" все записи достаточно записать в set их идентификаторы. Тогда при отображении соответствующей строки таблицы edit-метод чекбокса сообщит ему что он установлен. 2)как чекбоксы связаны с записями таблицы Через с edit-метод. |
|
|
За это сообщение автора поблагодарили: HorrR (1). |
22.09.2012, 01:28 | #14 |
Участник
|
И хотя уважаемый S.Kuskov уже ответил на Ваш вопрос всё же приведу
пару дополнений, которые могут быть полезны новичку для понимания: 1.) Чтобы заполнить Set значениями Вам нужно будет в цикле перебрать все записи, которые на данный момент выбраны по активному запросу на форме, то есть, через актуальную на данный момент quеry. Вот так примерно будет выглядеть метод, заполняющий Set (для начала почитайте о том, как работать с Query и QueryRun, хотя бы на той же аксаптапедии) X++: QueryRun currentQueryRun; CustTable customer; ; currentQueryRun = CustTable_DS.queryRun(); while (currentQueryRun.next()) { if (currentQueryRun.changed(tablenum(CustTable))) { customer = currentQueryRun.get(tablenum(CustTable)); selectedCustomers.add(customer.RecId); } } 2.) Для всех отобранных по активному запросу на форме записей аксаптовский движок отрисовует записи на гриде, если контрол грида завязан на поле записи - его значение берется напрямую из записи, если на метод(через свойство dataMethod), то данный метод(display или edit) выполняется с значением записи(или точнее ссылкой на текущую, отобранную запись) в качестве параметра. Edit метод(в нашем случае) лезет в Set и проверяет, находится ли в нем RecId данной записи. И возвращает NoYes::No или NoYes::Yes, в зависимости от значения, которое вернул опрошенный движком edit метод, движок отображает чекбокс отмеченным(если метод вернул true) или нет. Так работает логика в случае отображения, то есть для edit метода в режиме отображения или для display метода, который предназначен исключительно для отображения(контролы, завязанные за display метод всегда read-only). Если посмотреть на сигнатуру edit метода, видно, что первый параметр логического типа и имеет название set, этот параметр дает понять для каких целей исполняется метод - для чтения или для изменения(записи). В случаях, когда система только отображает запись метод выполняется с значением set = false. В случаях, когда пользователь меняет значение в контроле, завязанном на edit метод(в Вашем случае - checkbox), движок аксапты исполняет данный метод с значением set = true и 3ьим параметром(в случае с edit-методами на уровне таблицы активная запись не передается и параметр значения - второй), который передает состояние контрола - то есть, введенное\установленное в нем значение(базовый тип этого параметра, равно как и тип возвращаемого значения метода, должен совпадать с типом допустимого контента связанного контрола, в нашем случае это чекбокс и возвращает он enum - NoYes). Так вот, в случае изменения значения контрола edit метод вызывается с set = true и значением NoYes типа, установленным в контроле. Edit метод проверяет, что он вызван на запись и добавляет в Set значение, если чекбокс был отмечен или убирает значение из Set, если галка на чекбоксе была снята(то есть, в зависимости от 3ьего параметра, параметра состояния NoYes типа). Ну и возвращает значение, чтобы отобразить состояние контрола.
__________________
Axapta has seduced me deadly! Последний раз редактировалось HorrR; 22.09.2012 в 01:33. |
|
|
За это сообщение автора поблагодарили: Nikit (1). |
|
Похожие темы | ||||
Тема | Ответов | |||
Помогите новичку: импорт | 6 | |||
помогите новичку | 16 | |||
Помогите новичку. | 9 | |||
Помогите новичку Security keys | 4 | |||
Помогите новичку | 1 |
|