|
14.07.2010, 12:19 | #1 |
Участник
|
Помогите с 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 |
Участник
|
range.value(QueryUtils::in(контейнер));
соответственно контейер должен содержать только ['ЦД0001','УР0019'] (т.е. коды подразделений)
__________________
Лучше сделать и жалеть, чем жалеть что не сделал |
|
14.07.2010, 12:34 | #3 |
Участник
|
Цитата:
QueryUtils
у нас ax4.0, sp2 |
|
14.07.2010, 13:46 | #4 |
Участник
|
УПС, это самописны класс
Вот код этого метода можете попробовать 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 |
Участник
|
Огромное спасибо, добавила этот метод и всё заработало.
Чуть позже через global поиграюсь. ) Ещё раз, всем огромное спасибо. |
|
14.07.2010, 12:57 | #6 |
Участник
|
Цитата:
а так не пробовали?
X++: range.value(sysQuery::value(con2str(, ","))); Подумал и понял что сморозил глупость. Нужно при доставании из контейнера проделывать в цикле что-то вроде такого 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 |
Участник
|
Или так
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 |
Участник
|
Один минус этого метода - это ограничение длинны запроса в sql (в данном случае если много значений) . Выход - join. ))
__________________
Лучше сделать и жалеть, чем жалеть что не сделал |
|