15.03.2004, 18:23 | #1 |
Участник
|
Filter
Привет всем!
У меня такой вопрос: на форме имеется display/edit поле. По нему я не могу сделать быстрый фильтр, т.е. при нажатии правой кнопки в меню не появится пункт Фильтр (и понятно!). Вопрос: можно ли как-нибудь программно это реализовать? (Например, добавить в контекстное меню пункт Фильтр и запустить фильтр по соответствующему значению) Спасибо! |
|
15.03.2004, 18:52 | #2 |
Участник
|
можно.
но если вы таки подумаете какие ресурсы потребуются от сервера для такого поведения, то вы откажетесь от своей затеи |
|
17.03.2004, 18:06 | #3 |
Участник
|
Если необходим поиск по связанному полю(дисплей методу), то это можно реализовать несколько по другому . Не создавать дисплей метод, а просто добавить связанную таблицу в DS по InnerJoin и выводить поле непосредственно из связанного источника. В таком случае работает стандартная фильтрация и поиск по полю.
__________________
|
|
17.03.2004, 18:31 | #4 |
Moderator
|
Но не забудьте, что по inner join можно связывать только в том случае, если поле-foreign key в основной таблице является обязательным к заполнению. Иначе записи с незаполненным полем просто не будут отображаться в этой форме.
__________________
Андрей. |
|
05.09.2011, 18:11 | #5 |
:o)
|
подскажите, что делаю не так?
нужен фильтр по display-методу пробовала 2 метода: 1. по кнопке перестроить квери (уже делала подобный вариант - всё прекрасно работает..) 2. присоединить на форму таблицу, которую запрашивает дисплейный метод... что-то не выходит каменный цветок
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов. |
|
06.09.2011, 10:46 | #6 |
Moderator
|
Дык, все ж зависит от relations между таблицами... В вашем проекте этого не видно.
__________________
Андрей. |
|
06.09.2011, 11:07 | #7 |
Участник
|
По дисплейным полям фильтровать нельзя. В частном случае, когда до значения дисплейного поля можно "добраться" через джойн, можно сделать иллюзию фильтрации по дисплейному полю на самом деле примсенив фильтр к соответствующему полю связанной таблицы. Но в таком случае появляется сомнение в необходимости самого дисплей метода, ведь вместо него можно просто отображать то самое поле связанной таблицы и применять к нему фильтр стандартным образом.
|
|
06.09.2011, 15:53 | #8 |
Moderator
|
Цитата:
Сообщение от S.Kuskov
По дисплейным полям фильтровать нельзя. В частном случае, когда до значения дисплейного поля можно "добраться" через джойн, можно сделать иллюзию фильтрации по дисплейному полю на самом деле примсенив фильтр к соответствующему полю связанной таблицы. Но в таком случае появляется сомнение в необходимости самого дисплей метода, ведь вместо него можно просто отображать то самое поле связанной таблицы и применять к нему фильтр стандартным образом.
__________________
Андрей. |
|
08.09.2011, 19:07 | #9 |
:o)
|
да, Андрей, так и есть...
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов. |
|
08.09.2011, 19:50 | #10 |
Участник
|
Не знаю, о какой версии Axapta идет речь, но у Вас структура запроса имеет вид
X++: CustConfirmTrans |- InventTable |- CustConfirmJour | |- RContractTable |- IT_InvoiceRegJour При такой структуре подцеплять к таблице CustConfirmTrans еще одну копию таблицы IT_InvoiceRegJour, но уже по Exists Join - это искать себе приключений. Query с подобными структурами плохо работает. Непредсказуемо. А почему Вы не хотите наложить фильтр на уже существующий DataSource по таблице IT_InvoiceRegJour? Понятно, что будет конфликт, если на это поле пользователь уже наложил фильтр, ну, так объясните, что или то, или другое Можно, конечно, помучиться, пытаясь объединить условия по одному полю по "И", но, как мне кажется, оно того не стоит... ============= Есть, правда, еще один "корявенький" вариант Подцепите вторую копию таблицы IT_InvoiceRegJour саму к себе (к существующей IT_InvoiceRegJour) связав по RecId (ну, или по ключу, если он есть). Здесь принципиально важно, чтобы связь была именно по Inner Join. С ней никаких конфликтов не бывает. В остальном все точно также. |
|
13.09.2011, 13:02 | #11 |
:o)
|
Владимир, спасибо.
Это были попытки.. видимо уже не совсем удачные от замыленности.. На самом деле форма изначльно не имеет этот датасорс, я его убрала и пытаюсь навесить программно. Навесить фильтр пытаюсь кнопкой, считывая значение дисплэя для range Суть проблемы, что в гриде остаются строки не отфильтрованные Написала джоб, который интерпретирует запрос кверика, вывела строки в инфолог - все как надо, - остаются только строки, которые нужны по фильтру... Аналайзер и студия не доступны для использования код кнопки: X++: void clicked() { str strSetText = 'PC.Номер счета поставщика'; str strUnSetText = 'Снять "PC.Номер счета поставщика"'; IT_VendInvoice4PaymId invoice4PaymId; ; invoice4PaymId = custConfirmTrans.IT_invoice4PaymFromInvoiceReg(); super(); info(invoice4PaymId); if(!bInvoice4PaymFromInvoiceRegFilterSet) { if (!Invoice4PaymFromInvoiceRegFilter) element.setInvoice4PaymFromInvoiceRegFilter(); Invoice4PaymFromInvoiceRegFilter.value(SysQuery::value(invoice4PaymId)); custConfirmTrans_ds.query().recordLevelSecurity(false); bInvoice4PaymFromInvoiceRegFilterSet = true; Invoice4PaymFromInvoiceReg.text(strUnSetText); } else { Invoice4PaymFromInvoiceRegFilter.value(SysQuery::valueUnlimited()); custConfirmTrans_ds.query().recordLevelSecurity(true); bInvoice4PaymFromInvoiceRegFilterSet = false; Invoice4PaymFromInvoiceReg.text(strSetText); } custConfirmTrans_ds.executeQuery(); // custConfirmTrans_ds.first(); // while (custConfirmTrans_ds.next()) // { // info (custConfirmTrans.IT_invoice4PaymFromInvoiceReg()); // } } X++: void setInvoice4PaymFromInvoiceRegFilter() { QueryBuildDataSource queryCustConfirmTrans; QueryBuildDataSource queryInvoiceRegLine; QueryBuildDataSource queryInvoiceReg; Query q = new Query(custConfirmTrans_ds.queryRun().query()); QueryRun queryRun; ; queryCustConfirmTrans = q.dataSourceTable(tablenum(custConfirmTrans)); q.dataSourceTable(tablenum(custConfirmTrans)).fetchMode(QueryFetchMode::One2One); q.dataSourceTable(tablenum(InventTable)).fetchMode(QueryFetchMode::One2One); q.dataSourceTable(tablenum(CustConfirmJour)).fetchMode(QueryFetchMode::One2One); q.dataSourceTable(tablenum(RContractTable)).fetchMode(QueryFetchMode::One2One); queryInvoiceRegLine = queryCustConfirmTrans.addDataSource(tablenum(IT_InvoiceRegLine)); queryInvoiceRegLine.fetchMode(QueryFetchMode::One2One); queryInvoiceRegLine.addLink(fieldnum(custConfirmTrans, IT_PurchInventTransId), fieldnum(IT_InvoiceRegLine, InventTransId)); queryInvoiceRegLine.joinMode(joinMode::ExistsJoin); queryInvoiceReg = queryInvoiceRegLine.addDataSource(tablenum(IT_InvoiceRegJour)); queryInvoiceReg.fetchMode(QueryFetchMode::One2One); queryInvoiceReg.addLink(fieldnum(IT_InvoiceRegLine, InvoiceRegId), fieldnum(IT_InvoiceRegJour, InvoiceRegId)); queryInvoiceReg.joinMode(joinMode::ExistsJoin); // queryInvoiceReg = queryCustConfirmTrans.addDataSource(tablenum(IT_InvoiceRegJour)); // queryInvoiceReg.fetchMode(QueryFetchMode::One2One); // queryInvoiceReg.addLink(fieldnum(custConfirmTrans, IT_PurchId), fieldnum(IT_InvoiceRegJour, PurchId)); // queryInvoiceReg.joinMode(joinMode::ExistsJoin); Invoice4PaymFromInvoiceRegFilter = queryInvoiceReg.addRange(fieldNum(IT_InvoiceRegJour, Invoice4PaymId)); // queryRun = new QueryRun(q); // // custConfirmTrans_ds.queryRun(queryRun); custConfirmTrans_ds.query(q); } PHP код:
PHP код:
код моего проверочного джоба (правильно отфильтровывает): X++: static void Job338(Args _args) { custConfirmTrans custConfirmTrans; InventTable InventTable; CustConfirmJour CustConfirmJour; RContractTable RContractTable; IT_InvoiceRegLine IT_InvoiceRegLine; IT_InvoiceRegJour IT_InvoiceRegJour; ; while SELECT CustConfirmTrans JOIN SPIInventProducerId FROM InventTable WHERE CustConfirmTrans.ItemId == InventTable.ItemId JOIN CustConfirmJour WHERE CustConfirmTrans.SalesId == CustConfirmJour.SalesId && CustConfirmTrans.ConfirmId == CustConfirmJour.ConfirmId && CustConfirmTrans.ConfirmDate == CustConfirmJour.ConfirmDate JOIN RContractTable WHERE CustConfirmJour.InvoiceAccount == RContractTable.RContractPartnerCode && CustConfirmJour.IT_RContractCode == RContractTable.RContractCode && CustConfirmJour.IT_RContractAccount == RContractTable.RContractAccount && ((RContractTable.RContractPartnerType == 0)) EXISTS JOIN IT_InvoiceRegLine WHERE CustConfirmTrans.IT_PurchInventTransId == IT_InvoiceRegLine.InventTransId EXISTS JOIN IT_InvoiceRegJour WHERE IT_InvoiceRegLine.InvoiceRegId == IT_InvoiceRegJour.InvoiceRegId && ((IT_InvoiceRegJour.Invoice4PaymId == 'drgd')) { info (custConfirmTrans.IT_invoice4PaymFromInvoiceReg()); } // select count(RecId) from custConfirmTrans; // info(strfmt('итого %1', custConfirmTrans.RecId)); }
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов. Последний раз редактировалось jeky; 13.09.2011 в 13:55. Причина: добавила вложение |
|
13.09.2011, 16:35 | #12 |
Участник
|
По возможности, я бы избегал связи по Exists Join в данном случае. Как минимум, таблицы IT_InvoiceRegLine и IT_InvoiceRegJour без потери функциональности можно объединить по Inner Join.
Не знаю, можно ли и связку между IT_InvoiceRegLine и CustConfirmTrans также заменить на Inner Join? Думаю, проблема именно в типе связки. Кстати, а сколько получится значений поля CustConfirmTrans.IT_PurchInventTransId для одного значения IT_InvoiceRegJour.Invoice4PaymId? Может быть вместо добавления таблиц просто получить список значений и добавить Range по уже существующей таблице? |
|