2012-03-08

Force.com : sObject#clone()


sObject clone(Boolean opt_preserve_id
                     , Boolean opt_IsDeepClone
                     , Boolean opt_preserve_readonly_timestamps
                     , Boolean opt_preserve_autonumber)



○ パラメータ

  • opt_preserve_id
    • true: ID を引き継ぐ
    • false: ID はクリアされる
  • opt_IsDeepClone
    • true: 深いコピー(クローン化されたオブジェクトに変更を加えても元のオブジェクトに影響しない)
    • false: 浅いコピー
  • opt_preserve_readonly_timestamps
    • true: CreatedById, CreatedDate, LastModifiedById, LastModifiedDate を引き継ぐ
    • false: CreatedById, CreatedDate, LastModifiedById, LastModifiedDate はクリアされる
  • opt_preserve_autonumber
    • true: 自動採番を引き継ぐ
    • false: 自動採番はクリアされる



○ 例

※ シチュエーションはフィーリングで
  • Visualforce で[取引先]と[取引先責任者]をともに新規登録する画面を作成するとか
  • その際、[取引先責任者]を登録時に入力規則、Trigger 等でエラーが発生する可能性があるとか
  • エラー発生時は、元の画面に戻って再入力を促すとか
  • ※ この場合[取引先]はロールバックされ、insert はなかったことにされるのだけれども、オブジェクトには登録後に設定された ID がそのまま設定されたままになるのです
public Account account {get; set;}
public List<Contact> contacts {get; set}

public PageReference save() {

    Savepoint sp = Database.setSavepoint();

    try {
        insert account;
    } catch(DmlException e) {
        for(Integer i=0; i<e.getNumDml(); i++) {
            if(StatusCode.FIELD_CUSTOM_VALIDATION_EXCEPTION == e.getDmlType(i)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, e.getDmlMessage(i), ''));
            }
        }
        Database.rollback(sp);
           return null;
    }

    for(Contact contact : contacts) {
        contact.accountid = account.Id;
    }
    try {
        insert contacts;
    } catch(DmlException e) {
        for(Integer i=0; i<e.getNumDml(); i++) {
            if(StatusCode.FIELD_CUSTOM_VALIDATION_EXCEPTION == e.getDmlType(i)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, e.getDmlMessage(i), ''));
            }
        }
        account = account.clone(false, true, true, true);        // <<- ココ
        Database.rollback(sp);
        return null;
    }

    ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'OK', ''));

    return null;
}



◇ 環境

  • Salesforce - Enterprise Edition - API バージョン 24.0



◇ 参考


0 件のコメント:

コメントを投稿