筛选查询中的数据

已完成

可通过多种方式在查询生成的数据集中筛选数据,包括:

  • 定义数据项的 DataItemTableFilter 属性

  • 定义列的 ColumnFilter 属性

  • 创建筛选类型的项目

  • OnBeforeOpen 触发器中写入 AL 代码

DataItemTableFilter 属性

可以使用数据项的 DataItemTableFilter 属性,对表的一个或多个字段应用条件以限制查询生成的数据集中的记录。 可以筛选表中的任何字段,而非仅筛选作为列包含在生成的数据集中的字段。 在 DataItemTableFilter 属性中定义的筛选器是静态的;用户或 AL 代码无法替代它们。

query 7345 "Avail Qty. (Base) In QC Bins"
{
    Caption = 'Avail Qty. (Base) In QC Bins';

    elements
    {
        dataitem(Location; Location)
        {
            DataItemTableFilter = "Directed Put-away and Pick" = const(true);
            dataitem(Warehouse_Entry; "Warehouse Entry")
            {
                DataItemLink = "Location Code" = Location.Code;
                SqlJoinType = InnerJoin;
                column(Location_Code; "Location Code")
                {
                }
                ...
                dataitem(Bin_Type; "Bin Type")
                {
                    DataItemLink = Code = Warehouse_Entry."Bin Type Code";
                    SqlJoinType = InnerJoin;
                    DataItemTableFilter = Receive = const(false), 
                                          Ship = const(false), 
                                          Pick = const(false);
                }
            }
        }
    }
}

ColumnFilter 属性

可以使用列的 ColumnFilter 属性,对单个字段应用筛选条件。 ColumnFilter 属性与 DataItemTableFilter 属性相似,但存在一些差异。 与 DataItemTableFilter 属性设置的筛选器不同,对于 ColumnFilter 设置的筛选器,可以从 AL 代码调用 SetFilterSetRange 函数,在运行时将其替代。

如果 ColumnFilter 属性与 DataItemTableFilter 属性在同一字段上指定了筛选器,则将组合这两个属性的筛选器。 要包含在查询数据集中,记录必须满足这两个筛选器的条件。 例如,如果 DataItemTableFilter 属性对字段设置筛选器以包含小于 50 (<50) 的值,并且 ColumnFilter 属性对同一字段设置筛选器以包含大于 20 (>20) 的值,则本字段上的结果筛选器将包含大于二十且小于五十的值。

SetFilterSetRange 函数会覆盖 ColumnFilter 属性对列或筛选行上的同一字段设置的任何筛选器。 如果 SetFilterSetRange 函数与 DataItemTableFilter 属性指定的数据项筛选器筛选同一字段,则函数筛选器和DataItemTableFilter 属性筛选器将合并。

以下代码示例显示了如何在数量(基础) 字段上使用 ColumnFilter 属性。

query 7345 "Avail Qty. (Base) In QC Bins"
{
    Caption = 'Avail Qty. (Base) In QC Bins';

    elements
    {
        dataitem(Location; Location)
        {
            DataItemTableFilter = "Directed Put-away and Pick" = const(true);
            dataitem(Warehouse_Entry; "Warehouse Entry")
            {
                DataItemLink = "Location Code" = Location.Code;
                SqlJoinType = InnerJoin;
                ...
                column(Sum_Qty_Base; "Qty. (Base)")
                {
                    ColumnFilter = Sum_Qty_Base = filter(> 0);
                    Method = Sum;
                }
                ...
            }
        }
    }
}

筛选项目

可以使用筛选项目对字段上生成的数据集启用动态筛选,以排除您不希望包括在查询生成的数据集中的记录。

例如,您可能需要让用户或开发人员筛选日期范围;但您不希望将日期包括在数据集中。 要定义筛选器,请在要添加筛选器的数据项中插入一个新项目。 您可以添加筛选器(而不是添加列),然后从要启用筛选的表中指定字段。

以下代码示例显示了如何将筛选项目用于物料编号款式代码字段。

query 7345 "Avail Qty. (Base) In QC Bins"
{
    Caption = 'Avail Qty. (Base) In QC Bins';

    elements
    {
        dataitem(Location; Location)
        {
            DataItemTableFilter = "Directed Put-away and Pick" = const(true);
            dataitem(Warehouse_Entry; "Warehouse Entry")
            {
                DataItemLink = "Location Code" = Location.Code;
                SqlJoinType = InnerJoin;
                column(Location_Code; "Location Code")
                {
                }
                filter(Item_No; "Item No.")
                {
                }
                filter(Variant_Code; "Variant Code")
                {
                }
                column(Bin_Type_Code; "Bin Type Code")
                {
                }
                ...
            }
        }
    }
}

OnBeforeOpen 触发器

OnBeforeOpen 触发器在其模型转换为 Transact-SQL 语句之前运行,并根据底层 SQL Server 数据库运行。

可以使用 OnBeforeOpen 触发器,通过 SetFilterSetRange AL 函数对查询设置筛选器。 使用 AL 时,只能筛选查询中定义的列或筛选行上的查询。 无法筛选您未作为列或筛选行添加到查询模型的任何数据项的任何其他字段。

以下示例筛选查询以仅包括单位成本不为零的行 (0)。

CurrQuery.SetFilter("Unit_Cost",'<>%1',0);