2017-01-11 6 views
0

SOラインを作成する際に在庫番号を部品番号で選択できるようにするには、受注明細の在庫IDセレクタのカスタマ部品番号とベンダ部品番号の列を追加する必要があります。カスタマイズプロジェクトからの列の追加>カスタマイズされたデータクラス>セレクタセレクタの列は役に立ちません。SOLineに在庫ID​​セレクタの列を追加Acumatica

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

は、属性のこの種をカスタマイズする方法を考え出しに役立つ必要があります。ソリンDACのInventoryIDフィールドの定義はこのようなものですので、だから、私は属性をカスタマイズしようとしませんが、まだ成功します

+0

行う方法、アイテムのための多くの得意先/仕入先の部品番号があることができそれをセレクタに表示する予定ですか? – Hybridzz

答えて

2

Acumaticaのカスタマとベンダの部品番号は、[在庫明細]画面の[相互参照]タブに保存されています。下のスクリーンショットに示すように、AlternateIDがINItemXRef DACで宣言さInventoryItemとINItemXRef DAC間の1対多の関係が存在している。 enter image description here

ということで、それが顧客を追加することはできませんし、ベンダーパート在庫列セレクタに列番号を設定すると、重複した在庫アイテムレコードが生成されます。

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(); 
     } 
    } 
} 

別の解決策は、InventoryItem DACにカスタムテキストフィールドを作成し、カスタムテキストフィールドに代替IDと店舗結果(DB列)を連結するInventoryItemMaint BLC延長に固執オーバーライドします初期設定を簡素化するため、InventoryItemMaint BLC拡張でRecalcAlternateIDsアクションを実装することもできます。 (定義されたとき、またはSubstituteKey)

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(); 
      } 
     }); 
    } 
} 

デフォルトでは、すべてのセレクタのコントロールがキーに対する検索インデックスを構築し、説明、定義されている場合、フィールド:RecalcAlternateIDsアクションは、ループのすべての株式のアプリケーションの項目とは別のIDを連結しますけれども。このリストを拡張するには、FilterByAllFieldsプロパティをAspxのPXSelector/PXSegmentMaskコントロールのTrueに設定するか、以下の手順に従ってFastFilterFieldsを使用します。私の意見では、FastFilterFieldsはあなたの要求に対処するためのより良い選択肢のようです。

enter image description here

次のステップは、InventoryIDセレクタ受注画面用

  1. 打ち上げレイアウトエディタ(SO301000)にUsrAlternateIDs列を追加し、[アクション]メニューから[Edit ASPXオプションを選択する必要があります
    1. 在庫IDセレクタのAspxファイルロケート宣言:

      InventoryIDセレクタについては
      <px:PXSegmentMask CommitChanges=“True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" /> 
      
    2. 、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

nice。 crossRef.AlternateIDではなくcrossRef.Descrを使用すると、「StringまたはBinaryデータが切り捨てられる」という問題が発生しました。既にカスタム文字列のDACサイズを255に拡張しても、同じエラーが発生します。 – Arsiadi

+0

また、データベースの列サイズを変更してからIISを再起動する必要があります。列の型を 'nvarchar(4000)'に設定することをお勧めします。 project.xmlを編集して列の長さを増やすことを忘れないでください。そうすれば、別のインスタンスにプロジェクトを展開するときに、正しいサイズの列が作成されます。 – RuslanDev

+0

UsrAlternateIDを削除し、より長いサイズを使用して再作成します。パブリッシュして正常に動作します。 – Arsiadi

関連する問題