Apex - DML

在本章中,我们将讨论如何在 Salesforce 中执行不同的数据库修改功能。 我们可以通过两个命令来执行这些功能。

DML 语句

DML 是为了执行插入、更新、删除、更新插入、恢复记录、合并记录或转换潜在客户操作而执行的操作。

DML是Apex中最重要的部分之一,因为几乎每个业务案例都涉及对数据库的更改和修改。

数据库方法

可以使用 DML 语句执行的所有操作也可以使用数据库方法执行。 数据库方法是可用于执行 DML 操作的系统方法。 与 DML 语句相比,数据库方法提供了更大的灵活性。

在本章中,我们将研究使用 DML 语句的第一种方法。 我们将在后续章节中讨论数据库方法。

DML 语句

现在让我们再次考虑化学品供应商公司的实例。 我们的账单记录包含状态、已付金额、剩余金额、下一个付款日期和账单编号等字段。 今天创建且状态为"待处理"的账单应更新为"已付款"。

插入操作

插入操作用于在数据库中创建新记录。 您可以使用 Insert DML 语句创建任何标准或自定义对象的记录。

示例

我们可以在 APEX_Invoice__c 对象中创建新记录,因为每天都会为新客户订单生成新账单。 我们将首先创建一个客户记录,然后我们可以为该新客户记录创建一个账单记录。

// 获取今天创建的账单,注意,您必须至少有一张今天创建的账单

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

// 创建List来保存更新的账单记录
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test ABC';

//用于插入新客户记录的DML
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);
   }
}

// 更新账单状态的 DML 语句
update updatedInvoiceList;

// 打印更新后的账单的值
System.debug('List has been updated and updated values are' + updatedInvoiceList);

// 使用insert DML语句插入新记录
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 正在创建新的账单记录,该记录将与新链接
// 创建客户记录
insert objNewInvoice;
System.debug('New Invoice Id is '+objNewInvoice.id+' and the Invoice Number is'
   + objNewInvoice.Name);

更新操作

更新操作是对现有记录进行更新。 在此示例中,我们将现有账单记录的状态字段更新为"已付款"。

示例

// 更新账单状态的更新语句示例。 在执行此代码之前,您必须创建账单记录。 该程序正在更新位于列表索引 0 位置的记录。

// 首先,获取今天创建的账单
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>();

//更新List中的第一条记录
invoiceList[0].APEX_Status__c = 'Pending';
updatedInvoiceList.add(invoiceList[0]);

// 更新账单状态的 DML 语句
update updatedInvoiceList;

// 打印更新后的账单的值
System.debug('List has been updated and updated values of records are' 
   + updatedInvoiceList[0]);

更新插入操作

Upsert操作用于执行更新操作,如果要更新的记录不存在于数据库中,则也创建新记录。

示例

假设,Customer对象中的客户记录需要更新。 如果现有客户记录已存在,我们将更新该记录,否则创建一条新记录。 这将基于字段 APEX_External_Id__c 的值。 该字段将是我们用来识别记录是否已存在的字段。

注意 − 在执行此代码之前,请在 Customer 对象中创建一条记录,外部 Id 字段值为"12341",然后执行下面给出的代码 −

// 更新插入客户记录的示例
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);
} //更新客户记录

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);
   }
}

删除操作

您可以使用删除 DML 执行删除操作。

示例

在这种情况下,我们将删除为测试目的而创建的账单,即包含名称为"Test"的账单。

您也可以从开发者控制台执行此代码段,而无需创建类。

// 获取今天创建的账单
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';

// 插入客户记录
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);
   }
}

// 更新账单状态的 DML 语句
update updatedInvoiceList;

// 打印更新后的账单的值
System.debug('List has been updated and updated values are' + updatedInvoiceList);

// 使用insert DML语句插入新记录
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
insert objNewInvoice;
System.debug('New Invoice Id is' + objNewInvoice.id);

// 从数据库中删除测试账单获取为测试创建的账单,选择客户名称为测试的名称。
List<apex_invoice__c> invoiceListToDelete = [SELECT id FROM APEX_Invoice__c
   WHERE APEX_Customer__r.Name = 'Test'];

// 删除账单的 DML 语句
delete invoiceListToDelete;
System.debug('Success, '+invoiceListToDelete.size()+' Records has been deleted');

取消删除操作

您可以取消删除已删除且存在于回收站中的记录。 被删除的记录所具有的所有关系也将被恢复。

示例

假设需要恢复上例中删除的记录。 这可以使用以下示例来实现。 上一个示例中的代码已针对本示例进行了修改。

// 获取今天创建的账单
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';

// 插入客户记录
insert objCust;
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);
   }
}

// 更新账单状态的 DML 语句
update updatedInvoiceList;

// 打印更新后的账单的值
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
insert objNewInvoice;
System.debug('New Invoice Id is '+objNewInvoice.id);

// 从数据库中删除测试账单获取为测试创建的账单,选择客户名称为测试的名称。
List<apex_invoice__c> invoiceListToDelete = [SELECT id FROM APEX_Invoice__c
   WHERE APEX_Customer__r.Name = 'Test'];

// 删除账单的 DML 语句
delete invoiceListToDelete;
system.debug('Deleted Record Count is ' + invoiceListToDelete.size());
System.debug('Success, '+invoiceListToDelete.size() + 'Records has been deleted');

// 使用undelete语句恢复删除的记录
undelete invoiceListToDelete;
System.debug('Undeleted Record count is '+invoiceListToDelete.size()+'. This should 
   be same as Deleted Record count');