2017-10-25 26 views
0

契約DACとその新しいエクステンションを拡張機能のAPInvoiceEntry Graphに追加しようとしています。私は正確に何がうまくいきませんか、おそらくContracts DACと評価ロジックの初期化を知っていませんか?いくつかの契約ロジックをAPTranとしてキャストしようとしており、「キャストできません」というエラーが送信されています。DACに新しいエクステンションをグラフに追加する際の問題

最後の目標は、選択したプロジェクトを確認し、Bills and Paymentsの各行で分岐し、ContractExt DAC拡張で作成されたプロジェクトIDと新しいBranchIDフィールドに基づいて評価させることです。

私は取得しています現在のエラーのトレースは、次のとおりです。これは私が適切に契約DACを持っていない可能性がありますと信じて私をリード

Unable to cast object of type 'PX.Objects.AP.APTran' to type 'PX.Objects.CT.Contract'. 

at PX.Objects.AP.APInvoiceEntry_Extension.APTran_RowUpdating(PXCache cache, PXRowUpdatingEventArgs e, PXRowUpdating InvokeBaseHandler) 
at PX.Data.PXCache.OnRowUpdating(Object item, Object newitem, Boolean externalCall) 
at PX.Data.PXCache`1.Update(IDictionary keys, IDictionary values) 
at PX.Data.PXGraph.ExecuteUpdate(String viewName, IDictionary keys, IDictionary values, Object[] parameters) 

。次のように

コードは次のとおりです。

グラフ:

namespace PX.Objects.AP 
{ 
public class APInvoiceEntry_Extension : PXGraphExtension<APInvoiceEntry> 
{ 
    public PXSelect<Contract, Where<Contract.contractID, Equal<Current<APTran.projectID>>>> Contract; 
    protected void APTran_RowUpdating(PXCache cache, PXRowUpdatingEventArgs e, PXRowUpdating InvokeBaseHandler) 
    { 
     Contract conRow = (Contract)e.NewRow as Contract; 
     ContractExt conRowE = PXCache<Contract>.GetExtension<ContractExt>(conRow); 
     APTran row = e.NewRow as APTran; 
     int? projectid = conRow.ContractID; 
     int? baseprojectid = row.ProjectID; 
     int? basebranchid = row.BranchID; 
     int? branchid = conRowE.UsrBranch; 
     if (
      //Check to make sure that selected Branch and Project match 
      baseprojectid == projectid && 
      basebranchid != branchid 
      ) 
     { 
      throw new PXSetPropertyException("Branch and project must match", PXErrorLevel.RowError); 
     } 
    } 
} 
} 

DAC:

namespace PX.Objects.CT 
{ 
public class ContractExt : PXCacheExtension<PX.Objects.CT.Contract> 
{ 
    [Branch] 
    public virtual int? UsrBranch { get; set; } 
    public abstract class usrBranch : IBqlField { } 
}} 

このすべてが正常にコンパイルされます。 APTran Unable to Cast Error

答えて

1

あなたがエラーを持っていた理由です(Contract)e.NewRowを使用している場合ContractAPTran行をキャストしようとしている:あなたが期待するように、エラーはこのように、ポップ。下の図のようにselectを実行すると、必要なものが得られます。

public class APInvoiceEntry_Extension : PXGraphExtension<APInvoiceEntry> 
{ 
    protected void APTran_RowUpdating(PXCache cache, PXRowUpdatingEventArgs e, PXRowUpdating InvokeBaseHandler) 
    { 
     Contract conRow = PXSelect<Contract, Where<Contract.contractID, Equal<Current<APTran.projectID>>>>.Select(Base); 
     ContractExt conRowE = conRow.GetExtension<ContractExt>(); 
     APTran row = e.NewRow as APTran; 
     int? projectid = conRow.ContractID; 
     int? baseprojectid = row.ProjectID; 
     int? basebranchid = row.BranchID; 
     int? branchid = conRowE.UsrBranch; 
     if (
      //Check to make sure that selected Branch and Project match 
      baseprojectid == projectid && 
      basebranchid != branchid 
      ) 
     { 
      throw new PXSetPropertyException("Branch and project must match", PXErrorLevel.RowError); 
     } 
    } 
} 

あなたは、単にPXSelectを使用して、ベースDACを選択し、(すでに別のコールに持っていた - 正常に動作します)上記の例に示すように、拡張値を得ることができます。 DACエクステンションを表示したいのに、グラフにベースDACのビューがまだない場合は、ビューを追加します。それ以外の場合は、必要なときにPXSelectを使用します。

+0

パーフェクト!ありがとうブレンダン! – Jake