Apex ããªã¬ãŒå ¥é
åŠç¿ã®ç®ç
ãã®åå ãå®äºãããšã次ã®ããšãã§ããããã«ãªããŸãã
- Salesforce ãªããžã§ã¯ãã®ããªã¬ãŒãäœæããã
- ããªã¬ãŒã³ã³ããã¹ã倿°ã䜿çšããã
- ããªã¬ãŒããã¯ã©ã¹ã¡ãœãããã³ãŒã«ããã
- ããªã¬ãŒã§ sObject
addError()ã¡ãœããã䜿çšããŠä¿åæäœãå¶éããã
å§ããåã«
Apex ããªã¬ãŒã¯æ¥œãã䟿å©ã§æ©èœçã§ãããã®ã¢ãžã¥ãŒã«ã§ã¯ãApex ã䜿ãå§ããããããã«åºæ¬ã説æããŸãããŸããã»ãã® Salesforce æ©èœã«ãèšåããªãã Apex ããªã¬ãŒã®åã玹ä»ããŸãããã®ã¢ãžã¥ãŒã«ãæå€§éã«æŽ»ããã«ã¯ã次ã®ã¢ãžã¥ãŒã«ãå ã«å®äºããããšããå§ãããŸãã
-
ã¯ã€ãã¯ã¹ã¿ãŒã: Apex
-
Apex ã®åºæ¬ãšããŒã¿ããŒã¹
-
ã·ã¹ãã 管çè
ã®ããã® SOQL
-
éçºè
ã³ã³ãœãŒã«ã®åºç€
Apex ããªã¬ãŒã®äœæ
Apex ããªã¬ãŒã䜿çšãããšãSalesforce ã®ã¬ã³ãŒãã«å¯Ÿããã€ãã³ã (æ¿å ¥ãæŽæ°ãåé€) ã®åãŸãã¯åŸã«ã«ã¹ã¿ã ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸããããŒã¿ããŒã¹ã·ã¹ãã ã§ããªã¬ãŒããµããŒããããã®ãšåæ§ã«ãApex ã«ãããŠãã¬ã³ãŒãã管çããç®çã§ããªã¬ãŒããµããŒããããŠããŸãã
äžè¬ã«ãããªã¬ãŒã䜿çšããã®ã¯ãç¹å®ã®æ¡ä»¶ã«åºã¥ããŠæäœãå®è¡ããå Žåãé¢é£ã¬ã³ãŒãã倿Žããå ŽåããŸãã¯ç¹å®ã®æäœã®å®è¡ãå¶éããå Žåã§ããSOQL ããã³ DML ã®å®è¡ããã«ã¹ã¿ã Apex ã¡ãœããã®ã³ãŒã«ãªã©ãApex ã§è¡ããããšã¯ãã¹ãŠããªã¬ãŒã䜿ã£ãŠå®è¡ã§ããŸãã
ããªã¬ãŒã䜿çšããã®ã¯ãSalesforce ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®ãã€ã³ã & ã¯ãªãã¯ããŒã«ã§ã¯å®è¡ã§ããªããããªã¿ã¹ã¯ãå®è¡ããå Žåã§ããããšãã°ãã¬ã³ãŒãã®é ç®å€ã®æ€èšŒãé ç®ã®æŽæ°ãè¡ãå Žåãå ¥åèŠåããããŒã䜿çšããŸããããã©ãŒãã³ã¹ãšæ¡åŒµæ§ãéèŠããå Žåããã€ã³ã & ã¯ãªãã¯ããŒã«ã®ããžãã¯ãè€éãããå ŽåããŸã㯠CPU 䜿çšçã®é«ãæäœãå®è¡ããå Žåã¯ãApex ããªã¬ãŒã䜿çšããŸãã
ããªã¬ãŒãå®çŸ©ã§ããã®ã¯ãAccountãContact ãšãã£ãæäžäœã®æšæºãªããžã§ã¯ããã«ã¹ã¿ã ãªããžã§ã¯ããäžéšã®åæšæºãªããžã§ã¯ãã§ããããªã¬ãŒã¯äœææã«ããã©ã«ãã§æå¹ã«ãªããŸããSalesforce ã§ã¯ãæå®ããããŒã¿ããŒã¹ã€ãã³ããçºçãããšãã«æå¹ãªããªã¬ãŒãèªåçã«å®è¡ãããŸãã
ããªã¬ãŒæ§æ
ããªã¬ãŒå®çŸ©ã®æ§æã¯ãã¯ã©ã¹å®çŸ©ã®æ§æãšã¯ç°ãªããŸããããªã¬ãŒå®çŸ©ã¯ãtrigger ããŒã¯ãŒãã§éå§ããŸãããã®åŸã«ãããªã¬ãŒã®ååãããªã¬ãŒãé¢é£ä»ããããŠãã Salesforce ãªããžã§ã¯ããããªã¬ãŒãå®è¡ããæ¡ä»¶ãç¶ããŸããããªã¬ãŒã®æ§æã¯æ¬¡ã®ãšããã§ãã
trigger TriggerName on ObjectName (trigger_events) {
code_block
}æ¿å ¥ãæŽæ°ãåé€ãåŸ©å æäœã®åãŸãã¯åŸã«ããªã¬ãŒãå®è¡ããå Žåãã«ã³ãåºåãã®ãªã¹ãã§è€æ°ã®ããªã¬ãŒã€ãã³ããæå®ããŸããæå®ã§ããã®ã¯æ¬¡ã®ã€ãã³ãã§ãã
before insertbefore updatebefore deleteafter insertafter updateafter deleteafter undelete
ããªã¬ãŒã®äŸ
次ã®ç°¡åãªããªã¬ãŒã¯ãååŒå ãæ¿å ¥ããåã«å®è¡ããããããã°ãã°ã«ã¡ãã»ãŒãžãæžã蟌ã¿ãŸãã
- éçºè
ã³ã³ãœãŒã«ã§ã[File (ãã¡ã€ã«)] | [New (æ°èŠ)] | [Apex Trigger (Apex ããªã¬ãŒ)] ãã¯ãªãã¯ããŸãã
- ããªã¬ãŒåã«
HelloWorldTriggerãšå ¥åããŠãsObject ã« [Account (ååŒå )] ãéžæããŸãã[Submit (éä¿¡)] ãã¯ãªãã¯ããŸãã
- ããã©ã«ãã®ã³ãŒããæ¬¡ã®ã³ãŒãã«çœ®ãæããŸãã
trigger HelloWorldTrigger on Account (before insert) {
System.debug('Hello World!');
}- ä¿åããã«ã¯ã[Ctrl+S] ããŒãæŒããŸãã
- ããªã¬ãŒããã¹ãããã«ã¯ãååŒå
ãäœæããŸãã
-
[Debug (ãããã°)] | [Open Execute Anonymous Window (å®è¡å¿åãŠã£ã³ããŠãéã)] ãã¯ãªãã¯ããŸãã
- æ°ãããŠã£ã³ããŠã§ã次ã®ã³ãŒãã远å ããŠãã [Execute (å®è¡)] ãã¯ãªãã¯ããŸãã
Account a = new Account(Name='Test Trigger'); insert a;
- ãããã°ãã°ã§ã
Hello World!ã¹ããŒãã¡ã³ããèŠã€ããŸãããã°ã«ã¯ãããªã¬ãŒãå®è¡ãããããšã瀺ãããŸãã
ããªã¬ãŒã®çš®é¡
ããªã¬ãŒã«ã¯æ¬¡ã® 2 çš®é¡ããããŸãã
-
before ããªã¬ãŒã¯ãã¬ã³ãŒããããŒã¿ããŒã¹ã«ä¿åãããåã«ã¬ã³ãŒãã®å€ãæŽæ°ãŸãã¯æ€èšŒããå Žåã«äœ¿çšããŸãã
-
after ããªã¬ãŒã¯ãã·ã¹ãã ã«ãã£ãŠèšå®ãããé
ç®å€ (ã¬ã³ãŒãã®
Idé ç®ãLastModifiedDateé ç®ãªã©) ã«ã¢ã¯ã»ã¹ããå Žåããã»ãã®ã¬ã³ãŒãã®å€æŽã«åœ±é¿ãäžããå Žåã«äœ¿çšããŸããafter ããªã¬ãŒãå®è¡ããã¬ã³ãŒãã¯åç §ã®ã¿ã§ãã
ã³ã³ããã¹ã倿°ã®äœ¿çš
ããªã¬ãŒãå®è¡ããã¬ã³ãŒãã«ã¢ã¯ã»ã¹ããã«ã¯ãã³ã³ããã¹ã倿°ã䜿çšããŸããããšãã°ãTrigger.new ã«ã¯ãæ¿å
¥ãŸãã¯æŽæ°ããªã¬ãŒã§æ¿å
¥ããããã¹ãŠã®ã¬ã³ãŒããå«ãŸããŸããTrigger.old ã«ã¯ãæŽæ°ããªã¬ãŒã§æŽæ°ãããåã® sObject ã®æ§ããŒãžã§ã³ããŸãã¯åé€ããªã¬ãŒã§åé€ããã sObject ã®ãªã¹ãããããŸãã1 ã€ã®ã¬ã³ãŒããæ¿å
¥ãããå ŽåããAPI ãŸã㯠Apex ã䜿çšããŠå€æ°ã®ã¬ã³ãŒããäžæ¬ããŠæ¿å
¥ããå Žåã«ããªã¬ãŒãå®è¡ãããŸãããããã£ãŠãTrigger.new ãªã©ã®ã³ã³ããã¹ã倿°ã«ã¯ã1 ã€ã®ã¬ã³ãŒããå«ãŸããããšãããã°ãè€æ°ã®ã¬ã³ãŒããå«ãŸããããšããããŸããTrigger.new ã«å埩åŠçãè¡ããšãåã
ã® sObject ãååŸã§ããŸãã
次ã®äŸã¯ãHelloWorldTrigger ã®ãµã³ãã«ããªã¬ãŒã倿Žãããã®ã§ããfor ã«ãŒãã®åååŒå
ã«å埩åŠçãè¡ãããããããã® Description ([説æ]) é
ç®ãæŽæ°ãããŸãã
trigger HelloWorldTrigger on Account (before insert) {
for(Account a : Trigger.new) {
a.Description = 'New description';
}
}ã»ãã®äžå®ã®ã³ã³ããã¹ã倿°ã¯ãæŽæ°ã€ãã³ããå¥ã®äœããã®ã€ãã³ãã«ãã£ãŠããªã¬ãŒãå®è¡ããããã©ããã瀺ã Boolean å€ãè¿ããŸãããããã®å€æ°ã¯ãããªã¬ãŒã§è€æ°ã®ã€ãã³ããçµã¿åããããšãã«åœ¹ç«ã¡ãŸããæ¬¡ã«äŸã瀺ããŸãã
trigger ContextExampleTrigger on Account (before insert, after insert, after delete) {
if (Trigger.isInsert) {
if (Trigger.isBefore) {
// Process before insert
} else if (Trigger.isAfter) {
// Process after insert
}
}
else if (Trigger.isDelete) {
// Process after delete
}
}
次ã®è¡šã¯ãããªã¬ãŒã«äœ¿çšå¯èœãªãã¹ãŠã®ã³ã³ããã¹ã倿°ã®å æ¬çãªãªã¹ãã§ãã
倿° |
äœ¿çšæ¹æ³ |
|---|---|
isExecuting |
Apex ã³ãŒãã®çŸåšã®ã³ã³ããã¹ãã Visualforce ããŒãžãWeb ãµãŒãã¹ããŸã㯠|
isInsert |
æ¿å
¥æäœã«ãããSalesforce ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãApexããŸã㯠API ãããã®ããªã¬ãŒãå®è¡ãããå Žåã«ã |
isUpdate |
æŽæ°æäœã«ãããSalesforce ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãApexããŸã㯠API ãããã®ããªã¬ãŒãå®è¡ãããå Žåã«ã |
isDelete |
å逿äœã«ãããSalesforce ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãApexããŸã㯠API ãããã®ããªã¬ãŒãå®è¡ãããå Žåã«ã |
isBefore |
ã¬ã³ãŒããä¿åãããåã«ãã®ããªã¬ãŒãå®è¡ãããå Žåã«ã |
isAfter |
ãã¹ãŠã®ã¬ã³ãŒããä¿åãããåŸã«ãã®ããªã¬ãŒãå®è¡ãããå Žåã«ã |
isUndelete |
ã¬ã³ãŒãããã¿ç®±ãã埩å
ãããåŸã«ãã®ããªã¬ãŒãå®è¡ãããå Žåã«ã |
new |
æ°ããããŒãžã§ã³ã® sObject ã¬ã³ãŒãã®ãªã¹ããè¿ããŸãã ãã® sObject ãªã¹ã㯠|
newMap |
æ°ããããŒãžã§ã³ã® sObject ã¬ã³ãŒããžã® ID ã®å¯Ÿå¿ä»ãã§ãã ãã®å¯Ÿå¿ä»ã㯠|
old |
å€ãããŒãžã§ã³ã® sObject ã¬ã³ãŒãã®ãªã¹ããè¿ããŸãã ãã® sObject ãªã¹ã㯠|
oldMap |
å€ãããŒãžã§ã³ã® sObject ã¬ã³ãŒããžã® ID ã®å¯Ÿå¿ä»ãã§ãã ãã®å¯Ÿå¿ä»ã㯠|
operationType |
çŸåšã®æäœã«å¯Ÿå¿ãã System.TriggerOperation çš®å¥ã®åæå€ãè¿ããŸãã
|
size |
å€ãããŒãžã§ã³ãšæ°ããããŒãžã§ã³ã®äž¡æ¹ãå«ããããªã¬ãŒåŒã³åºãã®ã¬ã³ãŒãã®åèšæ°ã |
ããªã¬ãŒããã®ã¯ã©ã¹ã¡ãœããã®ã³ãŒã«
ããªã¬ãŒããå ¬éãŠãŒãã£ãªãã£ã¡ãœãããã³ãŒã«ã§ããŸããã»ãã®ã¯ã©ã¹ã®ã¡ãœãããã³ãŒã«ããããšã§ãã³ãŒããåå©çšã§ããããªã¬ãŒã®ãµã€ãºãçž®å°ããApex ã³ãŒãã®ã¡ã³ããã³ã¹ãåäžããŸãããŸãããªããžã§ã¯ãæåããã°ã©ãã³ã°ãå©çšã§ããããã«ãªããŸãã
次ã®ããªã¬ãŒäŸã¯ãããªã¬ãŒããéçã¡ãœãããã³ãŒã«ããæ¹æ³ã瀺ããŸããæ¿å
¥ã€ãã³ãã«ãã£ãŠããªã¬ãŒãå®è¡ãããå Žåããã®äŸã§ã¯ CustomContactNotification ã¯ã©ã¹ã§éç㪠notifyUsers() ã¡ãœãããã³ãŒã«ããŸãããã®ãŠãŒãã£ãªãã£ã¡ãœããã¯ãããªã¬ãŒã§å®çŸ©ããã Salesforce ãŠãŒã¶ãŒã«ã«ã¹ã¿ã éç¥ãéä¿¡ããŸããéç¥ã«ã¯ãæ¿å
¥ãããååŒå
責任è
ã¬ã³ãŒãã®ä»¶æ°ãå«ãŸããŸãã
- ãã¹ã¯ãããã®ã«ã¹ã¿ã éç¥ãäœæããŸãã
- [Setup (èšå®)] ã® [Quick Find (ã¯ã€ãã¯æ€çŽ¢)] ããã¯ã¹ã«
Notification Builder(éç¥ãã«ããŒ) ãšå ¥åããŠã[Custom Notifications (ã«ã¹ã¿ã éç¥)] ãéžæããŸãã
-
[New (æ°èŠ)] ãã¯ãªãã¯ããŸãã
- Custom Notification Name (ã«ã¹ã¿ã éç¥å) ã«
New Contact Notification(æ°èŠååŒå 責任è ã®éç¥) ãšå ¥åããŸãã
- API Name (API åç
§å) ã«
New_Contact_Notificationãšå ¥åããŸãã
- Supported Channels (ãµããŒãããããã£ãã«) ã§ [Desktop (ãã¹ã¯ããã)] ãéžæããŸãã
-
[Save (ä¿å)] ãã¯ãªãã¯ããŸãã
- [Setup (èšå®)] ã® [Quick Find (ã¯ã€ãã¯æ€çŽ¢)] ããã¯ã¹ã«
- éçºè
ã³ã³ãœãŒã«ã§ã[File (ãã¡ã€ã«)] | [New (æ°èŠ)] | [Apex Class (Apex ã¯ã©ã¹)] ãã¯ãªãã¯ããŸãã
-
CustomContactNotificationãšå ¥åããŠã[OK] ãã¯ãªãã¯ããŸãã
- ããã©ã«ãã®ã¯ã©ã¹æ¬æãã以äžã®
CustomContactNotificationã¯ã©ã¹ã®äŸã§çœ®ãæããŸãã
public with sharing class CustomContactNotification {
// Public method
public static void notifyUsers(Set<String> recipientsIds, Integer recordCount) {
// Get the ID for the custom notification type created in Setup
CustomNotificationType notificationType =
[SELECT Id, DeveloperName
FROM CustomNotificationType
WHERE DeveloperName='New_Contact_Notification'];
// Create a new custom notification
Messaging.CustomNotification notification = new Messaging.CustomNotification();
// Set the contents for the notification
notification.setTitle('Trailhead Trigger Tutorial');
notification.setBody(recordCount + ' contact(s) were inserted.');
// Set the notification type and target
notification.setNotificationTypeId(notificationType.Id);
// '000000000000000AAA' is a dummy targetId value
notification.setTargetId('000000000000000AAA');
// Send the notification
try {
notification.send(recipientsIds);
System.debug('Custom notification sent successfully.');
}
catch (Exception e) {
System.debug('Problem sending notification: ' + e.getMessage());
}
}
}- éçºè
ã³ã³ãœãŒã«ã§ã[File (ãã¡ã€ã«)] | [New (æ°èŠ)] | [Apex Trigger (Apex ããªã¬ãŒ)] ãã¯ãªãã¯ããŸãã
- ããªã¬ãŒåã«
ContactNotificationTriggerãšå ¥åããŠãsObject ã« [Contact (ååŒå 責任è )] ãéžæããŸãã[Submit (éä¿¡)] ãã¯ãªãã¯ããŸãã
- ããã©ã«ãã®ã³ãŒããæ¬¡ã®ã³ãŒãã«çœ®ãæããŸãã
trigger ContactNotificationTrigger on Contact (after insert, after delete) {
if (Trigger.isInsert) {
Integer recordCount = Trigger.new.size();
// Set the recipientIDs to the current user
Set<String> recipientIDs = new Set<String>{UserInfo.getUserId()};
// Call a utility method from another class
CustomContactNotification.notifyUsers(recipientIDs, recordCount);
}
else if (Trigger.isDelete) {
// Process after delete
}
}- ä¿åããã«ã¯ã[Ctrl+S] ããŒãæŒããŸãã
- ããªã¬ãŒããã¹ãããã«ã¯ãååŒå
責任è
ãäœæããŸãã
-
[Debug (ãããã°)] | [Open Execute Anonymous Window (å®è¡å¿åãŠã£ã³ããŠãéã)] ãã¯ãªãã¯ããŸãã
- æ°ãããŠã£ã³ããŠã§ã次ã®ã³ãŒãã远å ããŠãã [Execute (å®è¡)] ãã¯ãªãã¯ããŸãã
Contact c = new Contact(LastName='Test Contact'); insert c;
- ãããã°ãã°ã§ãããªã¬ãŒãå®è¡ãããããšã確èªããŸãããã°ã®æåŸã®ã»ãã«ããããŠãŒãã£ãªãã£ã¡ãœããã«ãã£ãŠæžã蟌ãŸãããããã°ã¡ãã»ãŒãž (
DEBUG|Custom notification sent successfully) ãèŠã€ããŸãã - éç¥ãåä¿¡ããããšã確èªããŸããéç¥ããã«ãéãã«ã¯ã
ãã¯ãªãã¯ããŸãããTrailhead Trigger Tutorial (Trailhead ããªã¬ãŒãã¥ãŒããªã¢ã«)ããšããã¿ã€ãã«ãšãã1 contact(s) were inserted. (1 ä»¶ã®ååŒå
責任è
ãæ¿å
¥ãããŸããã)ããšããæ¬æã®éç¥ã衚瀺ãããããšã確èªããŸãã
æ°ããããªã¬ãŒãæå¹ã«ãªã£ãŠããããã1 件以äžã®ååŒå 責任è ã远å ãããã³ã«ãã«ã¹ã¿ã ãã¹ã¯ãããéç¥ãå±ãããã«ãªããŸãã
é¢é£ã¬ã³ãŒãã®è¿œå
ããªã¬ãŒã¯å€ãã®å Žåãããªã¬ãŒã³ã³ããã¹ãã®ã¬ã³ãŒã (ããªã¬ãŒèµ·åã®åå ãšãªã£ãã¬ã³ãŒã) ã«é¢é£ããã¬ã³ãŒãã®ã¢ã¯ã»ã¹ãŸãã¯ç®¡çã«äœ¿çšããŸãã
ãã®ããªã¬ãŒã¯ãæ°ããååŒå
ãæŽæ°ãããååŒå
ã«ãŸã åè«ãé¢é£ä»ããããŠããªãå Žåã«ãåååŒå
ã«é¢é£ããåè«ã远å ããŸããããªã¬ãŒã¯æåã« SOQL ã¯ãšãªãå®è¡ããŠãããªã¬ãŒãå®è¡ãããååŒå
ã®ãã¹ãŠã®ååè«ãååŸããŸããæ¬¡ã«ãããªã¬ãŒã¯ Trigger.new ã§ sObject ã®ãªã¹ããå埩åŠçããŠåååŒå
ã® sObject ãååŸããŸããååŒå
ã«é¢é£ããåè« sObject ããªãå Žåã¯ãfor ã«ãŒãã«ãã£ãŠ 1 ä»¶ãäœæãããŸããããªã¬ãŒã§æ°ããåè«ãäœæãããå ŽåãæåŸã®ã¹ããŒãã¡ã³ãã§ãã®åè«ãæ¿å
¥ãããŸãã
- éçºè
ã³ã³ãœãŒã«ã䜿çšããŠæ¬¡ã®ããªã¬ãŒã远å ããŸã (
HelloWorldTriggerã®äŸã®æé ã«åŸããŸãããããªã¬ãŒåã«ã¯AddRelatedRecordã䜿çšããŸã)ã
trigger AddRelatedRecord on Account(after insert, after update) {
List<Opportunity> oppList = new List<Opportunity>();
// Get the related opportunities for the accounts in this trigger
Map<Id,Account> acctsWithOpps = new Map<Id,Account>(
[SELECT Id,(SELECT Id FROM Opportunities) FROM Account WHERE Id IN :Trigger.new]);
// Add an opportunity for each account if it doesn't already have one.
// Iterate through each account.
for(Account a : Trigger.new) {
System.debug('acctsWithOpps.get(a.Id).Opportunities.size()=' + acctsWithOpps.get(a.Id).Opportunities.size());
// Check if the account already has a related opportunity.
if (acctsWithOpps.get(a.Id).Opportunities.size() == 0) {
// If it doesn't, add a default opportunity
oppList.add(new Opportunity(Name=a.Name + ' Opportunity',
StageName='Prospecting',
CloseDate=System.today().addMonths(1),
AccountId=a.Id));
}
}
if (oppList.size() > 0) {
insert oppList;
}
}- ããªã¬ãŒããã¹ãããã«ã¯ãSalesforce ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã§ååŒå
ãäœæããŠã
Apples & Orangesãšããååãä»ããŸãã
- ååŒå
ã®ããŒãžã® [åè«] é¢é£ãªã¹ãã§ãæ°ããåè«ãèŠã€ããŸããããªã¬ãŒã«ãã£ãŠãã®åè«ãèªåçã«è¿œå ãããŠããŸãã
ããªã¬ãŒã®äŸå€ã®äœ¿çš
ç¹å®ã®æ¡ä»¶ãæºããããšãã¯ã¬ã³ãŒããä¿åãããªãããã«ãããªã©ãå Žåã«ãã£ãŠã¯ç¹å®ã®ããŒã¿ããŒã¹æäœã«å¶éãå ããå¿
èŠãããããšããããŸããããªã¬ãŒã«ã¬ã³ãŒããä¿åãããªãããã«ããã«ã¯ãåé¡ã® sObject ã§ addError() ã¡ãœãããã³ãŒã«ããŸããaddError() ã¡ãœããã¯ãããªã¬ãŒå
ã§èŽåœçãªãšã©ãŒãçæããŸãããã®ãšã©ãŒã¡ãã»ãŒãžããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«è¡šç€ºããããã°ã«èšé²ãããŸãã
次ã®ããªã¬ãŒã¯ãååŒå
ã«é¢é£ããåè«ãããå Žåã«ã¯ãã®ååŒå
ãåé€ãããªãããã«ããŸããããã©ã«ãã§ã¯ãååŒå
ãåé€ããããšããã®é¢é£ããã¬ã³ãŒãããã¹ãŠã«ã¹ã±ãŒãåé€ãããŸãããã®ããªã¬ãŒã¯ãåè«ãã«ã¹ã±ãŒãåé€ãããªãããã«ããŸãããã®ããªã¬ãŒã詊ããŠã¿ãŸããããåã®äŸãå®è¡ããå Žåã¯ãçµç¹ã« Apples & Oranges ãšããååŒå
ãšãé¢é£ããåè«ãååšããŸãããã®äŸã§ã¯ãã®ãµã³ãã«ååŒå
ã䜿çšããŸãã
- éçºè
ã³ã³ãœãŒã«ã䜿çšããŠã次ã®ããªã¬ãŒã远å ããŸãã
trigger AccountDeletion on Account (before delete) {
// Prevent the deletion of accounts if they have related opportunities.
for (Account a : [SELECT Id FROM Account
WHERE Id IN (SELECT AccountId FROM Opportunity) AND
Id IN :Trigger.old]) {
Trigger.oldMap.get(a.Id).addError(
'Cannot delete account with related opportunities.');
}
}- Salesforce ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã§ã
Apples & OrangesååŒå ã®ããŒãžã«ç§»åããŠã[Delete (åé€)] ãã¯ãªãã¯ããŸãã
- 確èªãããã¢ããã§ [OK] ãã¯ãªãã¯ããŸãã
ãCannot delete account with related opportunities (é¢é£ããåè«ãããååŒå
ã¯åé€ã§ããŸãã)ããšããã«ã¹ã¿ã ãšã©ãŒã¡ãã»ãŒãžã®æ€èšŒãšã©ãŒã衚瀺ãããããšã確èªããŸãã
-
AccountDeletionããªã¬ãŒãç¡å¹ã«ããŸãããã®ããªã¬ãŒãæå¹ã®ãŸãŸã«ãããšãåé¡ããã§ãã¯ã§ããŸããã
- [Setup (èšå®)] ãã
Apex Triggers(Apex ããªã¬ãŒ) ãæ€çŽ¢ããŸãã
- [Apex Triggers (Apex ããªã¬ãŒ)] ããŒãžã§ã
AccountDeletionããªã¬ãŒã®æšªã«ãã [Edit (ç·šé)] ãã¯ãªãã¯ããŸãã
-
[Is Active (æå¹)] ããªãã«ããŸãã
-
[Save (ä¿å)] ãã¯ãªãã¯ããŸãã
ããªã¬ãŒãšã³ãŒã«ã¢ãŠã
Apex ã䜿çšãããšãå€éš Web ãµãŒãã¹ãžã®ã³ãŒã«ãå¯èœã«ãªããApex ã³ãŒããå€éš Web ãµãŒãã¹ãšçµ±åã§ããããã«ãªããŸããå€éš Web ãµãŒãã¹ãžã® Apex ã³ãŒã«ãã³ãŒã«ã¢ãŠããšãããŸããããšãã°ãæ ªäŸ¡æ å ±ãµãŒãã¹ãžã®ã³ãŒã«ã¢ãŠããå®è¡ããŠãææ°ã®æ ªäŸ¡æ å ±ãååŸã§ããŸããããªã¬ãŒããã³ãŒã«ã¢ãŠããå®è¡ãããšãã¯ãå€éšãµãŒãã¹ããã®å¿çãåŸ æ©äžã«ãããªã¬ãŒããã»ã¹ã«ãã£ãŠæäœããããã¯ãããªãããã«ãã³ãŒã«ã¢ãŠããéåæã«è¡ãå¿ èŠããããŸããéåæã³ãŒã«ã¢ãŠããããã¯ã°ã©ãŠã³ãããã»ã¹ã§å®è¡ããŠãå€éšãµãŒãã¹ããå¿çãè¿ããããåä¿¡ããŸãã
ããªã¬ãŒããã³ãŒã«ã¢ãŠããå®è¡ããã«ã¯ãéåæã«å®è¡ããã¯ã©ã¹ã¡ãœãããã³ãŒã«ããŸãããã®ãããªã¡ãœãã㯠future ã¡ãœãããšåŒã°ãã@future(callout=true) ã¢ãããŒã·ã§ã³ãä»å ãããŸããæ¬¡ã®ã¯ã©ã¹ã®äŸã«ã¯ãã³ãŒã«ã¢ãŠããå®è¡ãã future ã¡ãœãããå«ãŸããŸãã
public class CalloutClass {
@future(callout=true)
public static void makeCallout() {
HttpRequest request = new HttpRequest();
// Set the endpoint URL.
String endpoint = 'http://yourHost/yourService';
request.setEndPoint(endpoint);
// Set the HTTP verb to GET.
request.setMethod('GET');
// Send the HTTP request and get the response.
HttpResponse response = new HTTP().send(request);
}
}次ã®äŸã¯ãã¯ã©ã¹ã§ã¡ãœãããã³ãŒã«ããŠãã³ãŒã«ã¢ãŠããéåæã§å®è¡ããããªã¬ãŒã瀺ããŠããŸãã
trigger CalloutTrigger on Account (before insert, before update) {
CalloutClass.makeCallout();
}ãã®ã»ã¯ã·ã§ã³ã¯ãã³ãŒã«ã¢ãŠãã®æŠèŠã®ã¿ã瀺ãã詳述ã¯ããããŸããã詳现ã¯ããApex éçºè ã¬ã€ããã®ãApex ã䜿çšããã³ãŒã«ã¢ãŠãã®åŒã³åºãããåç §ããŠãã ããã
ãªãœãŒã¹
- Apex éçºè ã¬ã€ã: ããªã¬ãŒ
- Apex éçºè ã¬ã€ã: Apex ã䜿çšããã³ãŒã«ã¢ãŠãã®åŒã³åºã
- Apex ãªãã¡ã¬ã³ã¹ã¬ã€ã: CustomNotification ã¯ã©ã¹
- Trailhead: Apex ã€ã³ãã°ã¬ãŒã·ã§ã³ãµãŒãã¹
