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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.04.2007, 13:40   #1  
Akinak is offline
Akinak
Участник
 
17 / 11 (1) +
Регистрация: 22.02.2007
Метод addRange() и его использование (верное)
Доброго времени суток, дамы и господа.

Подскажите пожалуйста, может кто-либо из вас сталкивался с таким вопросом. Суть - нужно открыть форму(№2) с заранее отсортированным дс из другой формы(№1).

Для этого изпользуются классы FormRun, FormDataSource и QueryBuildRange. В частности вот код -
X++:
    QFormRun = ClassFactory.FormRunClass(Args);
    QFormRun.init();
    QFormDs = QformRun.dataSource(2);
    criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpProjTable,ProjId)); //спозиционировались
    criteria.value(pgpProjTable.ProjId); //задали рейндж
    QFormRun.Run();
В данном случае код рабочий, однако, когда в другой форме(№3) используется точно такой-же код (необходимо открыть форму №2 с сортировкой того-же дс, но по другому полю), то в строке
X++:
criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpTaskTable,TaskId)); // вот тут начинаются чудеса :eek: 
criteria.value(pgpTasksTable.TaskId);
Аксапта не позиционируется на необходимое нам поле, а взамен этого выдает позиционирование на другое поле (даже из другой таблицы). В результате в дебаггере видна строка - criteria = pgpProjId = TN4 , где pgpProjId - это неправильное позиционирование, а TN4 - это правильно полученный TaskId. Что совсем интересно, так это то, что при смене позиционирования на другое поле(TaskName к примеру) Аксапта начнет позиционировать на необходимое поле (т.е. TaskId).
Как говорила некая Алиса - "Всё чудесатее и чудесатее."

З.Ы. Ax 3.0 eng SP2. Заранее благодарю.
Старый 05.04.2007, 13:43   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Akinak Посмотреть сообщение
Аксапта не позиционируется на необходимое нам поле, а взамен этого выдает позиционирование на другое поле (даже из другой таблицы).
А зачем вы позиционируетесь по номеру датасорса?
Может таблицы идут в разном порядке?
Позиционируйтесь по tablenum.

Вообще говоря, для того, чтобы преенести текущие range в другое место юзайте
SysQuery::mergeRange()

Для того, чтобы правильно создать range юзайте SysQuery::findOrCreateRange()
__________________
полезное на axForum, github, vk, coub.
Старый 05.04.2007, 14:24   #3  
Akinak is offline
Akinak
Участник
 
17 / 11 (1) +
Регистрация: 22.02.2007
хмм.... видимо я не совсем верно сформулировал свой вопрос. Попробую по другому.
Позиционирование на дс происходит абсолютно верно. Если вы говорите про кусок кода - Query().dataSourceNo(2), то да - здесь вернее будет ловить по имени (Query().dataSourceName("pgpQstRef")), спасибо за подсказку.

Суть немного в другом - мне необходимо форму №2 открывать из 4ех других форм, каждый раз с разным range.

. В форме №1 и в форме №3 у меня никакого range нет, я его задаю открываемой форме позиционируясь на один из её датасурсов и используя текущие записи из форм №1 и №3. И ессно у меня в данных формах нет и Query.

Не совсем еще разобрался в SysQuery::MergeRanges() но там на входе 2 query, а у меня существует только один. Данный метод мне, к сожалению не подходит.

Вобще суть вопроса такова - при явном указании открываемой форме на какое поле ей необходимо наложить range (то, что я назвал позиционироваться) Акспта начинает путать поля и накладывать задаваемый range не туда, куда надо.

З.Ы. SysQuery::findOrCreateRange() - вобще не нашел, к сожалению. Может это при другом СП? Напомню свой текущий - Ax3.0 SP2.

Последний раз редактировалось Akinak; 05.04.2007 в 14:26.
Старый 05.04.2007, 14:37   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Akinak Посмотреть сообщение
здесь вернее будет ловить по имени (Query().dataSourceName("pgpQstRef")), спасибо за подсказку.
Я говорил не про имя, а про номер таблицы.
Query().dataSourceTable(tablenum(pgpQstRef)))
__________________
полезное на axForum, github, vk, coub.
Старый 05.04.2007, 14:53   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Тут явно все дело именно в том источнике, который выбирается для фильтра. (Это так правильно называется. Позиционирование - это совсем другая тема)

Так как парсер опирается на таблицу, которая находится в QueryBuildDataSource при наложении фильтра, то в метод addRange вы передаете только номер поля (как у вас реализовано). Но из-за того, что таблица на самом деле не та, берется ее поле с этим номером - соостветственно получаете левое поле.

А вообще, вместо такой фильтрации может попробовали бы использовать динамические связи? (Dynalink)? Тут и программировать не пришлось бы. Только настроить отношения между таблицами. Хотя, Вам решать
Старый 05.04.2007, 15:04   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Akinak Посмотреть сообщение
X++:
    criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpProjTable,ProjId)); //спозиционировались
    criteria.value(pgpProjTable.ProjId); //задали рейндж
X++:
criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpTaskTable,TaskId)); // вот тут начинаются чудеса :eek: 
criteria.value(pgpTasksTable.TaskId);
Чудес не бывает
Посмотрите, в обоих случаях Вы обращаетесь к той же самой форме.
В первом случае как к таблице pgpProjTable, накладывая соответствующий фильтр. Все ОК. Видимо этот источник именно этой таблицы
Во втором случае уже как к таблице pgpTaskTable.

Если посмотрите код поля pgpTaskTable.TaskId, то увидите, что он равен коду поля, которое вы видите в дебаггере.
За это сообщение автора поблагодарили: Gustav (8).
Старый 05.04.2007, 15:49   #7  
Akinak is offline
Akinak
Участник
 
17 / 11 (1) +
Регистрация: 22.02.2007
Огромное спасибо, господа. Разобрался. По отдельности ваши посты не помогли бы, а вот вместе...
Маззи - спасибо за подсказку правильного метода для использования.
kasperuk - спасибо за разьяснение принципа работы addRange().
Старый 05.04.2007, 19:00   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Извините, не удержался, навёл красоту.

1400 / 350 = ровно 4 ! Congratulations! Гармония, однако!
Изображения
 
Старый 06.04.2007, 00:32   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Gustav Посмотреть сообщение
Извините, не удержался, навёл красоту.

1400 / 350 = ровно 4 ! Congratulations! Гармония, однако!
Спасибо

Это что же получается?
Что 3 сообщения из 4ех не оказались полезными?
Как, к примеру, и вот это
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как использовать метод layout для Web контролов, и использование JavaScripta rkorchagin DAX: Программирование 1 28.06.2007 13:41
Как вызвать метод для поля в FormDataSource? Maxim Gorbunov DAX: Программирование 3 08.05.2007 11:28
Расширенный AddRange и OuterJoin Russland DAX: Программирование 0 04.07.2006 16:36
display метод с параметром Андре DAX: Программирование 5 11.01.2006 19:04
Передача массива VARIANTов в Automation метод Maximin DAX: Программирование 0 09.10.2002 19:31

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

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

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