12.04.2011, 10:08 | #1 |
Участник
|
DataSource на форме
Доброго времени дня. Появилось несколько вопросов:
Необходимо при пустом DataSource на форме заблокировать кнопку, пиши такой код в методе init на DS. X++: if(!Table1_ds) { MenuItemButton1.enable(false); } И еще вопрос: какое событие происходит при выборе записи из DS на форме, и как эту запись в этом событии можно получить. |
|
12.04.2011, 10:15 | #2 |
северный Будда
|
а попробуйте наоборот:
X++: if (Table1) { MenuItemButton1.enable(true); }
__________________
С уважением, Вячеслав Последний раз редактировалось pitersky; 12.04.2011 в 10:18. |
|
|
За это сообщение автора поблагодарили: AngelDominantes (1). |
12.04.2011, 10:27 | #3 |
Участник
|
Table1_ds - это объект источника данных формы. То, что он не содержит данных не означает, что он равен NULL.
Table1_ds.cursor() или просто Table1 - это курсор связанный с источником данных. Он то как раз и будет равен NULL если источник данных пуст. Событие активации записи - active(). В коде этого метода также доступен табличный курсор Table1, который связан с активной строкой. Только я не уверен что в методе init источника данный табличный курсор уже будет проинициализирован. Лучше последовать совету pitersky и пойти от обратного. По умолчанию заблокировать кнопку а в методе active при необходимости разблокировать. Посмотрите также Заблокировать menuItemButton если запись не выбрана |
|
|
За это сообщение автора поблагодарили: AngelDominantes (1). |
12.04.2011, 15:01 | #4 |
Участник
|
Спасибо, тут попутно всплыл еще вопросик, вот такой код:
X++: for(c = (_fds.getFirst(1, 1) ? _fds.getFirst(1, 1) : _fds.cursor()); c; c = _fds.getNext()) |
|
12.04.2011, 15:07 | #5 |
Участник
|
Обходить все записи или только выделенные определяется первым параметром метода getFirst. Т.е. в вашем примере цикл должен перебирать только выделенные. Соответственно начать должен с первой выделенной.
|
|
12.04.2011, 16:59 | #6 |
Участник
|
Цитата:
mark - 1 ый параметр. An integer that determines whether the first record should be returned, or whether the first record marked with a particular value should be returned. If the value is not zero, the first record marked with the specified value will be returned, and subsequent calls to the FormDataSource.getNext method will return marked records. fetchAhead - второй параметр. A Boolean with a default value of true. If false, only cached records are returned. If true, additional records are found and added to the cache. Немного не понятно: - что имеется ввиду под "particular value" которым должно быть помечена запись. - и что именно кешируется если второй параметр true. Просто именно на этих строчках кода происходит подвисание(долгое время выполнение), причем зависит от записей выбраных на форме, на каких то подвисает на каких то нет. Последний раз редактировалось AngelDominantes; 12.04.2011 в 17:15. |
|
13.04.2011, 08:13 | #7 |
Участник
|
Цитата:
На сколько я понимаю - выделенные записи всегда будут присутствовать в кэше, так что если первый параметр = true, то ворой никак не должен влиять на производительность. Вот если бы у вас стояла задача вернуть все записи, а не только выделенные, то там уже можно было бы выбирать - пологаться на кэш либо перечитывать всё. Т.е. тормозит сам перебор, пустой цикл? Тормозит вход в цикл или движение по нему? |
|
13.04.2011, 08:41 | #8 |
Участник
|
|
|
13.04.2011, 11:15 | #9 |
Участник
|
Зависает именно при входе в цикл.
|
|
13.04.2011, 13:00 | #10 |
Участник
|
Для начала можно избавиться от второго вызова getFirst. Так должен висеть в два раза быстрее
X++: c = _fds.getFirst(1, 1); if (c == NULL) c = _fds.cursor(); while (c) { // ... c = _fds.getNext(); } |
|
14.04.2011, 11:57 | #11 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Для начала можно избавиться от второго вызова getFirst. Так должен висеть в два раза быстрее
X++: c = _fds.getFirst(1, 1); if (c == NULL) c = _fds.cursor(); while (c) { // ... c = _fds.getNext(); } X++: c = _fds.getNext(); |
|
14.04.2011, 13:43 | #12 |
Moderator
|
Затык начинается как раз из-за того, что происходит полная зачитка в кэш таблицы, т.к. параметр fetchAhead (второй) стоит в true. Хотя при выделении все помеченные записи обычно уже в кэше, кроме случая "Выделить все" (кнопка вверху слева).
Предлагаю следующее решение: на FormDatasource есть метод defaultMark(), возвращающий true в случае выделения через кнопку. Тогда метод можно переписать так: X++: c = _fds.getFirst(1, _fds.defaultMark());
__________________
Андрей. Последний раз редактировалось Dron AKA andy; 14.04.2011 в 13:46. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
14.04.2011, 13:50 | #13 |
Участник
|
Цитата:
Сообщение от Dron AKA andy
Затык начинается как раз из-за того, что происходит полная зачитка в кэш таблицы, т.к. параметр fetchAhead (второй) стоит в true. Хотя при выделении все помеченные записи обычно уже в кэше, кроме случая "Выделить все" (кнопка вверху слева).
Предлагаю следующее решение: на FormDatasource есть метод defaultMark(), возвращающий true в случае выделения через кнопку. Тогда метод можно переписать так: X++: c = _fds.getFirst(1, _fds.defaultMark()); |
|
14.04.2011, 15:05 | #14 |
Moderator
|
Ну да, как и написано в хелпе: "If true, additional records are found and added to the cache." Ему же надо найти эти additional records, вот и кэширует.
__________________
Андрей. |
|
14.04.2011, 15:21 | #15 |
Участник
|
А еще вопрос в тему. К примеру я обновил некоторые записи на гриде, после этого пишу
X++: pos = fds.getPosition(); fds.research(); fds.setPosition(pos); X++: c = fds.getFirst(1,fds.defaultMark());
while (c)
{
c.reread();
c = fds.getNext();
} |
|
14.04.2011, 15:40 | #16 |
Участник
|
|
|
14.04.2011, 15:58 | #17 |
Участник
|
если Ax 2009 то:
X++: table_ds.research(true); |
|
14.04.2011, 20:18 | #18 |
Участник
|
Цитата:
PHP код:
|
|
|
|