Apex - DML

Neste capítulo, discutiremos como executar as diferentes funcionalidades de modificação do banco de dados no Salesforce. Existem dois comandos com os quais podemos realizar as funcionalidades.

Declarações DML

DML são as ações executadas para executar a operação de inserção, atualização, exclusão, upsert, restauração de registros, fusão de registros ou conversão de leads.

DML é uma das partes mais importantes no Apex, pois quase todo business case envolve as mudanças e modificações no banco de dados.

Métodos de banco de dados

Todas as operações que você pode executar usando instruções DML podem ser executadas usando métodos de banco de dados também. Métodos de banco de dados são os métodos do sistema que você pode usar para realizar operações DML. Os métodos de banco de dados fornecem mais flexibilidade em comparação com as instruções DML.

Neste capítulo, examinaremos a primeira abordagem usando DML Statements. Veremos os métodos de banco de dados em um capítulo subsequente.

Declarações DML

Vamos agora considerar o caso da empresa fornecedora de produtos químicos novamente. Nossos registros de fatura têm campos como Status, Valor pago, Valor restante, Próxima data de pagamento e Número da fatura. As faturas que foram criadas hoje e estão com o status 'Pendente', devem ser atualizadas para 'Pagas'.

Operação de inserção

A operação de inserção é usada para criar novos registros no banco de dados. Você pode criar registros de qualquer objeto padrão ou personalizado usando a instrução Insert DML.

Example

Podemos criar novos registros no objeto APEX_Invoice__c à medida que novas faturas são geradas para novos pedidos de clientes todos os dias. Criaremos um registro de cliente primeiro e, em seguida, podemos criar um registro de fatura para esse novo registro de cliente.

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

Operação de atualização

A operação de atualização consiste em realizar atualizações nos registros existentes. Neste exemplo, estaremos atualizando o campo Status de um registro de fatura existente para 'Pago'.

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

Operação Upsert

A operação Upsert é usada para realizar uma operação de atualização e se os registros a serem atualizados não estiverem presentes no banco de dados, então crie novos registros também.

Example

Suponha que os registros do cliente no objeto Cliente precisem ser atualizados. Atualizaremos o registro do cliente existente, se já estiver presente, caso contrário, criaremos um novo. Isso será baseado no valor do campo APEX_External_Id__c. Este campo será o nosso campo para identificar se os registros já estão presentes ou não.

Note - Antes de executar este código, crie um registro no objeto Cliente com o valor do campo de ID externo como '12341' e execute o código fornecido abaixo -

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

Excluir operação

Você pode realizar a operação de exclusão usando Delete DML.

Example

Neste caso, iremos eliminar as faturas que foram criadas para efeitos de teste, ou seja, aquelas que contêm o nome como 'Teste'.

Você também pode executar este snippet no console do desenvolvedor sem criar a classe.

// 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');

Operação de undelete

Você pode recuperar o registro que foi excluído e está presente na Lixeira. Todos os relacionamentos que o registro excluído possui, também serão restaurados.

Example

Suponha que os registros excluídos no exemplo anterior precisem ser restaurados. Isso pode ser feito usando o exemplo a seguir. O código do exemplo anterior foi modificado para este exemplo.

// 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');