システム管理者の独り言

元営業の素人がsalesforceシステム管理者になったので備忘録を。。

ログインしたユーザとして実行できるダッシュボード数の制限

ログインしたユーザとして実行できるダッシュボード数の制限に達しました。

classic環境ですが、ダッシュボードを作成して保存したところ、上記エラーが発生しました。
調べたところ、動的ダッシュボードの制限でした。

Enterprise Edition → 最大5個
Unlimited Edition と Performance Edition → 最大10個

困ったこ

どのダッシュボードがログインユーザーで動かしてるかわからない。。。 単純にレポートの一覧ビューをみても判別できない。ダッシュボードを一つ一つ編集状態にして確認はちょっとしんどい。。

解決策

SOQLクエリで

SELECT Id, Type, RunningUserId, Title FROM Dashboard

f:id:iwaoLog:20171005194429p:plain

Type列で「指定ユーザー」か「ログインユーザー」か判別できる。。たすかった。。。

SOQLで使う「ALL ROWS」キーワード

salesforceでは活動オブジェクトが一定の基準でアーカイブされます。

https://help.salesforce.com/articleView?id=000005175&language=ja&type=1

 

アーカイブされたデータを取得するのには「ALL ROWS」キーワードを使うと。

ALL ROWSキーワードを使用すると削除されたレコードもクエリされる。

 developer.salesforce.com

 

実組織を使用して試してみました。

同じ条件のクエリで、ALL ROWSキーワードなし・ありで比較。

 

f:id:iwaoLog:20170914195711p:plain

 

ALL ROWS「なし」では4461件でしたが、「あり」だと18748件。そのうち9件が削除済み。

ALL ROWSなしのときは当然削除済みのものは0件ですね。

※削除済みは IsDeleted = true の条件を追加しています。

 

活動履歴をクエリする場合はアーカイブされたものを対象とするかどうかも検討が必要そうです。

不用意にALL ROWSを使うとガバナ制限にもかかりやすくなるでしょうし。。

 

※開発者コンソールの「Query Editor」だとALL ROWSキーワードは使えないみたいです。

 

SOQLの日付リテラル

忙しさを理由に更新を怠っていた… 前回書いていた内容の続きは改めて書こう

今回はSOQLで使える日付リテラルをまとめとく。(リファレンス読めよ) 時々使うのでここに抜粋

SOQL日付リテラル一覧

日付リテラル 範囲
YESTERDAY 昨日の 00:00:00 から、その 24 時間後まで SELECT Id FROM Account WHERE CreatedDate = YESTERDAY
TODAY 本日の 00:00:00 から、その 24 時間後まで SELECT Id FROM Account WHERE CreatedDate > TODAY
TOMORROW 明日の 00:00:00 から、その 24 時間後まで SELECT Id FROM Opportunity WHERE CloseDate = TOMORROW
LAST_WEEK 先週の最初の日の 00:00:00 から、その 7日後までが指定。週の最初の日はロケールによって判断 SELECT Id FROM Account WHERE CreatedDate > LAST_WEEK
THIS_WEEK 今週の最初の日の 00:00:00 から、その 7日後までが指定。週の最初の日はロケールによって判断 SELECT Id FROM Account WHERE CreatedDate < THIS_WEEK
NEXT_WEEK 来週の最初の日の 00:00:00 から、その 7日後までが指定。週の最初の日はロケールによって判断 SELECT Id FROM Opportunity WHERE CloseDate = NEXT_WEEK
LAST_MONTH 先月の最初の日の 00:00:00 から、その月のすべての日が指定 SELECT Id FROM Opportunity WHERE CloseDate > LAST_MONTH
THIS_MONTH 今月の最初の日の 00:00:00 から、その月のすべての日が指定 SELECT Id FROM Account WHERE CreatedDate < THIS_MONTH
NEXT_MONTH 来月の最初の日の 00:00:00 から、その月のすべての日が指定 SELECT Id FROM Opportunity WHERE CloseDate = NEXT_MONTH
LAST_90_DAYS 本日の 00:00:00 から、その 90 日前までが指定 SELECT Id FROM Account WHERE CreatedDate = LAST_90_DAYS
NEXT_90_DAYS 本日の 00:00:00 から、その 90 日後までが指定 SELECT Id FROM Opportunity WHERE CloseDate > NEXT_90_DAYS
LAST_N_DAYS:n 数値n が指定されている場合、本日の00:00:00 から、そのn 日前までが指定 SELECT Id FROM Account WHERE CreatedDate = LAST_N_DAYS:365
NEXT_N_DAYS:n 数値n が指定されている場合、本日の00:00:00 から、そのn 日後までが指定 SELECT Id FROM Opportunity WHERE CloseDate > NEXT_N_DAYS:15
NEXT_N_WEEKS:n 数値n が指定されている場合、翌週の最初の日の 00:00:00 から、そのn 週後までが指定 SELECT Id FROM Opportunity WHERE CloseDate > NEXT_N_WEEKS:4
LAST_N_WEEKS:n 数値n が指定されている場合、前週の最後の日の 00:00:00 から、そのn 週前までが指定 SELECT Id FROM Account WHERE CreatedDate = LAST_N_WEEKS:52
NEXT_N_MONTHS:n 数値n が指定されている場合、翌月の最初の日の 00:00:00 から、そのn 月後までが指定 SELECT Id FROM Opportunity WHERE CloseDate > NEXT_N_MONTHS:2
LAST_N_MONTHS:n 数値n が指定されている場合、前月の最後の日の 00:00:00 から、そのn 月前までが指定 SELECT Id FROM Account WHERE CreatedDate = LAST_N_MONTHS:12
THIS_QUARTER 今四半期の最初の日の 00:00:00 から、今四半期の終わりまでが指定 SELECT Id FROM Account WHERE CreatedDate = THIS_QUARTER
LAST_QUARTER 前四半期の 00:00:00 から、その四半期の終わりまでが指定 SELECT Id FROM Account WHERE CreatedDate > LAST_QUARTER
NEXT_QUARTER 翌四半期の 00:00:00 から、その四半期の終わりまでが指定 SELECT Id FROM Account WHERE CreatedDate < NEXT_QUARTER
NEXT_N_
QUARTERS:n
翌四半期の 00:00:00 から、n 期後の四半期の終わりまでが指定 SELECT Id FROM Account WHERE CreatedDate < NEXT_N_QUARTERS:2
LAST_N_
QUARTERS:n
n 期前の四半期の最初の日の 00:00:00 から、前四半期の最終日の終わりまでが指定 SELECT Id FROM Account WHERE CreatedDate > LAST_N_QUARTERS:2
THIS_YEAR 今年の 1 月 1 日 00:00:00 から、今年の 12月 31 日の終わりまでが指定 SELECT Id FROM Opportunity WHERE CloseDate = THIS_YEAR
LAST_YEAR 前年の 1 月 1 日 00:00:00 から、その年の12 月 31 日の終わりまでが指定 SELECT Id FROM Opportunity WHERE CloseDate > LAST_YEAR
NEXT_YEAR 翌年の 1 月 1 日 00:00:00 から、その年の12 月 31 日の終わりまでが指定 SELECT Id FROM Opportunity WHERE CloseDate < NEXT_YEAR
NEXT_N_
YEARS:n
翌年の 1 月 1 日 00:00:00 から、n 年後の 12月 31 日の終わりまでが指定 SELECT Id FROM Opportunity WHERE CloseDate < NEXT_N_YEARS:5
LAST_N_
YEARS:n
n 年前の 1 月 1 日 00:00:00 から、前年の 12月 31 日の終わりまでが指定 SELECT Id FROM Opportunity WHERE CloseDate > LAST_N_YEARS:5
THIS_FISCAL_
QUARTER
現在の会計四半期の最初の日の 00:00:00から、その会計四半期の最終日の終わりまでが指定。会計年度は、設定 の会計年度 ページで定義 SELECT Id FROM Account WHERE CreatedDate = THIS_FISCAL_QUARTER
LAST_FISCAL_
QUARTER
前会計四半期の最初の日の 00:00:00 から、その会計四半期の最終日の終わりまでが指定。会計年度は、設定 の 会計年度 ページで定義 SELECT Id FROM Account WHERE CreatedDate > LAST_FISCAL_QUARTER
NEXT_FISCAL_
QUARTER
翌会計四半期の最初の日の 00:00:00 から、その会計四半期の最終日の終わりまでが指定。会計年度は、設定 の 会計年度 ページで定義 SELECT Id FROM Account WHERE CreatedDate < NEXT_FISCAL_QUARTER
NEXT_N_FISCAL_
QUARTERS:n
翌会計四半期の最初の日の 00:00:00 から、n 期後の会計四半期の最終日の終わりまでが指定。会計年度は、設定の 会計年度 ページで定義 SELECT Id FROM Account WHERE CreatedDate < NEXT_N_FISCAL_
QUARTERS:6
LAST_N_FISCAL_
QUARTERS:n
n 期前の会計四半期の最初の日の 00:00:00から、前会計四半期の最終日の終わりまでが指定。会計年度は、設定の 会計年度 ページで定義 SELECT Id FROM Account WHERE CreatedDate > LAST_N_FISCAL_
QUARTERS:6
THIS_FISCAL_
YEAR
現在の会計四半期の最初の日の 00:00:00から、その会計四半期の最終日の終わりまでが指定。会計年度は、設定 の 会計年度 ページで定義 SELECT Id FROM Opportunity WHERE CloseDate = THIS_FISCAL_YEAR
LAST_FISCAL_
YEAR
前会計年度の最初の日の 00:00:00 から、その会計年度の最終日の終わりまでが指定。会計年度は、設定 の 会計年度 ページで定義 SELECT Id FROM Opportunity WHERE CloseDate > LAST_FISCAL_YEAR
NEXT_FISCAL_
YEAR
翌会計年度の最初の日の 00:00:00 から、その会計年度の最終日の終わりまでが指定。会計年度は、設定 の 会計年度 ページで定義 SELECT Id FROM Opportunity WHERE CloseDate < NEXT_FISCAL_YEAR
NEXT_N_FISCAL_
YEARS:n
翌会計年度の最初の日の 00:00:00 から、n 年後の会計年度の最終日の終わりまでが指定。会計年度は、設定 の会計年度 ページで定義 SELECT Id FROM Opportunity WHERE CloseDate < NEXT_N_FISCAL_YEARS:3
LAST_N_FISCAL_
YEARS:n
n 年前の会計年度の最初の日の 00:00:00から、前会計年度の最終日の終わりまでが指定。会計年度は、設定 の会計年度 ページで定義 SELECT Id FROM Opportunity WHERE CloseDate > LAST_N_FISCAL_YEARS:3

意外と多いですね。 LAST_N_DAYS:nとか定期的に取得するような場合は使えそうです。

developer.salesforce.com

続 TrailHeadでSalesforceDXをやってみる

 前回からの続きでtrailを進めていく

今回は

trailhead.salesforce.com

 

Create a Salesforce DX Project

まずはローカルにプロジェクトを作成するとのこと。

コマンドウィンドウから任意の場所に移動して以下のコマンドを入力

sfdx force:project:create -n geolocation 

 -nの後に入力した名前で下記の構成でプロジェクトが作成されました。

f:id:iwaoLog:20170815113511p:plain

「config/project-scratch-def.json

機能と環境設定がorgの形状を定義することを含むscratch orgの構成を決定します。開発チーム全体が共有できる設定ファイルを作成できます。

google翻訳のままですが、ここにこれから作成するスクラッチ組織の情報を書き込むのかな。。。

 

Create a Scratch Org

先程作成したプロジェクトのディレクトリに移動して、GeoAppScratchをいうエイリアスをもつscratch orgを作成。

sfdx force:org:create -s -f config/project-scratch-def.json -a GeoAppScratch

 -s このスクラッチ組織をプロジェクトのデフォルトに設定

 -f スクラッチ組織の設定を行うパスを指定。

 -a エイリアスを設定(= GeoAppScratch)

f:id:iwaoLog:20170815115122p:plain

設定が完了しました。

 

Create a Custom Object

 次のステップで取引先にカスタム項目を作ります。

クラッチ組織の設定をするために次のコマンドを入力

sfdx force:org:open

f:id:iwaoLog:20170815115725p:plain

エラーになりました。。。

調べてみると、スクラッチ組織を作成してすぐはエラーになるようです。数分(デフォルト4分?)ほど待って再度コマンド実行して成功しました。

f:id:iwaoLog:20170815120440p:plain

 

開いたスクラッチ組織の設定から指示通り、取引先に地理位置情報のカスタム項目、権限セットを作成後、以下のコマンド実行

sfdx force:user:permset:assign -n Geolocation

f:id:iwaoLog:20170815121609p:plain

成功しました。

Metadata Magic: Pull Changes into Your Project

クラッチ組織で行った変更をローカルプロジェクトと同期させます。と。。。

sfdx force:source:pull

f:id:iwaoLog:20170815122057p:plain

 見にくいですが、同期された内容が表示されました。trailと同じような内容です。

クラッチ組織は一時的(7日間)だそうです。Gitなどで変更履歴の管理をする際には、.sfdxフォルダはリポジトリに追加しないように推奨されていました。

 

Create Sample Data

クラッチ組織にサンプルデータを作成します。

そして、Geolocationプロジェクトにdataというディレクトリを作成して、スクラッチ組織で作成したサンプルデータをエクスポートします。

sfdx force:data:tree:export -q "SELECT Name, Location__Latitude__s,

Location__Longitude__s FROM Account WHERE Location__Latitude__s !=

NULL AND Location__Longitude__s != NULL"-d ./data 

3件のレコードがエクスポートされたようです。

f:id:iwaoLog:20170815124103p:plain

dataディレクトリを確認するとjsonデータがありました。

f:id:iwaoLog:20170815125820p:plain

 

次のユニットでコードの操作などを行うようです。

ひとまずここまで。

TrailHeadでSalesforceDXをやってみる

salesforceDX....

ひとまず覚えるためにトライしてみる。

trailhead.salesforce.com

・・・日本語化希望します。

 めげずに読んで最初の導入はなんとか終了。満点取れず

Salesforce DX Development Model | Salesforce Trailhead

 

 次からが実際の環境を動かすようです。

trailhead.salesforce.com

 

Dev Hubのサインアップ

f:id:iwaoLog:20170814152744p:plain

こちらの「Dev Hub trial org」から環境の取得ができます。

f:id:iwaoLog:20170814152750p:plain

必要な内容を記入して「サインアップ」

f:id:iwaoLog:20170814153117p:plain

認証メールが入力したアドレスに届くので、そこからパスワードを設定するとログインができました。

続いて、CLI(Command Line Interface)を自分のPCにあわせてインストールするので、Windows 64-bitを選択。デフォルト選択のままインストール。

(Gitもすべてデフォルトでインストールしました)

f:id:iwaoLog:20170814154504p:plain

f:id:iwaoLog:20170814154415p:plain

 

Trailに沿って進めてみます。

インストールした「Git Bush」を立ち上げて、$にカーソルがあうのでsfdxと入力。

f:id:iwaoLog:20170814155722p:plain

trailの通りに表示されました。追加で「sfdx force --help」と入力

f:id:iwaoLog:20170814155835p:plain

「sfdx force:doc:commands:list」も入力してみました。

f:id:iwaoLog:20170814160257p:plain

 

Dev Hubにログイン

 ログインを試してみます。

「sfdx force:auth:web:login -d -a DevHub」を入力すると、ブラウザが立ち上がるのでそこからログインします。

「-d」がデフォルトになる組織を指定。「-a」が組織のエイリアスを設定?だと思う。。。

ログインが成功するとCLI上は次のようになります。

f:id:iwaoLog:20170814161958p:plain

以下のコマンドを入力することで直接ブラウザを立ち上げてsalesforceを開くこともできました。

「sfdx force:org:open -u DevHub」

 

 

SObjectのプレフィックスを取得してみる

そこまで使うこともないのですが、時々オブジェクトのプレフィックスを知りたいときがある。

そこで一覧で取得できるようにしてみました。

 

<完成イメージとして。。。>

・標準オブジェクトとカスタムオブジェクトを分けて表示

API名、ラベル名もあわせて表示

 

<参考にしたのはこの辺>

developer.salesforce.com

developer.salesforce.com

 

でもって、visualforceでボタンを押すと一覧を表示する画面を作成

初期表示は下記の状態

f:id:iwaoLog:20170802193338p:plain

ボタンを押すと・・・・

 

f:id:iwaoLog:20170802193334p:plain

 

カスタムオブジェクトも表示できた。

f:id:iwaoLog:20170802193330p:plain

 

そこまで使うのかというと、正直わからないが一覧で取得できたことは良かったかも。

 

作ったソースはこちらです。

そのまま流用できるとは思いますが、オブジェクトへのアクセス権は考慮していないです。cssもVF内に直接書き込んでいます。

 

gist1ed14735410c0df223ba0353878def18

gistb4d3e948f717ac2fccb4bc16629463d1

 

 

ApexからChatterフィードを作る

取引先責任者の拡張コントローラからChatterフィードをApexで作ってみた。

 

<やりたいこと>

 ・定型の内容でChatterに投稿したい。

 ・投稿は、取引先責任者レコードに関連付けたい。

 ・メンション先は固定

 

ワークフローでメールアラートを送るようなイメージだがやりとりの履歴を

salesforceに残すためにChatterの活用を考えている。

 

ということでリファレンス丸写しですが以下のコードで実現できた。

※メソッド部分のみです。

ConnectApiってのを使うんですね、知らなかった・・・

 

 

 

ChatterFeedFromApex

 

拡張コントローラ内でVFに設置したボタンを押下するとメソッドを呼び出し。

コード内の注釈

「cont.id」は標準コントローラから受け取った取引先責任者のIdです。

「selected」は別メソッドから受け取った値を格納しています。

 

chatterグループにメンションする場合などは別途考慮が必要だったりしますが、

とりあえずのテストとしては成功。

 

いいかげん、Lightningも覚えていかないと

 

 元にしているvisualforce、apexは前回の記事をベースにしています。

iwaolog.hatenablog.com