sObject 項目へのアクセス
Java の場合と同様に、単純なドット表記を使用して sObject 項目にアクセスしたり、変更したりできます。次に例を示します。
1Account a = new Account();
2a.Name = 'Acme'; // Access the account name field and assign it 'Acme'[作成者] または [最終更新日] など、システムによって-生成された項目は変更できません。変更しようとすると、Apex ランタイムエンジンはエラーを生成します。また、数式項目値と、コンテキストユーザ参照専用の他の項目値も変更できません。
Account などの特定のオブジェクトではない汎用 sObject 種別の場合、ドット表記を使用して Id 項目のみを取得できます。Salesforce API バージョン 27.0 以降を使用して保存された Apex コードの Id 項目を設定できます)。また、汎用の sObject put メソッドおよび get メソッドも使用できます。「SObject クラス」を参照してください。
この例では、Id 項目にアクセスする方法および汎用 sObject で許可されない操作を示します。
1Account a = new Account(Name = 'Acme', BillingCity = 'San Francisco');
2insert a;
3sObject s = [SELECT Id, Name FROM Account WHERE Name = 'Acme' LIMIT 1];
4// This is allowed
5ID id = s.Id;
6// The following line results in an error when you try to save
7String x = s.Name;
8// This line results in an error when you try to save using API version 26.0 or earlier
9s.Id = [SELECT Id FROM Account WHERE Name = 'Acme' LIMIT 1].Id;1Account a = new Account(Name = 'Acme', BillingCity = 'San Francisco');
2insert a;
3sObject s = [SELECT Id, Name FROM Account WHERE Name = 'Acme' LIMIT 1];
4ID id = s.ID;
5Account convertedAccount = (Account)s;
6convertedAccount.name = 'Acme2';
7update convertedAccount;
8Contact sal = new Contact(FirstName = 'Sal', Account = convertedAccount);1public class convertToCLA {
2 List<Contact> contacts = new List<Contact>();
3 List<Lead> leads = new List<Lead>();
4 List<Account> accounts = new List<Account>();
5
6 public void convertType(String phoneNumber) {
7 List<List<SObject>> results = [FIND :phoneNumber
8 IN Phone FIELDS
9 RETURNING Contact(Id, Phone, FirstName, LastName),
10 Lead(Id, Phone, FirstName, LastName),
11 Account(Id, Phone, Name)];
12 List<SObject> records = new List<SObject>();
13 records.addAll(results[0]); //add Contact results to our results super-set
14 records.addAll(results[1]); //add Lead results
15 records.addAll(results[2]); //add Account results
16
17 if (!records.isEmpty()) {
18 for (Integer i = 0; i < records.size(); i++) {
19 SObject record = records[i];
20 if (record.getSObjectType() == Contact.sObjectType) {
21 contacts.add((Contact) record);
22 } else if (record.getSObjectType() == Lead.sObjectType){
23 leads.add((Lead) record);
24 } else if (record.getSObjectType() == Account.sObjectType) {
25 accounts.add((Account) record);
26 }
27 }
28 }
29 }
30}sObject 項目の使用
sObject 項目は、最初に設定することも、しないこともできます (未設定)。未設定の項目は、空白や null とは違います。sObject で DML 操作を実行するとき、設定済みの項目は変更できますが、未設定の項目は変更できません。
Apex メソッドが sObject を取らない場合には、System.isSet(field) を使用することで、設定済み項目を特定できます。値を保持するために項目の設定を解除する場合は、最初に sObject インスタンスを作成します。次に、DML 操作に含める項目のみを適用します。
次のコード例は、sObject 項目が設定済みであるか未設定であるかを特定する方法について示しています。
1Contact nullFirst = new Contact(LastName='Codey', FirstName=null);
2System.assertEquals(true, nullFirst.isSet('FirstName'), 'FirstName is set to a literal value, so it counts as set');
3Contact unsetFirst = new Contact(LastName='Astro');
4System.assertEquals(false, unsetFirst.isSet('FirstName'), ‘FirstName is not set’);Boolean 型の sObject 項目を含む式は、sObject 項目が true の場合にのみ、true と評価されます。この項目が false または null の場合、式が false と評価されます。このサンプルコードは、Campaign オブジェクトの IsActive 項目が null かどうかを確認する式を示しています。この式は常に false に評価されるため、if ステートメント内のコードが実行されることはありません。
1Campaign cObj= new Campaign();
2...
3 if (cObj.IsActive == null) {
4 ... // IsActive is evaluated to false and this code block is not executed.
5 }