【Salesforce】REQUIRED_FIELD_MISSING, 値を入力してください: [LastName]: [LastName]

【Salesforce】REQUIRED_FIELD_MISSING, 値を入力してください: [LastName]: [LastName]

SalesforceでContactを複製してInsertした際に、「REQUIRED_FIELD_MISSING, 値を入力してください: [LastName]: [LastName]」が出ました。

動作としてはこのようなものです。

// 取引先に紐づく取引先責任者を取得する
Contact con = [select Id from Contact where AccountId != null limit 1];

// 取引先責任者を複製する
Contact copyCon = con.clone(false, true);

// 複製した取引先責任者をInsertする
insert copyCon;

複製しているはずなのに、取引先責任者の必須項目でエラーが発生します。

デバッグを仕込むと、空っぽのContactが出来ていました。

// 取引先に紐づく取引先責任者を取得する
Contact con = [select Id from Contact where AccountId != null limit 1];

// 取引先責任者を複製する
Contact copyCon = con.clone(false, true);

system.debug(copyCon);                      // Contact:{}

// 複製した取引先責任者をInsertする
insert copyCon;

cloneで複製したオブジェクトには、元オブジェクトに設定されていた値しか設定されないんですね。

今回は取引先責任者をSelectしているのですが、取得する項目はIdしか指定されていません。

指定されているIdが複製されたオブジェクトに含まれていないのは、cloneの第一引数にfalseが設定されているためでしょうか。

Select文にLastNameを設定したところ、エラーは発生しなくなりました。

// 取引先に紐づく取引先責任者を取得する
Contact con = [select Id, LastName from Contact where AccountId != null limit 1];

// 取引先責任者を複製する
Contact copyCon = con.clone(false, true);

system.debug(copyCon);                      // Contact:{LastName=Con}

// 複製した取引先責任者をInsertする
insert copyCon;

しかし、これは必須項目のLastNameがコピーされただけなので、AccountIdは設定されていません。

そのため、当然ながら取引先に紐づかない取引先責任者が作成されるわけです。

cloneによってSObjectを複製するときは、複製元のオブジェクトに必要な値をすべてSelectしなければいけませんね。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です