2017-06-08 15 views
1

在庫アイテム(INItemLotSerial)のシリアル番号に関するカスタム情報を保存する画面とグラフを作成しました。Acumatica:表示フィールドのビューで最初のレコードを取得する - 外部オーダーBys

最新のトランザクションの場所に基づいて、シリアル番号の現在の場所を表示できるようになりました。 (理想的には私は、シリアル番号がインベントリに現在ある場合にできるディスプレイであることがしたいのですが、それはおそらく別の質問です。)ここで

が私のグラフの図である。

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トレースで生成されたSQLを見ると

しかし、Acumaticaは、フィールドでは、独自の注文を追加することが表示されます。別のレコードを引き起こしている

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を実行させるにはどうすればよいですか?または、最も良い取引場所を表示するためには全く異なるアプローチがありますか?

+0

私は誤解を招く可能性がありますが、セレクタで作業するときは、デフォルトの動作はキーで最初に注文することです。コードスニペットでは、InTranSplitのキーをフィールド順に表示できます。 INTranSplit.createdDateTimeの後、あなたのorder by節にキーを入れてみましたか? –

+0

ちょうどそのショットを与えました - 効果はありません。 –

答えて

0

あなたが専門的なフィルタリングが必要な場合、私は、この特定の状況でやって推薦するの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 }; 
} 

を使用しています記録。

乾杯!

関連する問題