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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.03.2007, 00:33   #1  
Blog bot is offline
Blog bot
Участник
 
25,626 / 848 (80) +++++++
Регистрация: 28.10.2006
axaptapedia: Tutorial Form MultiSelectCheckBox
Источник: http://www.axaptapedia.com/Tutorial_...SelectCheckBox
==============

Summary: see also + category
== A tutorial about MultiSelect with CheckBox in a form ==

[http://www.axaptapedia.com/images/4/...ctCheckBox.xpo download xpo]

=== Preview ===
[[Image:Screen.PNG]]

=== Description ===
Sometimes, simply selecting the lines you want in a datasource and pressing OK (or other button) is not enough for the users.
They want to clearly see what they have selected, be able to easily modify the selecting, and to their liking whould be to see a checkbox on the left of the grid for each line.
(For an example, see CustTransOpen form where you mark transaction with a checkbox)

Here is a simple tutorial form based on InventTable datasource.
You can select multiple lines and process the lines by pressing ''Process lines'' button.


The code in the form is commented. So it will be easy for anyone to understand the way it works
Here is the extract of the comments I think you should definitely read: (ClassDeclaration)
1. A set of strings is used in the example, because ItemId is a primaryKey field
2. Easiest is to use a RecId set, but in this case you have to create a RecId index on the table (see prop. CreateRecIdIndex) to speed up processing of selected lines
3. Notice that AllowEdit is enabled on the DataSource, but prohibited on all the fields. This is to allow editing of the edit-method.

And: (in the ProcessLines method on the form)
This method should not be implemented on the form and is merely here to avoid creating another object for the example
The processing should be implemented on a server based class
To pass the selected lines to the class for processing use the pack method of the set object, itemIdSet.pack()
This will create a container that you will pass on to the class. Then you unpack the container into a Set object
Set processLinesSet = Set::create(_packedSet), where _packedSet is the passed container

=== See also ===
[[Multiple_grid_selections]]

[[Category:Form development]]


Источник: http://www.axaptapedia.com/Tutorial_...SelectCheckBox
За это сообщение автора поблагодарили: alex55 (1).
Старый 06.03.2007, 10:08   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Кстати, я углубился в исследование этого вопроса, и получил немного (мягко говоря) неожиданные результаты.
В скором времени размещу обновленный проект и свои результаты. Было бы очень интересно сравнить их с результатами на Ваших машинах, а также услышать мнения относительно полученных результатов.
Старый 06.03.2007, 10:31   #3  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Прикольно.

Все так по-модному написано на английском, а язык интерфейса на скриншоте русский.

Сразу понятно, кто писал .
__________________
С уважением,
glibs®
Старый 06.03.2007, 14:33   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Кстати, я углубился в исследование этого вопроса, и получил немного (мягко говоря) неожиданные результаты.
"И Шахразаду застигло утро, и она прекратила дозволенные речи" (С)

Может намекнешь в двух словах, что именно было неожиданным?
__________________
полезное на axForum, github, vk, coub.
Старый 06.03.2007, 14:38   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Как раз в процессе.

см. Картинки.
http://kashperuk.blogspot.com/2007/0...ued-hello.html

Очень надеюсь на обсуждение после работы BlogBotа

Цитата:
Сообщение от glibs Посмотреть сообщение
Прикольно.
Все так по-модному написано на английском, а язык интерфейса на скриншоте русский.
Сразу понятно, кто писал .
Да, и новые версии картинок не исправили это.
А надо бы.

Последний раз редактировалось kashperuk; 06.03.2007 в 14:45.
Старый 06.03.2007, 18:10   #6  
Blog bot is offline
Blog bot
Участник
 
25,626 / 848 (80) +++++++
Регистрация: 28.10.2006
Kashperuk Ivan: Dynamics AX Tutorials (continued)Hello, readers....
Источник: http://kashperuk.blogspot.com/2007/0...ued-hello.html
==============

Dynamics AX Tutorials (continued)

Hello, readers.

After posting the first AX tutorial about Multiple Selection options in Dynamics AX we had a very interesting discussion about what's best to use in DAX at www.axForum.info
After this discussion, I decided to dig into the issue some more and see for myself, what is the best choice here.

So I modified the previous project a little bit: (you can download it here)
  • Added a Server-Based class that does all the processing of selected lines
  • Added a temporary table, tmpInventTable, consisting only of one field, ItemId.
  • Added a job - an approximate way to determine the memory wastes for filling different types of objects.
  • Added 2 tab pages to the form, so the form now allows five tipes of processing:
    • Using a Set
    • Using a Set (the query uses a JOIN)
    • Using a Temporary Table
    • Using a Temporary Table (the query uses a JOIN)
    • Using standard DAX way with multiselecting records
The good thing is that now everyone can try out the different options and choose what is most appropriate for his specific needs.
After this, I also did a test run on a 3-tier installation and on a 2-tier installation.
Here are the Memory test results: (the first is in 2-tier, the second - in 3-tier configuration)


Here are the Processing test results: (the first is in 2-tier, the second - in 3-tier configuration)

The results of my tests can also be found at the homepage of this tutorial.
As you can see from the results, the 3-tier environment provides more balanced results. And in 2-tier I got 25 to 60!!! times increase on Processing tests when not using joins. I would love to know what your resuls will be.
Filling in data is also slightly slower when using Temporary Tables, but the difference is not that great, especially if you take into consideration the amount of records inserted into it (up to 100 000)
You comments and suggestions are very welcome.


Источник: http://kashperuk.blogspot.com/2007/0...ued-hello.html
Старый 06.03.2007, 22:58   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Ничего не понимаю (С) Следствие ведут колобки

Цитата:
Сообщение от Blog bot Посмотреть сообщение
So I modified the previous project a little bit: (you can download it
А можно в двух словах рассказать что за модификации были?
На уровне идеи.

Цитата:
Сообщение от Blog bot Посмотреть сообщение
As you can see from the results, the 3-tier environment provides more balanced results.
Кто бы сомневался.
Но речь то шла о различных способах ставить галочку.
Какой способ лучше то?

Цитата:
Сообщение от Blog bot Посмотреть сообщение
And in 2-tier I got 25 to 60!!! times increase
Возможно, я тупой, но 60 раз нигде не увидел.

Цитата:
Сообщение от Blog bot Посмотреть сообщение
You comments and suggestions are very welcome.
Ой, а можно на русском?
__________________
полезное на axForum, github, vk, coub.
Старый 06.03.2007, 23:37   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от mazzy Посмотреть сообщение
А можно в двух словах рассказать что за модификации были?
На уровне идеи.
Там же ниже список изменений
Если кратко, то:
добавил на отд. закладку возможность выбора с галочкой, но используется временная таблица (+ возможность обработки соединением с InventTable)
добавил на отд. закладку возможность использования стандартного подхода Аксаптовского.
добавил возможность для SET формирования запроса (через OR - то есть возможны глюки при очень большом кол-ве выделенных записей) для того, чтобы послать только 1 запрос на сервер, вместо многократных вызовов по 1 записи.
добавил класс, работающий на сервере, который проходится по выделенным строках, и выводит название номенклатуры - при этом мы имеем только Код - соответственно, в некоторых случаях нужно сначала найти это название.
Добавил в проект JOB для теста скорости заполнения данными различных источников.

Вроде все.
Цитата:
Сообщение от mazzy Посмотреть сообщение
Кто бы сомневался.
Но речь то шла о различных способах ставить галочку.
Какой способ лучше то?
Да вот в том то и дело, что лично для себя я пока не определил.
Поэтому и предлагаю скачать, попробовать, посмотреть результаты, и показать их другим.
Судя по моим результатам, все решения нормальные. И подбирать тот или иной подход нужно на основании конкретной задачи (обработки, которую нужно будет делать с выбранными строками)
Цитата:
Сообщение от mazzy Посмотреть сообщение
Возможно, я тупой, но 60 раз нигде не увидел.
Нет, все верно, цифры 60 нигде нет на картинках.
Но есть 59. Именно о ней и шла речь. (2уровневая конфигурация).
В сравнении с стандартным подходом и использованием временной таблицы (с JOIN) время в 59 раз больше
Цитата:
Сообщение от mazzy Посмотреть сообщение
Ой, а можно на русском?
Запросто. blogspot все стерпит
Можно их и здесь разместить. как угодно.

Интересно было бы посмотреть и результаты выполнения - сделать это совсем не сложно - собственно, нажать кнопочек этак 7 или 8.
Старый 07.03.2007, 18:07   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Вот еще результаты
(около 96 000 номенклатур - 2tier)

189 сек - через SET - 5 Mb на заполнение (SET через OR по понятным причинам с таким кол-вом номенклатур не работает)
709 сек - через временную - 17 Мб на заполнение - видимо, винт медленный (ноутбук)
216 сек - временная с JOIN
44 сек!! - стандартный MULTISELECT - 140 Мб (пиковое потребление)

Думаю, комментарии излишни.
Старый 07.03.2007, 22:50   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Думаю, комментарии излишни.
Почему же?
как раз нужны комментарии. желательно комментарии автора.
__________________
полезное на axForum, github, vk, coub.
Старый 07.03.2007, 22:57   #11  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Автор и здесь я

Другая база просто, с бОльшим намного кол-вом номенклатуры.
А комментарии

Видим, что SET получился лучше временной таблицы, даже если используется JOIN.
Думается мне, что и при использовании временной таблицы результаты были бы значительно лучше, но винт медленный (4200 оборотов), и загаженный. Поэтому возможно задержки связаны именно с обращениями к винту, но FileMon не было под рукой, чтобы убедиться наверняка.

SET проигрывает значительно стандартному Аксаптовскому способу, но последний кушает значительно больше памяти.
Можно будет попробовать организовать коллекцию Record'ов, и сравнить после этого быстродействие (когда и там и там будут уже подготовленные курсоры)

Но это результаты с 2х звенки, и, мне кажется, они не так интересны/актуальны.
На след. неделе будут еще результаты 3х звенки (около 68000 номенклатур)
Старый 07.03.2007, 23:14   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mazzy Посмотреть сообщение
желательно комментарии автора.
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Автор и здесь я
Ну, я это и имел в виду.
На мой вгляд итог может и должен подводить тот, кто начал тему.

Про SET понял.
А какой трафик гоняется по сети? На какой сети ты проверял?
Если включить симуляцию медленного канала, то соотношение будет таким же?
http://www.microsoft.com/Rus/Dynamic...onitoring.mspx
__________________
полезное на axForum, github, vk, coub.
Старый 07.03.2007, 23:19   #13  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Трафик не успел замерять, праздник все таки. И так на меня все смотрели искоса на работе, когда после окончания рабочего дня (сокращенного) я не уходил домой

В понедельник замеряю. Там 10 Мбит/с сетка, попробую принудительное замедление, спасибо за ссылку.
За это сообщение автора поблагодарили: mazzy (5).
Старый 13.03.2007, 16:41   #14  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Добавил на форму еще 2 закладки (Set(Types::Record), InventTable.setTmp()), соответственно выкладываю обновленные результаты сравнения:
Цель изменения - сравнить производительность уже подготовленных курсоров со стандартным MultiSelect

Цитата:
2 слойная Аксапта
Кол-во записей - 97000

Set(Types::String)
выделение всех записей - 7 Мб
передача - 10 Мб пиковое выделение - 190 сек

Set(Types::Record)
выделение всех записей - 125 Мб
передача - 75 Мб пиковое выделение - 9 сек

TmpTable (винчестер 4200 оборотов)
выделение всех записей - 17 Мб + большая загрузка винчестера (чтение + запись)
передача - 2 Мб пиковое выделение - 715 сек + большая загрузка винта (чтение)

TmpTable (using Join)
выделение всех записей - 17 Мб + большая загрузка винчестера (чтение + запись)
передача - 2 Мб пиковое выделение - 203 сек - !!почти не загружен винчестер

InventTable.setTmp()
выделение всех записей - 52 Мб + средняя загрузка винчестера (чтение + запись) - долго по времени.
передача - 2 Мб пиковое выделение - 55 сек + средняя загрузка винчестера (чтение)

Standard MultiSelect
обработка - 184 Мб пиковое выделение - 65 сек
Видим существенное приемущество Set(Record). В то же время памяти он, ессно, кушает больше всего.
------------------------

Также провел небольшое сравнение на 3-уровневой (записей - 941) - тонкий клиент.
По совету Сергея установил плохой канал (2000 байт- bandwidth, 700 - задержка, что соответствует среднему dial-up соединению).
Все результаты ожидаемые.
Методы, которые передают на сервер только перечень номенклатур, а не целые записи, практически не создают клиент-серверного трафика.
Кстати - в такой конфигурации InventTable.setTmp() скушал много, и обращений к серверу было 941 - по кол-ву записей. И выполнялось все это довольно долго.
Через Set(Types::String) и TmpTable все было довольно быстро и без большой нагрузки на канал.
А standardMultiSelect вообще долго выполнялся (800 секунд), при этом очень большой трафик от сервера (при этом 945 вызовов с сервера).
За это сообщение автора поблагодарили: mazzy (13), belugin (14).
Старый 13.03.2007, 20:22   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Спасибо!
Можно в полезное перенести?
__________________
полезное на axForum, github, vk, coub.
Старый 14.03.2007, 23:48   #16  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от mazzy Посмотреть сообщение
Можно в полезное перенести?
Не вижу препятствий!
Старый 15.03.2007, 00:51   #17  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Gustav Посмотреть сообщение
Не вижу препятствий!
аналогично.
Старый 23.03.2007, 17:19   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Еще один аспект отметки галочками
Использование edit метода на таблицах, для которых MaxAccessMode=View

как должна работать отметка галочками, если таблицу нет доступа на редактирование?

Конкретно с LedgerTrans я вообще против галочек.
Но интересно как решать задачу в общем случае?
__________________
полезное на axForum, github, vk, coub.
Старый 24.03.2007, 11:48   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Решение так себе, но можно перекрыть mouseDown на чекбоксе и устанавливать выбор из него
X++:
#winapi
public int mouseDown(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
{
    int ret;
    boolean check;
    #define.GWL_STYLE(-16)
    ;
    ret = super(_x, _y, _button, _Ctrl, _Shift);

    if ( winapi::getWindowLong([ ].hWnd(), #GWL_STYLE) & #WS_DISABLED)
    {
        // Вызов метода на датасорсе
        [ ].[  ](true, [ ], ![ ].in([ ].[ ]));
        // Обновление данных в датасорсе для отражения изменения
        [ ].refresh();
    }
    return ret;
}
__________________
Axapta v.3.0 sp5 kr2
Старый 24.03.2007, 12:27   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
...перекрыть mouseDown...
А клавиатура?
Какие еще методы надо перекрыть, чтобы получить стандартную функциональность?
__________________
полезное на axForum, github, vk, coub.
Теги
axapta, map, multiselect, set, tmp, маркировка, полезное, производительность, скорость, тестирование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Validate field values on form Blog bot DAX Blogs 0 17.12.2008 12:05
axaptapedia: Tutorial Form Dynalink Blog bot DAX Blogs 0 22.08.2007 23:00
Kashperuk Ivan: Dynamics AX Tutorials - Tutorial 2 - Classes\Box Blog bot DAX Blogs 0 25.04.2007 22:23
Axapta Lessons: Trapping keystrokes in a Form Blog bot DAX Blogs 13 01.11.2006 18:16
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:47.