06.03.2007, 00:33 | #1 |
Участник
|
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 |
Участник
|
Кстати, я углубился в исследование этого вопроса, и получил немного (мягко говоря) неожиданные результаты.
В скором времени размещу обновленный проект и свои результаты. Было бы очень интересно сравнить их с результатами на Ваших машинах, а также услышать мнения относительно полученных результатов. |
|
06.03.2007, 10:31 | #3 |
Member
|
Прикольно.
Все так по-модному написано на английском, а язык интерфейса на скриншоте русский. Сразу понятно, кто писал .
__________________
С уважением, glibs® |
|
06.03.2007, 14:33 | #4 |
Участник
|
Цитата:
Может намекнешь в двух словах, что именно было неожиданным? |
|
06.03.2007, 14:38 | #5 |
Участник
|
Как раз в процессе.
см. Картинки. http://kashperuk.blogspot.com/2007/0...ued-hello.html Очень надеюсь на обсуждение после работы BlogBotа Цитата:
А надо бы. Последний раз редактировалось kashperuk; 06.03.2007 в 14:45. |
|
06.03.2007, 18:10 | #6 |
Участник
|
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)
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 |
Участник
|
Ничего не понимаю (С) Следствие ведут колобки
А можно в двух словах рассказать что за модификации были? На уровне идеи. Цитата:
Но речь то шла о различных способах ставить галочку. Какой способ лучше то? Возможно, я тупой, но 60 раз нигде не увидел. Ой, а можно на русском? |
|
06.03.2007, 23:37 | #8 |
Участник
|
Цитата:
Если кратко, то: добавил на отд. закладку возможность выбора с галочкой, но используется временная таблица (+ возможность обработки соединением с InventTable) добавил на отд. закладку возможность использования стандартного подхода Аксаптовского. добавил возможность для SET формирования запроса (через OR - то есть возможны глюки при очень большом кол-ве выделенных записей) для того, чтобы послать только 1 запрос на сервер, вместо многократных вызовов по 1 записи. добавил класс, работающий на сервере, который проходится по выделенным строках, и выводит название номенклатуры - при этом мы имеем только Код - соответственно, в некоторых случаях нужно сначала найти это название. Добавил в проект JOB для теста скорости заполнения данными различных источников. Вроде все. Цитата:
Поэтому и предлагаю скачать, попробовать, посмотреть результаты, и показать их другим. Судя по моим результатам, все решения нормальные. И подбирать тот или иной подход нужно на основании конкретной задачи (обработки, которую нужно будет делать с выбранными строками) Нет, все верно, цифры 60 нигде нет на картинках. Но есть 59. Именно о ней и шла речь. (2уровневая конфигурация). В сравнении с стандартным подходом и использованием временной таблицы (с JOIN) время в 59 раз больше Запросто. blogspot все стерпит Можно их и здесь разместить. как угодно. Интересно было бы посмотреть и результаты выполнения - сделать это совсем не сложно - собственно, нажать кнопочек этак 7 или 8. |
|
07.03.2007, 18:07 | #9 |
Участник
|
Вот еще результаты
(около 96 000 номенклатур - 2tier) 189 сек - через SET - 5 Mb на заполнение (SET через OR по понятным причинам с таким кол-вом номенклатур не работает) 709 сек - через временную - 17 Мб на заполнение - видимо, винт медленный (ноутбук) 216 сек - временная с JOIN 44 сек!! - стандартный MULTISELECT - 140 Мб (пиковое потребление) Думаю, комментарии излишни. |
|
07.03.2007, 22:50 | #10 |
Участник
|
Почему же?
как раз нужны комментарии. желательно комментарии автора. |
|
07.03.2007, 22:57 | #11 |
Участник
|
Автор и здесь я
Другая база просто, с бОльшим намного кол-вом номенклатуры. А комментарии Видим, что SET получился лучше временной таблицы, даже если используется JOIN. Думается мне, что и при использовании временной таблицы результаты были бы значительно лучше, но винт медленный (4200 оборотов), и загаженный. Поэтому возможно задержки связаны именно с обращениями к винту, но FileMon не было под рукой, чтобы убедиться наверняка. SET проигрывает значительно стандартному Аксаптовскому способу, но последний кушает значительно больше памяти. Можно будет попробовать организовать коллекцию Record'ов, и сравнить после этого быстродействие (когда и там и там будут уже подготовленные курсоры) Но это результаты с 2х звенки, и, мне кажется, они не так интересны/актуальны. На след. неделе будут еще результаты 3х звенки (около 68000 номенклатур) |
|
07.03.2007, 23:14 | #12 |
Участник
|
Ну, я это и имел в виду.
На мой вгляд итог может и должен подводить тот, кто начал тему. Про SET понял. А какой трафик гоняется по сети? На какой сети ты проверял? Если включить симуляцию медленного канала, то соотношение будет таким же? http://www.microsoft.com/Rus/Dynamic...onitoring.mspx |
|
07.03.2007, 23:19 | #13 |
Участник
|
Трафик не успел замерять, праздник все таки. И так на меня все смотрели искоса на работе, когда после окончания рабочего дня (сокращенного) я не уходил домой
В понедельник замеряю. Там 10 Мбит/с сетка, попробую принудительное замедление, спасибо за ссылку. |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
13.03.2007, 16:41 | #14 |
Участник
|
Добавил на форму еще 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 сек ------------------------ Также провел небольшое сравнение на 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 |
Участник
|
Спасибо!
Можно в полезное перенести? |
|
14.03.2007, 23:48 | #16 |
Moderator
|
|
|
15.03.2007, 00:51 | #17 |
Участник
|
|
|
23.03.2007, 17:19 | #18 |
Участник
|
Еще один аспект отметки галочками
Использование edit метода на таблицах, для которых MaxAccessMode=View как должна работать отметка галочками, если таблицу нет доступа на редактирование? Конкретно с LedgerTrans я вообще против галочек. Но интересно как решать задачу в общем случае? |
|
24.03.2007, 11:48 | #19 |
Участник
|
Решение так себе, но можно перекрыть 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 |
Участник
|
А клавиатура?
Какие еще методы надо перекрыть, чтобы получить стандартную функциональность? |
|
Теги |
axapta, map, multiselect, set, tmp, маркировка, полезное, производительность, скорость, тестирование |
|
|