Quantcast
Channel: tyoshikawa1106のブログ
Viewing all 1438 articles
Browse latest View live

SFDC:Apexバッチの数分おきに繰り返し実行を試してみました

$
0
0

Apexバッチを指定の時間や定期的に実行したい場合は、スケジュールバッチの仕組みを使って対応します。スケジュールバッチは「implements Schedulable 」を宣言したクラスを用意することで作成できます。

Scheduleクラス

f:id:tyoshikawa1106:20190916082622p:plain

Connectクラス

f:id:tyoshikawa1106:20190916082421p:plain


上記のようなクラスを用意するとApexクラスの設定で「Apex をスケジュール」の仕組みが利用できるようになります。
f:id:tyoshikawa1106:20190916082810p:plain


こちらがApexスケジュールの設定画面です。
f:id:tyoshikawa1106:20190916082918p:plain


開始日と終了日を設定でき、実行対象の曜日と時間を指定できます。一日一回のスケジュール実行という要件の場合はこちらの設定画面のみで対応できます。注意が必要なのは数分単位で実行したい場合です。Apex をスケジュールの設定では1時間単位でのみ実行時間を指定できます。そのため5分間隔や15分間隔での実行はサポートされていません。今回は設定ページのみでは実現できない数分間隔での実行方法を紹介します。


Apexバッチの処理は「コンストラクタ」「start」「execute」「finish」のメソッドで構成されます。「start」のメソッドで対象となるデータを取得します。「execute」のメソッドでメインの処理が実行されます。バッチサイズの件数分に分割して繰り返し処理を実行します。(バッチサイズ200件で1000件対象データがある場合は200×5回繰り返し実行されます。)「finish」のメソッドが最後に一回呼び出されて処理を実行します。

Apexバッチクラス

f:id:tyoshikawa1106:20190916083634p:plain


最後に実行される「finish」メソッドで次のスケジュールバッチを登録することが可能です。
f:id:tyoshikawa1106:20190916084102p:plain


スケジュールバッチは「System.schedule(jobName, sch, cls);」の処理で登録できます。ジョブ名、スケジュール実行時間、対象のスケジュールバッチクラスが引数として必要です。

/**
 * Finish
 */
public void finish(Database.BatchableContext BC) {
    // 次回スケジュールバッチ登録判定
    if (this.isNextBatch) {
        // 次回スケジュールバッチ実行時間取得
        Datetime nextBatchTime = Datetime.now().addMinutes(5);
        // 次回スケジュールバッチ実行時間登録
        OpportunityChatterPostBatchSchedule cls = new OpportunityChatterPostBatchSchedule();
        String jobName = 'OpportunityChatterPostBatchScheduleJob_' + nextBatchTime.format('yyyyMMddHHmm');
        String sch = nextBatchTime.format('0 m H d M ? yyyy');
        System.schedule(jobName, sch, cls);
    }
}

ジョブ名はユニークにする必要があります。Apex処理で自動登録する場合は実行日時などを追加するのが良さそうです。
スケジュール実行時間は文字列で宣言します。引数の渡し方はいくつか用意されていますが任意の時間に一回実行したい場合は下記の引数を渡します。

(秒 分 時 日 月 ? 年)

時間は24時間表記です。DateTime型の.formatでは「hh:mm:ss」と宣言できますが「hh」を「HH」と大文字で宣言することで24時間表記になります。また「H」とのみ宣言することで0埋めがされなくなります。


この方法で実行した結果がこちらです。約5分おきに実行されています。
f:id:tyoshikawa1106:20190916084729p:plain


検証時ですが20:00など切りの良い時間から開始しましたが一晩立つ頃には1分ズレが発生しました。こればバッチ実行は宣言してすぐに実行されない(一度キューに貯まる)ことと、Finsh時点での日時を基準に5分後で登録したので処理に時間がかかることで1分間のズレが発生したためと思います。


5分おきに実行する場合はこうしたズレも考慮した方が良いみたいです。またバッチのキューは一度に登録できる件数に上限があります。夜間バッチなど処理が多く実行される場合は登録をスキップするなどの考慮も必要になると思います。

補足

上記サンプルのバッチクラスでは下記の「Helper」クラスと「Dao」クラスを宣言しています。目的に合わせてクラスを分けるとメンテがしやすいと思います。

Helperクラス

f:id:tyoshikawa1106:20190916085723p:plain

Daoクラス

f:id:tyoshikawa1106:20190916085745p:plain

利用例

今回の数分単位でのバッチ実行ですが、例として新規商談を登録した際にChatterに投稿すると行った場面で利用できます。社内ユーザが新規商談を登録した際には何も気にせずプロセスビルダーでそのまま対応できますが、Force.comサイトで作成したフォーム経由で登録された場合など社外ユーザの作成時には通常Chatter投稿ができません。Apexのスケジュールバッチの場合は管理者権限で実行できるので、社外ユーザ権限で商談作成できる仕組みを構築したいときなどに利用できると思います。

関連・参考


SFDC:テストクラス判定できるTest.isRunningTest処理をつかったメンテナンス性の向上について

$
0
0

Apex開発でTest.isRunningTest処理を使ったメンテナンス性の向上についてです。
f:id:tyoshikawa1106:20190916103758p:plain

Salesforce Developers


Apex開発を行ったときにはテストクラスの作成が必要になります。テストクラスをきちんと作成することで既存処理への予期せぬ影響に気づけたり、実装した箇所の考慮漏れや実装ミスに気づくことができます。


・・・ですが処理の内容によってはテストクラスが作成しずらい場面がでてきます。


たとえば下記のような処理です。

// 次回スケジュールバッチ実行時間取得
Datetime nextBatchTime = Datetime.now().addMinutes(5);
// 次回スケジュールバッチ実行時間登録
OpportunityChatterPostBatchSchedule cls = new OpportunityChatterPostBatchSchedule();
String jobName = 'OpportunityChatterPostBatchScheduleJob_' + nextBatchTime.format('yyyyMMddHHmm');
String sch = nextBatchTime.format('0 m H d M ? yyyy');
// スケジュールバッチ登録
System.schedule(jobName, sch, cls);


上記の処理をそのままテスト実行すると下記のエラーが発生します。

System.AsyncException: "OpportunityChatterPostBatchScheduleJob_201909161032"という Apex ジョブはすでに実行がスケジュールされています。 3483
Class.OpportunityChatterPostBatch.finish: line 54, column 1

f:id:tyoshikawa1106:20190916104136p:plain


スケジュールバッチ処理実行時にジョブ名をユニークにするために日時を付与していますが、テストクラスで同じタイミングで複数呼び出しされることでユニークにならなくなってしまいました。こうした処理がある場合の対処方法として、テストクラスの実装を諦めるという手段もありますが、Test.isRunningTest処理を利用することできれいに解決できます。


Test.isRunningTest処理は「現在実行中のコードが、テストメソッドに含まれているコード」かを判別するための処理です。
f:id:tyoshikawa1106:20190916104550p:plain


これで下記のような書き方が可能となります。(if処理では「!」をつけてテストではない場合にという判定にできる)

if (!Test.isRunningTest()) {
    // テストでない場合にスケジュール登録処理を実行
    System.schedule(jobName, sch, cls); 
}


スケジュール登録処理のみスキップできるようになりテストクラスを開発できるようになります。ですが上記の判定方法だとif判定内の処理は絶対に実行できないためカバー率低下が発生します。この問題を回避するために下記の記述にした方が良いと思います。

// スケジュールバッチ登録
String nextBatchJobId = (!Test.isRunningTest()) ? System.schedule(jobName, sch, cls) : '';

f:id:tyoshikawa1106:20190916105754p:plain


テストクラスの実行判定は行単位で識別されるのでこの書き方ならカバー率低下を回避することができます。また必要に応じてテスト処理の場合のみ任意も戻り値を指定することも可能になります。


このようにTest.isRunningTest()をうまく利用することでテスト実装ができない問題を回避しつつ正しくテストを行い品質とメンテナンス性を向上することができると思います。

関連

SFDC:日時型をSOQLクエリで条件指定するときに注意すること

$
0
0

日時型をSOQLクエリで条件指定するときに注意することについてです。例えば作成日を条件に取得するようなケースがあたります。

f:id:tyoshikawa1106:20190919071350p:plain


日時型はSalesforceを普通に操作するような場面では下記のように表示されます。

「2019/09/19 7:10」


ですがApexなどでシステム上の値としては次の形で保持されています。GMT表記となり日本時間から9時間ずれた値として表示されます。

「2019-09-18T22:10:49.000+0000」

f:id:tyoshikawa1106:20190919071559p:plain

日付型や日時型の値を今日や昨日というように取得したい場合は日付リテラルの仕組みで取得できます。
f:id:tyoshikawa1106:20190919072318p:plain


「 WHERE CreatedDate = TODAY」というような記述ができます。これは実行ユーザのタイムゾーンに合わせて取得してくれるようです。

SELECT Name, CreatedDate FROM Account WHERE CreatedDate = TODAY ORDER BY CreatedDate

f:id:tyoshikawa1106:20190919072517p:plain

f:id:tyoshikawa1106:20190919072728p:plain


注意が必要なのは日付リテラルではなくDAY_ONLYなどの日付関数を利用する場合になります。
f:id:tyoshikawa1106:20190919073221p:plain


日付関数は協定世界時 (UTC)の値で返します。日本時間の9時より前の時間値は9時間ずれで前日扱いとなります。

WHERE DAY_ONLY(CreatedDate) =: targeDate
本日を条件に取得した場合

f:id:tyoshikawa1106:20190919073551p:plain

f:id:tyoshikawa1106:20190919073722p:plain

前日日付で取得する方法

f:id:tyoshikawa1106:20190919073838p:plain

f:id:tyoshikawa1106:20190919073854p:plain

検証コード
// 前日日付で実行
Date targeDate = System.today().addDays(-1); 

List<Account> accounts = [SELECT Name,CreatedDate FROM Account WHERE DAY_ONLY(CreatedDate) =: targeDate ORDER BY CreatedDate];

System.debug('取得結果 = ' + accounts.size());
for (Account account : accounts) {
    System.debug(account.Name + ' : ' + String.valueOf(account.CreatedDate));
}


上記のとおり日付関数だと作成日が本日のものでも前日の日付で取得される状態となります。開発者ガイドにも表記されていますが日付関数を利用してユーザのタイムゾーンに合わせるときには「convertTimezone」関数を使用します。

f:id:tyoshikawa1106:20190919074248p:plain


これで日付関数でもユーザのタイムゾーンに合わせてデータを取得できます。
f:id:tyoshikawa1106:20190919074400p:plain

その他の対応方法

頻繁に条件指定で使用する場合などでApex側でタイムゾーンを意識して処理を実装するのが大変な場合は数式で日付型に変換した値を用意すると便利かもしれません。

f:id:tyoshikawa1106:20190919075112p:plain


次のように当日日付として取得できました。
f:id:tyoshikawa1106:20190919075247p:plain

おまけ

日時型の項目はString.valueOf処理で文字列に変換するとユーザのタイムゾーンで表示されます。
f:id:tyoshikawa1106:20190919075540p:plain

関連

SFDC:Salesforce World Tour Tokyo 2019のDeveloper Theatreで登壇させて頂きました

$
0
0

Salesforce World Tour Tokyo 2019の2日目、Developer Theatreの17:00からのセッションで登壇させて頂きました。SalesCloudとApex開発についての内容で、セッション時のスライドはこちらです。


アレ話そうコレ話そうと付け足していったら時間ギリギリになってしまいましたが参加できて良かったです。


f:id:tyoshikawa1106:20190926170204j:plain

f:id:tyoshikawa1106:20190926171845j:plain

SFDC:Salesforce World Tour Tokyo 2019に参加しました

$
0
0

2019年 9月 25日(水)- 26日(木)に ザ・プリンス パークタワー東京と東京プリンスホテルで開催されたSalesforce World Tour Tokyo 2019に参加しました
f:id:tyoshikawa1106:20190930073400p:plain

Salesforce World Tour Tokyo | 2019年 9月 25日(水)- 26日(木) ザ・プリンス パークタワー東京/東京プリンスホテル | セールスフォース・ドットコム

Day 1

はじめての Salesforce [M1]@Room4 / Room5 (PPT)

8:30からのモーニングセッションです。モーニングセッションに参加する場合、受付時間が8時からになるので空いてる時間に手続きできて良いと思います。朝ごはんも頂けました。
f:id:tyoshikawa1106:20190925081913j:plain:w300

f:id:tyoshikawa1106:20190925081535j:plain:w300

f:id:tyoshikawa1106:20190925081632j:plain:w300


セッション内容はセールスフォースとはという話から実際の利用をイメージしたデモンストレーションです。
f:id:tyoshikawa1106:20190925083117j:plain:w300

f:id:tyoshikawa1106:20190925083733j:plain:w300


B to BとB to Cの両方でサポート可能な話もありました。
f:id:tyoshikawa1106:20190925084103j:plain:w300

f:id:tyoshikawa1106:20190925084138j:plain:w300


デモンストレーションではリードの使い方やダッシュボードの作成例を紹介してくれました。Lightningでの詳細ページでの3列表示は想像より使いやすそうだったのが印象に残りました。
f:id:tyoshikawa1106:20190925084546j:plain:w300

f:id:tyoshikawa1106:20190925084616j:plain:w300

f:id:tyoshikawa1106:20190925084831j:plain:w300

f:id:tyoshikawa1106:20190925084936j:plain:w300


Pardotをつかったマーケティングのデモも良かったです。セミナー、展示会、資料請求フォームでリードを獲得、Pardotでメールを送付という手順は便利そうでした。(セミナーや資料請求フォームをやっている必要はありますが)
f:id:tyoshikawa1106:20190925085151j:plain:w300


30分のセッションでしたがモーニングセッション良かったです。
f:id:tyoshikawa1106:20190925085707j:plain:w300

基調講演:A Celebration of Trailblazers [KN]@Keynote Room (PPT)

9:00からは基調講演を見に行きました。
f:id:tyoshikawa1106:20190925092332j:plain:w300

f:id:tyoshikawa1106:20190925092930j:plain:w300


小出CEOと米セールスフォース・ドットコムのCTOのパーカーハリスの話が聞けました。
f:id:tyoshikawa1106:20190925100514j:plain:w300

f:id:tyoshikawa1106:20190925102612j:plain:w300

f:id:tyoshikawa1106:20190925102134j:plain:w300

f:id:tyoshikawa1106:20190925102850j:plain:w300


特定の業界向けの新製品の発表もありました。
f:id:tyoshikawa1106:20190925103544j:plain:w300


導入事例企業の三越伊勢丹ホールディングス社とKubota社の役員の方のお話も聞けました。
f:id:tyoshikawa1106:20190925103816j:plain:w300

f:id:tyoshikawa1106:20190925110303j:plain:w300


どちらの話も面白かったのですが、個人的にKubota社の話で出てきた利用しているSalesforce製品の話でほとんどの製品が出てきていたのが印象に残りました。

EXPO会場

キーノートのあとです。今回はセッションとセッションの合間に時間があるのでEXPO会場を見に行きました。ミニセッションやスタンプラリーなどのイベントも行われていました。
f:id:tyoshikawa1106:20190925113753j:plain:w300

f:id:tyoshikawa1106:20190925114204j:plain:w300

f:id:tyoshikawa1106:20190925115647j:plain:w300

The Future of AI [SS1]@Keynote Room (PPT)

EinsteinとAIのセッション。米セールスフォースのAIの責任者の話が聞けました。
f:id:tyoshikawa1106:20190925130210j:plain:w300

f:id:tyoshikawa1106:20190925130920j:plain:w300

f:id:tyoshikawa1106:20190925131210j:plain:w300

f:id:tyoshikawa1106:20190925132144j:plain:w300


最後にQ&Aの時間があったのですが、そこで出たEinsteinの学習データは何件必要かという質問で1,000件という話があったのが印象に残りました。ずっと数万件レベルの学習データが必要なのかと思っていました。

Activist CEO ポスト資本主義時代のリーダーの条件 [SS2]@Keynote Room (PPT)

CEOの方々の話が聞けてよかったです。
f:id:tyoshikawa1106:20190925143335j:plain:w300

EXPO ミニセッション

Einsteinの導入の流れを見ることができました。予測ビルダーが使われるタイミングとかを見れてよかったです。
f:id:tyoshikawa1106:20190925153943j:plain

Einsteinのスコアはカスタム項目にセットするという部分も知れて良かったです。
f:id:tyoshikawa1106:20190925154744j:plain:w300

f:id:tyoshikawa1106:20190925143334j:plain:w300

サステナビリティ​:持続可能な成長と社会変革への挑戦 ​ [SS3]@Keynote Room (PPT)

YOSHIKIのセッション。内容は環境問題についてです。YOSHIKI見れてよかったです。

f:id:tyoshikawa1106:20190925162848j:plain:w300

f:id:tyoshikawa1106:20190925164815j:plain:w300


セッション終了後にクリスタル・ケイのライブも見れました。
[fid:tyoshikawa1106:20190925174641j:plain:w300]


次の日の準備があったのですぐに帰りましたが、Day1のラストで軽食が出てネットワーキングパーティーもありました。次回はゆっくり楽しみたいです。
f:id:tyoshikawa1106:20190925175625j:plain:w300

Day 2

午後に登壇させてもらったセッションの準備(練習とか資料修正とか)があったので2日目は午後から参加。お昼ごはんは会場で頂けました。
f:id:tyoshikawa1106:20190926130903j:plain:w300

f:id:tyoshikawa1106:20190926131013j:plain:w300


また少し時間があったのでTrailhead zoneで限定バッチ取得も済ませました。
f:id:tyoshikawa1106:20190926132650j:plain:w300

成長企業の必須アイテム マーケティングオートメーション Pardot [1-5]@Room1 (PPT)

2日目最初のセッションはPardotのセッション。
f:id:tyoshikawa1106:20190926135036j:plain:w300

f:id:tyoshikawa1106:20190926134217j:plain:w300

f:id:tyoshikawa1106:20190926135404j:plain:w300

f:id:tyoshikawa1106:20190926135422j:plain:w300


またPardotのセッションでは株式会社リバネス(Leave a Nest Co., Ltd. )の方がPardotを運用してみた知見をお話し頂けました。個人的に一番SWTTのセッションで一番印象に残ったセッションで実際に5年間運用してみての知見やPardotとEinsteinを組み合わせて利用してみた話など知りたかった話を聴くことができました。
f:id:tyoshikawa1106:20190926140045j:plain:w300

セッションスライドも公開して頂けています。Pardotを利用している人にとってはすごく為になるスライドだと思います。

SWTT TOKYO 2019 Pardot session - Google スライド


Pardotのセッションのあとはプリンスホテルの会場に移動しました。こちらは技術系セッションが中心の会場となっています。
f:id:tyoshikawa1106:20190926145353j:plain:w300

f:id:tyoshikawa1106:20190926150012j:plain:w300


SWTTお馴染みのTrailhead Zoneにも行きました。
f:id:tyoshikawa1106:20190926154150j:plain:w300

f:id:tyoshikawa1106:20190926154328j:plain:w300

f:id:tyoshikawa1106:20190926154656j:plain:w300

f:id:tyoshikawa1106:20190926165828j:plain:w300


同じ時間に複数セッションが開催されるのでチラッと見ては移動してと会場を回りました。2日目の最後は自分のセッションでApex周りの話をさせてもらうことができました。
f:id:tyoshikawa1106:20190926171846j:plain:w300

SFDC:Salesforce World Tour Tokyo 2019のDeveloper Theatreで登壇させて頂きました - tyoshikawa1106のブログ


Day2はこんな感じ。セッション登壇も終わりネットワーキングパーティーはゆっくり楽しむことができました。
f:id:tyoshikawa1106:20190926181626j:plain:w300


Salesforce World Tokyo 2019、二日間楽しい時間を過ごすことができました。
f:id:tyoshikawa1106:20190926182704j:plain:w300

SFDC:プレミアサポートとアクセラレータを利用してみました

$
0
0

プレミアサポートとアクセラレータを利用してみました。

f:id:tyoshikawa1106:20191001074729p:plain

Salesforceの早期導入、定着化、ROIの実現をエキスパートが支援 - セールスフォース・ドットコム | セールスフォース・ドットコム


過去にイベントのブースでもらった資料。
f:id:tyoshikawa1106:20190726064506j:plain

f:id:tyoshikawa1106:20190726064529j:plain

定着化支援

f:id:tyoshikawa1106:20190726064608j:plain

アクセラレータ

f:id:tyoshikawa1106:20190726064613j:plain

テクニカルサポート

f:id:tyoshikawa1106:20190726064617j:plain


アクセラレータによる 1 on 1の技術支援とプレミアサポート利用者向けのWebセミナー、それとテクニカルサポートへの問い合わせ時の一時応答の時間短縮が主な利用目的になると思います。
f:id:tyoshikawa1106:20190726064741j:plain


アクセラレータについては先日のSalesforce World Tour Tokyo 2019でもミニセッションをやっていました。
f:id:tyoshikawa1106:20190925140654j:plain

f:id:tyoshikawa1106:20190925140833j:plain

プレミアサポートの契約について

プレミアサポートは契約しているライセンス数に応じて料金が決まります。
ライセンス数は組織全体ではなく製品毎に判断されます。合わせて組織全体でのプレミアサポート契約ではなく製品ごとのプレミアサポートライセンスを契約する形です。
→ SalesCloudのプレミアサポート / Pardotのプレミアサポートという形

テクニカルサポートの一次応答時間の短縮

プレミアサポートを契約するとサポート問い合わせ時の一次応答時間が8時間以内になります。通常は最大で2日間。
一次応答というのは下記工程の④の部分に辺ります。

①サポート問い合わせ
②問い合わせのカテゴリに合わせて担当部門に振り分け
③サポート担当者が問い合わせ内容を確認
④問い合わせユーザに通知メール送信 ※1時応答
→「問い合わせ内容を確認しました。質問内容応じて担当エンジニアをアサインします。」的なシステムメールが届きます
 ※エンジニアアサインまでは最大2〜5日
⑤他の問い合わせ内容と比較して対応の順序決め
⑥問い合わせの1次回答
⑦状況に応じてやりとり
⑧解決
⑨問い合わせクローズ
⑩利用者アンケート

1次応答と1次回答は別のため、問い合わせ時には意識しておくと良いと思います。1次回答までは2〜3日かかるぐらいの認識で待っていれば慌てずに済むと思います。

アクセラレータ

アクセラレータは1 on 1で製品の使い方をレクチャーしてくれるサポートです。
基本的には自由時間でのやりとりではなく予め用意されているコースを解説を受けながら進められるイメージです。
※やりとりはWebミーティングのツールを利用します。

今回受けてみたPardotのB2BMAツールのコースの場合はこんな感じ。
・[1回目:45分] 初回ヒアリング。組織の状況等の確認
・[2回目:60分] 資料を見ながらツールの基本的な使い方の解説

用意されたコースの方は上記の時間で実施されました。
2回目完了後ですが、一定期間の間メールで自由に問い合わせ対応を受けてもらえるようになっています。(受講コースの内容に関係する問い合わせ)


■アクセラレータ利用の際に意識すること
①初期設定は完了させておく
・初期設定周りはアクセラレータプログラムの範囲外となるためサポートへ問い合わせで事前に完了させておく必要があります。
②利用時のスケジュール調整
・アクセラレータは1on1で対応頂けるサポートのため事前にスケジュール調整が必要になります。混み合っている場合もありますので遅くても受けたい日の一週間前ぐらいには連絡しておくと良いと思います。
③技術的な部分はテクニカルサポートへ確認
・基本的な使用方法以外の技術的な質問の場合は内容によってはアクセラレータ側では対応できないためサポートの方へ問い合わせて調べてしてもらいます。サポートへの問い合わせの時間も考慮して進めていくと良さそうです。


とりあえずプレミアサポートで利用したのはこの2つ。アクセラレータは初めて利用したのでこういう流れだったのかという部分がいくつかありました。時間のあるときにプレミアサポート向けのWebセミナーも見てみたいと思います。

SFDC:データローダバッチを使った別システムとのデータ連携について

$
0
0

Salesforceと別システムを連携するときですが、データローダのバッチモードの機能を利用してデータ連携の仕組みを構築できます。リアルタイムでの連携はできませんが、API連携などに開発をリソースを確保できない場合などに便利です。

f:id:tyoshikawa1106:20191008182618p:plain

データローダをバッチモードで使用する際の設定手順


以前まとめた開発のイメージと注意点についてです。


データローダバッチでデータ連携するときの処理の流れは下記のようになります。

1. Salesforce側にデータを登録
2. Windowsのタスクスケジューラ機能でデータローダバッチ実行
3. バッチ処理実行によりSalesforceのデータをCSVファイル形式で出力
4. 出力したCSVファイルを既存システム側へ取り込む

※上記と同じような感じでSalesforce側にCSVデータを取り込んでデータ作成することも可能です。(INSERT or UPSERT)


一般的にデータローダバッチを使ったデータ連携は下記のような構成になると思います。
f:id:tyoshikawa1106:20191008185832p:plain


例えば取引先データを他システムに連携する場合、データローダバッチのエクスポート処理を実装することで取引先データをそのままCSV形式で出力可能です。
CSVファイルができればあとは他システム側でCSV取込の処理を実装して連携完了です。


・・・ですがSalesforceと他システムでデータの持ち方が異なる場合があります。他システム側でCSVファイルを取り込んでデータ登録する際に形式の変換処理を行うことで対応は可能ですが、他システム側の開発に大きな負担が発生します。



そこで下記の方法が良いと思います。
f:id:tyoshikawa1106:20191008190114p:plain


連携対象をカスタムオブジェクトで管理する方法です。直接取引先などのオブジェクトを出力対象にするのではなく、カスタムオブジェクトを経由することで数式によるデータの加工や連携対象となったデータが何件存在しているかの確認が可能となります。その他連携時にトラブルが発生した場合でも、取引先の場合は業務開始と同時にバンバン更新されますが、カスタムオブジェクトで管理していることでエラー発生時のデータをそのまま残すことが可能です。


データ連携の出力データを作成するために取引先データを元にカスタムオブジェクトのデータを作成する処理が必要になりますが、Apexバッチを開発することで用意に実現できます。


基本的にSalesforce側で開発を行うのは、既存システムで機能追加するよりも容易に実装しやすいと思いますので、CSV出力時にそのまま取り込めるようなデータ形式に調整しておく構成が良いと思います。

データローダバッチで運用するときの注意点

実際に運用してみて下記のトラブルに遭遇しました。

トラブル発生時の状況
  • データローダバッチで出力するオブジェクトは2つ。
  • 出力実行はWindowsのタスクスケジューラ
  • タスクスケジュールから起動するバッチ処理内では、2つのオブジェクトのエクスポート処理を同時に呼び出し。
トラブルの内容
  • 2つのオブジェクトのうち、1つのオブジェクトのCSVデータが空。(運用開始直後は問題なかった。。)
  • Windowsタスクスケジューラは正常に実行されていた。
  • CSVファイル自体はできていたのでバッチ処理は起動している。
解決方法

上記トラブルが発生したのですが、運用開始から数日は問題なく動作していることもあり原因がわかりませんでした。ですが、おそらく2種類のオブジェクトのエクスポート処理を同時に実行したことが理由であると判断しました。実際に出力処理を別にわけて(2つめは30分後に実行)から様子を見たところ、出力結果が0件のトラブルは発生しなくなりました。


SalesforceからApexバッチを同時に実行しても数件はキューとして保持されるためエラーにならずに処理が実行できますが、ローカル環境で動くデータローダの起動を同時に行うのは無理があったと思います。(もともと人の手で操作して処理を行うツールのためそういう使い方は正しくない)

データローダバッチとログ出力

データローダバッチ処理の実行結果を残しておきたい場合があると思います。その場合は「config.properties」ファイル内の設定で設定可能です。

f:id:tyoshikawa1106:20191008193050p:plain


主にエクスポート処理時のための設定と思いますが、「process.enableExtractStatusOutput=true」とすると処理結果のログを残すことができます。(INSERTは特に指定してなくてもログが自動で生成された気がします。)


出力結果はlogフォルダに出力される。
f:id:tyoshikawa1106:20191008193251p:plain


出力先は「process-conf.xml」ファイル内で指定も可能
f:id:tyoshikawa1106:20191008193407p:plain


データ連携ですが、予期せぬエラーなどトラブルが発生することを想定する必要があります。ログを残したりは必ずやっておいた方が良いと思います。

データローダバッチの開発者ガイド

バッチモードについてもドキュメントがまとめられています。ログイン情報の暗号化や各種設定情報のカスタマイズはこちらで確認するのが良いと思います。

f:id:tyoshikawa1106:20191008193730p:plain

バッチモードでの実行 (Windows のみ)

SFDC:Lightningページで参照先オブジェクトの関連リスト表示を試してみました

$
0
0

Lightningページで参照先オブジェクトの関連リスト表示を試してみました。商談のページで取引先の活動を表示したかったのですが、標準機能のみで対応可能かなと思ったところ、Lightning Experienceなら関連リスト1つのみのコンポーネントであれば表示が可能であることを教えてもらったのでやってみました。

f:id:tyoshikawa1106:20191010083419p:plain


試したときは活動でしたが、ブログ書くときはちょうどいいテストデータがなかったので商談で試しました。
f:id:tyoshikawa1106:20191010083651p:plain


実際の表示結果はこんな感じ。普通に関連リストを表示できます。関連商談という感じで表示したら以外と便利そうでした。
f:id:tyoshikawa1106:20191010083825p:plain


すべて表示のリンクからビューで表示できます。
f:id:tyoshikawa1106:20191010083926p:plain


活動で試したときにはレコードタイプの絞り込みまでやりたかったので、最終的に利用は見送りとなりましたが、いろいろ使えて便利そうです。


SFDC:Winter'20にアップデートされました

$
0
0

Salesforceが年3回行っているアップデートでWinter'20になりました。ロゴはハンモックで休憩しているイエティの格好をしたアストロくん。南半球の冬をイメージしたロゴらしいです。

f:id:tyoshikawa1106:20191013213726p:plain


わかりやすいところで活動の表示が見やすくなっていました。

f:id:tyoshikawa1106:20191013214246p:plain


とりあえずチェックしておきたいのは重要な更新の部分です。

f:id:tyoshikawa1106:20191013214456p:plain


この中の「HTTPS 接続には TLS 1.2 以降が必要」は10/25までに有効化が必要です。Salesofrceへのアクセスに関わる部分なのでSandboxチェックしてから早めに有効化しておくほうが良さそうです。

f:id:tyoshikawa1106:20191013215032p:plain


その他の新機能はリリースノートでチェックできます。

f:id:tyoshikawa1106:20191013215147p:plain

リリースノート

SFDC:Winter'20の新しいモバイルアプリケーションを試してみました

$
0
0

Winter'20で利用できるようになった新しいモバイルアプリケーションを試してみました。
f:id:tyoshikawa1106:20191013220236p:plain


新しいバージョンのアップデートということでアプリのアップデートだと思っていたのですが、Salesforce組織側の設定で更新できるようです。
f:id:tyoshikawa1106:20191013220429p:plain


有効化のページで新しいモバイルアプリのイメージ動画が公開されています。
f:id:tyoshikawa1106:20191013220531p:plain


新しいモバイルアプリの有効化は権限の追加で行います。
f:id:tyoshikawa1106:20191013220622p:plain


一般ユーザに対して一括で有効化したい場合はプロファイルの設定で追加できます。
f:id:tyoshikawa1106:20191013220837p:plain


システム管理者の場合はプロファイルでの権限追加はできませんでした。
f:id:tyoshikawa1106:20191013221012p:plain


システム管理者に対しては権限セットで追加します。
f:id:tyoshikawa1106:20191013221210p:plain


権限を追加後にモバイルアプリを起動するとUIが更新されました。
f:id:tyoshikawa1106:20191013223345p:plain:w250

f:id:tyoshikawa1106:20191013223422p:plain:w250

f:id:tyoshikawa1106:20191013223510p:plain:w250


新しいバージョンではアプリケーションランチャーにアクセスできます。ですが初期状態では選択できるアプリケーションがありません。これについてはアプリケーション設定で電話での利用オプションを追加することでモバイルのアプリケーションランチャーからもアクセス可能にできます。
f:id:tyoshikawa1106:20191013223837p:plain


PCとモバイルでアクセス権限を分けて管理できるのは便利そうです。この他にもLightningページでモバイルのレイアウトカスタマイズができるようになっていました。
f:id:tyoshikawa1106:20191013224046p:plain


とりあえず確認できた新機能はこんな感じでした。

SFDC:Web-to-Xでフォームを実装するときに注意すること

$
0
0

Web-to-リードやWeb-to-ケースでを利用してフォームを作成する際のけっこう重要な注意事項として下記のヘルプ記事が公開されていました。

f:id:tyoshikawa1106:20191018190127p:plain

スパムの問題を回避するための Web-to-X のソースコードの保護


内容は下記のとおり。HTMLはサンプルでそのまま使わないことと、Salesforceの情報を記述しないという点が記載されています。

Salesforce で生成できる Web-to-X の HTML はサンプルとなります。
このため、Salesforce から生成した Web-to-X の HTML を公開するサイトで直接、使用しないよう注意してください。
公開するサイトのフォームには送信先となる Salesforce の情報を記述せず、HTML/API メソッドを使用してリクエストを送信することで、スパムなどの脅威から保護することができます。


基本的にデザインにはCSSを当てて、入力チェックにはJavascriptを使用します。なのでそれなりにカスタマイズは必要になる前提の機能ではありますが、Salesforceの情報を記述せずという部分がこのヘルプの重要なところでした。おそらく生成されるHTMLの組織IDのことを指していて、運用の際にはバックエンド側に変数等を用意してフロント側には見えなくしてくださいの意味ではないかと思います。



Web-to-Xのフォーム作成はCSSやJavascriptによるカスタマイズは必要ですが、サーバー側で処理を実装するのであれば、少し導入難易度が上がります。サーバーで処理を実装するのではればSalesforce APIの仕組みでリードや取引先の登録フォームを開発するという選択肢も有りかもしれません。



ただ、Web-to-Xのフォーム生成時にはセキュリティを高める「reCAPTCHA」の機能が用意されているためそちらを利用するのであれば、Web-to-Xによるフォーム作成のメリットも出てくると思います。

f:id:tyoshikawa1106:20191018191007p:plain

SFDC:Lightning Experienceのごみ箱機能を試してみました

$
0
0

Winter'20で追加されたLightning Experienceのごみ箱機能を試してみました。タブとして追加されているのでアプリケーションランチャーなどからアクセスできます。

f:id:tyoshikawa1106:20191018191933p:plain


Classicと同じく私のごみ箱と組織のごみ箱の選択が可能です。
f:id:tyoshikawa1106:20191018192006p:plain


Classicと違う部分として新規リストビューの作成が可能です。これにより複雑な条件でフィルタしたごみ箱のビューを用意できます。
f:id:tyoshikawa1106:20191018192057p:plain


またアプリケーションに追加するなどでナビゲーションバーに表示できます。
f:id:tyoshikawa1106:20191018192212p:plain:w300


今まではサイドバーのみでしたがより自由な配置が可能となっていました。
f:id:tyoshikawa1106:20191018192232p:plain

SFDC:Chatterページの「自分がフォローするもの」と「会社の注目」の初期選択について

$
0
0

ChatterタブでChatterのページにアクセスした際にユーザによって「自分がフォローするもの」が選択されている場合と「会社の注目」が選択されている場合に分かれていました。

f:id:tyoshikawa1106:20191018192800p:plain


なんでかなとサポートに問い合わせしてみたところ、ユーザのフォロー数に影響を受けるみたいです。

ほとんどのユーザにとって、デフォルトのフィードは [自分がフォローするもの] です。ただし、Lightning Experience では、フォローしているものが 10 件より少ないユーザのデフォルトのフィードは [会社の注目] になります。[会社の注目] がデフォルトになることで、新規ユーザは、組織内で最も活気のあるものは何かを確認することができます。


ヘルプはこちら。
f:id:tyoshikawa1106:20191018193147p:plain

特定のフィードの表示


公開グループを作成したときにメンバーには追加していないのでノイズにはならないと考えているときにはフォロー数が10件より少ないユーザが存在するかチェックしておいたほうが良いと思います。Chatter運用開始直後やフォローなどの文化が構築できていない組織ではフォロー数が少ないユーザは出てくると思いますので、そうしたユーザにはノイズ的な投稿がでてしまうことを意識する必要があります。

SFDC:Sales Cloud Einsteinを試してみました

$
0
0

Sales Cloud Einsteinを試してみました。実際に導入したわけではないのですが、ちょっと触らせてもらう機会があったのでそのときのメモ。

f:id:tyoshikawa1106:20191019221710p:plain

Sales Cloud Einstein:営業のパフォーマンスを最大化 | セールスフォース・ドットコム


Einsteinは製品毎に用意されていてSales Cloud用のEinsteinがSales Cloud Einsteinです。営業の人の業務をサポートするための機能になります。


Sales Cloud Einsteinで利用できるのは下記の機能です。

  • Einstein 取引先インサイト
  • Einstein 商談インサイト
  • Einstein リードスコアリング
  • Einstein 商談スコアリング
  • Einstein 売上予測
  • Einstein 活動キャプチャ
  • Einstein 自動取引先責任者

初期設定について

Sales Cloud Einstein の使用開始は設定アシストのページから有効化を行えいます。利用可能になったあと設定メニュー内に「支援付き設定」が追加されるのでそこから設定できます。初期設定の手順としては権限セットをユーザに割当して権限を付与します。それから下記機能を有効化および設定することで利用可能となりました。

Einstein 取引先インサイトについて

Einsteinインサイトですが、取引先オブジェクトのニュース機能の情報を元に参考になる情報を画面に表示してユーザに提供できる機能です。ただし現時点ではニュース機能は海外向けの機能で日本語はサポートされていないため、取引先インサイト機能の利用もできないようです。

Einstein 商談インサイトについて

商談インサイトは商談のページで利用できる機能です。こちらはEinstein 活動キャプチャやInboxの機能を利用してメール連携が可能になった組織で活躍できます。用途についてサポートに問い合わせてみたところ、下記の情報が表示されるようでした。

  • [案件予測]
  • [フォローアップアラーム]
  • [重要な瞬間]

今回はメール連携は試さなかったのでスキップ。

Einstein リードスコアリングについて

イベントなどで紹介されていたのを見ていたので期待値の高かった機能です。ですが、利用の前提条件を満たせていなかったためエラーとなってしまい有効化できませんでした。

利用時の前提条件(確かこの条件)
  • 過去6ヶ月間のリードデータが必要
  • 一ヶ月辺り20件の取引開始データが必要

残念ながら現時点で上記の前提条件を満たせる状況ではありませんでした。ちょっとリード使いはじめましたという使い方では取引開始の件数は20件行かないと思います。

Einstein 商談スコアリングについて

リードスコアリングと同じく期待値の高い機能。こちらは商談データがあれば利用可能でした。

つかってみて思ったこと

①スコアの値について
スコアはスコア項目にセットされました。リストビューで昇順、降順で並び替えたりリストビューの条件指定で利用できます。

②スコアの理由の確認方法について
スコアの理由の確認方法ですが、スコア項目にマウスを当てるとポップアップで表示されます。Lightningページに配置できるコンポーネントは無いようでした。(Lightningの場合です。Classicは数値の代わりに理由が常に表示されていました。)

マウスを当てないと理由が確認できないのは正直かなり使いづらいと思いました。

③スコアの理由の内容にについて
スコアの理由は「上位肯定」と「下位肯定」の二種類の情報が表示されます。

例) 上位肯定

・Opportunities with this forecast type have a high success rate.
・このフェーズでの商談の成功率は高くなっています。
・この商談の上位肯定はありません
・商談に多くの活動があります。


例) 下位肯定

・完了予定日が遅れ続けています。
・[種別] 項目が空です。
・このフェーズでの商談の成功率は低くなっています。
・この取引先との過去の不成立商談。
・この商談の上位否定はありません
・この商談の上位否定はありません。
・スコアが下がり続けています。
・完了予定日の期限が切れました。
・金額が変更されました。この場合、これは好ましくありません。
・商談にかかっている時間が長すぎます。
・商談の最新の更新はありません。
・商談はフェーズ間をゆっくり移動しています。
・商談は現在のフェーズで停滞しています。


基本的にフェーズが進めばスコアが上がり、完了予定日などが遅れればスコアが下がる感じでした。営業担当の方向けではなくマネージャーポジションの方が低いスコアを注意してチェックするといった用途で利用することになりそうです。(カスタム項目も条件判定に利用されます。)

Einstein 売上予測について

売上予測では順調そうに進んでいた商談がいつの間に失注している..そんなケースはよくあるとと思いますが、Einstein 売上予測があれば失注リスクを考慮したしたより確度の高い結果を表示できるのかなと思い、こちらも期待値の高い機能でした。


ですが、Einstein 売上予測機能の利用にも前提条件がありました。下記の条件を満たしていないと有効化しても結果が表示されません。

・売上予測 Einstein を利用できるのは組織作成から2年以上が経過しており、かつ十分な商談履歴データ(24ヶ月分)が存在している場合


完了予定日で判別されるわけではなく、純粋に組織運用が2年以上必要となる機能でした。また、予測の条件には商談履歴データとなっています。商談履歴データとは、実際に Salesforce 上で商談に対して操作した履歴が残るレコードです。項目履歴の場合は20項目までの記録を残せますがEinsteinの予測で使える項目も対象に含めておく必要があるようです。


ということで残念ながらEinstein予測を表示することはできませんでした。

Einstein 活動キャプチャとEinstein 自動取引先責任者について

SalesforceとOutlookやGmailを連携させたときに利用できる機能です。今回は詳細についての確認は行いませんでした。

さいごに

Sales Cloud Einsteinはだいたいこんな感じでした。またEinstein予測ビルダーという機能があるのですが、そちらは別料金で追加オブション的な製品となっているようです。あと勘違いかもしれませんが、Einstein機能を有効化したら歯車アイコンの設定メニューやホームの一部コンポーネントの読み込みに時間がかかるようになった気がします。

SFDC:Winter'20のホームレイアウトへのタブコンポーネント追加を試してみました

$
0
0

Winter'20のホームレイアウトへのタブコンポーネント追加を試してみました。

f:id:tyoshikawa1106:20191027102730p:plain


個人的にできるようにならないかなと思っていた機能だったのでWinter'20で設定可能になってよかったです。例えばフィードタブを用意してChatter投稿表示するとログイン時に気軽に自分がフォローする最近の投稿が確認できて便利だと思います。

f:id:tyoshikawa1106:20191027101523p:plain


ホームレイアウトにChatterフィードを追加するときには「フォロー」「ブックマーク」「自分宛て」の3つから選択できます。

f:id:tyoshikawa1106:20191027101621p:plain


すべての投稿ではなく自分がフォローする投稿のみを表示できるので、関係のある投稿のみが表示されてスッキリすると思います。Chatterタブの場合はフォロー数によってフォロー外の投稿が表示される「会社の注目」がデフォルトになる場合がありますが、ホームレイアウトに配置するときにはフォロー投稿のみを表示することが可能です。


Chatterのコンポーネントは投稿用の入力ボックスを表示するパブリッシャーと投稿内容を表示するフィードがありますが、ホームに配置するときは投稿の確認とコメントだけが表示されるフィードのみを配置してサクッと確認、コメントできるようにして、投稿などしっかりした操作を行うときはChatterタブに移動してもらうと棲み分けができるて良さそうに思いました。

f:id:tyoshikawa1106:20191027102309p:plain:w250


この他にもダッシュボードを表示するためのタブを用意したりと業務に合わせて配置してあげると今までスペースの問題で実現できなかったコンポーネントの配置が可能になりそうです。

参考


SFDC:数式項目の時間型を試してみました

$
0
0

数式項目の時間型を試してみました。

f:id:tyoshikawa1106:20191028034517p:plain


日時型項目で時間部分のみを扱うことが可能です。

f:id:tyoshikawa1106:20191028034549p:plain


数式はこんな感じ。日時型の項目はTIMEVALUE関数で時間型に変換できます。ただし、そのままだとタイムゾーンのズレが発生するため日本時間に合わせるために9時間ずらす必要があります。「 + 3600000 * 9」で9時間ずらすことができました。(もっと良い方法がほしい)

TIMEVALUE(SampleDateTime__c) + 3600000 * 9

f:id:tyoshikawa1106:20191028034722p:plain


時間型の数式を用意することで10:00よりも前の時間帯に登録されたデータというような条件抽出が可能になります。
f:id:tyoshikawa1106:20191028035339p:plain:w400


Web受付などを行っている組織の場合は勤務時間外に登録された案件の対応状況を確認するといった使い方ができると思います。
f:id:tyoshikawa1106:20191028035401p:plain:w400


ちなみに日時型の場合は日付も条件指定に加える必要があるため、特定の時間帯での条件判定には利用できませんでした。
f:id:tyoshikawa1106:20191028035505p:plain:w250


時間型項目でデータ入力を行おうとするとApex開発の際に扱いが難しいため使いづらかったのですが、数式項目でレポート抽出条件に指定するような使い方ならそうしたことを気にする必要もないので試しに導入してみても問題ない機能だと思います。

SFDC:取引開始済みリードと関連する取引先の一覧レポート作成を試してみました

$
0
0

取引開始済みリードと関連する取引先の一覧レポート作成を試してみました。

f:id:tyoshikawa1106:20191102195441p:plain


取引開始済みリードと関連する取引先の一覧ですが、標準のレポートタイプが一応用意されています。

f:id:tyoshikawa1106:20191102195609p:plain


ただし、選択できる取引先の項目には制限があります。

f:id:tyoshikawa1106:20191102200243p:plain


標準レポートタイプで選択できる項目以外の取引先項目を表示するにはカスタムレポートタイプを用意することで可能になります。
f:id:tyoshikawa1106:20191102200710p:plain


レイアウトの設定ページで参照先の項目を追加をクリックすると取引開始済みリードに関連する取引先や商談などの項目が選択可能になります。
f:id:tyoshikawa1106:20191102200836p:plain


これでリードの取引開始機能で作成した取引先一覧を表示できます。取引先側で商談件数を保持しておけば、インサイドセールスなどで新規獲得した顧客がどの程度商談まで進められているか確認できるといったメリットがあります。尚、取引先を削除していた場合はリードのみが表示されました。
f:id:tyoshikawa1106:20191102200918p:plain


今回のようにカスタムレポートタイプのレイアウト設定で利用できる「参照先の項目追加」を利用すれば標準レポートでは対応できないものも実現可能になるかもしれません。

SFDC:Lightningアプリケーションビルダーでコピペによるコンポーネント配置を試してみました

$
0
0

Lightningアプリケーションビルダーでコピー&ペーストによるコンポーネント配置を試してみました。

f:id:tyoshikawa1106:20191102212619p:plain


Macの場合はcommandキー + Cキーでコピーできますが、アプリケーションビルダーのカスタマイズ中はコンポーネントをコピーすることも可能でした。リッチテキストコンポーネントなど複数配置するときには便利かもしれません。
f:id:tyoshikawa1106:20191102212728p:plain


またコンポーネントの配置は25個までとなっていました。
f:id:tyoshikawa1106:20191102212811p:plain

SFDC:Lightningコンポーネントで行動タイムライン機能をつくってみました - Part 1

$
0
0

Salesforceの本番組織で動かすためにLightningコンポーネントで行動タイムライン機能をつくってみました。下記の動画みたいなやつです。


Lightningコンポーネントは2015年頃に発表されましたが、仕様がけっこう頻繁に変わっていたのと開発するときにはコンポーネントよりもページの機能が必要になっていたので、基本はVisualforceとApexの開発で対応できていました。ということで今回がLightningコンポーネントの本番運用第一号でした。


ちなみに今回Lightningコンポーネントの開発が必要になったのは標準の詳細ページ内に埋め込む必要がでてきた為です。

f:id:tyoshikawa1106:20191104120106p:plain


Visualforceページも埋め込むことは可能ですが、やはり標準ページ内で利用するのであればLightningコンポーネントの方が一体感があって良いと思います。

Lightningコンポーネントが必要になった理由

取引先や商談レコードには電話や訪問などの情報を活動レコードとして登録するようにしています。できれば標準の活動コンポーネントを利用する形で運用したかったのですが、下記の問題が解決できませんでした。

  • 特定のレコードタイプで絞り込み
  • 件名と説明を常に表示

特に特定のレコードタイプで絞り込みの方が外せない要望でした。他システムとの連携が必要なため営業的な活動は専用のレコードタイプを用意して管理しています。標準の活動コンポーネントだとそうした営業用の活動一覧という表示はできなかっため今回はLightningコンポーネントを開発するという形で対応しました。

件名と説明を常に表示する部分は細かい部分ですがページを開くたびに折りたたみを解除するのが少し面倒とのことだったので合わせて対応してしまいました。

Lightningコンポーネントの仕様

配置可能箇所

取引先、商談、リードのオブジェクトでの使用を想定していますが、コンポーネントとしてはカスタムオブジェクトへの配置も可能なようにつくってあります。(WhatIdとWhoIdを取得条件とするだけなので普通につくればそうなるとは思いますが)

シンプルなレイアウト

活動にはいくつか項目を用意していますが、一覧表示で確認場合には件名と説明項目が表示されていれば問題ないという要望を受けました。また表示項目が増えると縦に長くなるので少ないほうが良いという理由もあるみたいです。そこで下記のようなレイアウトにしました。なるべく標準コンポーネントと見た目を合わせつつ、開始時間と終了時間がわかりやすいように調整したり、曜日も表示されるようにしてみました。
f:id:tyoshikawa1106:20191104121435p:plain


要望としては少ない項目を表示、必要なら詳細ページで確認するという話を受けましたが、将来的に他の項目も表示したいという要望が出てくる気がしました。そのため、詳細を表示というリンクを追加してクリックすると場所などの項目も追加で表示されるという仕組みを追加しておきました。
f:id:tyoshikawa1106:20191104122223p:plain

更新リンク

標準の活動コンポーネントなどで活動レコードを編集したりした場合にLightningコンポーネント側も自動で反映されるかなと少し思っていましたが、そこまでは反映されませんでした。そこで更新リンクを追加してクリックされたら最新情報が表示されるという形で対応しました。基本的にLighntingコンポーネント側で記録を見るのは入力者以外の人が多いのでこの仕組みでも問題はなさそうでした。

取引先配置時の考慮

標準の活動コンポーネントでは、取引先の場合に商談など子オブジェクトの活動も表示できる仕組みとなっています。運用時の用途的にも必要な仕組みだったためLightningコンポーネント開発時にも取り入れました。

f:id:tyoshikawa1106:20191104122908p:plain

Lighntingアプリケーションビルダーでのカスタマイズ

表示件数は一旦200件にしてありますが、運用してみて上限を増やしたりなどの変更する必要がでてくると思います。せっかくLightningコンポーネントで開発するのでアプリケーションビルダー側の設定で変更できるようにしました。

f:id:tyoshikawa1106:20191104123538p:plain:w200


Lightningコンポーネント開発時に考慮したのはだいたいこんな感じ。あとはタイムラインレイアウトにする際に標準の行動アイコンと同じだと区別が付きづらいので、違うアイコンに変更したりもしてみました。

Lightningコンポーネント開発時に参照したもの

今回つくったコンポーネントはシンプルな機能ですが、Lightningコンポーネント開発方法自体を思い出す為に過去に調べたことやWeb検索などで調べながら進めました。主に下記のリンク先です。


その他にはこちら。Winter'20のリリースノートです。Lightningコンポーネントにはuiタグという専用タグが用意されていますが、lightningタグに差し替わるという話が数年前にでていました。開発時にlighntingタグの情報も見つけられなかったため、uiタグで開発を進めていたのですが、サポート終了のアナウンスが出ていることを教えてもらいその情報で検索したところ、リリースノートに辿り着きました。リンク先ではuiタグをどのように変更すればいいかまでまとめられているので便利だと思います。

SFDC:Lightningコンポーネントで行動タイムライン機能をつくってみました - Part 2

$
0
0

Lightningコンポーネントで行動タイムライン機能をつくってみました - Part 2です。

Lightningコンポーネントのソースコード

vscodeでプロジェクトを作成したときはauraフォルダ内に一式格納されています。
f:id:tyoshikawa1106:20191104210110p:plain

Apexクラスの準備

@AuraEnabledを宣言することでLightningコンポーネントから呼び出せます。メソッドはstaticで宣言します。今回はシンプルな処理のためsObject型をそのまま戻り値にしてしまいましたが、きちんとエラーチェックを行う場合はラッパークラスを用意してエラーメッセージ等を渡せるようにしておくと良いと思います。

f:id:tyoshikawa1106:20191104210259p:plain


LightningからApexクラスを呼び出す方法はこちら。
f:id:tyoshikawa1106:20191104210501p:plain

Lightningコンポーネントのパラメータ設定

アプリケーションビルダーから値を渡したい場合はdesignファイルを用意して対応します。下記のような感じです。
f:id:tyoshikawa1106:20191104210636p:plain


componentファイル側で宣言した変数のみ利用できます。ただし一度宣言すると相互に参照状況となり除外できなくなりました。除外する場合はdesignファイルを作り直すことになると思います。また「design:component label="xxx"」と宣言することでアプリケーションビルダーで表示する際のラベルを宣言できます。


componentファイル側では「aura:attribute」で変数を宣言しておきます。パラメータを渡す場合でも、defaultで初期値を宣言しておくと指定漏れがあっても大丈夫です。
f:id:tyoshikawa1106:20191104210917p:plain


designファイルは必須制御なども可能です。詳細はこちら。

プロファイル設定

Lightningコンポーネントの利用にはプロファイル設定は特に必要ないと思いますが、@AuraEnabledを宣言したApexクラスのみ利用権限を付与する必要があります。プロファイル設定の「有効な Apex クラス」で対象のクラスを追加してください。ここで追加ができていないとユーザが利用時にApexクラスで処理が実行されず戻り値が空の状態となってしまいます。(エラーメッセージがでなかったです。)

f:id:tyoshikawa1106:20191104211658p:plain

コンポーネント内の条件分岐

「aura:if」タグを利用することで表示/非表示の条件分岐が可能です。また「aura:set」タグで条件に当てはまらない場合のeles処理を実行できます。
f:id:tyoshikawa1106:20191104211857p:plain


elesの処理はコンポーネント読み込み中の一瞬でもeles状態となるのでそれを踏まえて開発する必要があります。

SVGタグの宣言

LightningコンポーネントではSVGタグの宣言はそのままではできません。宣言する場合は特定の処理を宣言したりするのですが、今回はLightning Design Systemのアイコン表示を対象に記載します。Lightning Design SystemのアイコンはSVGタグとなっていますが、コンポーネント内で利用する場合は下記の書き方が可能です。

アイコン
<lightning:icon iconName="standard:rtc_presence" size="small" alternativeText="活動" />
アイコン・ボタン
<lightning:buttonIcon iconName="utility:switch" variant="bare" alternativeText="活動" />


これで面倒な準備も不要でLightning Design Systmのアイコンを表示できました。

日時の形式指定

項目の値を表示する場合で日時項目の形式指定をする場合です。下記の書き方ができます。

<!-- 2019年10月XX日(木) 10:00 -->
<lightning:formattedDateTime value="{!item.StartDateTime}" year="numeric" month="short" day="2-digit" weekday="narrow" hour="2-digit" minute="2-digit" />
<!--10:00  -->
<lightning:formattedDateTime value="{!item.EndDateTime}" hour="2-digit" minute="2-digit" />


曜日を表示したり時刻部分のみを表示したりといった調整が可能でした。



以上がLightningコンポーネントで行動タイムライン機能をつくってみました - Part 2となります。開発をしてみて気づいたのはだいたいこんな感じでした。

Viewing all 1438 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>