Apex - DML

In diesem Kapitel wird erläutert, wie Sie die verschiedenen Funktionen zur Datenbankänderung in Salesforce ausführen. Es gibt zwei Sprüche, mit denen wir die Funktionen ausführen können.

DML-Anweisungen

DML sind die Aktionen, die ausgeführt werden, um das Einfügen, Aktualisieren, Löschen, Upsert, Wiederherstellen von Datensätzen, Zusammenführen von Datensätzen oder Konvertieren von Leads durchzuführen.

DML ist einer der wichtigsten Bestandteile von Apex, da fast jeder Geschäftsfall Änderungen und Modifikationen an der Datenbank beinhaltet.

Datenbankmethoden

Alle Operationen, die Sie mit DML-Anweisungen ausführen können, können auch mit Datenbankmethoden ausgeführt werden. Datenbankmethoden sind die Systemmethoden, mit denen Sie DML-Operationen ausführen können. Datenbankmethoden bieten im Vergleich zu DML-Anweisungen mehr Flexibilität.

In diesem Kapitel werden wir uns den ersten Ansatz mit DML-Anweisungen ansehen. Wir werden uns die Datenbankmethoden in einem nachfolgenden Kapitel ansehen.

DML-Anweisungen

Betrachten wir nun noch einmal die Instanz des Chemielieferanten. Unsere Rechnungsdatensätze enthalten Felder wie Status, bezahlter Betrag, verbleibender Betrag, nächstes Zahlungsdatum und Rechnungsnummer. Rechnungen, die heute erstellt wurden und den Status "Ausstehend" haben, sollten auf "Bezahlt" aktualisiert werden.

Operation einfügen

Der Einfügevorgang wird verwendet, um neue Datensätze in der Datenbank zu erstellen. Mit der Anweisung DML einfügen können Sie Datensätze für jedes Standard- oder benutzerdefinierte Objekt erstellen.

Example

Wir können neue Datensätze im Objekt APEX_Invoice__c erstellen, da täglich neue Rechnungen für neue Kundenaufträge generiert werden. Wir erstellen zuerst einen Kundendatensatz und können dann einen Rechnungsdatensatz für diesen neuen Kundendatensatz erstellen.

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

Vorgang aktualisieren

Der Aktualisierungsvorgang besteht darin, Aktualisierungen für vorhandene Datensätze durchzuführen. In diesem Beispiel aktualisieren wir das Feld Status eines vorhandenen Rechnungsdatensatzes auf "Bezahlt".

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

Upsert-Betrieb

Die Upsert-Operation wird verwendet, um eine Aktualisierungsoperation auszuführen. Wenn die zu aktualisierenden Datensätze nicht in der Datenbank vorhanden sind, erstellen Sie auch neue Datensätze.

Example

Angenommen, die Kundendatensätze im Kundenobjekt müssen aktualisiert werden. Wir werden den vorhandenen Kundendatensatz aktualisieren, falls er bereits vorhanden ist, andernfalls einen neuen erstellen. Dies basiert auf dem Wert des Felds APEX_External_Id__c. Dieses Feld ist unser Feld, um festzustellen, ob die Datensätze bereits vorhanden sind oder nicht.

Note - Bevor Sie diesen Code ausführen, erstellen Sie bitte einen Datensatz im Kundenobjekt mit dem externen ID-Feldwert '12341' und führen Sie dann den unten angegebenen Code aus. -

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

Vorgang löschen

Sie können den Löschvorgang mit der DML löschen ausführen.

Example

In diesem Fall löschen wir die Rechnungen, die zu Testzwecken erstellt wurden, dh diejenigen, die den Namen "Test" enthalten.

Sie können dieses Snippet auch über die Entwicklerkonsole ausführen, ohne die Klasse zu erstellen.

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

Vorgang wiederherstellen

Sie können den gelöschten und im Papierkorb vorhandenen Datensatz wiederherstellen. Alle Beziehungen, die der gelöschte Datensatz hat, werden ebenfalls wiederhergestellt.

Example

Angenommen, die im vorherigen Beispiel gelöschten Datensätze müssen wiederhergestellt werden. Dies kann anhand des folgenden Beispiels erreicht werden. Der Code im vorherigen Beispiel wurde für dieses Beispiel geändert.

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