|
15.03.2004, 18:23 | #1 |
Участник
|
Filter
Привет всем!
У меня такой вопрос: на форме имеется display/edit поле. По нему я не могу сделать быстрый фильтр, т.е. при нажатии правой кнопки в меню не появится пункт Фильтр (и понятно!). Вопрос: можно ли как-нибудь программно это реализовать? (Например, добавить в контекстное меню пункт Фильтр и запустить фильтр по соответствующему значению) Спасибо! |
|
06.09.2011, 10:46 | #2 |
Moderator
|
Дык, все ж зависит от relations между таблицами... В вашем проекте этого не видно.
__________________
Андрей. |
|
08.09.2011, 19:50 | #3 |
Участник
|
Не знаю, о какой версии 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 | #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. Причина: добавила вложение |
|
13.09.2011, 16:35 | #5 |
Участник
|
По возможности, я бы избегал связи по Exists Join в данном случае. Как минимум, таблицы IT_InvoiceRegLine и IT_InvoiceRegJour без потери функциональности можно объединить по Inner Join.
Не знаю, можно ли и связку между IT_InvoiceRegLine и CustConfirmTrans также заменить на Inner Join? Думаю, проблема именно в типе связки. Кстати, а сколько получится значений поля CustConfirmTrans.IT_PurchInventTransId для одного значения IT_InvoiceRegJour.Invoice4PaymId? Может быть вместо добавления таблиц просто получить список значений и добавить Range по уже существующей таблице? |
|