2017-08-15 56 views
0

我有貨在手在PO301000屏幕:如何處理質量手(自定義列)底座上的計量單位列PO 301000屏幕

這裏是我已存檔的

public class POLine_Extension : PXCacheExtension<POLine> { 
    [PXDecimal] 
    [PXUIField(DisplayName = "Qty On Hand", Enabled = false)] 
    [PXDBScalar(typeof(
Search<INSiteStatus.qtyOnHand, 
    Where<INSiteStatus.inventoryID, Equal<POLine.inventoryID>, 
    And<INSiteStatus.siteID, Equal<POLine.siteID>>>>))] 
public virtual decimal? QtyOnHand { get; set; } 
public abstract class qtyOnHand : IBqlField {} 
} 

public virtual void POLine_InventoryID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e) 
{ 
    UpdateQtyAvailable(sender, e); 
} 
public virtual void POLine_SiteID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e) 
{ 
    UpdateQtyAvailable(sender, e); 
} 
public virtual void POLine_UOM_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e) 
{ 
    UpdateQtyAvailable(sender, e); 
} 
private void UpdateQtyAvailable(PXCache sender, PXFieldUpdatedEventArgs e) 
{ 
    if (e.Row == null) return; 
    POLine row = (POLine)e.Row; 

    foreach (INSiteStatus siteStatus in PXSelect<INSiteStatus, 
     Where<INSiteStatus.inventoryID, Equal<Required<INSiteStatus.inventoryID>>, 
      And<INSiteStatus.siteID, Equal<Required<INSiteStatus.siteID>>>>>.Select(sender.Graph, row.InventoryID, row.SiteID, row.UOM)) 
    { 
     sender.SetValueExt<POLine_Extension.qtyOnHand>(row, siteStatus.QtyOnHand); 
    } 
} 
代碼

enter image description here

當我添加新的項目,並選擇通過轉換因子(數量手/轉換系數(轉換系數的值在PO細節電網計量單位列我想要的數量在手列的值劃分後Distribution => Stock Item => Stetti將軍納克=>度量單位=>網格)

enter image description here

例如,如果UOM值爲CASE12(具有轉換因子= 12)的意思是我的質量列的值已經通過12.否則來劃分,該值請勿更改

回答

1

您可以使用INUnitAttribute.ConvertFromBase來轉換數量值。

這裏是一個示例...

public static bool TryConvertFromBaseQty<InventoryIDField>(PXCache sender, object row, string toUnit, Decimal convertingQty, out decimal? result) where InventoryIDField : IBqlField 
    { 
     result = null; 

     try 
     { 
      result = INUnitAttribute.ConvertFromBase<InventoryIDField>(sender, row, toUnit, convertingQty, INPrecision.QUANTITY); 

      return true; 
     } 
     catch (PXUnitConversionException) 
     { 
      return false; 
     } 
    } 

    private void UpdateQtyAvailable(PXCache sender, PXFieldUpdatedEventArgs e) 
    { 
     if (e.Row == null) return; 
     POLine row = (POLine)e.Row; 

     foreach (INSiteStatus siteStatus in PXSelect<INSiteStatus, 
      Where<INSiteStatus.inventoryID, Equal<Required<INSiteStatus.inventoryID>>, 
       And<INSiteStatus.siteID, Equal<Required<INSiteStatus.siteID>>>>>.Select(sender.Graph, row.InventoryID, row.SiteID, row.UOM)) 
     { 
      decimal? qtyOnHandInPoUom = 0m; 
      if (TryConvertFromBaseQty<POLine.inventoryID>(sender, row, row.UOM, 
       siteStatus.QtyOnHand.GetValueOrDefault(), out qtyOnHandInPoUom)) 
      { 
       sender.SetValueExt<POLine_Extension.qtyOnHand>(row, qtyOnHandInPoUom); 
       break; 
      } 

      sender.SetValueExt<POLine_Extension.qtyOnHand>(row, siteStatus.QtyOnHand); 
     } 
    } 
+0

它的工作,但有一個問題。當數據庫中的項目質量發生變化時,我會在舊PO中看到我手中的定製質量已更新,但未由UOM列進行分割。例如,在將UOM從瓶子更改爲case12後的pictuce PO 000008中,手上的列從85更改爲85/12,但是當我釋放收據時,現有值從85更改爲90,我回到此000008 PO ,手上的列顯示爲90,而UOM列仍然是CASE12。這是非理性的,我希望它是90/12。請幫助我,謝謝你! –

+0

您需要爲未綁定的字段使用字段選擇。您無法使用更新的事件,因爲採購訂單不會更新庫存量的變化。您的未綁定字段將設置在頁面刷新字段中選擇 – Brendan

+0

您是否可以爲我特定請我是新手。我需要你更新你的答案和我需要一步一步編寫的所有代碼(刪除我的舊代碼完全沒問題)。我發現這個問題仍然與標題爲「基於UOM的流程數量」有關,所以我認爲開始一個新問題並不是一個好理想(如果我這樣做,它會長久,我不知道如何去做開始)我需要你的幫助我被卡住了 –