web-dev-qa-db-ja.com

Jitterbitから呼び出されたSOQLステートメントをテストすると、「バインド変数はApexコード[MALFORMEDQUERY]でのみ許可されます」というエラーが表示されます。

Jitterbitを使用してSalesforceからレコードをクエリしていますが、問題が発生しています。クエリ条件ステートメントで、Salesforceテーブルの2つのフィールドを比較しています。クエリをテストしようとすると、「バインド変数はApexコード[MALFORMEDQUERY]でのみ許可されています」というエラーが表示されます。

クエリの例を次に示します。

SELECT Id FROM Price_Agreement_Item__c WHERE Approved_Date__c > Last_Upload_Date__c

フィールド Approved_Date__cおよびLast_Upload_Date__cは両方ともSalesforceテーブルに含まれていますPrice_Agreement_Item__c。テーブル内の2つのフィールドを比較するselectステートメントを条件付けるSOQLステートメントをどのように作成しますか?

どんな助けでも大歓迎です。

前もって感謝します。

8
NickFranco

Daniel Ballingerが言ったことに加えて、SoapAPIはSOQLクエリで「IN」句を許可しません。ばかげていますが、これもSalesforceの95%です。

19
abhishekbh

SOQLは現在、WHERE句でのフィールド間の直接比較をサポートしていません。 From SOQLのWHERE句でのフィールド間の比較

SOQLのWHERE句でのフィールド間の比較

ナレッジ記事番号:000187460

説明
WHERE句で同じオブジェクトの2つのフィールドを比較してクエリを実行したいのですが、WHERE句で条件の右側のフィールドを使用できません。

List<user> users = [SELECT Id,name FROM User WHERE (FirstName != Lastname)];

上記のクエリは次を返します: "System.QueryException:予期しないトークン: '姓'"

解決策
Salesforceでは、SOQLクエリでのフィールド間の直接比較は許可されていません。

これを実現するために、フィールドを比較し、WHERE句で使用できる値(trueまたはfalseなど)を返す数式フィールドを作成できます。

したがって、上記のクエリでは、戻り値の型がテキストのUserオブジェクトに数式フィールドを作成できます。 NameCompare、式IF(User.FirstName!= User.LastName、 'true'、 'false')

これで、クエリは次のようになります。

List<User> Users = [SELECT id, name FROM User where NameCompare= 'true'];

SOQLでフィールド間の比較を可能にするために、次のアイデアがideaexchangeポータルに投稿されました。

https://success.salesforce.com/ideaView?id=08730000000BrHAAA

チェックボックスタイプの 数式フィールド を作成して、ブール値を返すことができます。

Approved_Date__c > Last_Upload_Date__c

次に、次のようにWHERE句を使用してクエリを書き直します。

SELECT Id  
FROM Price_Agreement_Item__c 
WHERE Approved_Date_Greater_Than_Last_Upload_Date__c = true

これがスキャンする必要がある行数に注意してください。インデックスを使用できないため、全表スキャンになります。行数が多すぎると、他のエラーが発生する可能性があります。

ちなみに、 Salesforce Stack Exchange は、Salesforce固有の質問をするのに最適な場所です。この回答は、JesseAltmanが回答した質問とKeithCおよびsfdcfoxのコメントを参照しています。

6

これが発生する可能性のある別の方法は、クエリをコマンドラインにコピーして、文字列定数の前後の引用符をエスケープせずに実行する場合です。

例:これ:

curl -X GET https://x.salesforce.com/services/data/v31.0/query?q=SELECT%20COUNT\(\)%20FROM%20YourObj%20WHERE%20field%20!=%20'Good'

これである必要があります:

curl -X GET https://x.salesforce.com/services/data/v31.0/query?q=SELECT%20COUNT\(\)%20FROM%20YourObj%20WHERE%20field%20!=%20%27Good%27
1
Ed Norris