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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.04.2015, 22:27   #1  
bitter is offline
bitter
Участник
 
15 / 19 (1) ++
Регистрация: 12.04.2015
Полученное значение через QueryBuildDataSource
Как определить, вернулось ли что-нибудь с помощью QueryBuildDataSource?
Старый 12.04.2015, 23:02   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от bitter Посмотреть сообщение
Как определить, вернулось ли что-нибудь с помощью QueryBuildDataSource?
Нужно создать queryRun для всей query (к которой добавлен queryBuildDataSource), и вызвать на нем next() - это вернет true, если квери вернула что-нибудь.
Старый 12.04.2015, 23:07   #3  
bitter is offline
bitter
Участник
 
15 / 19 (1) ++
Регистрация: 12.04.2015
Возвращает true в любом случае.
Могу предоставить код если необходимо.
Старый 12.04.2015, 23:11   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Не утруждайтесь - это только начинающие программисты смотрят в исходный код, а настоящие гуру умеют всю нужную информацию видеть в хрустальном шаре.

PS. См. также Как правильно задать вопрос, чтобы быть услышанным

Последний раз редактировалось gl00mie; 12.04.2015 в 23:14. Причина: PS
Старый 12.04.2015, 23:14   #5  
bitter is offline
bitter
Участник
 
15 / 19 (1) ++
Регистрация: 12.04.2015
X++:
Query                   query          = new Query();
QueryRun                queryRun;
QueryBuildDataSource    qbds;
;

qbds = query.addDataSource(tableNum(RContractTable));
qbds.addRange(fieldNum(RContractTable, RContractAccount)).value(PayRequestTable.RContractAccount);
queryRun = new QueryRun(query);
if (queryRun.next())
{
    info("true");
}
else if (!queryRun.next())
{
    info("false");
}
Старый 12.04.2015, 23:22   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Всегда используйте queryValue() (он же SysQuery::value()) для "обработки" значений, подставляемых в QueryBuildRange, в данном случае для PayRequestTable.RContractAccount. Вероятно, соотв. значение в вашем случае - пустое, поэтому выборка из таблицы договоров фактически идет без фильтрации по рег.номеру - см. также, какое значение возвращает SysQueryValue::unlimited().
За это сообщение автора поблагодарили: bitter (1).
Старый 12.04.2015, 23:49   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от bitter Посмотреть сообщение
X++:
....
if (queryRun.next())
{
    info("true");
}
else if (!queryRun.next())
{
    info("false");
}
должно быть

X++:
if (queryRun.next())
{
    info("true");
}
else
{
    info("false");
}
queryRun.next() передвигает позицию в результате выборки на след.строку, то есть вызвав next два раза вы выполняете проверку совсем разных условий.
За это сообщение автора поблагодарили: bitter (1).
Старый 13.04.2015, 00:08   #8  
bitter is offline
bitter
Участник
 
15 / 19 (1) ++
Регистрация: 12.04.2015
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Всегда используйте queryValue() (он же SysQuery::value()) для "обработки" значений, подставляемых в QueryBuildRange, в данном случае для PayRequestTable.RContractAccount. Вероятно, соотв. значение в вашем случае - пустое, поэтому выборка из таблицы договоров фактически идет без фильтрации по рег.номеру - см. также, какое значение возвращает SysQueryValue::unlimited().
Спасибо, буду разбираться.


Цитата:
Сообщение от kashperuk Посмотреть сообщение
должно быть

X++:
if (queryRun.next())
{
    info("true");
}
else
{
    info("false");
}
queryRun.next() передвигает позицию в результате выборки на след.строку, то есть вызвав next два раза вы выполняете проверку совсем разных условий.
Спасибо.
Я понял почему всегда возвращает true. Я сравниваю полученное значение со значением в таблице, которое априори там присутствует. Соответственно вопрос был задан некорректно, прошу прощения. Попытаюсь расписать алгоритм, который мне необходимо реализовать.

На форме есть лукап, с помощью которого я выбираю значение из таблицы, по этому значению мне необходимо найти строку в другой таблице и выяснить заполнено ли определенное поле в данной строке. От того, заполнено ли это поле, будут зависеть мои дальнейшие действия.
Я не совсем понимаю как мне выяснить заполнено ли поле найденной строки. Необходимо добавить еще один рейндж с этим полем в QueryBuildDataSource?
Старый 13.04.2015, 03:14   #9  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Для строкового поля:
X++:
qbds.addRange(fieldNum(, )).value(SysQuery::valueNotEmptyString());
или если поле целое к примеру:
X++:
qbds.addRange(fieldNum(, )).value(SysQuery::valueNot(0));
Если queryRun.next() что-то вернет значит поле заполнено.


Можно сделать через select
X++:
/* Выбираем первую попавшуюся запись с искомым RContractAccount и заполненым полем ContractDate */
select firstOnly RecId from rcontractTable
   where rcontractTable.RContractAccount == payRequestTable.RContractAccount
      && rcontractTable.ContractDate; /* Ваше поле */

if (rcontractTable)
{
    info("запись существует");
}
За это сообщение автора поблагодарили: bitter (1).
Старый 13.04.2015, 07:51   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от bitter Посмотреть сообщение
необходимо найти строку в другой таблице и выяснить заполнено ли определенное поле в данной строке.
А если в таблице есть две "такие" записи и с заполненным полем и с не заполненным? Проверять нужно, что данное поле заполнено для всех "таких" или хотя бы для одной? А что делать если вообще "таких" строк в таблице нет ни с заполненным полем ни с незаполненным?

Если "таких" строк в принципе не может быть больше одной (выборка происходит по уникальному ключу), то возможно логичнее сначала прочитать значение этой записи (каким бы оно ни было пустым или заполненным) - проверить что сама запись в таблице есть, а уже вторым шагом проверить заполненность поля в выбранной записи.
Цитата:
Сообщение от bitter Посмотреть сообщение
Я не совсем понимаю как мне выяснить заполнено ли поле найденной строки
X++:
if (queryRun.next())
{
    RContractTable = queryRun.get(tableNum(RContractTable)); // получаем выбранную запись
    if (RContractTable.ContractDate)
    {
        info("Поле заполнено");
    }
    else
    {
        info("Поле не заполнено");
    }
}
else
{
    info("Запись не найдена");
}

Последний раз редактировалось S.Kuskov; 13.04.2015 в 07:54.
За это сообщение автора поблагодарили: bitter (1).
Старый 13.04.2015, 10:22   #11  
bitter is offline
bitter
Участник
 
15 / 19 (1) ++
Регистрация: 12.04.2015
Цитата:
Сообщение от skuull Посмотреть сообщение
Для строкового поля:
X++:
qbds.addRange(fieldNum(, )).value(SysQuery::valueNotEmptyString());
Проблема решилась добавлением данной строки.
Спасибо!
Через select делать не очень целесообразно, т.к. исходный код содержится в методе датасорса формы.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Table Scan через QueryRun maximka DAX: Программирование 8 05.10.2007 10:46
Пропадает значение Range при экспорте проекта gl00mie DAX: Программирование 3 27.09.2007 00:22
Запуск программы из Аксапты через 2-хзвенку Migel_84 DAX: Программирование 25 27.04.2006 09:41
QueryBuildDataSource - динамически if_maks DAX: Программирование 6 07.04.2006 13:39
Проблема с запуском business connector'a через удал доступ yooshi DAX: Программирование 1 07.11.2005 08:56

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:39.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.