![]() |
#1 |
Участник
|
Filter
Привет всем!
У меня такой вопрос: на форме имеется display/edit поле. По нему я не могу сделать быстрый фильтр, т.е. при нажатии правой кнопки в меню не появится пункт Фильтр (и понятно!). Вопрос: можно ли как-нибудь программно это реализовать? (Например, добавить в контекстное меню пункт Фильтр и запустить фильтр по соответствующему значению) Спасибо! |
|
![]() |
#2 |
Участник
|
можно.
но если вы таки подумаете какие ресурсы потребуются от сервера для такого поведения, то вы откажетесь от своей затеи ![]() |
|
![]() |
#3 |
Участник
|
![]()
Если необходим поиск по связанному полю(дисплей методу), то это можно реализовать несколько по другому . Не создавать дисплей метод, а просто добавить связанную таблицу в DS по InnerJoin и выводить поле непосредственно из связанного источника. В таком случае работает стандартная фильтрация и поиск по полю.
![]()
__________________
![]() |
|
![]() |
#4 |
Moderator
|
Но не забудьте, что по inner join можно связывать только в том случае, если поле-foreign key в основной таблице является обязательным к заполнению. Иначе записи с незаполненным полем просто не будут отображаться в этой форме.
__________________
Андрей. |
|
![]() |
#5 |
:o)
|
подскажите, что делаю не так?
нужен фильтр по display-методу пробовала 2 метода: 1. по кнопке перестроить квери (уже делала подобный вариант - всё прекрасно работает..) 2. присоединить на форму таблицу, которую запрашивает дисплейный метод... что-то не выходит каменный цветок ![]()
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов. |
|
![]() |
#6 |
Moderator
|
Дык, все ж зависит от relations между таблицами... В вашем проекте этого не видно.
__________________
Андрей. |
|
![]() |
#7 |
Участник
|
По дисплейным полям фильтровать нельзя. В частном случае, когда до значения дисплейного поля можно "добраться" через джойн, можно сделать иллюзию фильтрации по дисплейному полю на самом деле примсенив фильтр к соответствующему полю связанной таблицы. Но в таком случае появляется сомнение в необходимости самого дисплей метода, ведь вместо него можно просто отображать то самое поле связанной таблицы и применять к нему фильтр стандартным образом.
|
|
![]() |
#8 |
Moderator
|
Цитата:
Сообщение от S.Kuskov
![]() По дисплейным полям фильтровать нельзя. В частном случае, когда до значения дисплейного поля можно "добраться" через джойн, можно сделать иллюзию фильтрации по дисплейному полю на самом деле примсенив фильтр к соответствующему полю связанной таблицы. Но в таком случае появляется сомнение в необходимости самого дисплей метода, ведь вместо него можно просто отображать то самое поле связанной таблицы и применять к нему фильтр стандартным образом.
__________________
Андрей. |
|
![]() |
#9 |
:o)
|
да, Андрей, так и есть...
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов. |
|
![]() |
#10 |
Участник
|
Не знаю, о какой версии Axapta идет речь, но у Вас структура запроса имеет вид
X++: CustConfirmTrans |- InventTable |- CustConfirmJour | |- RContractTable |- IT_InvoiceRegJour При такой структуре подцеплять к таблице CustConfirmTrans еще одну копию таблицы IT_InvoiceRegJour, но уже по Exists Join - это искать себе приключений. ![]() А почему Вы не хотите наложить фильтр на уже существующий DataSource по таблице IT_InvoiceRegJour? Понятно, что будет конфликт, если на это поле пользователь уже наложил фильтр, ну, так объясните, что или то, или другое ![]() ============= Есть, правда, еще один "корявенький" вариант Подцепите вторую копию таблицы IT_InvoiceRegJour саму к себе (к существующей IT_InvoiceRegJour) связав по RecId (ну, или по ключу, если он есть). Здесь принципиально важно, чтобы связь была именно по Inner Join. С ней никаких конфликтов не бывает. В остальном все точно также. |
|
![]() |
#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. Причина: добавила вложение |
|
![]() |
#12 |
Участник
|
По возможности, я бы избегал связи по Exists Join в данном случае. Как минимум, таблицы IT_InvoiceRegLine и IT_InvoiceRegJour без потери функциональности можно объединить по Inner Join.
Не знаю, можно ли и связку между IT_InvoiceRegLine и CustConfirmTrans также заменить на Inner Join? Думаю, проблема именно в типе связки. Кстати, а сколько получится значений поля CustConfirmTrans.IT_PurchInventTransId для одного значения IT_InvoiceRegJour.Invoice4PaymId? Может быть вместо добавления таблиц просто получить список значений и добавить Range по уже существующей таблице? |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|