ID値の15桁表現と18桁表現

by Tetsuo Ajima on 10月 29, 2013 at 06:46 午後

みなさん、Apexコード書いてますか?

ご存知かと思いますが、SalesforceのレコードIdには15桁表現と18桁表現があります。
この違い、おわかりになりますか?

Idの15桁表現はcase-sensitiveです。つまり、大文字・小文字を区別して扱わないとユニークになりません。大文字・小文字の差異のみがある複数のレコードが存在する場合があります。対して、18桁表現では大文字・小文字を区別しません。
そのため、以下のようなコードを実行すると複数件の検索結果がヒットする可能性があります。

String accountId = contact.accountId.substring(0, 15);
List L = Database.query('Select Id, Name From Account Where Id=\'' + accountId + '\'';

また、次のようなコードでは、IdAとIdBは別レコードのIdでも同一Idと判断される場合があります。

String IdA = contactA.accountId.substring(0, 15);
String IdB = contactB.accountId.substring(0, 15);
if (IdA.equals(IdB)) // <== TRUE!

String.equals()は大文字・小文字を区別しません。大文字・小文字を区別したい場合は

if (IdA == IdB)

と書きます。Javaとは異なり、Apexにおける == は文字列比較です。インスタンス比較を行いたい場合は === を使います。

15桁と18桁の変換方法

18桁表現のId値を15桁表現に変換するには、後ろの3文字を切り捨てるだけでOKです。

String accountId15digit = contact.accountId.substring(0, 15);

15桁表現のId値を18桁表現に変換するには、String型ではなくId型を利用します。

Id accountId18digit = contact.accountId.substring(0, 15);

Id型はすべてのId値を18桁で扱います。15桁の値を代入した場合は18桁に変換されます。
Id値はString型で扱わず、Id型でハンドリングするのが安全な方法です。
 ※数式の場合はCASESAFEID関数を使います。



余談

case-sensitiveの話題ついでに。
Javascriptにおける document.getElementById()ですが、IE7以前ではcase-insensitiveでした。(IE8以降や他の主要ブラウザではcase-sensitive)
そのため、IE7以前で動作していたスクリプトがブラウザやOSのバージョンアップで動作しなくなるという場合があります。古いWebアプリは要注意ですね。