วิธีใช้ฐานข้อมูล มีสถานะอยู่ใน 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

หากต้องการความช่วยเหลือเพิ่มเติมเกี่ยวกับโครงการพนักงานขาย โปรดจ้างเราเป็นที่ปรึกษาพนักงานขายของคุณและรับผลประโยชน์