【问题标题】:Acumatica: Retrieving first record in a view for a display field - extraneous Order BysAcumatica:检索显示字段视图中的第一个记录 - 无关稿按钮
【发布时间】:2017-11-10 09:43:46
【问题描述】:

我们创建了一个屏幕和图表,用于存储有关库存项目 (INItemLotSerial) 的给定序列号的自定义信息。

我希望能够根据最近交易的位置显示序列号的当前位置。 (理想情况下,如果序列号当前在库存中,我也希望能够显示,但这可能是一个不同的问题。)

这是我对图表的看法:

public PXSelect<INTranSplit, Where<INTranSplit.lotSerialNbr, Equal<Optional<INItemLotSerial.lotSerialNbr>>, 
    And<INTranSplit.inventoryID, Equal<Optional<INItemLotSerial.inventoryID>>>>, OrderBy<Desc<INTranSplit.createdDateTime>>> InventoryLocation;

还有我在页面上的字段:

<px:PXSegmentMask Enabled="False" AllowEdit="False" runat="server" ID="CstPXSegmentMask5" DataField="InventoryLocation.LocationID" ></px:PXSegmentMask>

我希望该字段获取第一条记录并忽略其余记录。

但是,当我在 SQL Trace 中查看生成的 SQL 时,Acumatica 似乎正在添加自己的 Order By 字段:

exec sp_executesql N'SELECT [INTranSplit].[DocType], [INTranSplit].[TranType], [INTranSplit].[RefNbr], [INTranSplit].[LineNbr], [INTranSplit].[POLineType], [INTranSplit].[TransferType], [INTranSplit].[ToSiteID], [INTranSplit].[ToLocationID], [INTranSplit].[SplitLineNbr], [INTranSplit].[TranDate], [INTranSplit].[InvtMult], [INTranSplit].[InventoryID], [INTranSplit].[SubItemID], [INTranSplit].[CostSubItemID], [INTranSplit].[CostSiteID], [INTranSplit].[SiteID], [INTranSplit].[LocationID], [INTranSplit].[LotSerialNbr], [INTranSplit].[ExpireDate], [INTranSplit].[Released], [INTranSplit].[UOM], [INTranSplit].[Qty], [INTranSplit].[BaseQty], [INTranSplit].[MaxTransferBaseQty], [INTranSplit].[OrigPlanType], [INTranSplit].[IsFixedInTransit], [INTranSplit].[PlanID], [INTranSplit].[TotalQty], [INTranSplit].[TotalCost], [INTranSplit].[AdditionalCost], ( CASE WHEN  ( [INTranSplit].[TotalQty] = .0) THEN  .0 ELSE  ( [INTranSplit].[TotalCost] /  [INTranSplit].[TotalQty]) END), [INTranSplit].[CreatedByID], [INTranSplit].[CreatedByScreenID], [INTranSplit].[CreatedDateTime], [INTranSplit].[LastModifiedByID], [INTranSplit].[LastModifiedByScreenID], [INTranSplit].[LastModifiedDateTime], [INTranSplit].[tstamp], [INTranSplit].[UsrQtyForQC], [INTranSplit].[UsrQtyCoded], [INTranSplit].[UsrQtyCompleted] FROM INTranSplit INTranSplit WHERE (INTranSplit.CompanyID = 2) AND  [INTranSplit].[LotSerialNbr] = @P0 AND [INTranSplit].[InventoryID] = @P1 
ORDER BY [INTranSplit].[DocType], [INTranSplit].[RefNbr], [INTranSplit].[LineNbr], [INTranSplit].[SplitLineNbr], [INTranSplit].[CreatedDateTime] DESC OPTION(OPTIMIZE FOR UNKNOWN) /* IN.21.00.00 */',N'@P0 nvarchar(100),@P1 int',@P0=N'EOSC52270005',@P1=16067

导致首先返回不同的记录,而不是最近的记录。

如何说服 Acumatica 运行我要求的 BQL 并按字段删除额外的订单?或者是否有一种完全不同的方法来显示更可取的最近交易位置?

【问题讨论】:

  • 我可能弄错了,但我记得在使用选择器时,默认行为是首先按键排序。在您的代码 sn-p 中,我们可以将 InTranSplit 的键视为字段的第一顺序。您是否尝试在 INTranSplit.createdDateTime 之后将键放入 order by 子句中?
  • 只是试了一下 -- 没有效果。

标签: acumatica


【解决方案1】:

如果您需要专门的过滤,我建议在这种特殊情况下使用 IEnumerable 排序

public IEnumerable inventoryLocation()
{
        PXView select = new PXView(this, true, InventoryLocation.View.BqlSelect);
        Int32 totalrow = 0;
        Int32 startrow = PXView.StartRow;
        List<object> result = select.Select(PXView.Currents, PXView.Parameters, PXView.Searches,
            PXView.SortColumns, PXView.Descendings, PXView.Filters, ref startrow, PXView.MaximumRows, ref totalrow);
        INTranSplit latest = null;
        if (result.Count > 0)
        { 
            //We need to perform a custom order in order to get to the latest record.
            latest = result.First() as INTranSplit;
            foreach (INTranSplit row in result)
            {
                if (latest.CreatedDateTime.Value < row.CreatedDateTime.Value)
                {
                    latest = row;
                } 

            }
        }
        return new List<object> { latest };
}

您将在哪里抓取所有记录,获取第一条记录,然后查找最新记录。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2019-08-09
    • 1970-01-01
    • 2017-08-06
    相关资源
    最近更新 更多