【Salesforce】String型についての勘違い

【Salesforce】String型についての勘違い

Salesforceで開発していて、よく使う型の中にString型があります。

私は基本的にApexで使用する場合にはブランク(”)を設定した後に使用します。

String型の文字列は宣言しただけだとnullが入っているため、そのようにしています。

うっかりnullのまま使用するのを防ぐためです。

String str;

system.debug(str);      // null

str.equals('TEST');     // null参照エラー

 

一方で、SObject型のテキスト項目を使用する場合はそのようなことをしません。

比較する場合は比較対象の文字列にてStringのメソッドを使用しています。

取引先の取引先番号で例を示します。

Account acc;
String str;

// 取引先を作成する
acc = new Account();
acc.Name = 'TEST';
insert acc;

acc = [select Id, AccountNumber from Account where Id = :acc.Id];

str = '012345';
str.equals(acc.AccountNumber);     // 比較対象の文字列を使用

strに値が設定されているため、null参照エラーは発生しません。

 

前置きが長くなってしまいましたが、ここからが本題です。

SObjectのテキスト項目に対して文字列を設定した場合、設定した文字列が必ず設定されているものと思っていました。

その思い込みで作成したコードは、思わぬ結果となりました。

Account acc;
String str;

// AccountNumberに設定する文字列
str = '';

// 取引先を作成する
acc = new Account();
acc.Name = 'TEST';
acc.AccountNumber = '';
insert acc;

// 再取得前
system.debug('【ログ】str : ' + str);                                                       // ブランク
system.debug('【ログ】acc.AccountNumber : ' + acc.AccountNumber);                           // ブランク
system.debug('【ログ】str.equals(acc.AccountNumber) : ' + str.equals(acc.AccountNumber));   // true

acc = [select Id, AccountNumber from Account where Id = :acc.Id];

// 再取得後
system.debug('【ログ】str : ' + str);                                                       // ブランク
system.debug('【ログ】acc.AccountNumber : ' + acc.AccountNumber);                           // null
system.debug('【ログ】str.equals(acc.AccountNumber) : ' + str.equals(acc.AccountNumber));   // false

SELECTで再取得する前は、当然のようにTRUEが返ってきます。

設定した値と設定された値を比較しているのですから当然ですね。

しかし、レコードを再取得したことによって取引先番号の項目にnullが設定されており、比較した結果はfalseとなっています。

これにより、私が書いたロジックは思わぬ動きをしていました。

 

調べてみると、ちゃんと書いてありますね。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_primitives.htm

SObjectのString項目には空白が設定できないそうです。

それゆえに、String項目に空白を設定するとnullの項目とされてしまうのでしょうね。

確認してみると、選択リストの項目でも同じことが起きました。

まだまだ知識不足ですね。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です