2022/03/22

Salesforceのnot allowedって何?なぜ出るのか、改善方法をご紹介

 
  

Salesforceのnot allowedとは?

Salesforceでは、ApexというSalesforce専門のプログラム言語でDMLを実行すると「DML currently not allowed」というエラーが発生することがあります。簡単に言うと、追加されていないデータをリストにアップデートするときに発生します。 例えば、クラウド請求書のAPIでPDFにする際、その請求書のIDで保存しているプログラムがあるとします。このプログラムでは請求書PDFを取り込んだとき、Salesforceに請求書IDがあるか調べ、なかったときはクラウドにもう一度問い合わせるという仕組みでした。 しかし、保存しようとすると「DML currently not allowed」が出てしまったということです。つまり、データを呼び出す、そしてアップロードをするプログラムの場合、起きてしまうエラーということになります。

Salesforceでnot allowedが出る条件

Salesforceで、「DML currently not allowed」が発生するのは、追加されていないデータをリストにアップロードできない、ControllerクラスのコンストラクタでDMLは実行できないというのが主な原因です。 DMLも含め、詳しく説明します。

DMLとは

SalesforceにおいてのDMLとは、データベースに対する検索、更新、削除、登録をするときの指示のことです。Apexという言語でデータベースクラスメソッドやApex DMLステートメントを使用して実行ができます。 データ追加や更新、削除や復元などDMLステートメントで使うことが可能です。insert DMLでは、個別で取引先、取引の代表者など1つ、複数の組織データを追加できます。SQLで例えると、INSERT ステートメントに似ています。 以下サンプルコードです。
Account newAcct = new Account(name = 'Acme');
try {
   insert newAcct;
} catch (DmlException e) {
// Process exception here
}
update DMLは個別の取引先、取引責任者、請求書の明細など組織のデータを複数で更新が可能です。SQLで例えると、UPDATE ステートメントに似ています。 以下サンプルコードです。
Account a = new Account(Name='Acme2');
insert(a);

Account myAcct = [SELECT Id, Name, BillingCity FROM Account WHERE Id = :a.Id];
myAcct.BillingCity = 'San Francisco';

try {
    update myAcct;
} catch (DmlException e) {
    // Process exception here
}

DML currently not allowedのサンプルコード

「DML currently not allowed」というエラーが発生するサンプルコードを紹介します。最初に取引先の判定処理をして、結果を画面に出力するサンプルです。判定が正常に行われた場合は、「Checked_ok」、という項目をturuにしてupdateします。 下記、サンプルコードになります。

<!-- Visualforceページ -->
<apex:page controller=""AccountCheckController"">
   < apex:outputText value=""{! msg }"" />
</apex:page>

/**
 * コントローラクラス.
 */
public class AccountCheckController {

    /** 取引先ID */
    public String accountId;

    /** メッセージ */
    public String msg{get; set;}

    /**
     * コンストラクタ.
     */
    public AccountCheckController() {
	    Map paramMap = ApexPages.currentPage().getParameters();
        this.accountId = paramMap.get('id');

        // 取引先取得
        List accountList = [SELECT Id, Name, Checked_ok FROM Account WHERE Id =: this.accountId];
        if (accountList.size() == 0) {
            this.msg = '取引先が取得できませんでした。';
			return;
        }
        Account acc = accountList.get(0);

        // 判定処理
        AccountCheck accountCheck = new AccountCheck();
        boolean result = accountCheck.exec();
        if (!result) {
            this.msg = '判定処理でエラーが発生しました。';
            return;
        }

        // 判定処理が正常であれば、チェック実施済フラグを立てる
        acc.Checked_ok = true;
        update acc;

        this.msg = '判定処理が完了しました!';
    }
}

Salesforceのnot allowedの解決方法

Salesforceで「DML currently not allowed」が出るのは、まだ追加できていないデータをリストにupdateしようとしているからです。 サンプルコードの場合、ControllerクラスのコンストラクタでDMLが実行できなくなっています。「update acc;」の部分でエラーが起きているのです。 解決方法として、初期表示で処理するアクションメソッドを作り、そこにapexタグを作ってactionを指定しましょう。以下、サンプルコードになります。

<!-- Visualforceページ -->
<!-- 追加部分 -->
<apex:page controller=""AccountCheckController"" action=""{! init }"">
    <apex:outputText value=""{! msg }"" />
</apex:page>

/**
 * コントローラ.
 */
public class AccountCheckController {

    /** 取引先ID */
    public String accountId;

    /** メッセージ */
    public String msg{get; set;}

    /**
     * 初期表示処理(追加部分).
     */
    public void init() {
	    Map paramMap = ApexPages.currentPage().getParameters();
        this.accountId = paramMap.get('id');

        // 取引先取得
        List accountList = [SELECT Id, Name, Checked_ok FROM Account WHERE Id =: this.accountId];
        if (accountList.size() == 0) {
            this.msg = '取引先が取得できませんでした。';
			return;
        }
        Account acc = accountList.get(0);

        // 判定処理
        AccountCheck accountCheck = new AccountCheck();
        boolean result = accountCheck.exec();
        if (!result) {
            this.msg = '判定処理でエラーが発生しました。';
            return;
        }

        // 判定処理が正常であれば、チェック実施済フラグを立てる
        acc.Checked_ok = true;
        update acc;

        this.msg = '判定処理が完了しました!';
    }
}

Salesforceを便利に活用しよう

今回は、Salesforceの「DML currently not allowed」についてご紹介しました。 起こりやすいエラーではありますが、追加されていない状態でデータのリストをアップデートすると起こるということを理解し、エラーになっている箇所を確認して対処するようにしましょう。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】