2022/08/3

SalesforceでのUnsupportedエラー回避方法を解説します!

 
  

SalesforceのVisualforceを利用しているとき、「Unsupported~」の文字を含むエラーが発生して困った経験はないでしょうか。 Unsupportedエラーが発生する要因は事象によって異なりますが、とくにコンパイル時のエラーとして発生しているケースを多く見かけます。 本記事ではコンパイル時に発生するエラーとして、Unsupportedエラーが発生した場合の原因と解決方法を紹介していきます。

Address項目タイプを利用してUnsupportedエラーが発生する要因

SalesforceのVisualforceを利用してAddressという項目タイプを選択するとき、直接Visualforceページに使用すると、このUnsupportedエラーが発生します。 発生の理由は、Addressという項目タイプが構造化された複合データ型であるためです。 つまり「Address(住所)」というデータ型は、複数のデータ項目からなる複合型なので、「Address(住所)」単体では複数データ項目を出力できません。 補足として、Address(住所)型では各データ項目が参照されていますが、カスタムオブジェクトでは、Address(住所)と同じデータ項目を作成するとUnsupportedエラーが発生します。 各データ型の種類を確認するためには、Salesforceのオブジェクトマネジャーで検索してみてください。

Unsupportedエラーが発生する記述例

以下の記述はSalesforceのVisualforceを利用してAccount.ShippingAddressを直接出力しようとしている例です。 この場合はコンパイル時にUnsupportedエラーが発生します。
< apex:page standardController=""Account"" >
    < apex:pageBlock >
            < apex:pageBlockSection title=""取引先の住所"" >
・・・
            < apex:outputText value=""{!Account.ShippingAddress}"" / >
        < /apex:pageBlockSection >
    < /apex:pageBlock >
< /apex:page >
Unsupportedエラーは以下のようなメッセージで出力されます。
”Unsupported type: common.api.soap.wsdl.Address used in expression :Account.ShippingAddress”
上記のUnsupportedエラーを翻訳すると、「common.api.soap.wsdl.Address上で、”Account.ShippingAddress”この記述はサポートされていません。」となります。複合型データを直接参照するときに発生するUnsupportedエラーです。 次に複合型データを直接参照するときに発生するUnsupportedエラーの回避方法を紹介します。

Unsupportedエラーの発生を回避する記述例

Unsupportedエラーを回避するためには、「Address(住所)」というデータ型に含まれる各データに出力します。
< apex:page standardController=""Account"" >
    < apex:pageBlock >
            < apex:pageBlockSection title=""取引先の住所"" >
・・・
            < apex:outputText value=""{!Account.ShippingPostalCode}"" / >
            < apex:outputText value=""{!Account.ShippingState}"" / >
            < apex:outputText value=""{!Account.ShippingCity}"" / >
            < apex:outputText value=""{!Account.ShippingStreet}"" / >
        < /apex:pageBlockSection >
    < /apex:pageBlock >
< /apex:page >
ShippingPostalCod、ShippingState、ShippingCity、ShippingStreetを個別に参照することで、複合Account項目の各データを個別に取得しています。 上記で取り上げた項目の他にも、複合Account項目の各データにはいくつか種類がありますので紹介します。
  • Accuracy(住所の地理コードの精度レベル)
  • City(住所の市区郡の詳細)
  • Country(住所の国の詳細)
  • CountryCode(住所の ISO 国コード)
  • Latitude(住所の正確な地理位置情報)
  • Longitude(住所の正確な地理位置情報)
  • PostalCode(住所の郵便番号)
  • State(住所の都道府県の詳細)
  • StateCode(住所の ISO 都道府県コード)
  • Street(住所の町名・番地の詳細)
オブジェクトごとに異なる住所が存在する場合は、複合Address項目のデータ前に住所の種別名を記載します。たとえば、ShippingCountry、BillingCountryのように記述してください。 次の項では、項目をBillingCountryに指定した場合に、Unsupportedエラーが発生したときの記述を例にとって解説していきます。

SOQLでNo such column ~エラーが出力された際の対処法

SOQLでSelectを指定したときのエラーが発生した場合も、BillingAddress項目も複合Address項目データであるため、複合Address項目のデータごとに出力してください。
No such column 'BillingAddress' on entity 'Account'.
SalesforceのVisualforceを利用してBillingAddress項目から複合Address項目のデータを出力したい場合は、代わりに以下の項目から出力してください。
  • BillingCountry: 国 (請求先)
  • BillingPostalCode: 郵便番号 (請求先)
  • BillingState: 都道府県 (請求先)
  • BillingCity: 市区郡 (請求先)
  • BillingStreet: 町名・番地 (請求先)

Unsupportedエラーの発生する記述例

前述と同じく、VisualforceにおいてAccount.BillingAddressから直接データを出力しようとすると、コンパイル時にUnsupportedエラーが発生します。
< apex:outputText value=""{!Account.BillingAddress}"" / >
発生したエラーの内容は以下の通りです。
Unsupported type: common.api.soap.wsdl.Address used in expression: Account.BillingAddress
上記のエラーは、BillingAddressで複合Address項目の各データ項目が存在しないことを知らせています。

Unsupportedエラーの発生を回避する記述例

Unsupportedエラーの発生を回避するために、以下のように各データに出力する記述をしてください。
< apex:outputText value=""{!Account.BillingPostalCode}"" / >
< apex:outputText value=""{!Account.BillingCountry}"" / >
< apex:outputText value=""{!Account.BillingState}"" / >
< apex:outputText value=""{!Account.BillingCity}"" / >
< apex:outputText value=""{!Account.BillingStreet}"" / >

Apex Codeで元となる項目を検索する

BillingAddressでデータ出力する代わりに、BillingCountry、BillingPostalCode、BillingState、BillingCity、BillingStreetの複合Address項目の各データを出力します。
public class AddressFieldController {
  public Account record{get; private set;}
  public AddressFieldController(ApexPages.StandardController controller) {
    record = [SELECT Id, Name, BillingCountry, BillingPostalCode, BillingState, BillingCity, BillingStreet, BillingLatitude, BillingLongitude
              FROM Account WHERE Id = :controller.getId()
            ];
  }
}
複合Address項目の各データ項目の値を出力すると、それぞれAddress(住所)というデータ型で返されます。
< apex:page standardController=""Account"" extensions=""AddressFieldController"" >
  < apex:sectionHeader title=""{!record.name}"" / >
  < apex:pageBlock title=""{!record.name}"" >
    < apex:pageBlockSection title=""AccountSection"" columns=""1"" >
      < apex:outputField value=""{!record.Name}"" / >
      < apex:pageBlockSectionItem >
        < apex:outputLabel value=""BillingAddress"" / >
        < apex:outputPanel >
          < apex:outputText value=""{!record.BillingCountry}"" / >< br / >
          < apex:outputText value=""{!record.BillingPostalCode}"" / > 
          < apex:outputText value=""{!record.BillingState}"" / > 
          < apex:outputText value=""{!record.BillingCity}"" / > < br / >
          < apex:outputText value=""{!record.BillingStreet}"" / >
        < /apex:outputPanel >
      < /apex:pageBlockSectionItem >
    < /apex:pageBlockSection >
  < /apex:pageBlock >
< /apex:page >
上記記述の例では、BillingCountry、BillingPostalCode、BillingState、BillingCity、BillingStreetの複合Address項目の各データを個別に参照していることがわかります。

Unsupportedエラーは、Address複合型データの扱い方で回避

Addressという項目タイプが構造化された複合データ型であるため、VisualforceでAddressという項目タイプを選択して直接SalesforceのVisualforceページに使用すると、このUnsupportedエラーが発生します。 「Address(住所)」というデータ型は、複数のデータ項目からなる複合型なので、「Address(住所)」単体では複数データ項目を出力できないことを覚えておきましょう。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】