AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.03.2004, 18:23   #1  
NataLee is offline
NataLee
Участник
Аватар для NataLee
 
20 / 12 (1) ++
Регистрация: 30.09.2003
Адрес: СПб
Filter
Привет всем!

У меня такой вопрос:
на форме имеется display/edit поле. По нему я не могу сделать быстрый фильтр, т.е. при нажатии правой кнопки в меню не появится пункт Фильтр (и понятно!).

Вопрос:
можно ли как-нибудь программно это реализовать?
(Например, добавить в контекстное меню пункт Фильтр и запустить фильтр по соответствующему значению)

Спасибо!
Старый 15.03.2004, 18:52   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
можно.

но если вы таки подумаете какие ресурсы потребуются от сервера для такого поведения, то вы откажетесь от своей затеи
Старый 17.03.2004, 18:06   #3  
Lora is offline
Lora
Участник
 
9 / 10 (1) +
Регистрация: 16.07.2002
Адрес: Kiev
:)
Если необходим поиск по связанному полю(дисплей методу), то это можно реализовать несколько по другому . Не создавать дисплей метод, а просто добавить связанную таблицу в DS по InnerJoin и выводить поле непосредственно из связанного источника. В таком случае работает стандартная фильтрация и поиск по полю.
__________________
Старый 17.03.2004, 18:31   #4  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Но не забудьте, что по inner join можно связывать только в том случае, если поле-foreign key в основной таблице является обязательным к заполнению. Иначе записи с незаполненным полем просто не будут отображаться в этой форме.
__________________
Андрей.
Старый 05.09.2011, 18:11   #5  
jeky is offline
jeky
:o)
Аватар для jeky
 
131 / 64 (3) ++++
Регистрация: 22.05.2008
подскажите, что делаю не так?
нужен фильтр по display-методу
пробовала 2 метода:
1. по кнопке перестроить квери (уже делала подобный вариант - всё прекрасно работает..)
2. присоединить на форму таблицу, которую запрашивает дисплейный метод... что-то не выходит каменный цветок
Вложения
Тип файла: xpo Form_IT_PurchRequestLine.xpo (72.1 Кб, 400 просмотров)
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 06.09.2011, 10:46   #6  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Дык, все ж зависит от relations между таблицами... В вашем проекте этого не видно.
__________________
Андрей.
Старый 06.09.2011, 11:07   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от jeky Посмотреть сообщение
нужен фильтр по display-методу
По дисплейным полям фильтровать нельзя. В частном случае, когда до значения дисплейного поля можно "добраться" через джойн, можно сделать иллюзию фильтрации по дисплейному полю на самом деле примсенив фильтр к соответствующему полю связанной таблицы. Но в таком случае появляется сомнение в необходимости самого дисплей метода, ведь вместо него можно просто отображать то самое поле связанной таблицы и применять к нему фильтр стандартным образом.
Старый 06.09.2011, 15:53   #8  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
По дисплейным полям фильтровать нельзя. В частном случае, когда до значения дисплейного поля можно "добраться" через джойн, можно сделать иллюзию фильтрации по дисплейному полю на самом деле примсенив фильтр к соответствующему полю связанной таблицы. Но в таком случае появляется сомнение в необходимости самого дисплей метода, ведь вместо него можно просто отображать то самое поле связанной таблицы и применять к нему фильтр стандартным образом.
Я так понял, что jeky как раз и хочет заменить дисплей на поле из приджойненной таблицы.
__________________
Андрей.
Старый 08.09.2011, 19:07   #9  
jeky is offline
jeky
:o)
Аватар для jeky
 
131 / 64 (3) ++++
Регистрация: 22.05.2008
да, Андрей, так и есть...
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 08.09.2011, 19:50   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Не знаю, о какой версии Axapta идет речь, но у Вас структура запроса имеет вид

X++:
CustConfirmTrans
|-  InventTable 
|-  CustConfirmJour 
|     |-   RContractTable 
|-  IT_InvoiceRegJour
Все таблицы связаны по Inner Join

При такой структуре подцеплять к таблице CustConfirmTrans еще одну копию таблицы IT_InvoiceRegJour, но уже по Exists Join - это искать себе приключений. Query с подобными структурами плохо работает. Непредсказуемо.

А почему Вы не хотите наложить фильтр на уже существующий DataSource по таблице IT_InvoiceRegJour? Понятно, что будет конфликт, если на это поле пользователь уже наложил фильтр, ну, так объясните, что или то, или другое Можно, конечно, помучиться, пытаясь объединить условия по одному полю по "И", но, как мне кажется, оно того не стоит...

=============

Есть, правда, еще один "корявенький" вариант

Подцепите вторую копию таблицы IT_InvoiceRegJour саму к себе (к существующей IT_InvoiceRegJour) связав по RecId (ну, или по ключу, если он есть). Здесь принципиально важно, чтобы связь была именно по Inner Join. С ней никаких конфликтов не бывает.

В остальном все точно также.
Старый 13.09.2011, 13:02   #11  
jeky is offline
jeky
:o)
Аватар для jeky
 
131 / 64 (3) ++++
Регистрация: 22.05.2008
?
Владимир, спасибо.
Это были попытки.. видимо уже не совсем удачные от замыленности..
На самом деле форма изначльно не имеет этот датасорс, я его убрала и пытаюсь навесить программно.
Навесить фильтр пытаюсь кнопкой, считывая значение дисплэя для 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 код:
SELECT FROM CustConfirmTrans 

JOIN SPIInventProducerId FROM InventTable 
    WHERE CustConfirmTrans
.ItemId InventTable.ItemId 

JOIN 
FROM CustConfirmJour 
    WHERE CustConfirmTrans
.SalesId CustConfirmJour.SalesId 
    
AND CustConfirmTrans.ConfirmId CustConfirmJour.ConfirmId 
    
AND CustConfirmTrans.ConfirmDate CustConfirmJour.ConfirmDate 

JOIN 
FROM RContractTable 
    WHERE CustConfirmJour
.InvoiceAccount RContractTable.RContractPartnerCode 
    
AND CustConfirmJour.IT_RContractCode RContractTable.RContractCode 
    
AND CustConfirmJour.IT_RContractAccount RContractTable.RContractAccount 
    
AND ((RContractPartnerType 0)) 
текст запроса после наложения фильтра:
PHP код:
SELECT FROM CustConfirmTrans 
JOIN SPIInventProducerId FROM InventTable 
    WHERE CustConfirmTrans
.ItemId InventTable.ItemId 
JOIN 
FROM CustConfirmJour 
    WHERE CustConfirmTrans
.SalesId CustConfirmJour.SalesId 
    
AND CustConfirmTrans.ConfirmId CustConfirmJour.ConfirmId 
    
AND CustConfirmTrans.ConfirmDate CustConfirmJour.ConfirmDate 
JOIN 
FROM RContractTable 
    WHERE CustConfirmJour
.InvoiceAccount RContractTable.RContractPartnerCode 
    
AND CustConfirmJour.IT_RContractCode RContractTable.RContractCode 
    
AND CustConfirmJour.IT_RContractAccount RContractTable.RContractAccount 
    
AND ((RContractPartnerType 0)) 
EXISTS JOIN FROM IT_InvoiceRegLine 
    WHERE CustConfirmTrans
.IT_PurchInventTransId IT_InvoiceRegLine.InventTransId 
EXISTS JOIN 
FROM IT_InvoiceRegJour 
    WHERE IT_InvoiceRegLine
.InvoiceRegId IT_InvoiceRegJour.InvoiceRegId 
    
AND ((Invoice4PaymId N'drgd')) 
аналайзер нет возможности использовать..
код моего проверочного джоба (правильно отфильтровывает):
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));
}
upd: вложила форму
Вложения
Тип файла: xpo Form_IT_PurchRequestLine130911.xpo (75.3 Кб, 375 просмотров)
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.

Последний раз редактировалось jeky; 13.09.2011 в 13:55. Причина: добавила вложение
Старый 13.09.2011, 16:35   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
По возможности, я бы избегал связи по Exists Join в данном случае. Как минимум, таблицы IT_InvoiceRegLine и IT_InvoiceRegJour без потери функциональности можно объединить по Inner Join.

Не знаю, можно ли и связку между IT_InvoiceRegLine и CustConfirmTrans также заменить на Inner Join? Думаю, проблема именно в типе связки.

Кстати, а сколько получится значений поля CustConfirmTrans.IT_PurchInventTransId для одного значения IT_InvoiceRegJour.Invoice4PaymId? Может быть вместо добавления таблиц просто получить список значений и добавить Range по уже существующей таблице?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Filter-by-Grid Blog bot DAX Blogs 2 30.05.2012 13:39
Solutions Monkey: Always keep the Filter section expanded in AxGridView Blog bot DAX Blogs 0 03.04.2009 08:05
Kashperuk Ivan: Hotkeys and Find vs Filter in Dynamics AX 2009 Blog bot DAX Blogs 2 11.03.2008 12:06
Dynamics AX: DAX 4.0 Filter by Grid [Update] Blog bot DAX Blogs 0 27.04.2007 17:10
filter on a form - how? paucer DAX: Функционал 1 25.03.2004 13:20
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:37.