tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:ApexのLive Codingをやってみました

YoutubeなどでやっているLive Codingがすごく楽しそうだったので自分でもやってみました。




実際にやってみると時間が予定よりも長くなってしまったり、うまく言葉にできなかったりして、いろいろ難しかったです。

補足

Apex Triggerの方ですが、思いの外長くなってしまった為か、最後に話そうと思ってたことを1つ話忘れたのと、判定処理を1つミスってました。やり直す気力はなかったので補足ということでごまかそうと思います。

1. アクセス権限について

取引先責任者の件数を取得する際に、サブクエリを使っています。その際にwith sharingできちんと参照権限を制御しているのですが、今回のような組織全体の件数を取得する場合には、『without sharing』にする必要があります。
f:id:tyoshikawa1106:20150728011858p:plain


例えば、全部で10件ある取引先責任者の内、5件分しか参照権限の無いユーザがトリガで更新処理を行うと、10件あるはずが5件と登録されてしまいます。これを防ぐために、件数を取得する処理はwithout sharingで実行する必要があります。


without sharingですが、トリガのハンドラークラス全体に適用してしまったりすると、別のトリガ処理などで問題が起きてしまいます。なので、without sharing専用のDaoクラスを用意して対応する方法がいいと思います。

2. エラー処理について

最後の最後でミスしてしまったやつです。ContactTriggerHelperの中で次の処理があります。
f:id:tyoshikawa1106:20150728012233p:plain

処理で必要なのはMapのキーにセットしたAccountIDなので正常時の処理では問題ないのですが、このやり方だと異常時の処理で上手く動作しません。戻り値の型を次のように変更する必要があります。

Map<Id, Contact> → Map<Id, List<Contact>>


同じ取引先IDを持つ取引先責任者が複数存在した場合ですね、、間違ったやり方だとマップの値を上書きしてしまいます。なので値部分はリストで持つ必要がありました。。


以下の赤枠の部分が、ただのContactではなくList<Contact>となって、エラーになった取引先IDに紐付く複数の取引先責任者に対してaddErrorにする必要があります。
f:id:tyoshikawa1106:20150728013010p:plain


・・・という感じです。ちょっと後半集中力も切れてきて、ミスして気づかすに進んでいました。動画の場合はこういうときに修正できないのが以外と大変ですね。

追記

コーディング中にでてきたサンプルコードをGitHubにアップしました。