如何在数据视图委托

时间:2015-12-28 17:21:39

标签: acumatica

我有一个自定义处理屏幕,其中包含一个为用户提供的下拉框。下拉列表用于提供数据视图委托中使用的排序顺序。我选择数据视图委托的原因是查询完全取决于所选的排序顺序。根据选择,查询必须排序结果以及其他逻辑,然后将结果集发布到网格。我使用switch语句来评估下拉列表中选择的选择。目前,结果集返回查询的结果。但排序顺序基于声明的数据视图。我的order by子句在switch语句中没有被使用。我相信默认情况下,排序顺序基于定义数据视图中的键。如何动态重新排序查询结果?

switch (filter.ProcessOrder)
            {
                //new[] { "O", "P", "R", "B" },
                //new[] { "By Order Date", "By Order Priority", "By Request Date", "By Backorder Only" }

                case "O":
                foreach (PXResult<SOOrder, SOOrderShipment> res in PXSelectJoin<SOOrder,LeftJoin<SOOrderShipment, On<SOOrder.orderNbr, Equal<SOOrderShipment.orderNbr>, And<SOOrder.orderType, Equal<SOOrderShipment.orderType>>>>,
                    Where<SOOrderShipment.shipmentNbr, IsNull, And<SOOrder.orderType, Equal<OrderTypes.salesOrder>>>,
                    OrderBy<Desc<SOOrder.orderDate>>>.Select(this))
                    {
                        SOOrder order = (SOOrder)res;
                        SOOrderShipment oShip = (SOOrderShipment)res;
                        //ASSIGN VALUES OR EXCLUDE FRON RESULTSET BASED ON CRITERIA TO BE DEFINED
                        yield return new PXResult<SOOrder, SOOrderShipment>(order, oShip);
                    }
                    break;

2 个答案:

答案 0 :(得分:1)

视图委托返回的结果列表始终根据视图选择中指定的条件进行排序。正如您所猜测的那样,如果您未在select中指定任何排序条件,则结果将按键排序。

然而,有一种默认方法可以解决这个问题。您可以使用代理中OrderByNewPXSelectBase的{​​{1}}方法更改视图所需的排序条件,如下所示:

PXView

使用上面的子句但在不同的public PXSelect<SOOrder> Orders; public virtual IEnumerable orders() { switch(filter.ProcessOrder) { case "O": // by Order Date foreach (PXResult<SOOrder, SOOrderShipment> res in PXSelectJoin<SOOrder,LeftJoin<SOOrderShipment, On<SOOrder.orderNbr, Equal<SOOrderShipment.orderNbr>, And<SOOrder.orderType, Equal<SOOrderShipment.orderType>>>>, Where<SOOrderShipment.shipmentNbr, IsNull, And<SOOrder.orderType, Equal<OrderTypes.salesOrder>>>, OrderBy<Desc<SOOrder.orderDate>>>.Select(this)) { SOOrder order = (SOOrder)res; SOOrderShipment oShip = (SOOrderShipment)res; //ASSIGN VALUES OR EXCLUDE FRON RESULTSET BASED ON CRITERIA TO BE DEFINED yield return new PXResult<SOOrder, SOOrderShipment>(order, oShip); } // !!! Orders.OrderByNew<SOOrder.OrderDate>(); // !!! break; // Other cases } } 中使用不同的字段,您可以获得所需的结果。

答案 1 :(得分:0)

我有一个类似的案例,

我做的是,添加了一个名为SortOrder的新的未绑定的int列,我手动对结果进行排序并从委托中返回。

#region SortOrder
        public abstract class sortOrder : PX.Data.IBqlField
        {
        }
        protected Int32? _SortOrder;
        [PXDefault(TypeCode.Int32, "5")]
        [PXInt()]
        public virtual Int32? SortOrder
        {
            get
            {
                return this._SortOrder;
            }
            set
            {
                this._SortOrder = value;
            }
        }
        #endregion

使用基于新列的排序声明视图

    public PXSelect<Something, 
                 Where<True, Equal<False>>, OrderBy<Asc<Something.sortOrder>>> SomethingElse; // My delegate will give the result always

在委托中,获取结果并设置结果集记录的sortorder值并返回结果。

它正在工作^^