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