添加表单过滤器

时间:2014-03-06 15:34:35

标签: forms filter axapta microsoft-dynamics

我目前正在使用Microsoft Dynamics AX中的表单。 表单由一个网格组成,网格包含来自4个不同表格的大约10个字段。 由于表格现在它返回太多的值所以我需要包含某种过滤器,它不需要是动态的,只是一个静态过滤器,只表示在Y列中显示值为X的行。

这里有没有人有这方面的经验?我从哪里开始?

我必须说我根本没有使用过Microsof AX的经验,我已经使用了大约一个月了。

我试图遵循本指南:How to: Add Filter Controls to a Simple List Form [AX 2012] 但是我被困在第二部分(将控件添加到自定义过滤器组)第2步:我不知道选择哪种类型的控件,我选择让我说一个ComboBox我不能让第3步工作,因为我不看他们提到的'覆盖方法'。

1 个答案:

答案 0 :(得分:1)

嗯,我通常这样做:

  • 在ClassDeclaration中,创建尽可能多的QueryBuildRanges变量作为要过滤的字段。让我们将它们命名为Criteria1,Criteria2等(请将它们正确命名,请在此处注明)

    QueryBuildRange criteria1, criteria2;
    
  • 在每个数据源中,您需要过滤,覆盖方法Init,添加类似于此的代码:

    super();
    criteria1 = this.query().datasource(tablenum(tableofdatasource)).addQueryRange(fieldNum(fieldtofilter))
    //criteria1.status(RangeStatus::locked); //optional - this way you can hide filter field to user, have it readonly for users, etc
    
  • 在表单中创建StringEdit或ListBox类型的控件以用作过滤器。将其AutoDeclaration属性更改为是。覆盖modified()方法。在其中,我使用类似的东西:

    super();
    element.changeFilters();
    
  • 在表单中,添加方法changeFilters();

    range rangeFromStringControl = StringEditControlName.text(); //Put in rangeFromStringControl the string to be used as filter, as a user would write it
    range rangeFromListBoxControl;
    criteria1.value(rangeFromStringControl);
    
    switch (listBoxControl.Selection())
    {
        case NoYesAll::All:
            rangeFromListBoxControl = ''; //Empty filter string - No filter at all
            break;
        case NoYesAll::No:
            rangeFromListBoxControl = QueryValue(NoYes::No); //Or whatever string filter value you want
            break;
        //Etc
    }
    
    //We have all filter strs done; let's filter for each main DataSource required with new filters
    DataSource1.executeQuery(); 
    //If there is other datasources joined to this one, it's usually no necessary to call their executeQuery;
    //If there are others with filters and not joined to it, call their executeQuery()
    
  • 如果您需要在窗体打开时应用此过滤器,请将适当的初始值设置为控件,然后在窗体的run()方法中设置:

    run();
    element.changeFilters();