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")
評価結果
上記が当たり前、違う、
なぜなら、Case文の返り値がテキストだから
じゃ、上記のCase文の返り値をテキストに直します そして、コンパイルをすると
ここがポイント
この数式の返り値がチェックボックス(Boolean)
Case文の記述が正しいぞ、正しいのに、コンパイルエラー
Case文ややこしいなと思った時に
テキストである"true" また "false"をif文でラッパーしてみよう
まとめ
下記のことがわかった
・数式はできるだけ簡潔に記述
・IF文をCASE文に切り替えて記述
IF文のネストを避けましょう
・CASE文の返り値がテキストである