|
27.02.2013, 19:29 | #1 |
Участник
|
Сложный Range
Задаем несложный Range:
X++: str60 wrkgroup = "W0123*"; ; queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrGroupId )).value( strFmt('(%1 == %2)', fieldStr( wrkCtrTable, WrkCtrGroupId ), fieldStr( wrkCtrTable, WrkCtrId ) ) ); queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrId )).value( wrkgroup ); Задача: Убрать верхнюю строчку из lookup, т.е. отображать только тех фрезеровщиков у которых есть разряд. Читаем: Expressions in query ranges Сложный Range с датами Пытаемся повторить : X++: str60 wrkgroup = "W0123*"; str60 notwrkgroup = "W012300000"; queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrGroupId )).value( strFmt('(%1 == %2)', fieldStr( wrkCtrTable, WrkCtrGroupId ), fieldStr( wrkCtrTable, WrkCtrId ) ) ); queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrId )).value( strFmt('( (%1 == "%2") && (%1 != "%3") )', fieldStr(wrkCtrTable, WrkCtrId), queryValue( wrkgroup) ) queryValue( notwrkgroup ) ) ); Делаем запрос на таблице, убеждаемся что все таки имеются записи удовлетворяющие нашим условиям: Пытаемся решить задачу своими силами: немного упрощаем Range: X++: str60 wrkgroup = "W0123*"; queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrGroupId )).value( strFmt('(%1 == %2)', fieldStr( wrkCtrTable, WrkCtrGroupId ), fieldStr( wrkCtrTable, WrkCtrId ) ) ); queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrId )).value( strFmt(' (%1 == "%2") ', fieldStr(wrkCtrTable, WrkCtrId), queryValue( wrkgroup ) ) ); Что я делаю не так? |
|
27.02.2013, 19:40 | #2 |
Участник
|
Цитата:
Сообщение от sashanka
Читаем:
Expressions in query ranges Там в самом конце есть раздел Using wildcards and comma-separated range values |
|
|
За это сообщение автора поблагодарили: sashanka (1). |
28.02.2013, 01:18 | #3 |
Участник
|
Стыдно то как -___-
Спасибо что не поленились ответить невнимательному новичку. Завтра обязательно проверю Последний раз редактировалось sashanka; 28.02.2013 в 01:20. |
|
28.02.2013, 17:50 | #4 |
Участник
|
Все получилось
X++: str60 wrkgroup = "W0123*"; str60 notwrkgroup = "W012300000"; queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrGroupId )).value( strFmt("(%1 == %2)", fieldStr( wrkCtrTable, WrkCtrGroupId ), fieldStr( wrkCtrTable, WrkCtrId ) ) ); queryBuildDatasource.addRange( fieldNum( wrkCtrTable, WrkCtrId )).value( strFmt('((%1 LIKE "%2") && (%1 != "%3"))', fieldStr( wrkCtrTable, WrkCtrId ), wrkgroup, notwrkgroup ) ); |
|
28.02.2013, 21:43 | #5 |
Участник
|
Глядя на то куда (на какое поле) вы добавляете расширенный фильтр, хочется предостеречь от возможных ошибок и недопонимания вас и других читающих этот пост.
1) На одно и то же поле таблицы можно устанавливать несколько фильтров (делать addRange на один и тот же fieldNum). В этом случае условия связываются так, как если бы они были перечислены один раз в одном фильтре через запятую. Т.е. грубо говоря связываются через ИЛИ (за исключением отрицаний). 2) Фильтр с расширенным синтаксисом может быть добавлен через любое поле таблицы. Для самого расширенного синтаксиса абсолютно не важно в Range.Value() какого именно поля его добавляют. Значение имеет только содержимое фильтра. 3) 2-ой пункт не отменяет 1-й. Т.е. если забыть о 1-ом пункте, то добавление даже расширенного фильтра на поле, по которому уже был задан ранее фильтр может привести не к запланированному результату. Мораль. Все расширенные фильтры лучше не разбивать на несколько частей а формировать в один пусть и большой критерий. И добавлять этот критерий лучше через какое-нбудь системное поле (например TableId), что бы исключить его пересечение с пользовательскими фильтрами. P.S.: А точно для реализации второго критерия необходимо прибегать к расширенному синтаксису? Вот такого критерия strfmt("%1, !%2", wrkgroup, notwrkgroup) не достаточно? Последний раз редактировалось S.Kuskov; 28.02.2013 в 21:47. |
|
|
За это сообщение автора поблагодарили: sashanka (1). |
03.03.2013, 13:14 | #6 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Глядя на то куда (на какое поле) вы добавляете расширенный фильтр, хочется предостеречь от возможных ошибок и недопонимания вас и других читающих этот пост.
1) На одно и то же поле таблицы можно устанавливать несколько фильтров (делать addRange на один и тот же fieldNum). В этом случае условия связываются так, как если бы они были перечислены один раз в одном фильтре через запятую. Т.е. грубо говоря связываются через ИЛИ (за исключением отрицаний). 2) Фильтр с расширенным синтаксисом может быть добавлен через любое поле таблицы. Для самого расширенного синтаксиса абсолютно не важно в Range.Value() какого именно поля его добавляют. Значение имеет только содержимое фильтра. 3) 2-ой пункт не отменяет 1-й. Т.е. если забыть о 1-ом пункте, то добавление даже расширенного фильтра на поле, по которому уже был задан ранее фильтр может привести не к запланированному результату. Мораль. Все расширенные фильтры лучше не разбивать на несколько частей а формировать в один пусть и большой критерий. И добавлять этот критерий лучше через какое-нбудь системное поле (например TableId), что бы исключить его пересечение с пользовательскими фильтрами. P.S.: А точно для реализации второго критерия необходимо прибегать к расширенному синтаксису? Вот такого критерия strfmt("%1, !%2", wrkgroup, notwrkgroup) не достаточно? 1)Про то, что на одно и то же поле таблицы можно устанавливать несколько фильтров и что они связываются по ИЛИ знала, а вот перечисление через запятую лично для меня это новость. 2) До этого дошла практическим путем 3) Запомню на будущее. Действительно, расширенный синтаксис излишен в данном случае, для второго критерия. P.S. strfmt("%1, !%2", wrkgroup, notwrkgroup) это круто ^___^ |
|
03.03.2013, 13:21 | #7 |
Участник
|
Тогда следующая ссылка для вас будет полезной http://axapta.mazzy.ru/lib/search/
|
|