' P '

whatever I will forget

Platform Developer I - Developer Fundamentals

外部オブジェクトと標準オブジェクトの関連付け

標準/カスタムオブジェクトを親とし、外部オブジェクトを子としたい

外部オブジェクトを親とし、標準子 / カスタムオブジェクトを子としたい

  • 外部参照関係項目を使用する.

JSON対応のAPI

Pub/SubのAPI

  • Streaming API.

Apex

選択リストの操作

Schema.DescribeFieldResult F = Account.Industry.getDescribe();
List<Schema.PicklistEntry> P = F.getPicklistValues();

Apex Reference Guide: PicklistEntry Class

あるレコードタイプに対しての情報を取得する

RecordType recType = [SELECT Id,Name FROM RecordType 
WHERE SobjectType='Contact' AND DeveloperName='PartnerContact' LIMIT 1];
Schema.DescribeSObjectResult result = Schema.SObjectType.Contact;
// これ
Map<Id,Schema.RecordTypeInfo> mapRecTypes = result.getRecordTypeInfosById();  
Schema.RecordTypeInfo recordTypeInfo = mapRecTypes.get(recType.id);

レコードタイプの開発者名を取得

Schema.DescribeSObjectResult dsr = Schema.SObjectType.Account;
System.debug(dsr.getRecordTypeInfosByDeveloperName());

項目権限レベルのチェック

if (Schema.sObjectType.Contact.fields.Email.isAccessible()) {
   Contact c = [SELECT Email FROM Contact WHERE Id= :Id];
}

Apex Reference Guide: Enforcing Object and Field Permissions

Get App metadata

Schema.DescribeTabSetResult[] r = Schema.describeTabs();

全SObjectのメタデータ取得

Map<String, Schema.SObjectType> m = Schema.getGlobalDescribe();
for(String s : m.keySet()) {
    DescribeSObjectResult dsr = m.get(s).getDescribe();
    System.debug('Object Name : ' + dsr.getName());
}

SObjectタイプを取得する

Schema.DescribeSobjectResult[] r = Schema.describeSObjects(s);
for(Schema.DescribeSobjectResult result : r) {
    System.debug('Label of sObject: ' + result.getLabel());
}

項目が現在のユーザにて参照可能か確認する

Schema.DescribeFieldResult dfr = Account.Description.getDescribe();
System.debug(dfr.isAccessible());

数式フィールドが空白を0として扱うかチェック

Schema.DescribeFieldResult dfr = Opportunity.TestFormula__c.getDescribe();
System.debug(dfr.isFormulaTreatNullNumberAsZero());

Integer型変数の桁チェック

Schema.DescribeFieldResult dfr = Account.NumberOfEmployees.getDescribe();
System.debug(dfr.getDigits());

カスタム例外を作成する

  • カスタム例外は、内部クラスだけでなくトップレベル・クラスにもなり、メンバ変数、メソッド、コンストラクタをサポートする.
  • カスタム例外は組み込み例外クラスを拡張したもので、その名前は 'Exception' で終わる必要があります.
  • カスタム例外と組み込み例外は、ジェネリックなExceptionを除いて、明示的にスローすることができます.
  • 例外をキャッチした場合、スローされたカスタム例外のパラメータとして例外を渡すなどして、例外を再スローすることができます。これは、メソッドが他のメソッドから呼び出され、例外処理を呼び出し元のメソッドに委譲する必要がある場合に便利です.
  • すべての例外をキャッチできるわけではないことに注意してください。キャッチできない例外は LimitException と AssertException です.
  • 下記のようなCustom Exception Classとメソッドを実装する.
public class MyCustomException extends Exception {
     class testException extends Exception {}
     public void logException(Boolean flag) {
          if(flag == false) {
               throw new textException('test exception');
          else {
               //
          }
     }
  • あとはtry-catchで使用する.
try {
     testException te = new testException();
     te.logException(false);
} catch {
     System.debug('exception! + error.getMessage());
}

User Interface

静的リソースのCSSをVisualforceで読み込む

  • <apex:stylesheet/>を使って、静的リソースのURLを取得する.
<apex:stylesheet value="{!URLFOR($Resource.StyleResource, 'cosmic.css')}"/>

読みこめるレコードの最大数

  • 10000件.
  • StandardSetControllerDatabase.getQueryLocator()インスタンス化した場合は、例外がthrowされる.
  • SObjectのリストでインスタンス化した場合は10000レコードに切り捨てられ、例外は発生しない.
ApexPages.StandardSetController ssc = new ApexPages.StandardSetController(Database.getQueryLocator( [SELECT...] // SOQL ));

複数選択されたレコードの処理

  • getSelected()で選択レコードを取得.
  • getRecord()で選択されたSObjectが返却される.

取引先と個人取引先について

  • Nameが入力されている場合はbuisnessアカウント.
  • LastNameが入力されている場合あpersonアカウント.

標準ページのボタンアクションをオーバーライドしたい

  • 標準コントローラーを使用する.
  • コントローラー拡張は機能追加時に使用する.

Cross-Site Scripting (XSS) 攻撃を無効化する手段

  1. HTMLENCODE() - この関数を使用すると、HTML コンテキストに反映する前に、入力の HTML エンコーディングを追加で実行できます.
  2. JSENCODE() - この関数を使用すると、JavaScript コンテキストでリフレクションの前に入力の JavaScript エンコーディングを実行できます.
  3. JSINHTMLENCODE() - 自動 HTML エンコーディングが導入される前は、開発者は HTML 内の JavaScript イベントハンドラにマージフィールドを含めるときにこの関数を呼んでいました.
  4. JSENCODE(HTMLENCODE()) - この関数は、JSINHTMLENCODE() の代わりに使用できます。

Aura ComponentのComponent / Application Event

SOQLで項目レベルセキュリティーを考慮する場合

  • stripInaccessibleメソッドを使う.
  • これを使えば、SOQLクエリを変えることなく、READができないユーザに対してはその項目を除去したクエリ結果を取得できる.
List<Custom__c> cst = [SELECT Name, xxxx FROM Custom__c ];
SobjectAccessDecision decision = Securiy.stripInaccesible(AccessType.READABLE, cst);
List<Custom__c> cstStrip = decision.getRecords();

暗号化

  • Cryptoクラスのメソッドを使用して暗号化・解読
    public static Blob encryptData(String data) {

        // initialization vector must be 16 bytes
        Blob initializationVector = Blob.valueOf('Example of IV123');
        Blob key = Crypto.generateAesKey(256); 
        Blob dataBlob = Blob.valueOf(data);
        Blob encryptedData = Crypto.encrypt('AES256', key, initializationVector, dataBlob);

        Blob decryptedData = Crypto.decrypt('AES256', key, initializationVector, encryptedData); 
System.debug(decryptedData.toString());

        return encryptedData;
    }
}```

## Testing
### テスト時に実際のデータを使用したい場合
- Testクラスに`@isTest(seeAllData=True)`を追加する.  
- デフォルトではFalse.   

### 新規・既存ユーザでテストを行いたい場合
`System.runAs(userVar)`を使用する. 

### Scheduled JobをSOQLで取得したい場合
- 下記どちらかを使う.  

AsyncApexJob jobInfo = [SELECT Status, NumberOfErrors FROM AsyncApexJob WHERE JobType = 'ScheduledApex' LIMIT 1];

CronTrigger ct = [SELECT State, TimesTriggered FROM CronTrigger LIMIT 1];