![]() |
#1 |
Участник
|
Поиск в Grid по полю DataMethod
В форме "Строки", которая вызывается из формы "* приказы" нужно сделать поиск по полю "Фамилия Имя Отчество". Поле заполняется через метод emplName таблицы RHRMOrderTrans. Т.е. стандартные поиск и фильтрация по нему не работают. В ТЗ написали, чтобы поиск был через отдельный EditText форме. (Что-то типа поиска по подразделению в штатном расписании) Но как его связать с полем "ФИО"?
|
|
![]() |
#2 |
Участник
|
При изменении добавлять в RHRMOrderTrans_ds.query exist join на EmplTable.
Если надо снять фильтр, то восстнавливать изначальный query предварительно запакованный (правда при попытке паковки чего-то с дайналинками вываливается ошибка). Если вы точно знаете что в EmplID всегда есть значение, то второй пункт пропустить. |
|
![]() |
#3 |
Участник
|
Что такое RHRMOrderTrans_ds.query ?
|
|
![]() |
#4 |
Участник
|
Цитата:
Цитата:
public container pack( [boolean _doCheck=TRUE] )
Arguments doCheck : If this argument is TRUE, an error is flagged when a datasource in the query has references to an outside cursor (i.e. a dynalink was added to the datasource). The default value is TRUE (i.e. enforce the constraint). Кроме того, надо изменять запрос в QueryRun - тогда сброс фильтра будет стандартный
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: belugin (5). |
![]() |
#5 |
Участник
|
xxx_ds - это FormDataSource на форме. query - это фильтр в этом источнике данных. Вернее query() т.к. это свойство.
то есть если вы хотите обратиться к \Forms\RHRMOrderTrans\Data Sources\RHRMOrderTrans из программы внутри этой вформы надо вызывать RHRMOrderTrans_ds - это объект, представляющий источник данных. |
|
![]() |
#6 |
Участник
|
Цитата:
Кроме того, надо изменять запрос в QueryRun - тогда сброс фильтра будет стандартный
|
|
![]() |
#7 |
Участник
|
Да мне не нужны изменения
![]() |
|
![]() |
#8 |
Участник
|
В data source нет поля emplName, кстати... Только emplid. А emplName подтягивается из EmplTable. Поэтому мне нет смысла обращаться к этому датасорсу.
Вижу только как такой вариант: Пользователь вводит фамилию, я из таблицы EmplTable выискиваю его Таб№ и потом по нему делаю фильтр на датасоурс. Это же через Ж... !!! |
|
![]() |
#9 |
Участник
|
Цитата:
Только в стандарте этого не делают (взять, хотя бы, складские журналы - фильтр разнесенным жунралам) ![]()
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#10 |
Участник
|
Предлагается при изменении поля-фильтра добавить динамически другой датаурс (причем QueryBuildDataSource а не FormDataSource), связанный с первым.
|
|
![]() |
#11 |
Участник
|
Объясните, плз, что означает сей код:
X++: for (i = 1 ; i <= RHRMStaffList_DS.query().dataSourceCount() ; i++) { switch (RHRMStaffList_DS.query().dataSourceNo(i).table()) { case tableNum(RHRMStaffList): dsStaff = i; break; case tableNum(PersonTitleTable): dsTitle = i; break; case tableNum(RPayHRMOrganization): dsOrg = i; break; } } |
|
![]() |
#12 |
Участник
|
dsStaff, dsTitle, dsOrg переменные типа int.
|
|
![]() |
#13 |
SAP
|
В этом коде перебираются все источники данных этого запроса и в зависимости от того какая это таблица int переменным присваевается значения, скорей всего для того что бы в дальнейшем обращатся к источнику данных по номеру
|
|
![]() |
#14 |
Участник
|
Вопрос номер 1: как в дебагере посмотреть содержимое таблицы. А то я только одну запись вижу и толку мне от нее? Или хотя бы сколько в ней записей на данный момент?
Вопрос номер 2: как бегать по джоиной таблице? Пыталась: X++: while (emplTable.RecId) { filter_str += ','+emplTable.emplId; next emplTable; } |
|
![]() |
#15 |
Участник
|
1. В отладчике - никак.
2. Бегайте по первому (ведущему) датасорсу - остальные синхронизируются автоматом
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#16 |
Участник
|
Объясните, плиз, что должно происходить (и происходит ли вообще что-нибудь) в этом коде:
X++: s2 = FindEdit.valueStr();
emplTable_ds.filter(fieldnum(EmplTable, lastName), s2);
et = emplTable_ds.getFirst(1); et - типа EmplTable. |
|
![]() |
#17 |
Участник
|
Если emplTable_ds - подчиненный датасорс, то при вызове emplTable_ds.filter() ничего не произойдет. Для фильтрации по этому полю надо дополнительно вызвать [Имя главного датасорса]_ds.research().
Для строки X++: et = emplTable_ds.getFirst(1);
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#18 |
Участник
|
Тогда скажите, как сделать такой алгоритм.
У датасорса RHRMOrderTrans есть InnerJoin EmplTable (он тоже датасоурс). Мне нужно сделать выборку EmplId из таблицы EmplTable по введенной в строке поиска фамилии (т.е. фильтр по полю LastName) и потом этими выбранными EmplId отфильтровать RHRMOrderTrans_ds. Как это сделать через датасоурсы? Я пока сделала через обращение к самой таблице EmplTable, в которой по введенной фамилии выбираются подходящие EmplId. Из них делаю стринговую переменную (перечеслением через ',') и потом использую эту переменную как фильтр для RHRMOrderTrans_ds. Но если какой-то умный пользватель введет только первую букву, то будет куча фамилий, соответственно куча таб.номеров и стринг обрежется (у него же есть ограничение по длинне 255 символов?), в общем не все таб.номера влезут и могут некоторые фамилии потеряться. |
|
![]() |
#19 |
Участник
|
почему вы не слушаете советы?
Вам же сказали, сделайте exists join EmplTable в случае, если введен фильтр, и накладывайте фильтр на поле этого нового источника на соответствующее поле (ФИО) |
|
![]() |
#20 |
Участник
|
О, по одной простой причине: сделать нужно вчера (как всегда), а я ничего не понимаю из написанного, а разбираться времени не было. Сейчас появилось, попробую разобраться.
|
|