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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.12.2001, 15:00   #1  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Быстрый способ добавить фильтр на FormDataSource
Чтобы быстро добавить ограничение на значения одного из полей источника данных, например, для фильтрации, следует:
  1. Перекрыть метод FormDataSource::Init().
  2. Написать там примерно следующее:

X++:
this.query().dataSourceNo(1).addRange(fieldNum(MyTable,MyField)).value(MyValue);
Роман Кошелев
Старый 05.12.2001, 15:03   #2  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Приносим свои извинения
Сегодня эта тема была утерена, приносим всем свои извинения, а в особенности Сергею и Андрею.
Причина: мои кривые руки. Некорректно удалил дублирующиеся сообщения. Хотел как лучше...
Старый 05.12.2001, 15:04   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Вопрос
Цитата:
Чтобы быстро добавить ограничение на значения одного из полей источника данных,например, для фильтрации, следует:
Перекрыть метод FormDataSource::Init().
Уточните пожалуйста: метод какого объекта необходимо перекрыть.
FormDataSource - это, что ? Это таблица в разделе DataSource у какой-либо формы ? Если это так, то почему когда я набираю:

this.query().

у меня появляется сообщение "информация из таблицы подстановок не доступна" ?

Спасибо.

<a href = "http://www.axforum.info/forums/member.php?s=&action=getinfo&userid=24">Андрей.</a>
Старый 05.12.2001, 15:07   #4  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Re: Вопрос
Здравствуйте, Андрей.

Вы поняли совершенно верно: FormDataSource - это один из DataSource формы, которые расположены в ветви DataSource у формы (на одном уровне с Methods и Designs). Из кода в форме к объекту типа FormDataSource можно получить доступ через переменную вида <имя DataSource>_ds (например, SalesTable_ds).

Если вы перекрываете метод Init, вы можете использовать this для доступа к FormDataSource. Недоступность информации из таблицы подстановок не есть ошибка. Дело в том, что система IntelliSence Axapta, которая отвечает за подстановку, устроена так, что она обрабатывает лишь подстановки первого уровня. Вы же пытаетесь заставить ее обработать более глубокую подстановку. Если Вы хотите воспользоваться IntelliSence, заведите переменную типа Query и присвойте ей значение this.query(). Продолжая по аналогии Вы получите подстановки на всех уровнях. Однако, это лишь вопрос удобства разработки и отладки. Для краткости вы можете воспользоваться нашим текстом.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 07.12.2001, 15:55   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Да действительно, мое сообщение затерялось. Но ничего, напишу еще раз.

Спасибо Max.

Спасибо за предыдущее объяснение, но у меня все равно не получается фильтровать записи при открытии формы.
Я создал форум и добавил в нее источник данных, например BOMTable. Я раскрываю эту таблицу и перекрываю метод Init.
В нем я пишу следующее:
this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");
или
BOMTable_ds.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");

Форма копмилируется. Но при запуске формы появляется сообщение о ошибке времени выполнения:

empty class object не инициализирован.
Трассировка стека:
\Procedures\<Global>\dataSourceNo
\Forms\Form3\Data Sources\BOMTable\Methods\init // Это тот метод который я перекрываю.

Если же я создаю кнопку, перекрываю метод clicked и добавляю туда эту же строку, то принажатии на кнопку сообщение об ошибке не появляется, но и с Grid'ом на который я вывожу источник данных тоже ничего не происходит.

В чем дело ?

Спасибо.

Андрей.
Старый 08.12.2001, 03:29   #6  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Цитата:
Изначально опубликовано Андре

... перекрываю метод Init.
В нем я пишу следующее:
this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");
Скорее всего, ошибка в том, что "не успевает" проинициализироваться query.
Я повторил вcё как ты писал, и понял -- быстрее всего решить проблему, если перекрыть метод <b>executeQuery</b>, а не <b>Init</b>:

X++:
public void executeQuery()
{
    this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");
    super();
}
Так вроде всё работает.
__________________
С уважением, Роман Кошелев.
Старый 08.12.2001, 03:32   #7  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Цитата:
Изначально опубликовано Андре
Если же я создаю кнопку, перекрываю метод clicked и добавляю туда эту же строку, то принажатии на кнопку сообщение об ошибке не появляется, но и с Grid'ом на который я вывожу источник данных тоже ничего не происходит.

В чем дело ?
Дело в том, что ты установил правила фильтрации, но не заставил перефильтроваться.
ВЫзови что-то вроде BOMTable_ds.research() или BOMTable_ds.executeQuery() и грид перерисуется.
__________________
С уважением, Роман Кошелев.
Старый 09.12.2001, 18:19   #8  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Ошибка времени выполнения
Здравствуйте, Андрей.

Возможно, что причина вашей ошибки - не совсем корректная формулировка с нашей стороны.
Цитата:
Перекрыть метод FormDataSource::Init()
Слово "перекрыть" здесь, видимо, не совсем уместно. На самом деле Вы должны лишь дописать этот метод. По видмому, Вы удалили вызов метода super() оттуда. Делать этого не стоит, а добавленные Вами строки кода должны обязательно находиться <b>после</b> вызова метода super().

Смысл сообщения об ошибке, выдаваемого Вам, заключается в том, что Вы пытаетесь использовать методы объекта, который еще не иниализирован (инициализация проходит именно в методе super()).

Решение проблемы через executeQuery также корректно (к этому момент объект FormDataSource уже инициализирован), но Вы должны осознавать, что каждый раз при вызове этого метода (а он, в отличие от init, вызывается очень часто) будет происходить присваивание query для dataSource. Теперь, если Вы захотите изменить значение query во время работы (например, по нажатию кнопки), Вам придется добавлять сравнительно сложный код с условиями ветвления в executeQuery. В случае использования метода init Вы присваиваете query лишь начальное значение, которое затем сможете как угодно менять в любых методах своей формы.

Вообще говоря, метод executeQuery лишь выполняет запрос, который присвоен полю query элемента FormDataSource. То, что у Вас не происходила фильтрация при нажатии на кнопку, объясняется тем, что Вы лишь присваивали полю query новые параметры запроса. Для выполнения запроса следует использовать метод executeQuery.

В качестве примера посмотрите мой проект. Я переопределял методы init у InventTable и clicked у кнопки. Попробуйте убрать вызов метода clearRanges.
Вложения
Тип файла: zip project1.zip (2.3 Кб, 253 просмотров)
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 24.04.2002, 12:01   #9  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Изначально опубликовано Андре

... перекрываю метод Init.
В нем я пишу следующее:
this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");

Цитата:
Роман Кошелев

Скорее всего, ошибка в том, что "не успевает" проинициализироваться query.
Я повторил вcё как ты писал, и понял -- быстрее всего решить проблему, если перекрыть метод executeQuery, а не Init:


public void executeQuery()
{
this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");
super();
}

Так вроде всё работает.
Работает, да не совсем.

Метод executeQuery срабатывает каждый раз при добавлении/снятии фильтра. Соответственно на форме установки фильтра при каждой установке/снятии фильтра добавляется еще одна строка.
Наверно корректнее будет так:

public void executeQuery()
{

this.query().dataSourceNo(1).clearRange(fieldNum(BomTable,BomId));
this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");

super();

}

И еще. При добавлении этого метода и открытии формы установки фильтра, там по умолчанию можно фильтровать только по одному полю - тому, на которое мы установили фильтр. А если бы я не создавал этот метод, то в форме установки фильтра отображались бы строки фильтрации по другим полям.

Куда они пропадают ?
Старый 27.05.2002, 10:39   #10  
vetalgl is offline
vetalgl
Участник
 
7 / 11 (1) +
Регистрация: 06.12.2001
Попробуйте перенести ваш код
this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");
в инит'е Дата сорса за super()
т.е.
void init()
{
...
super();
this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId)).value("001");
}

То, что он вылетает с ошибкой трасировкой ... и т.д. - это понятно, на непроинициалицированный дата сорс вы ложите ограничение ...

в нашей практике мы поступаем несколько по другому ...

ClassDeclaration формы объявляем переменную
{
...
QueryBuildRange myRange;
...
}

в ините дата сорса инициализируем ее после супера

...
super();
....
myRange = this.query().dataSourceNo(1).addRange(fieldNum(BomTable,BOMId));
...

в executeQuery этого же дата сорса прописуем до супера
...
myRange.value('001');
super();
...

Вот.

Но даже не это вызывает интерес ...
Более интересна проблема решить как не сбив уже наложенные пользователем фильтры (правой клавишей на поле , фильтр) наложить свой ... фильтр.

Я по свободке капался и даже нарыл как это можно сделать, но по какой-то причине не записал ..., может кто знает?
__________________
Всем привет!!!
За это сообщение автора поблагодарили: Vasil (1).
Старый 27.05.2002, 13:05   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
<pre>
QueryBuildDataSource dataSource;
QueryBuildRange queryRange;
str value;
int RangeCount;

rangeCount = dataSource.rangeCount();
for( fieldNo = 1; fieldNo <= rangeCount; ++fieldNo )
{
queryRange = dataSource.range(fieldNo);
if(
queryRange.field() != %FieldName% || queryRange.status() != %RangeStatus%
)
continue;

// Нашли критерий. Добавляем наш фильтр во все критерии по этому полю.
value = queryRange.value();
if( value )
{ // критерий уже задан. Добавляем свой
queryRange.value(value+','+%RangeValue%);
}
else
{ // Критерий задан. Но он пустой. Странно. Но продолжаем
queryRange.value(%RangeValue%);
}
}
</pre>

ты уверен, что без программирования никак?
ты уверен, что то что ты хочешь не решается штатными средствами?
Старый 27.05.2002, 17:53   #12  
vetalgl is offline
vetalgl
Участник
 
7 / 11 (1) +
Регистрация: 06.12.2001
:(
У важаемый mazzy!!!
Думаю для людей популяризирующих аксапту несколько не уместен Ваш тон!!!
нет я не уверен, что без пограмирования никак, нет я не уверен, что то, что я хочу, не решается програмными ср-ми, но именно для этого я и листаю, этот форум, именно для этого я и пытаюсь учавствовать в дисскусиях, или я не понимаю для чего был создан данный форум.

За предложенное Вами решение - спасибо (програмный код), - проверял работает, понравилось.
__________________
Всем привет!!!
Старый 27.05.2002, 19:37   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
vegtabl, извини.
Старый 23.04.2003, 10:18   #14  
daemon is offline
daemon
Участник
 
20 / 10 (1) +
Регистрация: 13.03.2003
Адрес: Москва, Россия
Re: Вопрос
Цитата:
Если это так, то почему когда я набираю:

this.query().

у меня появляется сообщение "информация из таблицы подстановок не доступна" ?
PHP код:
public void init()  {;
      
super(); 
      
this.query().dataSource(...).addRange(...).value(...); 

__________________
Roman "Daemon" Krivov
Specialist of “CORUS Group” IT department
Старый 23.04.2003, 15:20   #15  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Вы что-то хотели спросить?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 23.04.2003, 15:31   #16  
daemon is offline
daemon
Участник
 
20 / 10 (1) +
Регистрация: 13.03.2003
Адрес: Москва, Россия
Talking
Цитата:
Изначально опубликовано Maxim Gorbunov
Вы что-то хотели спросить?
Нет. Мы просто хотели ответить
Упс! Говорили же мне "Внимательно читай хворумы!" оказывается такой ответ уже был... Сорри!
__________________
Roman "Daemon" Krivov
Specialist of “CORUS Group” IT department
Старый 25.04.2003, 15:47   #17  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 28.04.2003, 09:27   #18  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано PlasticinE
Кстати, это не вами был изначально усилен AxForum?
Нет. Форум был усилен другими демонами.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 28.04.2003, 13:26   #19  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 29.04.2003, 10:35   #20  
daemon is offline
daemon
Участник
 
20 / 10 (1) +
Регистрация: 13.03.2003
Адрес: Москва, Россия
Цитата:
Изначально опубликовано PlasticinE


Максим! ну что же вы?!
Вдруг бы человек признался? - нам было бы кого пинать ногами...
В таком случае... фиг вам!
__________________
Roman "Daemon" Krivov
Specialist of “CORUS Group” IT department
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
оборотная ведомость по складу необходимо добавить ещё один фильтр jeky DAX: Программирование 21 06.04.2009 19:03
Быстрый способ вывода данных в Excel с картинками Zlojbarsuk DAX: Программирование 10 23.10.2008 20:13
Как в query добавить фильтр по аналитике (Dimension)? Roman812 DAX: Программирование 21 15.07.2005 09:53
Различные типы связей (LinkType) для FormDataSource Maxim Gorbunov DAX: База знаний и проекты 1 16.05.2004 13:20
Гибрид FormTableControl и FormDataSource Андре DAX: Программирование 27 01.10.2003 09:58

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

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

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