function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ogiogi 

Apexでのワークフロー承認でエラー

もしご存知の方がいらっしゃれば、ご教授お願い致します。

 

現在、以下の PDF を参考に salesforce のワークフローの勉強をしています。

 

http://developerforcejp.s3.amazonaws.com/books/workbook/Workbook_JP.pdf

 

この資料通りにワークフローを作成し、salesforceが用意してくれる画面からの
申請、承認まで確認できました。

 

ただ、実際にやりたいことは、自分で作成した画面 (Apex側) からの申請、承認で、

この資料にはそこまで書かれていませんでしたので、以下を参考にして自分で作ってみました。

 

http://blog.flect.co.jp/salesforce/2010/09/apex-d1a3.html

http://success.salesforce.co.jp/DeveloperForce/DeveloperGuide/Apex_language_reference_JP_v18_Beta.pdf

 

ワークフロー自体は、資料 Workbook_JP.pdf の「チュートリアル 4: ワークフローと承認プロセスの使用」

で作成したワークフローを使いまわしたのですが、申請は正常に動作したのですが、承認で以下のエラー

が発生してしまいます。

 

System.DmlException: Process failed. First exception on row 0; first error: INVALID_OPERATION, Illegal transition type: []
Class.registDataController.approve: line 72, column 49 External entry point

 

ロジックもほとんど参考サイトのままで、きちんと承認できるユーザでログインして承認しているのですが・・・

( WorkitemId は、とりあえず申請時の戻り値から取得したものを固定でセットしています )

 

試しに、Apexで申請した承認プロセスを、salesforceが用意してくれる画面から承認すると

正常に承認できます。

 

ソースは以下のとおりです。

( approve メソッドが承認時のロジックです )

 

お分かりになる方は、何卒ご教授をお願い致します。

 

 

 

 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

  ソース

 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

 

public class registDataController{
    public String workItemId { get; set; }

    public String message { get; set; }

    public PageReference save() {
       
        Invoice_Statement__c[] obj;
       
        String invoiceNumber = 'INV-0008';
       
        obj = [SELECT Id,Name,Description__c,Status__c FROM Invoice_Statement__c WHERE Name = :invoiceNumber];
       
        // オブジェクトIDの設定
        String objectId = obj[0].id;
       
        // プロセスの作成
        Approval.ProcessSubmitRequest psr = new Approval.ProcessSubmitRequest();
       
        // 申請するオブジェクトの設定
        psr.setObjectId(objectId);
       
        // 次の承認者の設定(自動割当の場合はnull)
        psr.setNextApproverIds(new Id[] {UserInfo.getUserId()});
       
        // プロセス実行
        Approval.ProcessResult submitResult = Approval.process(psr);
       
        // 成功 or 失敗の確認
        System.assert(submitResult.isSuccess());
       
        // 状態の確認
        // Pending:未承認、Approved:承認済み、
        // Rejected:却下、 Removed:取消済み
        System.assertEquals('Pending', submitResult.getInstanceStatus());
       
        // 承認申請により作成された
        // ProcessInstanceWorkitemオブジェクトのIDを取得
        // (承認申請すると、ProcessInstanceWorkitemオブジェクトに
        // レコードが作成される)
        List<Id> newWorkItemIds = submitResult.getNewWorkitemIds();
       
        workItemId = newWorkItemIds.get(0);
       
        message = '申請!! '
                + '  ObjectId : '+ objectId;
       
        return null;
    }

    public PageReference approve() {
       
        // プロセスの作成
        Approval.ProcessWorkitemRequest pwr = new Approval.ProcessWorkitemRequest();
       
        // 承認するProcessInstanceWorkitemオブジェクトのIDの設定
        pwr.setWorkitemId('04iA00000005DqM');
       
        // 次の承認者の設定
        // (自動割当や最終承認の場合はnull)
        //pwr.setNextApproverIds(new Id[] {UserInfo.getUserId()});
       
        // アクションの設定
        // Approval:承認、Reject:却下、
        // Removed:削除<システム管理者のみ>
        pwr.setAction('Approval');
       
        // コメントの設定
        pwr.setComments('123');
       
        // プロセス実行
        Approval.ProcessResult workitemResult = Approval.process(pwr);
        System.assert(workitemResult.isSuccess());
        System.assertEquals('Approved', workitemResult.getInstanceStatus());
       
        message = '承認!!'
                + '  WorkItemId : ' + workItemId;
       
        return null;
    }
   
}

 

westwest

 First exception on row 0

とあるので、戻り値の値がないです。存在しない値になんらかの処理をしようとしているので、

まずは、デバッグ。System.debugなど使って値がセットされているかどうかを確認ですね。