2016-04-25 3 views

答えて

0

私は照会していたテーブルの共通の列(プロパティ)を含む基本クラス(Base)を作成しました。

  • PDSTATUS
  • PCSTATUS
  • PHSTATUS

これら3列[で基本クラスのステータスになりました(名前=「STATUS:列名は2文字の接頭辞を除いて同じでした")]属性と、派生クラスに格納されている接頭辞:

using System; 
using System.Runtime.Serialization; 
using System.Data.Linq.Mapping; 

public class Class1 
{ 
    [DataContract] 
    [KnownType(typeof(Contract))] 
    [KnownType(typeof(Product))] 
    [KnownType(typeof(Customer))] 
    public abstract class Base 
    { 
     protected virtual string _sourcePrefix { get; private set; } 

     //[DataMember(EmitDefaultValue = false)] // Doesn't seem to do anything 
     [IgnoreDataMember] // Only way I could get this to not show up in the WSDL for Base class 
     public virtual string Id { get; protected set; } 

     [Column(Name = "PRCNGID")] // This is the key for Contracts, foreign key for Customers and Products 
     [IgnoreDataMember] // I don't want this to show up in the Base class in the WSDL, only for Contract 
     public virtual string ContractId { get; set; } 

     [Column(Name = "EFFDT")] 
     [DataMember] 
     public DateTime? EffectiveDate { get; set; } 

     [Column(Name = "EXPDT")] 
     [DataMember] 
     public DateTime? ExpirationDate { get; set; } 

     [Column(Name = "STATUS")] 
     [DataMember] 
     public Statuses Status { get; set; } 
    } 

    [Table(Name = "PRPCN10C")] 
    [DataContract] 
    [KnownType(typeof(Base))] 
    public class Contract : Base 
    { 
     protected override string _sourcePrefix { get { return "PC"; } } 

     //[IgnoreDataMember] // Using ContractId field instead for this class' Id 
     //public override string Id 
     //{ 
     // get { return base.Id; } 
     // protected set { base.Id = value; } 
     //} 

     [Column(Name = "PRCNGID")] 
     [DataMember] 
     public new string ContractId 
     { 
      get { return base.ContractId; } 
      set { base.ContractId = value; } 
     } 

     [Column(Name = "PRCNGTYP")] 
     [DataMember] 
     public Types ContractType { get; set; } 

     [Column(Name = "NAME")] 
     [DataMember] 
     public string Name { get; set; } 

     [Column(Name = "ROOTCT#")] 
     [DataMember] 
     public string RootContractNumber { get; set; } 

     [Column(Name = "CMTTYP")] 
     [DataMember] 
     public string CommitmentType { get; set; } 
    } 

    [Table(Name = "PRPCN30H")] 
    [DataContract] 
    public class Customer : Base 
    { 
     protected override string _sourcePrefix { get { return "PH"; } } 

     [Column(Name = "SHPTO#")] 
     [DataMember(Name = "CustomerNumber")] 
     public new string Id 
     { 
      get { return base.Id; } 
      protected set { base.Id = value; } 
     } 
    } 

    [Table(Name = "PRPCN20D")] 
    [DataContract] 
    public class Product : Base 
    { 
     protected override string _sourcePrefix { get { return "PD"; } } 

     [Column(Name = "ITEM")] 
     [DataMember(Name = "ProductNumber")] 
     public new string Id 
     { 
      get { return base.Id; } 
      protected set { base.Id = value; } 
     } 
    } 
} 

テーブル属性と列属性を追加しましたReflectionを使用してソースデータベースに対してクエリを作成し、OleDb ExecuteReaderから返されたDataReaderの結果を処理することができました。

私はもともとこのようにオーバーライドを使用して派生クラス内のプロパティを宣言しようとした:

 [Column(Name = "ITEM")] 
     [DataMember(Name = "ProductNumber")] 
     public new string Id 
     { 
      get { return base.Id; } 
      protected set { base.Id = value; } 
     } 

しかし、WCFは、それをどうするかを知っていないようでした。派生クラスのプロパティを生成するのではなく、基本クラスのプロパティのみを生成し、新しいDataMember名は無視しました。

私はWCFの部分を理解したので、私のサーバーで生成された?singleWSDLを開き、wsdl2apexユーティリティ(ApexクラスページのWSDLから生成)ボタンを使用してSalesforceにインポートしました。

私はXS削除する必要がありました:attribute要素を(wsdl2apexがそれらを好きではない)、と私はそれが3つのApexクラス生成、ということでした後: 1)をシリアル化プロパティ(それは基本的に、このために空であった) 2 )クラス定義:ベース、契約、顧客、製品 3)

たクラス定義ファイルが含まれているSalesforceでウェブコールアウトで使用&メソッドのクラスをこの:

//Generated by wsdl2apex 

    public class CPQ_PricingContractWSClasses { 
     public class PricingContract { 
      public CPQ_PricingContractWSClasses.ArrayOfPricingContract_Contract Contracts; 
      public CPQ_PricingContractWSClasses.ArrayOfPricingContract_Customer Customers; 
      public CPQ_PricingContractWSClasses.ArrayOfPricingContract_Product Products; 
      private String[] Contracts_type_info = new String[]{'Contracts','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] Customers_type_info = new String[]{'Customers','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] Products_type_info = new String[]{'Products','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'Contracts','Customers','Products'}; 
     } 
     public class ArrayOfPricingContract_Contract { 
      public CPQ_PricingContractWSClasses.PricingContract_Contract[] PricingContract_Contract; 
      private String[] PricingContract_Contract_type_info = new String[]{'PricingContract.Contract','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','-1','true'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'PricingContract_Contract'}; 
     } 
     public class ArrayOfPricingContract_Customer { 
      public CPQ_PricingContractWSClasses.PricingContract_Customer[] PricingContract_Customer; 
      private String[] PricingContract_Customer_type_info = new String[]{'PricingContract.Customer','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','-1','true'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'PricingContract_Customer'}; 
     } 
     public virtual class PricingContract_Customer { 
      public String CustomerNumber; 
      private String[] CustomerNumber_type_info = new String[]{'CustomerNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'CustomerNumber'}; 
     } 
     public virtual class PricingContract_Product { 
      public String ProductNumber; 
      private String[] ProductNumber_type_info = new String[]{'ProductNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'ProductNumber'}; 
     } 
     public virtual class PricingContract_Contract { 
      public String CommitmentType; 
      public String ContractType; 
      public String Name; 
      public String RootContractNumber; 
      public String ContractId; 
      private String[] CommitmentType_type_info = new String[]{'CommitmentType','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] ContractType_type_info = new String[]{'ContractType','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','false'}; 
      private String[] Name_type_info = new String[]{'Name','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] RootContractNumber_type_info = new String[]{'RootContractNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'CommitmentType','ContractType','Name','RootContractNumber'}; 
     } 
     public virtual class PricingContract_Base { 
      public DateTime EffectiveDate; 
      public DateTime ExpirationDate; 
      public String Status; 
      private String[] EffectiveDate_type_info = new String[]{'EffectiveDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] ExpirationDate_type_info = new String[]{'ExpirationDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] Status_type_info = new String[]{'Status','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','false'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'EffectiveDate','ExpirationDate','Status'}; 
     } 
     public class ArrayOfPricingContract_Product { 
      public CPQ_PricingContractWSClasses.PricingContract_Product[] PricingContract_Product; 
      private String[] PricingContract_Product_type_info = new String[]{'PricingContract.Product','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','-1','true'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'PricingContract_Product'}; 
     } 
    } 

それは、近くに見えますが、何も仮想として宣言されておらず、あなたのコード内のクラス/プロパティを使用しようとした場合、あなたはこのようなエラーになりますなど、

を拡張決してありません。

Webサービスコールアウトに失敗しました:コールアウト応答を解析できません。エイペックスタイプが要素に見つかりませんEffectiveDate

Saleforceのサポートでは、Webコールアウトで継承はサポートされていないため、すべてのプロパティと_type_infoフィールドのコピー/ペーストをBaseクラスから各派生クラス。 field_order_type_infoフィールドを更新し、Baseクラスからコピーしたプロパティを追加する必要もありました。次に、変更後のクラスの例を示します。

 public virtual class PricingContract_Product { 
      public DateTime EffectiveDate { get; set; } 
      public DateTime ExpirationDate { get; set; } 
      public String ProductNumber { get; set; } 
      public String Status { get; set; } 
      private String[] EffectiveDate_type_info = new String[]{'EffectiveDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] ExpirationDate_type_info = new String[]{'ExpirationDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] ProductNumber_type_info = new String[]{'ProductNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'}; 
      private String[] Status_type_info = new String[]{'Status','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','false'}; 
      private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'}; 
      private String[] field_order_type_info = new String[]{'EffectiveDate','ExpirationDate','ProductNumber','Status'}; 
     } 

Visualfourceページからこれらのクラスとプロパティにアクセスしていたため、{get; }をすべてのプロパティに渡して、VFがそれらを見るようにします。他のコードでクラスを拡張したいので、私は手動で仮想を追加しました。

関連する問題