08.05.2007, 08:13 | #1 |
Участник
|
Поиск в Grid по полю DataMethod
В форме "Строки", которая вызывается из формы "* приказы" нужно сделать поиск по полю "Фамилия Имя Отчество". Поле заполняется через метод emplName таблицы RHRMOrderTrans. Т.е. стандартные поиск и фильтрация по нему не работают. В ТЗ написали, чтобы поиск был через отдельный EditText форме. (Что-то типа поиска по подразделению в штатном расписании) Но как его связать с полем "ФИО"?
|
|
08.05.2007, 08:51 | #2 |
Участник
|
При изменении добавлять в RHRMOrderTrans_ds.query exist join на EmplTable.
Если надо снять фильтр, то восстнавливать изначальный query предварительно запакованный (правда при попытке паковки чего-то с дайналинками вываливается ошибка). Если вы точно знаете что в EmplID всегда есть значение, то второй пункт пропустить. |
|
08.05.2007, 09:44 | #3 |
Участник
|
Что такое RHRMOrderTrans_ds.query ?
|
|
08.05.2007, 10:06 | #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). |
08.05.2007, 10:07 | #5 |
Участник
|
xxx_ds - это FormDataSource на форме. query - это фильтр в этом источнике данных. Вернее query() т.к. это свойство.
то есть если вы хотите обратиться к \Forms\RHRMOrderTrans\Data Sources\RHRMOrderTrans из программы внутри этой вформы надо вызывать RHRMOrderTrans_ds - это объект, представляющий источник данных. |
|
08.05.2007, 10:08 | #6 |
Участник
|
Цитата:
Кроме того, надо изменять запрос в QueryRun - тогда сброс фильтра будет стандартный
|
|
08.05.2007, 10:19 | #7 |
Участник
|
Да мне не нужны изменения мне бы только голимый поиск по этому полю... Понимаете, в чем проблема, они пишут, что у них в приказе может быть до 1500 человек и искать им в этом списке в лом (а станартного поиска по этому полю нету). По таб.номеру искать они скорее всего не хотят. Вот и все. Никаких изменений. Или изменения в выводе грида? Про какие изменения говорим-то?
|
|
08.05.2007, 10:24 | #8 |
Участник
|
В data source нет поля emplName, кстати... Только emplid. А emplName подтягивается из EmplTable. Поэтому мне нет смысла обращаться к этому датасорсу.
Вижу только как такой вариант: Пользователь вводит фамилию, я из таблицы EmplTable выискиваю его Таб№ и потом по нему делаю фильтр на датасоурс. Это же через Ж... !!! |
|
08.05.2007, 10:30 | #9 |
Участник
|
Цитата:
Только в стандарте этого не делают (взять, хотя бы, складские журналы - фильтр разнесенным жунралам)
__________________
Axapta v.3.0 sp5 kr2 |
|
08.05.2007, 12:15 | #10 |
Участник
|
Предлагается при изменении поля-фильтра добавить динамически другой датаурс (причем QueryBuildDataSource а не FormDataSource), связанный с первым.
|
|
08.05.2007, 13:20 | #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; } } |
|
08.05.2007, 13:24 | #12 |
Участник
|
dsStaff, dsTitle, dsOrg переменные типа int.
|
|
08.05.2007, 14:16 | #13 |
SAP
|
В этом коде перебираются все источники данных этого запроса и в зависимости от того какая это таблица int переменным присваевается значения, скорей всего для того что бы в дальнейшем обращатся к источнику данных по номеру
|
|
10.05.2007, 09:27 | #14 |
Участник
|
Вопрос номер 1: как в дебагере посмотреть содержимое таблицы. А то я только одну запись вижу и толку мне от нее? Или хотя бы сколько в ней записей на данный момент?
Вопрос номер 2: как бегать по джоиной таблице? Пыталась: X++: while (emplTable.RecId) { filter_str += ','+emplTable.emplId; next emplTable; } |
|
10.05.2007, 09:39 | #15 |
Участник
|
1. В отладчике - никак.
2. Бегайте по первому (ведущему) датасорсу - остальные синхронизируются автоматом
__________________
Axapta v.3.0 sp5 kr2 |
|
10.05.2007, 10:02 | #16 |
Участник
|
Объясните, плиз, что должно происходить (и происходит ли вообще что-нибудь) в этом коде:
X++: s2 = FindEdit.valueStr();
emplTable_ds.filter(fieldnum(EmplTable, lastName), s2);
et = emplTable_ds.getFirst(1); et - типа EmplTable. |
|
10.05.2007, 11:36 | #17 |
Участник
|
Если emplTable_ds - подчиненный датасорс, то при вызове emplTable_ds.filter() ничего не произойдет. Для фильтрации по этому полю надо дополнительно вызвать [Имя главного датасорса]_ds.research().
Для строки X++: et = emplTable_ds.getFirst(1);
__________________
Axapta v.3.0 sp5 kr2 |
|
10.05.2007, 13:44 | #18 |
Участник
|
Тогда скажите, как сделать такой алгоритм.
У датасорса RHRMOrderTrans есть InnerJoin EmplTable (он тоже датасоурс). Мне нужно сделать выборку EmplId из таблицы EmplTable по введенной в строке поиска фамилии (т.е. фильтр по полю LastName) и потом этими выбранными EmplId отфильтровать RHRMOrderTrans_ds. Как это сделать через датасоурсы? Я пока сделала через обращение к самой таблице EmplTable, в которой по введенной фамилии выбираются подходящие EmplId. Из них делаю стринговую переменную (перечеслением через ',') и потом использую эту переменную как фильтр для RHRMOrderTrans_ds. Но если какой-то умный пользватель введет только первую букву, то будет куча фамилий, соответственно куча таб.номеров и стринг обрежется (у него же есть ограничение по длинне 255 символов?), в общем не все таб.номера влезут и могут некоторые фамилии потеряться. |
|
10.05.2007, 13:51 | #19 |
Участник
|
почему вы не слушаете советы?
Вам же сказали, сделайте exists join EmplTable в случае, если введен фильтр, и накладывайте фильтр на поле этого нового источника на соответствующее поле (ФИО) |
|
10.05.2007, 14:28 | #20 |
Участник
|
О, по одной простой причине: сделать нужно вчера (как всегда), а я ничего не понимаю из написанного, а разбираться времени не было. Сейчас появилось, попробую разобраться.
|
|