tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:承認申請と複数承認プロセスを試してみました

承認申請と複数承認プロセスを試してみました。

f:id:tyoshikawa1106:20180916135838p:plain


承認プロセスは複数のステップを用意することができるので基本的には一つの承認プロセスで対応可能だと思います。ですが下記の要件を満たすために承認プロセスを複数にわけたい場合があるかもしれません。

  • 承認プロセス①
    • ステップ1
    • ステップ2
    • ステップ3 ※ステップ3まで承認されたら承認プロセス②へ
  • 承認プロセス②
    • ステップ1
    • ステップ2
    • ステップ3 ※ステップ3まで承認されたら承認プロセス完了


プロセスが別れていると、プロセス②で却下になった場合、プロセス①は承認済みの状態で再度プロセス②の再申請を行うことができます。

承認申請の実行条件

はじめに承認申請ボタンをクリックしたときに実行される承認プロセスは実行時に条件にマッチしたプロセスとなります。もし同じ条件で実行される複数の条件がある場合は最初にマッチしたプロセスになると思います。(なので開始条件はかぶらないように注意が必要です。)

f:id:tyoshikawa1106:20180916140618p:plain


また承認申請ボタンは最終承認完了後でもなんどでもクリック可能です。(回避したい場合は最終承認後にページレイアウトから除外するなどの方法で対応します。) そのため、承認プロセス①が最終承認されたタイミングで承認プロセス②の開始条件を満たすようにデータ更新を行えば、複数の承認プロセスを実行可能となります。


ですが、手動での実行は作業漏れ等が発生する可能性が非常に高いです。この問題はプロセスビルダーを使って自動化することが可能です。
f:id:tyoshikawa1106:20180916141012p:plain


実行時のコメントを自動セットしたり、開始条件をスキップすることで値に関係なく承認プロセスを開始することが可能です。(※却下時に再申請することを考えると開始条件を満たす状態に保つのがいいと思います。)
f:id:tyoshikawa1106:20180916141040p:plain


このようにプロセスビルダーからの承認プロセス開始機能を利用することで複数の承認プロセスを運用することができます。

SFDC:ARカメラで遊べるDREAMOJIを試してみました

ARカメラで遊べるDREAMOJIを試してみました。アプリ自体はずっと前から公開されていましたが最近のアップデートで機能追加されてARカメラで遊べるようになりました。iOS / Androidのアプリが出ているみたいです。
f:id:tyoshikawa1106:20180916132755p:plain

‎「DREAMOJI」をApp Storeで


アプリを起動すると次のようにステッカーの一覧が表示されます。こちらは画像を長押しするとメニューが表示され、画像の保存やSNSへの共有ができたりします。
f:id:tyoshikawa1106:20180916133645p:plain:w150


真ん中のアストロアイコンがARカメラのメニューとなります。選択するとカメラモードに切り替わります。赤い録画ボタンを長押しすることで動画撮影ができました。最大12秒で縦向き撮影のみ可能となっているみたいです。
f:id:tyoshikawa1106:20180916133715p:plain:w150


アストロ、クラウディ、コーディーを選択できました。


2本指で操作することで、サイズや向きを変更することができました。

その他の機能

メニューを見るとカレンダーなどの機能がありました。
f:id:tyoshikawa1106:20180916134544p:plain:w150


見てみたところDreamforce19のページが表示されました。今年開催されるDreamforce2018で何か紹介されたりするのかもしれません。
f:id:tyoshikawa1106:20180916134704p:plain:w150

Twitterより

Salesforce Japan


Dreamforce

SFDC:SalesforceプロジェクトとGitHub管理 (Mac版)

SalesforceプロジェクトをGitHubで管理する手順についてです。

はじめに

Terminalのコマンドからテキストエディタを起動できるようにしておきます。SublimeTextの場合はこちらの記事を見ながら設定できました。
($ subl "file name" でファイルを開けるようになります。)

Sublime TextをTerminalから起動できるようにする El Capitan対応


GitHubでssh接続できるようにします。その手順はこちらサイトが参考になりました。

gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~

やることメモ

① .sshディレクトリに移動
$ cd ~/.ssh

② 公開鍵・秘密鍵を作成
$ ssh-keygen -t rsa

③ sshキーをGitHubに登録
https://github.com/settings/ssh

④ ~/.ssh/configファイルを作成
$ subl config

⑤ GitHubとの接続確認
$ ssh -T github


configファイル内容のメモ

Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User <username>


これで記載のあったとおりに接続完了メッセージが表示されました。

Hi <name>! You've successfully authenticated, but GitHub does not provide shell access.


他にもインストールしたりの作業が必要になることがあるのでHomebrewも利用できるようにしておきます。

MacにHomebrewを導入する方法

Salesforceプロジェクトを用意

まずはローカル上にSalesforceプロジェクトを用意します。MavensMateを使っていますがForce.com IDEなど他のツールでも大丈夫です。
f:id:tyoshikawa1106:20180913062809p:plain

GitHubにリポジトリを作成

GitHubにリポジトリを作成します。
f:id:tyoshikawa1106:20180913063555p:plain

Terminalを起動して作業ディレクトリに移動

続いてTerminalでsalesforceプロジェクトのディレクトリに移動します。今回はprojectフォルダを作成し、その中にsalesforceフォルダを用意して作業しています。

$ cd project/salesforce/workspace/trailblazer

f:id:tyoshikawa1106:20180913063136p:plain

Gitの作業環境準備

Gitの作業環境準備します。

$ git init

これで.gitファイルが作成されます。
f:id:tyoshikawa1106:20180913063721p:plain


続いて.gitignoreファイルを作成します。giboコマンドが便利です。

$ gibo dump macOS Windows SublimeText VisualStudioCode Eclipse Node >> .gitignore

※ dumpから先は任意の内容。


giboについてはこちら。

Git:gitignoreを生成できるgiboを試してみました - Part 2 - tyoshikawa1106のブログ


これで.gitignoreファイルを用意できました。
f:id:tyoshikawa1106:20180913064148p:plain


Gitで管理不要なのは下記のファイルです。

# Salesforce Project
config/
package.xml

これは手作業で追加します。
f:id:tyoshikawa1106:20180913064539p:plain


.sublimeプロジェクトも不要です。コメントアウトされているので修正します。
f:id:tyoshikawa1106:20180913064645p:plain


.gitignoreファイルの編集もこれで完了しました。Gitの作業環境準備は以上になります。

GitHubへのアップロード

下記のコマンドを実行してGitHubにSalesforceプロジェクトのソースコードをアップします。

$ git add .

次のコマンドでGit管理対象となったファイルを確認できます。

$ git status

f:id:tyoshikawa1106:20180913065105p:plain


次のコマンドでコミットします。

$ git commit -m "first commit"

f:id:tyoshikawa1106:20180913065232p:plain


続いてGitの作業環境とGitHubを接続します。

$ git remote add origin <GitHubのリポジトリ参照>

f:id:tyoshikawa1106:20180913065458p:plain


最後にgit pushコマンドでGitHubにアップできます。

$ git push -u origin master

f:id:tyoshikawa1106:20180913065640p:plain


検証中、自分の作業環境では.gitignoreファイルがアップされない問題に遭遇しました。なぜかGit管理対象から除外されるファイルがある場合は「.gitignore_global」を確認すればいいみたいです。

$ subl .gitignore_global

確認したところ、ファイル内に.gitignoreが記載されていました。
f:id:tyoshikawa1106:20180913070704p:plain


自分の作業環境でのみ管理対象から除外したいファイルがある場合は「.gitignore_global」の仕組みで除外できるみたいです。今回記載されていた内容は過去によく理解せずに記載したものが残っていただけでした。「.gitignore_global」の内容を綺麗にすると.gitignoreファイルを管理対象に追加できました。

f:id:tyoshikawa1106:20180913071035p:plain

README.mdの作成とGitHubから最新情報を取得する。

GitHubにSalesforceプロジェクトをアップできたら画面上からREADME.mdファイルを作成してみます。

f:id:tyoshikawa1106:20180913071214p:plain

f:id:tyoshikawa1106:20180913071251p:plain


作成したら次のコマンドを実行してGitHubの最新の情報を取得します。

$ git pull


README.mdをローカル上に取得できると思います。

f:id:tyoshikawa1106:20180913071419p:plain


以上の手順でSalesforceプロジェクトをGitHubで管理する環境を構築できました。後は開発を行ったソースコードをgit commitやgit pushで管理していけると思います。

Sourcetreeをつかった管理

環境構築はTerminalでコマンドを実行して行いましたが、環境構築後の日常的なコミット作業やソースコードの差分チェックをTerminalから行うのは慣れがないと難しいと思います。その場合はAtlassianのSourcetreeが便利です。インストール後のセットアップ時にAtlassianアカウントが必要になりますが、初期設定完了後はGitHubと接続して作業が可能です。


初期設定が完了すると次のようにディレクトリをスキャンの表示があると思います。
f:id:tyoshikawa1106:20180913072202p:plain:w300


ここにSalesforceプロジェクトのディレクトリをドラッグ&ドロップやディレクトリを指定して追加します。
f:id:tyoshikawa1106:20180913072318p:plain:w300



これだけでSourcetreeをつかったGit管理が可能となります。
f:id:tyoshikawa1106:20180913072419p:plain


試しにREADME.mdファイルの内容を変更します。

# trailblazer

## Table of Contents
- [Requirements](#requirements)
- [Usage](#usage)
- [Link](#link)

## Requirements
- MavensMate

## Usage
### Create Salesforce Project
MavensMateでLocalにSalesforceのプロジェクトを作成。
```
/Users/<user>/project/salesforce/workspace/trailblazer
```

### Setup Git
```
$ cd project/salesforce/workspace/trailblazer
$ git init
$ git remote add origin <path>
$ git fetch origin
$ git reset --hard FETCH_HEAD
```

### Write package.xml (src/package.xml)  
```
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>*</members>
        <name>ApexClass</name>
    </types>
    <types>
        <members>*</members>
        <name>ApexComponent</name>
    </types>
    <types>
        <members>*</members>
        <name>ApexPage</name>
    </types>
    <types>
        <members>*</members>
        <name>ApexTrigger</name>
    </types>
    <types>
        <members>*</members>
        <name>AuraDefinitionBundle</name>
    </types>
    <types>
        <members>*</members>
        <name>StaticResource</name>
    </types>
    <version>39.0</version>
</Package>
```

### MavensMate Menu
● Refresh From Server...
- Salesforceから最新のコードを取得できます。
- プロジェクトフォルダを右クリックするとメニューが表示されます。
- 開発作業開始前に実行して差分がない状態にしてください。

### Git Manage Tool
Setup完了後はSourcetreeを使って作業を行います。

## Link
- [MavensMate](https://github.com/joeferraro/MavensMate)
- [Sourcetree](https://ja.atlassian.com/software/sourcetree)


Sourcetreeを見ると差分が表示されます。内容を確認してコミットしてください。
f:id:tyoshikawa1106:20180913072941p:plain

commit時のコメントは1行目にタイトル。2行目は空白。3行目以降に説明を入力する...という話を過去に聞いた気がします。

f:id:tyoshikawa1106:20180913073315p:plain


これをGitHubにプッシュするとREADME.mdが更新されていることを確認できると思います。
f:id:tyoshikawa1106:20180913073632p:plain

GitHubリポジトリからSalesforceプロジェクトを取得

上記でGitHubリポジトリを作成してSalesforceプロジェクトをアップするところまでできました。続いてGitHubからソースコードを取得して開発環境を整える方法です。


はじめにMavensMateでSalesforceのプロジェクトを作成します。枠だけあればソースコードは不要です。
f:id:tyoshikawa1106:20180914194543p:plain


Terminalを起動して作成したプロジェクトのディレクトリに移動します。
f:id:tyoshikawa1106:20180914194916p:plain


次の手順でコマンドを実行してGitHubからソースコードを取得します。

$ git init
$ git remote add origin git@github.com:tyoshikawa1106/trailblazer.git
$ git fetch origin
$ git reset --hard FETCH_HEAD

f:id:tyoshikawa1106:20180914195318p:plain


「$ git pull origin master」などが使えると思います。
f:id:tyoshikawa1106:20180914195636p:plain


問題がなければ先程枠だけ作成したSalesforceプロジェクトにGitHubのソースコードが反映されていると思います。
f:id:tyoshikawa1106:20180914195733p:plain


package.xmlはGit管理の対象外としているので任意の内容に更新します。あとはRefresh from ServerなどSalesforceに連携するコマンドもいつもどおりに実行できると思います。


SourceTreeの利用は上記のときと同じでドラッグ&ドロップするだけです。
f:id:tyoshikawa1106:20180914200102p:plain


これでSalesforceの開発を行いながらGitHubでバージョン管理を行うことができると思います。。
f:id:tyoshikawa1106:20180914200559p:plain


Salesforce DXを本格的に利用する場合は上記とは別の手順になりますが、とりあえずGitHubでバージョン管理したいという場合は上記の手順で対応可能だと思います。

関連記事

Git:gitignoreを生成できるgiboを試してみました - Part 2

2015年11月に試して依頼、久しぶりに使うことになったgiboについてです。前回の試したときの記事はこちらです。

giboのアップデート

giboのバージョンですが、2.x系が追加されていました。brewコマンドでアップデートすればいいみたいです。

$ brew upgrade gibo

f:id:tyoshikawa1106:20180911214948p:plain


2系に変更したあとは「gibo --vertion」という書き方が「gibo vertion」で実行できるようになっていました。ヘルプコマンドは下記のコマンドになります。

$ gibo help


最新バージョンにしたあとに知ったのですがコマンドで呼び出せた OSX は macOS に名称変更していました。利用できるコマンドは下記のコマンドで確認できます。

$ gibo list


gitignoreファイルを作成する方法も変更されています。下記のように dump と記載する必要がありました。

$ gibo dump macOS Windows SublimeText VisualStudioCode Eclipse >> .gitignore

f:id:tyoshikawa1106:20180911215810p:plain


これでgitignoreファイルを作成することができました。
f:id:tyoshikawa1106:20180911215836p:plain

SFDC:apex:sldsタグとAPIバージョンの関係について

apex:sldsタグとはVisualforceページにLightning Design SystemのCSSを読み込むためのタグです。

f:id:tyoshikawa1106:20180909194123p:plain

Visualforce - Lightning Design System


このタグを宣言することでLightning Experienceに合わせたページを開発することができます。
f:id:tyoshikawa1106:20180909194235p:plain


このapex:sldsタグで読み込まれるSLDSのバージョンですが、VisualforceページのAPIバージョンと連動する仕組みとなっているみたいです。先程の画面はAPIバージョンが39.0で作成されていたページです。ページのAPIバージョンを43.0と最新版に変更するとSLDSのバージョンも別のバージョンに自動で切り替わります。

f:id:tyoshikawa1106:20180909194809p:plain


先程の画面のAPIバージョンを43.0に変更した結果がこちらです。APIバージョン以外のコードの変更はありません。
f:id:tyoshikawa1106:20180909194912p:plain


ChromeのDeveloper Consoleで確認したところfontファイルのパスは23.0と、APIバージョン39.0でも43.0でも変更ありませんでしたが、デザインが大きく変更されていることからSLDSのバージョンが切り替わっていると思います。Lightning Design Systemをより活用するためにはAPIバージョンをできる限り最新にしておくのが良さそうです。


ちなみにLightning Design SystemのCSSはClassicでも違和感なく利用することができます。まだLightning Experienceに切り替えられなくてもVisualforceページの開発はLightningスタイルに切り替えておくと後々楽になると思います。

Lightnign Design System デモ

SFDC:大量データの管理ができるBig Objectを試してみました

Trailheadを見ながらBig Objectの機能を試してみました。
f:id:tyoshikawa1106:20180909110429p:plain

Big Object の基礎 | Salesforce Trailhead


Big Objectは10億件を超えるデータを扱う場面で活躍する機能です。
f:id:tyoshikawa1106:20180909110613p:plain


標準 Big Object とカスタム Big Object の二種類があります。
f:id:tyoshikawa1106:20180909110649p:plain


カスタム Big Objectを利用例です。

顧客の 360 度ビュー

お客様には、保存する顧客情報が大量にあります。ロイヤルティプログラムから取引、注文、請求情報まで、カスタム Big Object を使用すれば、すべての詳細を追跡できます。

監査と追跡

分析またはコンプライアンス目的で、ユーザの Salesforce 利用状況を長期的に追跡します。

履歴アーカイブ

分析またはコンプライアンス目的で、履歴データへのアクセスを管理しながら、中核的な CRM または Lightning Platform アプリケーションのパフォーマンスを最適化します。


Big Object はSOQLクエリと非同期SOQLクエリを使って検索できます。

SOQLクエリで取得する場面

クエリで返されるデータが少量であることがわかっている場合や、結果を待ちたくない場合、Apex で使用するために結果をすぐに返す必要がある場合には、SOQL を使用します。

非同期SOQLクエリで取得する場面

非同期 SOQL は、クエリ対象のデータが非常に大きいためにリアルタイムで結果を待てない場合に SOQL クエリを実行するための方法です。

補足

カスタム Big Object はすべてのライセンスに含まれていますが、非同期 SOQL は追加の Big Object 容量のライセンスにのみ含まれています。



Big Objectを利用する際に下記の注意点がありました。
f:id:tyoshikawa1106:20180909111018p:plain

Big Objectの設定

Developer Edtion組織でも試すことができます。
f:id:tyoshikawa1106:20180909111213p:plain


Big ObjectはUIでの設定がサポートされていません。メタデータを使って登録する必要があります。メタデータの操作は「Force.com移行ツール」がやりやすいと思います。



こんな感じでファイルを用意します。
f:id:tyoshikawa1106:20180909121001p:plain


cdコマンドで対象のディレクトリに移動して次のコマンドを実行します。

$ ant -Dpackage.xml=package.xml -f build.xml deployCode

f:id:tyoshikawa1106:20180909121103p:plain


設定画面の方を確認すると無事にBig Objectが登録されています。
f:id:tyoshikawa1106:20180909121204p:plain

f:id:tyoshikawa1106:20180909121217p:plain


権限セット(Permission Set)の方はうまくデプロイできませんでしたがひとまずBigObjectを設定することができました。削除や編集は設定画面からできるみたいです。
f:id:tyoshikawa1106:20180909121427p:plain


ただし権限設定は画面からは変更できないようでした。
f:id:tyoshikawa1106:20180909121449p:plain


・・・権限セットのメタデータの扱いどうやればいいんだろ。

コード

Customer_Interaction__b.object
<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
    <deploymentStatus>Deployed</deploymentStatus>
    <fields>
        <fullName>In_Game_Purchase__c</fullName>
        <label>In-Game Purchase</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Level_Achieved__c</fullName>
        <label>Level Achieved</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Lives_This_Game__c</fullName>
        <label>Lives Used This Game</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Game_Platform__c</fullName>
        <label>Platform</label>
        <length>16</length>
        <required>true</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
     <fields>
        <fullName>Score_This_Game__c</fullName>
        <label>Score This Game</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    <fields>
        <fullName>Account__c</fullName>
        <label>User Account</label>
        <referenceTo>Account</referenceTo>
        <relationshipName>Game_User_Account</relationshipName>
        <required>true</required>
        <type>Lookup</type>
    </fields>
    <fields>
        <fullName>Play_Date__c</fullName>
        <label>Date of Play</label>
        <required>true</required>
        <type>DateTime</type>
    </fields>
    <fields>
        <fullName>Play_Duration__c</fullName>
        <label>Play Duration</label>
        <required>false</required>
        <type>Number</type>
        <scale>2</scale>
        <precision>18</precision>
    </fields>
    <indexes>
        <fullName>CustomerInteractionsIndex</fullName>
        <label>Customer Interactions Index</label>
        <fields>
            <name>Account__c</name>
            <sortDirection>DESC</sortDirection>
        </fields>
        <fields>
            <name>Game_Platform__c</name>
            <sortDirection>ASC</sortDirection>
        </fields>
        <fields>
            <name>Play_Date__c</name>
            <sortDirection>DESC</sortDirection>
        </fields>
    </indexes>
    
    <label>Customer Interaction</label>
    <pluralLabel>Customer Interactions</pluralLabel>
</CustomObject>
Customer_Interaction.permissionset
<?xml version="1.0" encoding="UTF-8"?>
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.In_Game_Purchase__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Level_Achieved__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Lives_This_Game__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Play_Duration__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Score_This_Game__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
     <label>Customer Interaction Permission Set</label>
</PermissionSet>
package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>*</members>
        <name>CustomObject</name>
    </types>
    <types>
        <members>*</members>
        <name>PermissionSet</name>
    </types>
    <version>41.0</version>
</Package>