Memos About Salesforce

Salesforceにハマってたこと!

SFDC SOQL 数式 ORA-00920エラーおよびIF Case 文

イングリッシュベルの公式ページ・無料体験はこちら

SFDCのクエリを発行する時に

Select 数式 From sObject

データへの問い合わせをしてみたら、

エラーメッセージ:

System.UnexpectedException: common.exception.SfdcSqlException: ORA-00920: invalid relational operator

になっていませんか

今回、

この解決方法について

共有したいと思います。

欲しけりゃくれてやる・・・。

探せ!

この世の全てをそこに置いてきた〜笑

目次

エラー原因

自分の場合は

数式を作って、

VFに表示する時にクエリでその数式にアクセスし

データを撮りに行ったシナリオ

検証したこと

開発者コンソールで

Select 数式カラムだけでタイムアウトになっていた

しかし、エラーメッセージを訳すと

関係演算子が無効

数式中身

数式は結局どのような構成かと言うと

10個くらいのIF文でネストしている

かなり、時間かかるやな

ラクルのエラーが出たし

salesforceの裏でオラクルであるって知っているが

なぜ、こんなエラーになったか

微妙に思っていたのが、数式本体複雑すぎるではないかと

解決方法

最後、数式を最適し、見直した できるだけ、IF文を減らしてた

そして、IFをCaseに切り替え

Case文でチェックボックス項目を評価する時に

trueやfalseに返すがCase文がテキストの"true","false"を返すので

IF文でそれをラッパーする必要がある こうしないと数式のコンパイラでずっと case文で引数のデータ型を間違えているってエラーになる

Case文でチェックボックスを評価するサンプル
No 数式項目 API データ型
1 数式評価 checkboxEX チェックボックス

エラーになる評価

アルゴリズム

 1:最後の更新日の月を評価する

   1月なら、真に返す

   2月なら、偽に返す

   それ以外なら、偽に返す

CASE(MONTH(LastActivityDate),
   1, "true",
   2, "false",
   "false")

評価結果 f:id:jude2016:20180824120208p:plain

上記が当たり前、違う、

なぜなら、Case文の返り値がテキストだから

じゃ、上記のCase文の返り値をテキストに直します そして、コンパイルをすると f:id:jude2016:20180824120257p:plain

ここがポイント

この数式の返り値チェックボックスBoolean

Case文の記述が正しいぞ、正しいのに、コンパイルエラー

Case文ややこしいなと思った時に

テキストである"true" また "false"をif文でラッパーしてみよう

f:id:jude2016:20180824120412p:plain

まとめ

下記のことがわかった

・数式はできるだけ簡潔に記述

・IF文をCASE文に切り替えて記述

 IF文のネストを避けましょう

・CASE文の返り値がテキストである