วิธีใช้ฐานข้อมูล มีสถานะอยู่ใน Batch Apex ใน Salesforce
เผยแพร่แล้ว: 2023-11-21ประการแรก เราต้องเข้าใจว่าหากเราต้องการใช้ Batch Apex เราต้องเขียนคลาส Apex ที่ใช้ฐานข้อมูลอินเทอร์เฟซที่ Salesforce มอบให้ เป็นแบบแบตช์แล้วเรียกใช้คลาสโดยทางโปรแกรม หากต้องการตรวจสอบหรือหยุดการทำงานของงาน Apex เป็นกลุ่ม จากการตั้งค่า ให้ป้อนงาน Apex ในกล่องค้นหาด่วน จากนั้นเลือกงาน Apex
ในบทความนี้ เราจะเจาะลึกฟีเจอร์อันทรงพลังของ Database สถานะใน Batch Apex ทำความเข้าใจกับฐานข้อมูล Stateful เป็นสิ่งจำเป็นสำหรับการรักษาสถานะในการดำเนินการแบบแบตช์ ซึ่งช่วยให้นักพัฒนาสามารถรักษาตัวแปรอินสแตนซ์ และสร้างกระบวนการแบตช์ที่รับรู้สถานะที่ซับซ้อนมากขึ้น
ไวยากรณ์สำหรับแบทช์:
BatchName คลาสระดับโลกใช้ Database.Batchable{}วิธีการคลาสแบทช์:
ทั่วโลก (Database.QueryLocator | Iterable) เริ่มต้น (Database.BatchableContext bc) {
//ที่นี่เราจะเพิ่มแบบสอบถามและส่งกลับผลลัพธ์เพื่อดำเนินการวิธีการ
}
การดำเนินการเป็นโมฆะทั่วโลก (Database.BatchableContext BC, รายการ <P>) {
//ตรรกะต้องอยู่ที่นี่
}
การเสร็จสิ้นเป็นโมฆะส่วนกลาง (Database.BatchableContext BC){
//หลังจากประมวลผลแบตช์ทั้งหมดแล้ว เมธอดนี้จะถูกเรียก เราสามารถเขียนโค้ดอะไรก็ได้ลงไป เช่นเดียวกับหากต้องการส่งอีเมลไปยังบันทึกทั้งหมดที่สร้างขึ้นหรืออัปเดตในวิธีการดำเนินการ
}อ่านเพิ่มเติม: วิธีสร้างประเภทรายงานที่กำหนดเองใน Salesforce
การใช้อินเทอร์เฟซ Database.Batchable
ตัวอย่าง:
BatchAccountUpdate ระดับโลกใช้ Database.Batchable {
String query = 'เลือกชื่อจากบัญชี WHERE Name! = null และ (ชื่อ = \'บริษัท Virendra\' หรือ ชื่อ = \'Virendra Sharma\') ';
เริ่มต้น Database.QueryLocator ทั่วโลก (Database.BatchableContext bc) {
// รวบรวมชุดของบันทึกหรือวัตถุที่จะส่งผ่านเพื่อดำเนินการ
กลับ Database.getQueryLocator (แบบสอบถาม);
}
การดำเนินการเป็นโมฆะทั่วโลก (Database.BatchableContext bc, รายการบันทึก) {
// ประมวลผลบันทึกแต่ละชุด
สำหรับ (บัญชีบัญชี : บันทึก){
acc.Name = acc.Name + 'อัปเดต';
}
อัปเดตบันทึก;
}
โมฆะสากลเสร็จสิ้น (Database.BatchableContext bc){
// ดำเนินการหลังการประมวลผลใด ๆ เรียกคลาสแบตช์
BatchUpdateAccountRelatedContacts b = ใหม่ BatchUpdateAccountRelatedContacts();
ฐานข้อมูล executeBatch (b, 200);
}
}

ฐานข้อมูลสถานะ
คลาสตัวอย่างต่อไปนี้ค้นหาบันทึกบัญชีทั้งหมดที่ถูกส่งผ่านโดยเมธอด start() โดยใช้ QueryLocator และอัปเดตผู้ติดต่อที่เกี่ยวข้องด้วยที่อยู่ทางไปรษณีย์ของบัญชี สุดท้าย ระบบจะส่งอีเมลพร้อมผลลัพธ์ของงานจำนวนมาก และเนื่องจากเราใช้ Database.Stateful เพื่อติดตามสถานะ จำนวนบันทึกจึงอัปเดต


ตัวอย่าง:

ฐานข้อมูล อนุญาต Callout
Database.AllowsCallout in Batch ช่วยในการรวม Salesforce เข้ากับเซิร์ฟเวอร์ภายนอก หากต้องการใช้คำบรรยายภาพในแบตช์ Apex เราต้องใช้อินเทอร์เฟซ Database.AllowsCallouts ในคำจำกัดความคลาสของคลาสแบตช์

ไวยากรณ์:
SearchAndReplace ระดับโลกใช้ Database.Batchable, Database.AllowsCallouts{} ตัวอย่าง:
ที่นี่ ฉันกำลังรวมออบเจ็กต์โอกาสเข้ากับ Razorsync.com
/*
รับคำขอบริการจาก Razorsync และอัปเดตไปยังฝ่ายขาย
*/
คลาสระดับโลก Batch_SR_RazorSyncAPI ใช้งาน Database.Batchable, Database.AllowsCallouts{
เริ่มต้น Database.QueryLocator ทั่วโลก (Database.BatchableContext BC){
แบบสอบถามสตริง = 'SELECT Id, Razorsync_Service_Request_Id__c จากโอกาสโดยที่ Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'งานเสร็จสิ้น\' และ RazorSync_Status__c = \'Success\'';
กลับ Database.getQueryLocator (แบบสอบถาม);
}
การดำเนินการเป็นโมฆะทั่วโลก (Database.BatchableContext BC, ขอบเขตรายการ){
สถานะสตริง;
สำหรับ (โอกาส : ขอบเขต){
//รับคำขอบริการ
System.debug(s.Id);
Http http1 = Http ใหม่ ();
HttpRequest request1 = ใหม่ HttpRequest();
request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c);
request1.setMethod('GET');
request1.setHeader('ประเภทเนื้อหา', 'application/json');
request1.setHeader('โฮสต์', 'DomainName.0.razorsync.com');
request1.setHeader('ความยาวเนื้อหา', '0');
request1.setHeader('การเชื่อมต่อ', 'Keep-Alive');
request1.setHeader('ชื่อเซิร์ฟเวอร์', 'DomainServerName');
request1.setHeader('โทเค็น', 'XXXXXXXXXXXXXXXXXXXXXXXX');
HttpResponse response1 = http1.send (คำขอ 1);
ถ้า (response1.getStatusCode() == 200) {
สถานะ;
ตัวแยกวิเคราะห์ JSONParser = JSON.createParser(response1.getBody());
ในขณะที่ (parser.nextToken() != null) {
if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) {
parser.nextToken();
StatusId = parser.getText();
}
}
System.debug(รหัสสถานะ);
ถ้า (StatusId == String.valueOf (1) || Test.isRunningTest ()) {
s.Razorsync_Job_Status__c = 'งานเสร็จสิ้น';
s.StageName = 'ปิดชนะ';
}อื่น{
s.Razorsync_Job_Status__c = 'กำลังทำงาน';
}
}
}
ขอบเขตการอัพเดต
}
การเสร็จสิ้นเป็นโมฆะส่วนกลาง (Database.BatchableContext BC){
}
}
อ่านเพิ่มเติม: ประโยชน์ของ Salesforce Commerce Cloud และวิธีเรียกโฟลว์จาก Apex ใน Salesforce
บทสรุป
การใช้ Database.Stateful ใน Batch Apex ภายใน Salesforce ช่วยให้สามารถรักษาสถานะด้วยวิธีการดำเนินการต่างๆ ในงานแบบแบตช์ได้ นี่เป็นสิ่งสำคัญสำหรับสถานการณ์ที่จำเป็นต้องมีการประมวลผลข้อมูลที่ซับซ้อน และต้องรักษาสถานะไว้ระหว่างกลุ่มแบตช์
ด้วยการใช้ Database.Stateful นักพัฒนาสามารถรับประกันความสอดคล้องของข้อมูลและจัดการชุดข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม การใช้ฟีเจอร์นี้อย่างรอบคอบเป็นสิ่งสำคัญเพื่อหลีกเลี่ยงการใช้หน่วยความจำมากเกินไปและปัญหาด้านประสิทธิภาพที่อาจเกิดขึ้น
แนวทางปฏิบัติที่ดีที่สุด ได้แก่ การรักษาตัวแปรสถานะให้น้อยที่สุดและมุ่งเน้นไปที่ข้อมูลที่จำเป็น ด้วยเหตุนี้ Database.Stateful จึงเป็นเครื่องมือที่มีประสิทธิภาพสำหรับการประมวลผลชุดงานที่ซับซ้อนและขึ้นอยู่กับสถานะใน Salesforce
หากต้องการความช่วยเหลือเพิ่มเติมเกี่ยวกับโครงการพนักงานขาย โปรดจ้างเราเป็นที่ปรึกษาพนักงานขายของคุณและรับผลประโยชน์
