Apex-データベースメソッド

データベースクラスメソッドは、挿入、更新などのDMLステートメントよりも柔軟なDMLステートメントを操作する別の方法です。

データベースメソッドとDMLステートメントの違い

DMLステートメント データベースメソッド
部分的な更新は許可されていません。たとえば、リストに20個のレコードがある場合、すべてのレコードが更新されるか、まったく更新されません。 部分的な更新が許可されます。データベースメソッドのパラメータをtrueまたはfalseとして指定できます。trueは部分的な更新を許可し、falseは同じものを許可しないようにします。
成功したレコードと失敗したレコードのリストを取得することはできません。 例で見たように、成功レコードと失敗レコードのリストを取得できます。
Example −listNameを挿入 Example − database.insert(listName、False)。falseは、部分的な更新が許可されていないことを示します。

挿入操作

データベースメソッドを介した新しいレコードの挿入も非常に簡単で柔軟です。DMLステートメントを使用して新しいレコードを挿入した前のシナリオを考えてみましょう。データベースメソッドを使用して同じものを挿入します。

// Insert Operation Using Database methods
// Insert Customer Records First using simple DML Statement. This Customer Record will be
// used when we will create Invoice Records
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test';
insert objCust; // Inserting the Customer Records

// Insert Operation Using Database methods
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
List<apex_invoice__c> InvoiceListToInsert = new List<apex_invoice__c>();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Customer__c = objCust.id;
objNewInvoice.APEX_Amount_Paid__c = 1000;
InvoiceListToInsert.add(objNewInvoice);
Database.SaveResult[] srList = Database.insert(InvoiceListToInsert, false);

// Database method to insert the records in List
// Iterate through each returned result by the method

for (Database.SaveResult sr : srList) {
   if (sr.isSuccess()) {
      // This condition will be executed for successful records and will fetch the ids 
      // of successful records
      System.debug('Successfully inserted Invoice. Invoice ID: ' + sr.getId());
      // Get the invoice id of inserted Account
   } else {
      // This condition will be executed for failed records
      for(Database.Error objErr : sr.getErrors()) {
         System.debug('The following error has occurred.');
         
         // Printing error message in Debug log
         System.debug(objErr.getStatusCode() + ': ' + objErr.getMessage());
         System.debug('Invoice oject field which are affected by the error:' 
            + objErr.getFields());
      }
   }
}

更新操作

ここで、データベースメソッドを使用したビジネスケースの例を考えてみましょう。Invoiceオブジェクトのステータスフィールドを更新する必要があるが、同時に、レコードのステータス、失敗したレコードID、成功カウントなどの情報も必要であるとします。これはDMLステートメントでは不可能であるため、データベースメソッドを使用する必要があります。オペレーションのステータスを取得します。

請求書のステータスが「保留中」で、作成日が本日である場合、請求書の「ステータス」フィールドを更新します。

以下のコードは、Database.updateメソッドを使用して請求書レコードを更新するのに役立ちます。また、このコードを実行する前に請求書レコードを作成してください。

// Code to update the records using the Database methods
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
   createdDate FROM APEX_Invoice__c WHERE createdDate = today];

// fetch the invoice created today
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);    //Adding records to the list
   }
}

Database.SaveResult[] srList = Database.update(updatedInvoiceList, false);
// Database method to update the records in List

// Iterate through each returned result by the method
for (Database.SaveResult sr : srList) {
   if (sr.isSuccess()) {
      // This condition will be executed for successful records and will fetch
      // the ids of successful records
      System.debug('Successfully updated Invoice. Invoice ID is : ' + sr.getId());
   } else {
      // This condition will be executed for failed records
      for(Database.Error objErr : sr.getErrors()) {
         System.debug('The following error has occurred.');
         
         // Printing error message in Debug log
         System.debug(objErr.getStatusCode() + ': ' + objErr.getMessage());
         System.debug('Invoice oject field which are affected by the error:' 
            + objErr.getFields());
      }
   }
}

このチュートリアルでは、挿入操作と更新操作のみを見ていきます。他の操作は、これらの操作と前の章で行ったことと非常によく似ています。