AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.09.2012, 13:16   #1  
Nikit is offline
Nikit
Участник
 
6 / 10 (1) +
Регистрация: 19.09.2012
:) Помогите новичку
Помогите пожалуйста. Недавно занимаюсь Axapta. На форме имеется grid с данными. Нужно добавить колонку "маркировка" (checkbox) и кнопки "маркировать всё" и "отмена маркировки". Не получается написать методы на эти кнопки, ведь источника данных нет.
Старый 19.09.2012, 13:21   #2  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Расчеты с клиентами/Клиенты кнопка функции - сопоставление открытых проводок. Там увидите чекбокс. Ковыряйте как он сделан
Старый 19.09.2012, 13:21   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Nikit Посмотреть сообщение
.... На форме имеется grid с данными... источника данных нет.
А тогда чьи данные отображает grid?

UPD: А понял. Источник есть, но в этом источнике нет поля отвечающего за галки. Так? Тогда Sada вам правильный пример подсказал.

Последний раз редактировалось S.Kuskov; 19.09.2012 в 13:27.
Старый 19.09.2012, 13:28   #4  
Nikit is offline
Nikit
Участник
 
6 / 10 (1) +
Регистрация: 19.09.2012
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А тогда чьи данные отображает grid?
Источник данных - голова пользователя. Что он "нащёлкает", то столбец чекбоксов и будет отображать.
Старый 19.09.2012, 13:54   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Nikit Посмотреть сообщение
Источник данных - голова пользователя. Что он "нащёлкает", то столбец чекбоксов и будет отображать.
Да, спасибо, я уже догадался

При выборе способа решения данной задачи стоит обратить внимание на следующие вопросы:
1) Должен ли интерфейс быть многопользовательским? Как должна вести себя система, если два пользователя начнут совместно ставить галки.
2) Должна ли информация о выборе сохраняться между сеансами работы пользователя, т.е после закрытия формы (специально или в случае ошибки)?
3) Должен ли интерфейс отображающий выбор пользователя позволять сортировать и фильтровать по столбцу с галками?
4) Вопрос производительности может быть актуален в случае большого числа маркеруемых записей
5) Способ дальнейшего использования/обработки маркированных данных.
6) Настройка прав доступа.

P.S.: axaptapedia: Tutorial Form MultiSelectCheckBox
Старый 19.09.2012, 14:48   #6  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
А нельзя ли просто мультиселектом обойтись?
__________________
С уважением,
Вячеслав
Старый 19.09.2012, 15:19   #7  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от pitersky Посмотреть сообщение
А нельзя ли просто мультиселектом обойтись?
если строк много, то не удобно, особенно если их нужно просматривать
Старый 20.09.2012, 06:32   #8  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от ice Посмотреть сообщение
если строк много, то не удобно, особенно если их нужно просматривать
Два "если" в одном предложении
но я согласен, что это зависит от задачи
__________________
С уважением,
Вячеслав
Старый 20.09.2012, 07:32   #9  
kaw is offline
kaw
Участник
 
122 / 35 (2) +++
Регистрация: 23.03.2004
Адрес: Новосибирск
Цитата:
Сообщение от pitersky Посмотреть сообщение
Два "если" в одном предложении
а так:

IF( "строки нужно просматривать" )
{
IF( "строк много" ) THEN неудобно
}

хотя конечно, лучше:
IF( "строк много" && "строки нужно просматривать")
THEN неудобно

За это сообщение автора поблагодарили: ice (1).
Старый 20.09.2012, 13:09   #10  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
if (true)
"Неудобно"
Старый 20.09.2012, 19:11   #11  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
В общем, если отбросить всякие "если" Вам нужен 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  
Nikit is offline
Nikit
Участник
 
6 / 10 (1) +
Регистрация: 19.09.2012
HorrR, спасибо за объяснения, может ответите еще на несколько вопросов, аксапту изучаю всего 2 недели, поэтому много непонятного:
1)как перебрать все чекбоксы в цикле, чтоб все их отметить
2)как чекбоксы связаны с записями таблицы
Старый 21.09.2012, 16:40   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Nikit, вы какой вариант реализации выбрали? Через set + edit method?
Спрашиваю, потому что от этого зависят ответы на вопросы, которые вы задали.

Предположу что за основу выбран именно этот вариант. Тогда
1)как перебрать все чекбоксы в цикле, чтоб все их отметить
Для того чтобы "отметить" все записи достаточно записать в set их идентификаторы. Тогда при отображении соответствующей строки таблицы edit-метод чекбокса сообщит ему что он установлен.
2)как чекбоксы связаны с записями таблицы
Через с edit-метод.
За это сообщение автора поблагодарили: HorrR (1).
Старый 22.09.2012, 01:28   #14  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
И хотя уважаемый 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);
        }
        
    }
Здесь вы сначала получаете ссылку на QueryRun объект главного(если их несколько) источника данных, потом в цикле перебираете все возвращаемые данным QueryRun записи. Метод queryRun.changed обеспечивает проверку того, что найдена новая уникальная запись именно интересующей Вас таблицы(в моем примере это CustTable), в случаях, когда у вас один источник данных её можно опустить, в случаях же со связанными источниками данных(join) она необходима, так как общее количество итераций цикла будет равняться сумме комбинаций записей из всех связанных таблиц для каждой записи главной таблицы. Например, если у нас в запросе формы имеем ещё и CustTrans(кастомерские проводки), объедененную join"ом с CustTable, то для одной и той же записи CustTable мы попадем в цикл столько раз, сколько проводок у кастомера, и если не реализовать выше указанную проверку добавим в Set один и тот же 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).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помогите новичку: импорт Bars DAX: Администрирование 6 26.03.2005 09:14
помогите новичку ita DAX: Программирование 16 21.02.2005 18:12
Помогите новичку. bagyr DAX: Программирование 9 18.02.2005 08:33
Помогите новичку Security keys listener DAX: Администрирование 4 24.07.2003 16:28
Помогите новичку Trantor DAX: Администрирование 1 14.07.2003 10:48

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:18.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.