2017-01-11 62 views
0

我需要添加Sales Order行上的InventoryID選擇器的Customer Part Number和Vendor Part Number列,以便在創建SO Lines時允許用戶通過零件號選擇InventoryID。將自定義項目>自定義數據類>選擇器列添加到選擇器不能幫助。所以,我試圖自定義屬性,但仍然沒有成功,因爲InventoryID場對SOLine DAC的定義是這樣的:在SOLINE Acumatica上添加InventoryID選擇器的列

[SOLineInventoryItem(Filterable=true)] 
[PXDefault()] 

需要幫助的花樣如何自定義這種屬性。

+0

可以有很多的客戶/供應商的零件號爲一個項目,怎麼辦你打算在選擇器中顯示? – Hybridzz

回答

2

在Acumatica客戶和供應商零件編號存儲在庫存項目屏幕上的交叉引用標籤中。正如下面的截圖所示,AlternateID在INItemXRef DAC聲明,還有就是InventoryItem和INItemXRef DAC之間的一個一對多的關係: enter image description here

雖這麼說,它不能添加客戶和供應商部分將數列編入InventoryID選擇器,因爲這將導致重複的InventoryItem記錄。

另一種解決方案是在InventoryItem DAC來創建自定義文本字段中,然後覆蓋堅持在InventoryItemMaint BLC延伸以連接在自定義文本字段可替代的ID和存儲結果(DB柱):

public class InventoryItemMaint_Extension : PXGraphExtension<InventoryItemMaint> 
{ 
    [PXOverride] 
    public void Persist(Action del) 
    { 
     using (PXTransactionScope ts = new PXTransactionScope()) 
     { 
      InventoryItem item = Base.Item.Current; 
      if (item != null && Base.itemxrefrecords.Cache.IsDirty) 
      { 
       string alternateIDs = string.Empty; 
       foreach (INItemXRef crossRef in Base.itemxrefrecords.Select()) 
       { 
        alternateIDs = string.IsNullOrEmpty(alternateIDs) ? 
         crossRef.AlternateID : alternateIDs + "; " + crossRef.AlternateID; 
       } 
       item.GetExtension<InventoryItemExt>().UsrAlternateIDs = alternateIDs; 
       Base.Item.Update(item); 
      } 

      del(); 
      ts.Complete(); 
     } 
    } 
} 

爲了簡化初始設置,您還可以在InventoryItemMaint BLC擴展中實現RecalcAlternateIDs操作。該RecalcAlternateIDs行動將循環儘管在應用程序的所有庫存產品,並串連備用ID:

public class InventoryItemMaint_Extension : PXGraphExtension<InventoryItemMaint> 
{ 
    ... 

    public PXAction<InventoryItem> RecalcAlternateIDs; 
    [PXButton] 
    [PXUIField(DisplayName = "Concatenate Alternate IDs")] 
    protected void recalcAlternateIDs() 
    { 
     PXLongOperation.StartOperation(Base,() => 
     { 
      InventoryItemMaint itemMaint = PXGraph.CreateInstance<InventoryItemMaint>(); 
      var items = PXSelect<InventoryItem, Where<InventoryItem.stkItem, Equal<boolTrue>>>.Select(itemMaint); 
      foreach (InventoryItem item in items) 
      { 
       itemMaint.Clear(); 
       itemMaint.Item.Current = item; 
       itemMaint.itemxrefrecords.Cache.IsDirty = true; 
       itemMaint.Actions.PressSave(); 
      } 
     }); 
    } 
} 

默認情況下,所有的選擇控制築起鍵搜索索引(或SubstituteKey定義時),並說明,如果定義,字段。要擴展此列表,可以將FilterByAllFields屬性設置爲Aspx中的PXSelector/PXSegmentMask控件的True,或者按照以下步驟使用FastFilterFields。在我看來,FastFilterFields似乎是解決您的請求的更好選擇。需要

下一個步驟添加UsrAlternateIDs列到InventoryID選擇

  1. 啓動佈局編輯器的銷售訂單屏幕(SO301000),然後從操作菜單編輯.aspx的選項:

enter image description here

  1. 在Aspx文件中找到InventoryID選擇器的聲明:

    <px:PXSegmentMask CommitChanges=「True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" /> 
    
  2. 對於InventoryID選擇,通過聲明UsrAlternateIDs列追加列,然後單擊生成自定義腳本:

    <px:PXSegmentMask CommitChanges="True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" > 
        <GridProperties FastFilterFields="UsrAlternateIDs"> 
         <Columns> 
          <px:PXGridColumn DataField="UsrAlternateIDs" AutoGenerateOption="Add" Width="250px" /> 
         </Columns> 
        </GridProperties> 
    </px:PXSegmentMask> 
    
+0

不錯。當我使用crossRef.Descr而不是crossRef.AlternateID時,只是遇到了一些問題「字符串或二進制數據會被截斷」。已經將自定義字符串DAC大小擴展到255,但仍然有相同的錯誤。 – Arsiadi

+0

您還需要更改您的數據庫列大小,然後重新啓動IIS。我建議你將列類型設置爲'nvarchar(4000)'。不要忘記編輯project.xml並增加列的長度,所以當您在另一個實例上部署項目時,會創建正確大小的列。 – RuslanDev

+0

刪除UsrAlternateID並使用更長的尺寸重新創建它。發佈並且工作正常。 – Arsiadi