Skip to content

Instantly share code, notes, and snippets.

@tyoshikawa1106
Created February 14, 2015 03:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tyoshikawa1106/2ac1521c527e3aca4f48 to your computer and use it in GitHub Desktop.
Save tyoshikawa1106/2ac1521c527e3aca4f48 to your computer and use it in GitHub Desktop.
Database.DMLOptionsのサンプル
<apex:page controller="DMLOptionsDemoController" showHeader="true" sidebar="false">
<div id="vf-page">
<apex:form id="form">
<apex:pageBlock title="{!$ObjectType.Account.Label}" mode="edit" tabStyle="Account">
<apex:pageMessages id="msg" />
<apex:pageBlockButtons location="bottom">
<apex:commandButton value=" 保存 " action="{!doSave}" reRender="form" />
</apex:pageBlockButtons>
<apex:pageBlockSection title="情報">
<apex:inputField value="{!account.Name}" />
<apex:inputField value="{!account.AccountNumber}" />
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</div>
</apex:page>
public with sharing class DMLOptionsDemoController {
public Account account {get; set;}
public Boolean isDuplicate {get; set;}
public DMLOptionsDemoController () {
this.isDuplicate = false;
doInit();
}
public void doSave() {
// DMLOptions Class
Database.DMLOptions dml = new Database.DMLOptions();
// 重複レコード保存不可
dml.DuplicateRuleHeader.AllowSave = false;
// INSERT
Database.SaveResult sr = Database.insert(this.account, dml);
// エラー判定
if (!sr.isSuccess()) {
// 重複エラー
this.isDuplicate = true;
// Insertion failed due to duplicate detected
for(Database.Error duplicateError : sr.getErrors()){
// Datacloud.DuplicateResult
Datacloud.DuplicateResult duplicateResult = ((Database.DuplicateError)duplicateError).getDuplicateResult();
System.debug('Database.DuplicateResult:getFields() = ' + duplicateResult.getDuplicateRule());
System.debug('Database.DuplicateResult:getErrorMessage() = ' + duplicateResult.getErrorMessage());
System.debug('Database.DuplicateResult:getMatchResults() = ' + duplicateResult.getMatchResults());
System.debug('Database.DuplicateResult:isAllowSave() = ' + duplicateResult.isAllowSave());
// Database.DuplicateError
System.debug('Database.DuplicateError:getFields() = ' + duplicateError.getFields());
System.debug('Database.DuplicateError:getMessage() = ' + duplicateError.getMessage());
System.debug('Database.DuplicateError:getStatusCode() = ' + duplicateError.getStatusCode());
// Error Message
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, duplicateResult.getErrorMessage()));
}
} else {
// 正常実行
this.isDuplicate = false;
// Create Message
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, 'Create Account!!'));
// Default
doInit();
}
}
private void doInit() {
this.account = new Account(
Name = 'Sample Account'
,AccountNumber = 'Sample Number'
);
}
}
@isTest
private class DMLOptionsDemoControllerTest {
private static User testAdminUser = CommonTester.getLoginUser();
/**
* DMLOptionsDemoControllerTest1
*/
static testMethod void DMLOptionsDemoControllerTest1() {
System.runAs(testAdminUser) {
Test.startTest();
// Test
DMLOptionsDemoController cls = new DMLOptionsDemoController();
Test.stopTest();
// Result
System.assertEquals(cls.isDuplicate, false);
System.assertEquals(cls.account.Name, 'Sample Account');
System.assertEquals(cls.account.AccountNumber, 'Sample Number');
}
}
/**
* doSaveTest1
*/
static testMethod void doSaveTest1() {
System.runAs(testAdminUser) {
Test.startTest();
// Test
DMLOptionsDemoController cls = new DMLOptionsDemoController();
cls.doSave();
Test.stopTest();
// Result
System.assertEquals(cls.isDuplicate, false);
List<Account> resultAccounts = [SELECT Id,Name,AccountNumber FROM Account LIMIT 1];
System.assertEquals(resultAccounts.size(), 1);
System.assertEquals(resultAccounts[0].Name, 'Sample Account');
System.assertEquals(resultAccounts[0].AccountNumber, 'Sample Number');
}
}
/**
* doSaveTest2
*/
static testMethod void doSaveTest2() {
System.runAs(testAdminUser) {
Test.startTest();
// Test
DMLOptionsDemoController cls = new DMLOptionsDemoController();
// 保存1回目
cls.doSave();
// 保存2回目 (重複エラー発生条件)
cls.doSave();
Test.stopTest();
// Result
System.assertEquals(cls.isDuplicate, true);
List<Account> resultAccounts = [SELECT Id,Name,AccountNumber FROM Account LIMIT 1];
System.assertEquals(resultAccounts.size(), 1);
System.assertEquals(resultAccounts[0].Name, 'Sample Account');
System.assertEquals(resultAccounts[0].AccountNumber, 'Sample Number');
}
}
/**
* doSaveTest3
*/
static testMethod void doSaveTest3() {
System.runAs(testAdminUser) {
Test.startTest();
// Test
DMLOptionsDemoController cls = new DMLOptionsDemoController();
// 保存1回目
cls.doSave();
// 保存2回目 (条件変更)
cls.account.AccountNumber = cls.account.AccountNumber + '★';
cls.doSave();
Test.stopTest();
// Result
System.assertEquals(cls.isDuplicate, false);
List<Account> resultAccounts = [SELECT Id,Name,AccountNumber FROM Account ORDER BY AccountNumber ASC LIMIT 5];
System.assertEquals(resultAccounts.size(), 2);
System.assertEquals(resultAccounts[0].Name, 'Sample Account');
System.assertEquals(resultAccounts[0].AccountNumber, 'Sample Number');
System.assertEquals(resultAccounts[1].Name, 'Sample Account');
System.assertEquals(resultAccounts[1].AccountNumber, 'Sample Number★');
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment