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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.04.2011, 10:08   #1  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
DataSource на форме
Доброго времени дня. Появилось несколько вопросов:
Необходимо при пустом DataSource на форме заблокировать кнопку, пиши такой код в методе init на DS.
X++:
 if(!Table1_ds)
 {
       MenuItemButton1.enable(false);
 }
Но такой способ не срабатывает(
И еще вопрос: какое событие происходит при выборе записи из DS на форме, и как эту запись в этом событии можно получить.
Старый 12.04.2011, 10:15   #2  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,509 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
а попробуйте наоборот:
X++:
if (Table1)
 {
      MenuItemButton1.enable(true);
}
Х++ по умолчанию инитит табличную переменную для каждого датасоурса и заполняет её активным курсором
__________________
С уважением,
Вячеслав

Последний раз редактировалось pitersky; 12.04.2011 в 10:18.
За это сообщение автора поблагодарили: AngelDominantes (1).
Старый 12.04.2011, 10:27   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Table1_ds - это объект источника данных формы. То, что он не содержит данных не означает, что он равен NULL.
Table1_ds.cursor() или просто Table1 - это курсор связанный с источником данных. Он то как раз и будет равен NULL если источник данных пуст.

Событие активации записи - active(). В коде этого метода также доступен табличный курсор Table1, который связан с активной строкой.

Только я не уверен что в методе init источника данный табличный курсор уже будет проинициализирован. Лучше последовать совету pitersky и пойти от обратного. По умолчанию заблокировать кнопку а в методе active при необходимости разблокировать.

Посмотрите также Заблокировать menuItemButton если запись не выбрана
За это сообщение автора поблагодарили: AngelDominantes (1).
Старый 12.04.2011, 15:01   #4  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Спасибо, тут попутно всплыл еще вопросик, вот такой код:
X++:
for(c = (_fds.getFirst(1, 1) ? _fds.getFirst(1, 1) : _fds.cursor()); c; c = _fds.getNext())
я так понимаю он просматривает выделенные записи на форме, но с какой записи он начинает просмотр? с первой вообще или с первой выделенной?
Старый 12.04.2011, 15:07   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Обходить все записи или только выделенные определяется первым параметром метода getFirst. Т.е. в вашем примере цикл должен перебирать только выделенные. Соответственно начать должен с первой выделенной.
Старый 12.04.2011, 16:59   #6  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Обходить все записи или только выделенные определяется первым параметром метода getFirst. Т.е. в вашем примере цикл должен перебирать только выделенные. Соответственно начать должен с первой выделенной.
Вот описание функции getFirst, точнее описание параметров.

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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
что имеется ввиду под "particular value" которым должно быть помечена запись.
ИМХО имелось в виду что вернуться не все записи а только определённые, т.е. выбранные.

Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
- и что именно кешируется если второй параметр true.
На сколько я понимаю - выделенные записи всегда будут присутствовать в кэше, так что если первый параметр = true, то ворой никак не должен влиять на производительность. Вот если бы у вас стояла задача вернуть все записи, а не только выделенные, то там уже можно было бы выбирать - пологаться на кэш либо перечитывать всё.

Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
Просто именно на этих строчках кода происходит подвисание(долгое время выполнение), причем зависит от записей выбраных на форме, на каких то подвисает на каких то нет.
Т.е. тормозит сам перебор, пустой цикл? Тормозит вход в цикл или движение по нему?
Старый 13.04.2011, 08:41   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
выделенные записи всегда будут присутствовать в кэше
Поправлю сам себя. Бывают случаи, когда это не так. Например, выделение всех записей щелчком мыши по левому верхнему углу грида не добавляет все выделенные записи в кэш.
Старый 13.04.2011, 11:15   #9  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Зависает именно при входе в цикл.
Старый 13.04.2011, 13:00   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Для начала можно избавиться от второго вызова getFirst. Так должен висеть в два раза быстрее
X++:
c = _fds.getFirst(1, 1);
if (c == NULL)
    c = _fds.cursor();

while (c)
{
    
    // ...

    c = _fds.getNext();
}
Но это так, оптимизация, проблему это не решит. Возможно причиной подвисания является отсутствие индекса на таблице. У вас источник данных отфильтрован или отсортирован по каким-либо полям? Создайте соответствующий индекс на таблице.
Старый 14.04.2011, 11:57   #11  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от 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  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Затык начинается как раз из-за того, что происходит полная зачитка в кэш таблицы, т.к. параметр 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  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
Затык начинается как раз из-за того, что происходит полная зачитка в кэш таблицы, т.к. параметр fetchAhead (второй) стоит в true. Хотя при выделении все помеченные записи обычно уже в кэше, кроме случая "Выделить все" (кнопка вверху слева).
Предлагаю следующее решение: на FormDatasource есть метод defaultMark(), возвращающий true в случае выделения через кнопку. Тогда метод можно переписать так:
X++:
c = _fds.getFirst(1, _fds.defaultMark());
Т.е. он кеширует все записи на гриде, если второй параметр установлен в true?
Старый 14.04.2011, 15:05   #14  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
Т.е. он кеширует все записи на гриде, если второй параметр установлен в true?
Ну да, как и написано в хелпе: "If true, additional records are found and added to the cache." Ему же надо найти эти additional records, вот и кэширует.
__________________
Андрей.
Старый 14.04.2011, 15:21   #15  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
А еще вопрос в тему. К примеру я обновил некоторые записи на гриде, после этого пишу
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
dsRefresh_RU
Старый 14.04.2011, 15:58   #17  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
если Ax 2009 то:
X++:
table_ds.research(true);
Старый 14.04.2011, 20:18   #18  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
А еще вопрос в тему. К примеру я обновил некоторые записи на гриде, после этого пишу ........
Но так он не обновляет последнюю выбранную запись, почему для меня загадка) Как можно еще обновить грид с сохранение курсора?
Можно перерисовать грид старым дедовским способом, который сохраняет курсор на текущей записи. Создайте на форме вот такой метод и вызывайте его:
PHP код:
static void myRefreshData()
{
    
SalesTable        t;
    ;
    
t.RecId SalesTable.RecId;
    
element.lockWindowUpdate(true);
    
SalesTable_DS.executeQuery();
    
SalesTable_DS.findRecord(t);
    
element.lockWindowUpdate(false);

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Динамическое создание DataSource на форме, и добавление элементов дизайна. epack DAX: Программирование 12 24.11.2010 15:31
Фильтр на форме без datasource vazerdim DAX: Программирование 8 13.05.2009 18:58
DataSource на Web-форме (DAX 4.0) cherv DAX: Программирование 24 24.07.2007 16:51
Кто знает можно как нибудь открыть доступ к полю на форме если DataSource закрыт для AlexT1 DAX: Программирование 9 03.11.2005 00:18
Как получить значение поля Datasource на динамически созданной форме? storer DAX: Программирование 2 14.11.2003 16:41

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

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

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