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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.07.2010, 12:19   #1  
SashaR is offline
SashaR
Участник
 
3 / 10 (1) +
Регистрация: 16.10.2007
Помогите с range
Здравствуйте.
Помогите с range, есть такой код:

X++:
QueryBuildRange range;
str strOrganization;
;
 
range = SysQuery::findOrCreateRange(queryRun.query().dataSourceTable(tableNum(RPayTrans)),fieldnum(RPayTrans, HrmOrganisationId) );
 
//строку упростили для наглядности (переменные достаются из контейнера) 
strOrganization  =  'HrmOrganisationId = ' + "N'ЦД0001'" + ' OR HrmOrganisationId = ' + "N'УР0019'";
range.value("( " + strOrganization + ") ");
В результате получаем ошибку: "Ошибка расширенного диапазона запроса: ."

Правильный запрос выглядит так:
SELECT * FROM EmplTable ORDER BY EmplTable.EmplId ASC EXISTS JOIN * FROM RPayTrans WHERE EmplTable.EmplId = RPayTrans.Emplid AND ((PayPeriod = {ts '2010-06-30 00:00:00.000'})) AND ((NOT (Amount = 0))) AND ((HrmOrganisationId = N'ЦД0001' OR HrmOrganisationId = N'УР0019'))

У меня же получается:
SELECT * FROM EmplTable ORDER BY EmplTable.EmplId ASC EXISTS JOIN * FROM RPayTrans WHERE EmplTable.EmplId = RPayTrans.Emplid AND ((PayPeriod = {ts '2010-06-30 00:00:00.000'})) AND ((NOT (Amount = 0))) AND (((HrmOrganisationId=N'ЦД0001'OR HrmOrganisationId=N'УР0019')))

Как я понимаю, все дело в тройных кавычках.
Как передать value чтобы было меньше кавычек не понимаю, или же как передать сразу контейнер?
Спасибо.
Старый 14.07.2010, 12:27   #2  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
range.value(QueryUtils::in(контейнер));
соответственно контейер должен содержать только ['ЦД0001','УР0019'] (т.е. коды подразделений)
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 14.07.2010, 12:34   #3  
SashaR is offline
SashaR
Участник
 
3 / 10 (1) +
Регистрация: 16.10.2007
Цитата:
QueryUtils
а нет у нас такого класса в системе.
у нас ax4.0, sp2
Старый 14.07.2010, 13:46   #4  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от SashaR Посмотреть сообщение
а нет у нас такого класса в системе.
у нас ax4.0, sp2
УПС, это самописны класс

Вот код этого метода можете попробовать

X++:
static str in(container _values, str _prefix="")
{
    str result="";
    int i;
    for(i=1;i<=conLen(_values);i++)
    {
        if(result)
            result+=",";
        result+=_prefix+queryValue(conPeek(_values, i));
    }
    return result;
}
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
За это сообщение автора поблагодарили: Poleax (1).
Старый 14.07.2010, 14:05   #5  
SashaR is offline
SashaR
Участник
 
3 / 10 (1) +
Регистрация: 16.10.2007
Огромное спасибо, добавила этот метод и всё заработало.

Чуть позже через global поиграюсь. )

Ещё раз, всем огромное спасибо.
Старый 14.07.2010, 12:57   #6  
Alexanderis.ua is offline
Alexanderis.ua
Участник
 
53 / 40 (2) +++
Регистрация: 25.12.2008
Адрес: Киев, Украина
Цитата:
а так не пробовали?

X++:
range.value(sysQuery::value(con2str(, ",")));
SysQuery вроде корректно обрабатывает значения через запятую.

Подумал и понял что сморозил глупость.

Нужно при доставании из контейнера проделывать в цикле что-то вроде такого

X++:
for // перебор
{
    strOrganization = Global::queryRangeConcat(strOrganization, SysQuery::value(conpeek(, i)));
}
range.value(strOrganization);
__________________
If it ain't broke, take it apart and find out why (с)

Последний раз редактировалось Alexanderis.ua; 14.07.2010 в 13:15. Причина: написал не подумав как следует. каюсь.
Старый 14.07.2010, 13:48   #7  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Или так

X++:
    str result="";
    int i;
    for(i=1;i<=conLen( );i++)
    {
        if(result)
            result+=",";
        result+=queryValue(conPeek( , i));
    }
    range.value(result);
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
За это сообщение автора поблагодарили: SashaR (1).
Старый 14.07.2010, 21:14   #8  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Один минус этого метода - это ограничение длинны запроса в sql (в данном случае если много значений) . Выход - join. ))
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
jinx: Dynamics AX LookupForms &ndash; FindValue und Range auf gleichem Feld Blog bot DAX auf Deutsch 0 18.09.2009 03:13
axaptapedia: Packing date range values in queries Blog bot DAX Blogs 1 09.11.2007 13:10
вопрос про дату в range. помогите разобраться. Hans DAX: Программирование 5 24.04.2007 17:52
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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