05.04.2007, 13:40 | #1 |
Участник
|
Метод 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(); X++: criteria = QFormDs.Query().dataSourceNo(2).addRange( fieldNum(pgpTaskTable,TaskId)); // вот тут начинаются чудеса :eek: criteria.value(pgpTasksTable.TaskId); Как говорила некая Алиса - "Всё чудесатее и чудесатее." З.Ы. Ax 3.0 eng SP2. Заранее благодарю. |
|
05.04.2007, 13:43 | #2 |
Участник
|
Цитата:
Может таблицы идут в разном порядке? Позиционируйтесь по tablenum. Вообще говоря, для того, чтобы преенести текущие range в другое место юзайте SysQuery::mergeRange() Для того, чтобы правильно создать range юзайте SysQuery::findOrCreateRange() |
|
05.04.2007, 14:24 | #3 |
Участник
|
хмм.... видимо я не совсем верно сформулировал свой вопрос. Попробую по другому.
Позиционирование на дс происходит абсолютно верно. Если вы говорите про кусок кода - 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 |
Участник
|
Цитата:
Query().dataSourceTable(tablenum(pgpQstRef))) |
|
05.04.2007, 14:53 | #5 |
Участник
|
Тут явно все дело именно в том источнике, который выбирается для фильтра. (Это так правильно называется. Позиционирование - это совсем другая тема)
Так как парсер опирается на таблицу, которая находится в QueryBuildDataSource при наложении фильтра, то в метод addRange вы передаете только номер поля (как у вас реализовано). Но из-за того, что таблица на самом деле не та, берется ее поле с этим номером - соостветственно получаете левое поле. А вообще, вместо такой фильтрации может попробовали бы использовать динамические связи? (Dynalink)? Тут и программировать не пришлось бы. Только настроить отношения между таблицами. Хотя, Вам решать |
|
05.04.2007, 15:04 | #6 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Огромное спасибо, господа. Разобрался. По отдельности ваши посты не помогли бы, а вот вместе...
Маззи - спасибо за подсказку правильного метода для использования. kasperuk - спасибо за разьяснение принципа работы addRange(). |
|
05.04.2007, 19:00 | #8 |
Moderator
|
Извините, не удержался, навёл красоту.
1400 / 350 = ровно 4 ! Congratulations! Гармония, однако! |
|
06.04.2007, 00:32 | #9 |
Участник
|
Цитата:
Это что же получается? Что 3 сообщения из 4ех не оказались полезными? Как, к примеру, и вот это |
|