tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:HAVINGクエリによる重複データの抽出を試してみました

HAVINGクエリによる重複データの抽出についてです。
f:id:tyoshikawa1106:20190627082018p:plain

Salesforce Developers


特定のデータが2件以上存在するデータの抽出はレポートのサマリレポートでレコード順で並び替える方法で対応するこことができたのでよく使ってました。

f:id:tyoshikawa1106:20190627074929p:plain


関係無いデータも表示されますが一旦必要なデータが上の方に集まります。
f:id:tyoshikawa1106:20190627075041p:plain


重複判定に使いたいキーワードを持つ項目をサマリ項目に指定してレコード件数の多い順に並び替えることで重複データの有無をチェックしていたのですが組織に登録されたレコード件数自体が多くなると並び替え時にエラーとなり、この方法での重複データの確認はできなくなりました。


別の抽出方法を探していたところ、Trailblazer CommunityでHAVINGクエリをつかった方法が紹介されているのを見つけたので試したところ無事に必要なデータの抽出がうまくいきました。

Trailblazer Community - 質問広場


同じ取引先IDを持つ商談が2件以上存在しているデータの抽出するときのサンプルです。(※取引先と商談の場合は実際は積み上げ集計で取得可能ですが正しく取得できていることをわかりやすいのでこの条件で試しています。)


まず取引先と商談件数の登録状況です。
f:id:tyoshikawa1106:20190627080611p:plain


同じ取引先IDを持つ商談の件数の取得までならGROUP BYクエリで対応できます。(WHEREもORDER BYも使えます。)

SELECT AccountId,Account.Name,COUNT(Id) FROM Opportunity WHERE AccountId != null GROUP BY AccountId,Account.Name ORDER BY COUNT(Id) DESC

f:id:tyoshikawa1106:20190627081138p:plain


上記のクエリにHAVINGクエリを追加することで2件以上存在するデータという形で絞り込みできます。
→ HAVING COUNT(Id) > 1

SELECT AccountId,Account.Name,COUNT(Id) FROM Opportunity WHERE AccountId != null GROUP BY AccountId,Account.Name HAVING COUNT(Id) > 1 ORDER BY COUNT(Id) DESC

f:id:tyoshikawa1106:20190627081427p:plain


開発者コンソールでの実行となりますので管理者向けの確認方法となりますがこんな感じで特定の条件に一致するデータが2件以上のデータを抽出することができます。サンプルでは取引先IDとしていますが重複判定の項目に差し替えれば重複データの抽出が可能です。

関連

co-meeting もくもく会#17に参加しました

FARO神楽坂にオフィスがあるco-meetingさんのもくもく会#17に参加しました。

f:id:tyoshikawa1106:20190608101813j:plain


場所は神楽坂駅から徒歩10分ぐらい。
f:id:tyoshikawa1106:20190608101209j:plain:w300


オフィスが入っているFARO神楽坂の1階ラウンジでの開催でした。おしゃれ。
f:id:tyoshikawa1106:20190608101424j:plain:w300

f:id:tyoshikawa1106:20190608102043j:plain:w300


FARO神楽坂の1階にはカフェもあります。ネットで見て気になっていたカフェでせっかくなので一段落ついたときに利用してみました。

コーヒースタンド『WHY NOT』FARO神楽坂店オープン | FARO青山/神楽坂

Suicaでの支払いがOKでした。カフェラテおいしかったです。
f:id:tyoshikawa1106:20190608172051j:plain:w300

f:id:tyoshikawa1106:20190608172401j:plain:w300

やったこと

午前中はVisualforce&Apexとアクセス権限まわりについての調べ物をしました。調べた結果は次の2記事です。


詳細ページに表示されるカスタムボタンの表示/非表示切り替えってできないのかなという話を聞いてVisualforceページのアクセス権限がなかった非表示になったかもという話をしてアクションだと非表示になるね。と教えてもらったので自分でも試してみました。最初カスタムボタンでも非表示になったかもと思ったのですが勘違いだったみたいです。


午後は放置しちゃっていたSpring'19リリース試験を片付ける作業を進めました。

モジュールを見たらびっくり14種類。(いつの間にこんなに認定資格が...)

  • アドミニストレーター認定資格の更新 (Spring '19)
  • B2C Commerce デベロッパー資格の更新 (Spring '19)
  • CPQ スペシャリスト認定資格の更新 (Spring '19)
  • Data Architecture and Management デザイナー認定資格の更新 (Spring '19)
  • Development Lifecycle and Deployment デザイナー認定資格の更新 (Spring '19)
  • Einstein Analytics and Discovery コンサルタント認定資格の更新 (Spring '19)
  • Identity and Access Managementデザイナー認定資格の更新 (Spring '19)
  • Integration Architecture デザイナー認定資格の更新 (Spring '19)
  • 認定 Marketing Cloud メールスペシャリスト資格の更新 (Spring '19)
  • 認定モバイルソリューションアーキテクチャデザイナー資格の更新 (Spring '19)
  • Pardot スペシャリスト認定資格の更新 (Spring '19)
  • Platform アプリケーションビルダー認定資格の更新 (Spring '19)
  • Platform デベロッパー資格の更新 (Spring '19)
  • Sharing and Visibility デザイナー認定資格の更新 (Spring '19)


関係あるリリース試験だけならすぐに終わりますが、このモジュールは期間限定バッチが取得できるモジュールという考え方をするとやらないわけにも行かないのでこの機会に全部に取り掛かりました。
f:id:tyoshikawa1106:20190608165632p:plain

だいたい2時間近くかかりましたが無事にクリア。
f:id:tyoshikawa1106:20190608180651p:plain

合計14個の期間限定バッチをゲットできました。よかった。
f:id:tyoshikawa1106:20190608180710p:plain:w300


リリース試験自体は新機能自体の確認になるので勉強になりました。


開発系まわりだとベータ版ですがSOQLにWITH SECURITY_ENFORCEDを処理が追加されてました。
f:id:tyoshikawa1106:20190608161448p:plain


あとはSalesforceのリッチテキストエリアの裏側の仕組みとして使われていたCKEditorというライブラリが別のライブラリにかわっていました。
f:id:tyoshikawa1106:20190608155245p:plain

f:id:tyoshikawa1106:20190608155653p:plain


昔CKEditorをハックする方法を教わったりしたのでなんとなくおお..となりました。

CKeditor カテゴリーの記事一覧 - tyoshikawa1106のブログ


とはいえCKEditorをハックする場面なんて全然なかったので今のSalesforceの機能に合う便利なライブラリが導入されるのは良いことかなと思います。


まったく関わりの無いデザイナー試験のモジュールも把握してなかったSalesforceの新機能の情報が満載だったので時間があればやっておくと良いと思います。
f:id:tyoshikawa1106:20190608181908p:plain

打ち上げ&ラップアップ

20:00から打ち上げ&ラップアップということでお寿司とからあげとビールをごちそうになりながらやりたいとはその日やったことの共有タイムがありました。co-meetingさんからは画像認識のモーションキャプチャを使ったブロック崩しゲームを試している話を聞かせてもらったのとそのデモを見えて頂きました。また最近の気になる技術をコピペで気軽に試せるコピペテックの話も聞けました。


せっかくのアウトプットの機会なので自分も参加させてもらい、この記事に書いてる内容について話させてもらったのと、自分自身の振り返りも兼ねて作成した最近Salesforceをつかってやっていることの話を聞いてもらいました。
f:id:tyoshikawa1106:20190609001327p:plain


Salesforceをつかってやっていることの話の方は今つくってるものがちゃんと完成して内容をもっと整理したらどこかで発表する機会があればいいなと思ってます。


最後にお寿司おいしかったです。
f:id:tyoshikawa1106:20190608201715j:plain:w300


co-meetingさんのもくもく会#17はだいたいこんな感じでした。FARO神楽坂のラウンジでのもくもく会とても楽しかったです。
f:id:tyoshikawa1106:20190608224512j:plain:w300

f:id:tyoshikawa1106:20190608224825j:plain:w300

f:id:tyoshikawa1106:20190608224846j:plain:w300

SFDC:TrailheadのSpring'19 リリース試験モジュールを進めました

実はまだ終わっていないSpring'19リリース試験。Summer'19への切り替えの話も出ているのでさすがにやることにしました。(いつかやり忘れで失効しそう...)
f:id:tyoshikawa1106:20190608134640p:plain


ちなみに期限は「August 23, 2019」。
f:id:tyoshikawa1106:20190608154102p:plain

アドミニストレーター認定資格の更新

1ページ目
2ページ目

f:id:tyoshikawa1106:20190608140832p:plain

f:id:tyoshikawa1106:20190608141006p:plain


f:id:tyoshikawa1106:20190608141051p:plain

B2C Commerce デベロッパー資格の更新

この資格持ってないけどせっかくなので。

  • Business Manager の IP 制限
    • 特定の IP アドレスまたはアドレス範囲に対するアクセスを制限できるようになりました。

設定に一致しない IP アドレスでユーザがログインしようとした場合に、次のことを実行できます。

  • ユーザのアクセスを拒否する。
  • エラーログエントリを要求する。エラーログエントリは、LogCenter に送信されて処理されます。
  • 指定されたシステム管理者にメール通知を送信する。
  • ログイン失敗回数を増やす。この回数を増やすことで、アクセスの試行回数が多くなりすぎた場合にユーザをブロックできます。
  • すべての認証試行とその結果はセキュリティログに記録されます。以前は、成功したログインのみが記録されていました。
  • OCAPI API 設定の変更
    • ExportDataUnitsConfiguration ドキュメント (Data API 19.1)
    • ExportGlobalDataConfiguration ドキュメント (Data API 19.1)
    • ExportSitesConfiguration ドキュメント (Data API 19.1)
  • ジョブとスケジュール
    • OCAPI Data API を使用してサイトエクスポートを管理できるようになりました。その結果、開発者はカスタムコードを開発せずにサイトエクスポートを実行できるようになりました。
    • システムジョブ sfcc-site-archive-export として公開されています。
  • 価格設定
    • お客様による 300 個以上の価格表の削除が可能に
    • 1000個を超えるって書き方してたけどリリース試験の1200という回答は誤りだったので1000個までっぽい。
  • 新しい API メソッド dw.order.Basket.releaseInventory
    • dw.order.Basket.releaseInventory は、買い物かご用に予約されているすべての在庫をリリースします。


f:id:tyoshikawa1106:20190608142113p:plain

CPQ スペシャリスト認定資格の更新

これももってないけど。せっかくなので。

  • 消費スケジュール価格の定義
    • 定義済みの消費レートに基づいて使用量の価格を設定します。以前は、営業担当が価格一覧を使用して、注文商品ごとに 1 つのみの使用量レートセットに価格を定義できました。消費スケジュールにより、価格設定の柔軟性が高まります。複数の商品に対して消費スケジュールを適用したり、複数の消費スケジュールを 1 つの商品に添付したりします。
  • Salesforce CPQ および Salesforce Billing での消費スケジュールの使用
    • 以前は、消費スケジュールは Salesforce でのみ使用できました。CPQ および Billing の管理パッケージサポートによって、消費スケジュールを Salesforce CPQ および Salesforce Billing のライフサイクル全体に取り込むことができます。消費スケジュールが設定された使用量商品の見積、契約、注文、請求処理ができるようになりました。
  • カスタムスクリプトでの消費スケジュールと消費レートの使用
    • 会社のニーズをより的確に満たすように消費スケジュールと消費レートにさらに機能を追加します。消費レートおよび消費スケジュールオブジェクトから最大 10 個の項目をカスタム JavaScript コードに含めます。
  • 見積品目エディタでのサブスクリプションの修正
    • 見積品目エディタに修正見積用の [サブスクリプションを修正] ボタンを追加しました。営業担当が見積品目エディタで [サブスクリプションを修正] をクリックすると、Salesforce CPQ に [サブスクリプションを修正] ページが表示されます。このページで、営業担当は、見積の取引先の修正可能なサブスクリプションを選択して修正見積に追加できます。この機能は、営業担当が別の契約から修正見積にサブスクリプションを取り込む場合に役立ちます。
  • 見積品目の迅速な削除
    • 積品目エディタに修正見積用の [サブスクリプションを修正] ボタンを追加しました。営業担当が見積品目エディタで [サブスクリプションを修正] をクリックすると、Salesforce CPQ に [サブスクリプションを修正] ページが表示されます。このページで、営業担当は、見積の取引先の修正可能なサブスクリプションを選択して修正見積に追加できます。この機能は、営業担当が別の契約から修正見積にサブスクリプションを取り込む場合に役立ちます。以前は、修正見積で営業担当が修正できるのは、元の見積から取得した納入商品とサブスクリプションのみでした。
  • 見積品目の迅速な削除
    • 複数品目削除を有効にしている組織で大量の削除 (150 以上の見積品目の削除など) がすばやく完了するように、見積品目エディタの機能を拡張しました。
  • 見積プレビューページからの見積ドキュメント PDF のダウンロード
    • PQ 見積ドキュメントのプレビューが完了したら、その PDF を容易にダウンロードできるようになりました。


f:id:tyoshikawa1106:20190608143319p:plain

Data Architecture デザイナー認定資格の更新

  • データアーキテクチャ設計について
    • 認定 Data Architecture and Management デザイナーは、データソーシング、インテグレーション/移動、持続性、マスタデータ管理、メタデータ管理とセマンティックな調整、データガバナンス、セキュリティ、配布など、主要なビルディングブロックからなる情報アーキテクチャフレームワークに関する豊富な知識を有します。
  • モデルの各プレディクターによる影響の理解
  • Spring '19 では、Einstein に各プレディクターの影響スコアが提示されます。予測の構築が完了したら、予測リストでそれを見つけて、アクションメニューから [スコアカードを表示] を選択します。この機能は、Einstein Analytics Plus または Einstein Predictions ライセンスを持つシステム管理者が使用できます。
  • 項目履歴データの保持制限の更新
    • Salesforce では、組織経由で最大 18 か月、API 経由で最大 24 か月の項目履歴データの保持が保証されています。Winter '19 でお知らせしたとおり、Spring '19 以降、24 か月より古い項目履歴データの削除プロセスが開始されます。
  • [設定] からのカスタム Big Object の作成
    • Big Object は、Salesforce Platform 上で大量のデータを保存して管理します。Big Object に他のオブジェクトのデータをアーカイブしたり、外部システムの膨大なデータセットを取り込んで顧客の全容を把握したりすることができます。
  • Einstein データインサイトによるレポートからの詳細情報の取得 (正式リリース)
    • Einstein ではレポートデータが分析されて、要点、比較、トレンドが、洞察に満ちたグラフと総計値でまとめられます。ワンクリックでデータサイエンスを実現します。
  • カスタムメタデータ: カスタムメタデータ型を使用したデフォルト項目値の設定
    • デフォルト値でカスタムメタデータ型レコードを参照し、項目の更新を簡略化します。デフォルト項目値を変更する必要がある場合、複数の項目参照を更新する代わりに、参照先のカスタムメタデータ項目値で更新できます。複数の項目のデフォルト値を簡単に変更できるようになります。


f:id:tyoshikawa1106:20190608144219p:plain

Spring '19 での Development Lifecycle and Deployment デザイナー認定資格の更新

これも関係ないやつ。

  • 開発ライフサイクルとリリースの設計について
  • 変更セットまたはメタデータ API を使用した有効なプロセスおよびフローのリリース
    • プロセスの自動化設定で有効化できるとかなんとか。
  • カスタマイズ可能な事前作成済みのビジネスプロセスの作成またはインストール
    • プロセスビルダーのプロセスのプロパティを編集して、[テンプレート] を [はい] に設定する。
  • Sandbox のコピーによる時間の節約 (正式リリース)
  • ロック解除済みパッケージ内の廃止されたメタデータの移行を有効化
  • VS Code 向け Salesforce 拡張機能: Lightning Web コンポーネントのサポート、予定されている Force.com IDE の廃止


認定資格は持ってないけど内容はよかった。2019年10月12日Force.com IDE廃止。最近は使ってないけど初めての開発でお世話になった開発ツール。
f:id:tyoshikawa1106:20190608144710p:plain


あとプロセスビルダーを有効状態でリリースできるようになってた。便利だけど基本は無効でリリースする方が助かるかもことが多いかも。(Chatter投稿系の処理がエラーになるので。。)
f:id:tyoshikawa1106:20190608144908p:plain


プロセスビルダーのテンプレート機能
f:id:tyoshikawa1106:20190608145433p:plain


f:id:tyoshikawa1106:20190608150100p:plain

Spring '19 での Einstein Analytics and Discovery 認定資格の更新

  • Einstein データインサイトのレポートでの人工知能 (AI) の活用
    • Einstein Analytics Plus ライセンスに含まれる「Einstein データインサイトの実行」ユーザ権限が必要
  • R や Quip での Einstein Discovery ストーリーの分析とカスタマイズ
  • Spring '19 では、Einstein Discovery ストーリーをデータサイエンティストの R にエクスポートし、エクスポートされたモデルを各自の言語で分析してカスタマイズしたり、Quip にエクスポートし、インサイトをチームのビジネスユーザに共有したりすることができます。
  • ビジネス向けの Analytics アプリケーションの追加
  • イベントベースのスケジュールの使用によるデータ同期とデータフロー実行からの推測の排除
  • コミュニティの Analytics からの Salesforce のアクションの実行


f:id:tyoshikawa1106:20190608150735p:plain

Spring '19 での Identity and Access Management管理デザイナー認定資格の更新

  • メール、電話番号または選択した任意の識別子によるユーザログインの有効化
  • [私のドメイン] のログイン検出を使用した ID ファーストログインページの作成
  • 更新されたパスワードブラックリストによるセキュリティの強化
  • 軽量な、連絡先のないExternal Identity ユーザの作成
  • 証明書によるユーザの認証


f:id:tyoshikawa1106:20190608151539p:plain

Spring '19 での Integration Architecture デザイナー認定資格の更新

  • データの自動更新
  • プロセスおよびフローでの外部オブジェクトの使用
  • 接続アプリケーションの OAuth 2.0 エンドポイントとのインテグレーションの合理化
  • 変更データキャプチャを使用した外部データの最新の状態の維持
  • 大規模プラットフォームイベントによるイベントベースのアプリケーションの拡張


f:id:tyoshikawa1106:20190608152245p:plain

Spring '19 での認定 Marketing Cloud メールスペシャリスト資格の更新

  • Email Studio
    • 2 ステップログイン
    • ドメイン登録
  • Content Builder
    • Litmus プレビュー連携
    • カスタムコンテンツブロック SDK
  • Journey Builder
    • Journey Builder でのメールの作成
    • ジャーニーフォルダー
  • Contact Builder
    • 連絡先の削除の有効化
    • 分析ダッシュボードまたは REST API リソースでの連絡先削除要求の表示


f:id:tyoshikawa1106:20190608153106p:plain

認定モバイルソリューションアーキテクチャデザイナー資格の更新

  • モバイルアプリケーション用 Snap-in: 顧客へのより充実したチャット環境の提供
  • 行動のリソースの予約
  • Salesforce アプリケーションを使用して取引先を転送するときに維持できる関連レコードの増加
  • モバイルデバイスのプッシュ登録の削除
  • モバイルデバイスでのコミュニティフィード項目の翻訳


これは良さげ。
f:id:tyoshikawa1106:20190608153621p:plain


こんな機能あったんだ。
f:id:tyoshikawa1106:20190608153819p:plain


モバイルアプリにGoogle翻訳機能追加されてた。
f:id:tyoshikawa1106:20190608153910p:plain


f:id:tyoshikawa1106:20190608153932p:plain

Spring '19 での Pardot スペシャリスト認定資格の更新

  • 複数言語での Pardot の使用
  • エンゲージメント履歴
  • ボットクリックなしで Pardot アクションとレポートを取得
  • Pardot Einstein とは?
  • エンゲージメントアクティビティでのプロスペクトのスコアリング


f:id:tyoshikawa1106:20190608154548p:plain

Platform アプリケーションビルダー認定資格の更新

アプリケーション構築者向けの新機能の学習
  • Flow Builder を使用したより直感的なフローの作成
  • Lightning ページから別のテンプレートへの切り替え
  • Lightning Experience での取引先チームの削除
  • Lightning Web コンポーネントの作成
  • マクロでの相対日付を使用した正確な日時の設定

・・・アドミンのリリース試験とけっこう重複してる。。

カスタマイズされたホームページとコンポーネントを使ってみる
  • リッチテキストコンポーネントは Quill テキストエディタを使用
  • 標準およびカスタムユーザ権限に基づくコンポーネントの表示の設定

CKEditorからQuillになってた。
f:id:tyoshikawa1106:20190608155245p:plain

f:id:tyoshikawa1106:20190608155653p:plain


ホームページにリッチテキストコンポーネント追加できるの便利!あとコンポーネントの表示条件指定ができるようになったのは助かってる。
f:id:tyoshikawa1106:20190608160142p:plain


f:id:tyoshikawa1106:20190608160500p:plain

Spring '19 での Platform デベロッパー向けの新機能の学習

一番やらないといけないやつ。

  • Apex: 新規および変更されたクラスおよびインターフェース
  • 予期しない例外に関する情報の取得
  • Sandbox のコピーによる時間の節約
  • カスタムメタデータ: カスタムメタデータ型を使用したデフォルト項目値の設定
  • SOQL クエリの項目レベルセキュリティ権限の適用 (ベータ)


これか。Apexで項目レベルセキュリティをチェックするようになる話。
f:id:tyoshikawa1106:20190608161448p:plain


SOQLにWITH SECURITY_ENFORCEDを宣言すると項目レベルセキュリティ判定ができるようになる。
f:id:tyoshikawa1106:20190608162321p:plain

Schema.SObjectType.Contact.fields.__c.isAccessible()処理がいらなくなる。処理をスッキリさせるとこんな感じ。
f:id:tyoshikawa1106:20190608162759p:plain


SecurityExceptionが不要になってQueryExceptionで対応するようになるみたいです。まだパイロットだし使う機会があるかわかりませんがこういう処理が追加されてるのは確認できてよかったです。


f:id:tyoshikawa1106:20190608163027p:plain

Spring '19 でのSharing and Visibility デザイナー認定資格の更新

最後のモジュール。長かった。

  • テリトリー別のレコード、レポートおよびダッシュボードフォルダ、リストビューへのアクセス権の付与
    • 共有ルールにより、ユーザは組織の共有設定よりも幅広いアクセス権をユーザグループに付与できます。
  • パートナー取引先のリレーションとデータ共有ルールの作成
    • 複数の流通業者を使用していて、オブジェクトレコードへの異なるレベルのアクセス権が各流通業者に必要な場合、共有ルールは複雑になる可能性があります。
  • テリトリー別の個々のレコードの共有
    • Spring '19 では、レコードを共有するときに、営業担当は [テリトリー] または [テリトリーおよび下位テリトリー] を選択できるようになりました。
  • エンタープライズテリトリー管理での取引先の手動共有を有効化
    • Spring '19 リリースでは、AccountShare の TerritoryManual 理由コードが Territory2AssociationManual に変更されます。
  • コミュニティのゲストユーザによるファイルのアップロード
    • Spring '19 リリースでは、システム管理者はゲストユーザがファイルをアップロードして共有することを許可できます。
  • ケースへのコミュニティユーザアクセスの制限
    • Spring '19 リリースでは、Customer Community Plus ライセンスを持つユーザが、自分が取引先責任者として含まれているケースを参照および編集できるかどうかを制御できるようになりました。


サイトゲストユーザもファイルアップロードできるようになったんだ。Force.comサイトは別かな。
f:id:tyoshikawa1106:20190608164317p:plain


これSpring'19で追加されてた機能だったのか。なんか増えてると思ってた。
f:id:tyoshikawa1106:20190608164916p:plain

f:id:tyoshikawa1106:20190608164807p:plain


f:id:tyoshikawa1106:20190608165000p:plain

まとめ

最初のモジュールが14:10完了してから16:49まで、2時間20分で無事にすべてのリリース試験バッチを取得できました。
f:id:tyoshikawa1106:20190608165632p:plain


バッチ取得のために関係モジュールもやりましたがSpring'19リリース試験無事に完了して資格更新できました。
f:id:tyoshikawa1106:20190608165726p:plain

SFDC:Apex開発とアクセス権限の関係について

Apexクラスの処理は基本的にシステム権限で実行されます。そのためいくつか権限設定を行い正しく利用されるように制御する必要があります。

ページアクセスの権限

この権限が付与されていない場合はページにアクセスするとエラーメッセージが表示されます。
f:id:tyoshikawa1106:20190608110458p:plain

f:id:tyoshikawa1106:20190608110812p:plain

有効なApexクラスの権限

Apexクラスの権限が実は付与されていなくてもあまり問題がないことが多いです。
f:id:tyoshikawa1106:20190608115046p:plain


社内ユーザが操作するVisualforceページが裏側で呼び出しているcontrollerなどは権限を付与していなくても問題なく利用できます。(@RemoteActionも平気でした。)
f:id:tyoshikawa1106:20190608115544p:plain


この権限が必要になるのはカスタムボタンからApexクラスを実行するWebServiceメソッドを呼び出すような場面で必要になります。(カスタムボタン→Javascript→Apexクラス呼び出しはLightning Experienceではサポートされていないので利用場面は少なくなったと思います。)


その他いくつかの場面で必要になったとは思いますが基本的には実装後の動作確認で気づけるレベルと思います。

オブジェクトの参照権限

Apexは基本的にシステム権限で実行されます。そのため項目レベルセキュリティなどは無視して処理が可能です。例として下記のような感じ。

権限あり

f:id:tyoshikawa1106:20190608131315p:plain

権限なし

f:id:tyoshikawa1106:20190608131350p:plain

f:id:tyoshikawa1106:20190608131408p:plain

このように取引先権限を除外することで標準ページでアクセスできなくしてもVisuaforceページでクエリを実行すると下記のようにデータにアクセスできます。
f:id:tyoshikawa1106:20190608131556p:plain


Visualforceページ側でapex:outputFieldタグなどをつかった場合は権限周りもチェックされますが、それ以外の表示方法なら権限を無視して実装できます。こうした仕様のメリットとしては、プロファイル設定でユーザの権限を与えないことで標準ページ上は何も操作できない状態にして、Visualforce一画面のみ業務に必要なデータ登録を行うなどの実装ができます。(上記取引先検索の例ではデータ参照ですが、基本的にはデータ登録や更新周りでの用途となると思います。)


逆に開発者はセキュリティの要件が厳しい機能のApex開発を行う場合はそうした判定処理を実装する必要があります。(基本的にアクセス権限を無視した機能の実装を行うケースの方が稀だと思いますが..)

「with sharing」と「without sharing」

よく話にでてくる「with sharing」と「without sharing」での取得制御ですが、こちらは項目レベルセキュリティを判定するのではなく、共有設定で制御された非公開レコードへのアクセスの制御となります。

まとめ

Apexのシステム権限実行ですが、Summer'19へのリリースでFLSやCRUDが考慮されるようになる機能が追加されるという話を耳にしました。(パイロット版かも) リリースノートなどではまだ正確な情報を確認していないのですが、Sandbox組織でSummer'19が一足先にさわれるようになっていると思いますので気になる機能の動作確認はしておいたほうが良いかもしれません。(パイロット版とのことなのでまだ大丈夫と思いますが。)

SFDC:Visualforceページにアクセスするときのカスタムボタンとアクションの違い

レコードの詳細ページからVisualforceページにアクセスするにはカスタムボタンの方法とアクションによる方法があります。

f:id:tyoshikawa1106:20190608110025p:plain

はじめに

・カスタムボタン => ClassicでもLightning Experienceでも両方OK.
・アクション => Lightning Excperienceのみ(Salesforceモバイルでも利用可能)

Visualforceアクセス権限での挙動の違い

ユーザがVisualforceページにアクセスするにはプロファイル等で権限を付与する必要があります。
f:id:tyoshikawa1106:20190608110458p:plain


Visualforceページのアクセス権限がない場合、カスタムボタンの場合はボタンが表示された状態となりますが、アクションの場合はボタン自体が非表示になる制御が用意されています。※「商談商品登録⚡」がアクションです。

VFページのアクセス権限あり

f:id:tyoshikawa1106:20190608113007p:plain:w300

VFページのアクセス権限なし

f:id:tyoshikawa1106:20190608110658p:plain:w300


カスタムボタンの場合、ボタンは表示されたままになりますがクリックするとアクセスエラーとなります。
f:id:tyoshikawa1106:20190608110812p:plain


アクションはClassicでは利用できないという仕様がありますが、Lightning Experienceへの移行が完了している組織の場合は権限判定が強化されているアクション経由での利用の検討も良いかもしれません。

カスタムボタンとアクションの表示形式の違い

カスタムボタンでVisualforceページにアクセスするとページ全体が切り替わります。
f:id:tyoshikawa1106:20190608111251p:plain


アクションの場合はポップアップ形式で表示されます。
f:id:tyoshikawa1106:20190608111642p:plain


ポップアップの高さはアクションの設定の際に指定できます。
f:id:tyoshikawa1106:20190608111714p:plain


ポップアップにタイトルやキャンセルボタンなどが付いてきますがこちらはapex:pageタグのshowQuickActionVfHeader属性で解決すると思います。
f:id:tyoshikawa1106:20190608112110p:plain

f:id:tyoshikawa1106:20190608111853p:plain

https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_page.htm


変更後はこちら。不要なタイトルやボタンが非表示となりスッキリしました。
f:id:tyoshikawa1106:20190608112207p:plain


アクションの場合、詳細ページからは移動していないため「sforce.one.back(true);」処理による前ページに戻る処理を実行すると詳細ページの前のページのビューページまで戻る挙動となります。
f:id:tyoshikawa1106:20190608112533p:plain

f:id:tyoshikawa1106:20190608112547p:plain


カスタムボタンでの実装時にレコード詳細ページ→ボタンクリック→Visuafoorceページ→前ページへ戻る→レコード詳細ページという流れを想定してつくっている場合はアクションにすると挙動が変わってしまうのでアクションへの切り替え前に処理を見直す必要があります。


Visualforceページにアクセスするカスタムボタンとアクションの違いはこんな感じでした。