2016-11-03 19 views
0

SOLine詳細グリッドの検索セレクタに代替IDフィールドを追加しようとしています。次のように私のコードは:代替IDフィールドをSOLineグリッドの在庫IDセレクタに追加

[PXNonInstantiatedExtension] 
public class SO_SOLine_ExistingColumn : PXCacheExtension<PX.Objects.SO.SOLine> 
{ 
    #region InventoryID 
[PXMergeAttributes(Method = MergeMethod.Append)] 
[PXSelector(typeof(Search2<InventoryItem.inventoryCD, LeftJoin<INItemXRef, On<InventoryItem.inventoryID, Equal<INItemXRef.inventoryID>>>>), 

     typeof(PX.Objects.IN.InventoryItem.inventoryCD), 
     typeof(PX.Objects.IN.INItemXRef.alternateID), 
     typeof(PX.Objects.IN.InventoryItem.descr), 
     typeof(PX.Objects.IN.InventoryItem.itemClassID), 
     typeof(PX.Objects.IN.InventoryItem.itemStatus), 
     typeof(PX.Objects.IN.InventoryItem.itemType), 
     typeof(PX.Objects.IN.InventoryItem.baseUnit), 
     typeof(PX.Objects.IN.InventoryItem.salesUnit), 
     typeof(PX.Objects.IN.InventoryItem.purchaseUnit), 
     typeof(PX.Objects.IN.InventoryItem.basePrice))] 
    public int? InventoryID { get; set; } 
    #endregion 
} 
    public void SOLine_InventoryID_CacheAttached(PXCache sender) 
{ 
} 

これは簡単に選択する代替IDフィールドを追加し、おそらく第二のために、選択されたときに適切なインベントリCDを返し、その後インベントリCDは、整数IDを変更し、 IDが認識されないので、もちろんエラーインジケータが表示されます。

答えて

0

George、InventoryItemとINItemXRef DACの間には一対一の関係があり、PX.Objectを追加しています。 IN.INItemXRef.alternateID PXSelectorAttributeの宣言へのBQL-fieldは、タスクを達成するには不十分です。

  1. 各目録品目の代替IDを格納するInventoryItem DACのDeclare非連結テキストフィールド(データベースと別の接続を確立するためにPXConnectionScopeの必須の使用)RowSelectingイベントを購読

    public class InventoryItemExt : PXCacheExtension<InventoryItem> 
    { 
        #region AlternateIDs 
        public abstract class alternateIDs : IBqlField { } 
    
        [PXString] 
        [PXUIField(DisplayName = "Alternate IDs")] 
        public virtual string AlternateIDs { get; set; } 
        #endregion 
    } 
    
  2. 以内SOOrderEntry BLC拡張を使用して各行の代替IDを連結し、計算された文字列値で非結合AlternateIDsフィールドに数値を入力します。

    public class SOOrderEntryExtension : PXGraphExtension<SOOrderEntry> 
    { 
        public override void Initialize() 
        { 
         Base.RowSelecting.AddHandler<InventoryItem>((sender, e) => 
         { 
          InventoryItem item = e.Row as InventoryItem; 
          if (item == null) return; 
    
          string alternateIDs = string.Empty; 
          using (new PXConnectionScope()) 
          { 
           foreach (INItemXRef crossRef in PXSelect<INItemXRef, 
            Where<INItemXRef.inventoryID, Equal<Required<InventoryItem.inventoryID>>>>.Select(Base, item.InventoryID)) 
           { 
            alternateIDs = string.IsNullOrEmpty(alternateIDs) ? 
             crossRef.AlternateID : alternateIDs + "; " + crossRef.AlternateID; 
           } 
          } 
          item.GetExtension<InventoryItemExt>().AlternateIDs = alternateIDs; 
         }); 
        } 
    } 
    
  3. 受注画面(SO301000)用
  4. 起動レイアウトエディタと[アクション]メニューから[Edit ASPXオプションを選択します。ASPXファイルで enter image description here

  5. InventoryIDセレクタの宣言を探しますするため

    <px:PXSegmentMask CommitChanges=“True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" /> 
    
  6. InventoryIDセレクターでFastFilterFieldsプロパティーをAlternateIDsに設定し、AlternateID列を宣言して列を追加し、「カスタマイズ」スクリプトを作成します。

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

お返事いただきありがとうございます。 パトリック - 代替キーは正しい在庫CDを返しますが、システムにInventoryIDが存在しないというエラーが表示されます。 Ruslan - 私の顧客のために、セレクターの各レコードに別々のAlternateIDを付けてInventoryIDを繰り返す必要があります。私は繰り返し試しましたが、あなたがすでに認識していると確信していますので、あなたが提供したコードを変更することができませんでした。 – GeorgeM

+0

George、元の試み(Patrickの提案に従って更新された場合でも)重複したPXSelectorAttribute。実際には、インベントリCDがセグメント化されたキーであるため、インベントリIDをPXSelectorAttributeでデコレートするのは妥当ではありません。セグメント化されたキーに対してはPXDimensionSelectorAttributeのみが許可されます。 – RuslanDev

+0

追加のコメント:セレクタ内の各レコードの個別のAlternateIDでInventoryIDを繰り返しても、選択されたAlternateIDにもかかわらず、セレクタは常に最初に検出されたInventory CDをハイライト表示するため、 INItemXRef DACに対してカスタムセレクタフィールドを作成し、コード内にインベントリIDを設定することもできないようです:InventoryIDは5です! INItemXRef DAC用に定義されたキーフィールド。先に示唆したソリューションは、顧客が要求したものに可能な限り近づけるための唯一の受け入れ可能な選択肢のようです。 – RuslanDev

0

セレクタを検索してInventoryIDを検索し、セレクタのUIにInventoryCDを表示する "SubstituteKey"オプションを追加する必要があります。例:[PXSelector(typeIt(InventoryItem.inventoryID)、SubstituteKey = typeof(InventoryItem.inventoryCD))]

関連する問題