Apex - DML

Trong chương này, chúng ta sẽ thảo luận về cách thực hiện các Chức năng Sửa đổi Cơ sở dữ liệu khác nhau trong Salesforce. Có hai lời nói mà chúng ta có thể thực hiện các chức năng.

Tuyên bố DML

DML là các hành động được thực hiện để thực hiện chèn, cập nhật, xóa, nâng cấp, khôi phục bản ghi, hợp nhất bản ghi hoặc chuyển đổi hoạt động dẫn.

DML là một trong những phần quan trọng nhất trong Apex vì hầu hết mọi trường hợp nghiệp vụ đều liên quan đến việc thay đổi và sửa đổi cơ sở dữ liệu.

Phương pháp cơ sở dữ liệu

Tất cả các hoạt động mà bạn có thể thực hiện bằng cách sử dụng câu lệnh DML cũng có thể được thực hiện bằng các phương thức Cơ sở dữ liệu. Phương thức cơ sở dữ liệu là phương thức hệ thống mà bạn có thể sử dụng để thực hiện các hoạt động DML. Các phương thức cơ sở dữ liệu cung cấp tính linh hoạt hơn so với các Câu lệnh DML.

Trong chương này, chúng ta sẽ xem xét cách tiếp cận đầu tiên sử dụng Câu lệnh DML. Chúng ta sẽ xem xét các Phương thức Cơ sở dữ liệu trong chương tiếp theo.

Tuyên bố DML

Bây giờ chúng ta hãy xem xét trường hợp của công ty cung cấp hóa chất một lần nữa. Hồ sơ Hóa đơn của chúng tôi có các trường là Trạng thái, Số tiền đã trả, Số tiền còn lại, Ngày thanh toán tiếp theo và Số hóa đơn. Các hóa đơn đã được tạo ngày hôm nay và có trạng thái là 'Đang chờ xử lý', sẽ được cập nhật thành 'Đã thanh toán'.

Chèn hoạt động

Thao tác chèn được sử dụng để tạo bản ghi mới trong Cơ sở dữ liệu. Bạn có thể tạo bản ghi của bất kỳ đối tượng Chuẩn hoặc Tùy chỉnh nào bằng cách sử dụng câu lệnh Chèn DML.

Example

Chúng tôi có thể tạo bản ghi mới trong đối tượng APEX_Invoice__c vì các hóa đơn mới đang được tạo cho các đơn đặt hàng mới của khách hàng mỗi ngày. Trước tiên, chúng tôi sẽ tạo bản ghi Khách hàng và sau đó chúng tôi có thể tạo bản ghi Hóa đơn cho bản ghi Khách hàng mới đó.

// fetch the invoices created today, Note, you must have at least one invoice 
// created today

List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
   createdDate FROM APEX_Invoice__c WHERE createdDate = today];

// create List to hold the updated invoice records
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test ABC';

//DML for Inserting the new Customer Records
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);
   }
}

// DML Statement to update the invoice status
update updatedInvoiceList;

// Prints the value of updated invoices
System.debug('List has been updated and updated values are' + updatedInvoiceList);

// Inserting the New Records using insert DML statement
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Amount_Paid__c = 1000;
objNewInvoice.APEX_Customer__c = objCust.id;

// DML which is creating the new Invoice record which will be linked with newly
// created Customer record
insert objNewInvoice;
System.debug('New Invoice Id is '+objNewInvoice.id+' and the Invoice Number is'
   + objNewInvoice.Name);

Cập nhật hoạt động

Thao tác cập nhật là thực hiện cập nhật các bản ghi hiện có. Trong ví dụ này, chúng tôi sẽ cập nhật trường Trạng thái của bản ghi Hóa đơn hiện có thành 'Đã thanh toán'.

Example

// Update Statement Example for updating the invoice status. You have to create
and Invoice records before executing this code. This program is updating the
record which is at index 0th position of the List.

// First, fetch the invoice created today
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c];
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();

// Update the first record in the List
invoiceList[0].APEX_Status__c = 'Pending';
updatedInvoiceList.add(invoiceList[0]);

// DML Statement to update the invoice status
update updatedInvoiceList;

// Prints the value of updated invoices
System.debug('List has been updated and updated values of records are' 
   + updatedInvoiceList[0]);

Hoạt động nâng cấp

Hoạt động nâng cấp được sử dụng để thực hiện thao tác cập nhật và nếu bản ghi cần cập nhật không có trong cơ sở dữ liệu, thì hãy tạo bản ghi mới.

Example

Giả sử, các bản ghi khách hàng trong đối tượng Khách hàng cần được cập nhật. Chúng tôi sẽ cập nhật hồ sơ Khách hàng hiện có nếu nó đã có, nếu không, hãy tạo một hồ sơ mới. Điều này sẽ dựa trên giá trị của trường APEX_External_Id__c. Trường này sẽ là trường của chúng tôi để xác định xem các bản ghi đã có hay chưa.

Note - Trước khi thực thi mã này, vui lòng tạo bản ghi trong đối tượng Khách hàng với giá trị trường Id bên ngoài là '12341' và sau đó thực thi mã được cung cấp bên dưới -

// Example for upserting the Customer records
List<apex_customer__c> CustomerList = new List<apex_customer__c>();
for (Integer i = 0; i < 10; i++) {
   apex_customer__c objcust=new apex_customer__c(name = 'Test' +i,
   apex_external_id__c='1234' +i);
   customerlist.add(objcust);
} //Upserting the Customer Records

upsert CustomerList;

System.debug('Code iterated for 10 times and created 9 records as one record with 
   External Id 12341 is already present');

for (APEX_Customer_c objCustomer: CustomerList) {
   if (objCustomer.APEX_External_Id_c == '12341') {
      system.debug('The Record which is already present is '+objCustomer);
   }
}

Xóa hoạt động

Bạn có thể thực hiện thao tác xóa bằng Xóa DML.

Example

Trong trường hợp này, chúng tôi sẽ xóa các hóa đơn đã được tạo cho mục đích thử nghiệm, đó là những hóa đơn có tên là 'Thử nghiệm'.

Bạn cũng có thể thực thi đoạn mã này từ Bảng điều khiển dành cho nhà phát triển mà không cần tạo lớp.

// fetch the invoice created today
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c WHERE createdDate = today];
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test';

// Inserting the Customer Records
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);
   }
}

// DML Statement to update the invoice status
update updatedInvoiceList;

// Prints the value of updated invoices
System.debug('List has been updated and updated values are' + updatedInvoiceList);

// Inserting the New Records using insert DML statement
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Amount_Paid__c = 1000;
objNewInvoice.APEX_Customer__c = objCust.id;

// DML which is creating the new record
insert objNewInvoice;
System.debug('New Invoice Id is' + objNewInvoice.id);

// Deleting the Test invoices from Database
// fetch the invoices which are created for Testing, Select name which Customer Name
// is Test.
List<apex_invoice__c> invoiceListToDelete = [SELECT id FROM APEX_Invoice__c
   WHERE APEX_Customer__r.Name = 'Test'];

// DML Statement to delete the Invoices
delete invoiceListToDelete;
System.debug('Success, '+invoiceListToDelete.size()+' Records has been deleted');

Phục hồi hoạt động

Bạn có thể phục hồi bản ghi đã bị xóa và có trong Thùng rác. Tất cả các mối quan hệ mà bản ghi đã xóa có, cũng sẽ được khôi phục.

Example

Giả sử, các Bản ghi đã xóa trong ví dụ trước cần được khôi phục. Điều này có thể đạt được bằng cách sử dụng ví dụ sau. Mã trong ví dụ trước đã được sửa đổi cho ví dụ này.

// fetch the invoice created today
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
createdDate FROM APEX_Invoice__c WHERE createdDate = today];
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test';

// Inserting the Customer Records
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);
   }
}

// DML Statement to update the invoice status
update updatedInvoiceList;

// Prints the value of updated invoices
System.debug('List has been updated and updated values are' + updatedInvoiceList);

// Inserting the New Records using insert DML statement
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Amount_Paid__c = 1000;
objNewInvoice.APEX_Customer__c = objCust.id;

// DML which is creating the new record
insert objNewInvoice;
System.debug('New Invoice Id is '+objNewInvoice.id);

// Deleting the Test invoices from Database
// fetch the invoices which are created for Testing, Select name which Customer Name
// is Test.
List<apex_invoice__c> invoiceListToDelete = [SELECT id FROM APEX_Invoice__c
   WHERE APEX_Customer__r.Name = 'Test'];

// DML Statement to delete the Invoices
delete invoiceListToDelete;
system.debug('Deleted Record Count is ' + invoiceListToDelete.size());
System.debug('Success, '+invoiceListToDelete.size() + 'Records has been deleted');

// Restore the deleted records using undelete statement
undelete invoiceListToDelete;
System.debug('Undeleted Record count is '+invoiceListToDelete.size()+'. This should 
   be same as Deleted Record count');