2019年

1/5ページ

VS CodeのOrg Browserという機能

  • 2019.09.23

概要 Salesforceのソースコードベースの開発を行う際には、VSCodeとその拡張機能(Extension)を使用しますが、その中にOrg Browserという便利な機能が追加されていたので紹介したいと思います。Org Browserを使用すると、manifest file(package.xml)を作成せずにSandbox等の組織からローカルにソールコードを取得することができます。 VSCodeの基本設定やSalesforceのExtensionについてはこちらに記載していますので、本記事では割愛します。 使用方法 SFDXプロジェクトを作成する VSCodeのコマンドパレットでSFDX: Create Project with Manifestを実行してSFDXプロジェクトを作成します。 接続対象の組織を認証する VSCodeのコマンドパレットでSFDX: Authorize an Orgを実行して対象組織の認証により接続を行います。認証するとVSCodeの一番左のアイコンにSalesforceマークが表示されます。こちらが、Org Browserの機能となります。 対象のメタデータを選択 Salesforceマークを選択すると、接続した組織のメタデータの一覧が表示されます。その中からローカルのプロジェクトにダウンロードしたいメタデータを選び、ボタンを押すとダウンロードされます。 ダウンロードしたファイルは、ソース形式でデフォルトでは下記のパスに格納されます。sfdx project > force-app > main > default これでソースコードによる開発をVSCode上で容易に行うことができます。これまでは、package.xmlを作成しないと対象のメタデータをダウンロードできかったのと比較すると非常に簡単になったと思います。 ちなみに、package.xmlの作成方法については、公式のExtensionではありませんが、下記の記事に記載しているものを使用すればVSCodeのUIベースで作成することもできます。 参考 Org Browserhttps://developer.salesforce.com/tools/vscode/articles/user-guide/org-browser

本番組織へのソース形式でのデプロイ

  • 2019.08.27

概要 本記事はSalesforceにおけるリリースにおいて、CLIを使用する場合にソース形式(メタデータ形式ではなく)で直接、本番組織へデプロイする方法を記載します。これまで(Spring’19以前)もSandboxへはソース形式でもデプロイすることができましたが、本番組織には一度メタデータ形式に変換したのちにデプロイする必要がありました。Summer’19からは、一度クイックリリースでテストを実行したのちに、そこで発行されるジョブIDを元にデプロイをすることができるようになったようです。 リリース方法(コマンド) まずは、クイックリリースでテストを実行してコードカバー率が要件を満たしていることを確認します。 上記のコマンドでSuccessとなった後に、実行した際に発行されているジョブIDを用いてデプロイを行います。 以上でリリース完了となります。 まとめ いちいちメタデータ形式への変換が不要となったので、個人的にはこちらの方が便利かなと思っています。 参考 本番組織へのアプリケーションのリリースhttps://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_build_mdapi_production.htm 任意の組織に対する開発https://developer.salesforce.com/docs/atlas.ja-jp.220.0.sfdx_dev.meta/sfdx_dev/sfdx_dev_develop_any_org.htm source Commandshttps://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_force_source.htm#cli_reference_deploy

リストビューで選択したレコードを引数にFlowを実行

  • 2019.08.26

概要 本記事では、Salesforceのオブジェクトのレコードを一覧表示する標準機能のリストビューにて選択したレコードを引数にしてFlowを実行する方法を記載します。リストビューで選択したレコードに対してアクションではできないような少し複雑なロジックをFlowで実装したい場合に利用できるかと思います。 実装方法 Flowを呼び出すVisualforceを作成 事前に呼び出したいFlowは事前に作成しておきます。起点となるリストビューのオブジェクトに対応する標準リストコントーラを定義したVisualforceページを作成します。当該VFページから<flow:interview>タグでフローを呼び出します。finishLocationでは、Flowで完了ボタン押下後の戻り先のURLを指定します。Accoutオブジェクトのサンプルは、以下となります。 カスタムリストボタンを作成 対象のオブジェクトの設定画面で新規ボタンから表示の種類として「リストボタン」-「チェックボックスの表示」を選択します。内容のソースで上記で作成したVisualforceページを選択します。 まとめ 一覧画面で選択したレコードに対してなんらかの処理をしたいという場合のソリューションとして、極力開発する箇所を少なくするための手法として利用できるかと思います。 参考 Visualforce ページへの標準リストコントローラの関連付けhttps://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_controller_sosc_associate.htm Visualforce ページへのフローの埋め込みhttps://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_flows_adding.htm フローの finishLocation 属性の設定https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_flows_finishlocation.htm 標準リストコントローラを使用したカスタムリストボタンの追加https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_controller_sosc_custom_button.htm

Mavenで実行可能なJARファイルを作成

  • 2019.07.27

概要 本記事では、Mavenで実行可能なJARファイルを簡単にビルドして作成する方法を記載します。ローカルで実行するようなツール等をJavaで作成する際には、JARファイルをコマンドもしくはダブルクリックで実行可能になるので参考にしていただければと思います。 プロジェクトの作成 mvnコマンドでJavaプロジェクトのスケルトンを作成します。 maven-assembly-plugin maven-assembly-pluginは、プロジェクトの出力をその依存関係、モジュール、ドキュメント、およびその他のファイルと共に単一の配布可能なアーカイブにまとめることを可能にします。今回は、JARファイルの形式でアーカイブしたいので、jar-with-dependenciesを指定します。また、<archive>の<manifest>で実行クラスのパスを指定します。追加で<appendAssemblyId>をfalseに設定しています。そうしないと、作成されるjarファイルに-jar-with-dependenciesが最終的な名前に追加されてしまいます。下記をpom.xmlファイルに記載します。 maven-dependency-plugin maven-dependency-pluginのcopy-dependenciesを使用することで、プロジェクトの直接の依存関係とオプションで推移的な依存関係のリストを取得し、それらを指定された場所にコピーします。下記をpom.xmlファイルに記載します。 サンプル Githubに本記事のサンプルを格納しています。cloneして、mvn packageすることでJARファイルを作成できます。https://github.com/yhayashi30/maven-jar-sample 参考 Apache Maven Assembly Pluginhttp://maven.apache.org/plugins/maven-assembly-plugin/Apache Maven Assembly Plugin Usagehttp://maven.apache.org/plugins/maven-assembly-plugin/usage.htmlApache Maven Dependency Pluginhttps://maven.apache.org/plugins/maven-dependency-plugin/Apache Maven Dependency Plugin Usagehttps://maven.apache.org/plugins/maven-dependency-plugin/usage.html

プラットフォームイベントとは

  • 2019.07.21

概要 本記事ではSalesforceのプラットフォームイベントについての概要や使用方法を簡単に整理します。 イベント駆動型アーキテクチャ イベント駆動型アーキテクチャとは、イベントプロデューサ/イベントコンシューマ/イベントバスから構成されます。イベントプロデューサは、イベント発生時の情報を取得してイベントバスにメッセージとして転送します。転送されたメッセージは、プロデューサとは非同期にイベントコンシューマで受信して処理を実行します。従来の要求-応答通信モデルでは、Webシステムやデータベースに要求を実行して同期で応答を受信していました。したがって、応答するWebシステムやデータベースの可用性に依存していました。イベント駆動型アーキテクチャの使用用途は、外部システムとのインテグレーション等で別トランザクションで非同期に処理を実行したいような場合かと思います。そして、プラットフォームイベントは、Salesforce Platform上でイベント駆動型アーキテクチャを実現する機能となります。 https://developer.salesforce.com/docs/resources/img/ja-jp/220.0?doc_id=images%2Fsalesforce_event_bus.png&folder=platform_events カスタムプラットフォームイベントの定義 カスタムプラットフォームイベントは、カスタムオブジェクト(sObject)と同じように定義することができます。また、カスタムオブジェクトと同様に作成したプラットフォームイベントには、カスタム項目を追加することができます。ただし、レイアウトやLightningレコードページで表示することはできません。プラットフォームイベントのAPI参照名のサフィックスは、__eとなります。(通常のカスタムオブジェクトでは、__cとなる部分です。)例) event__e みたいな感じです。 プラットフォームイベントの公開 上記で定義したプラットフォームイベントに対してレコードを作成することがイベントの公開になります。公開するための方法は以下のいずれかとなります。イベント駆動型アーキテクチャでいうと、イベントプロデュースにあたります。 プロセスビルダー フロー Apex API(SOAP API/REST API/Bulk API etc) それぞれの機能での実装は、通常のカスタムオブジェクトにレコードを作成するのと同じようなイメージとなります。 プラットフォームイベントの登録 上記で公開したプラットフォームイベントのレコードによりメッセージを受信して動作する処理を登録します。登録するための方法は以下のいずれかとなります。イベント駆動型アーキテクチャでいうと、イベントコンシューマにあたります。 プロセスビルダー フロー Apexトリガー Litghtningコンポーネント(empApiコンポーネント) CometDクライアント プロセスビルダーとフローには、プラットフォームイベントを開始のタイミングとして選択することができます。 プロセスビルダー フロー Apexトリガーは、カスタムオブジェクトのトリガーと同様にプラットフォームイベントのオブジェクトに対して作成することができます。処理種別は、after triggerとして実装します。また、通常のカスタムオブジェクトの最大バッチ数は200ですが、プラットフォームイベントは、2000となります。Lightningコンポーネントは、empApiコンポーネントを使用してリスンするプラットフォームイベントを登録することができます。参考(lightning-emp-api)https://developer.salesforce.com/docs/component-library/bundle/lightning-emp-api/documentationCometDは、外部クライアントでプラットフォームイベントの受信を登録できます。CometD クライアントを実装するか EMP コネクタのオープンソースのコミュニティツールを使用して作成することができます。具体的な実装のサンプルは、下記に記載されています。参考(Java クライアントを使用した登録とイベントの再生)https://developer.salesforce.com/docs/atlas.ja-jp.platform_events.meta/platform_events/code_sample_java_client_intro.htm 参考 Platform Events Developer Guide (プラットフォームイベント開発者ガイド)https://developer.salesforce.com/docs/atlas.ja-jp.platform_events.meta/platform_events/platform_events_intro.htm プラットフォームイベントの基礎https://trailhead.salesforce.com/ja/content/learn/modules/platform_events_basics インスタント通知アプリケーションの作成https://trailhead.salesforce.com/ja/content/learn/projects/workshop-platform-events

FlowからApex呼び出し

  • 2019.07.19

概要 宣言的型の開発(UIベースでの実装)であるFlowからApex(プログラムベースでの実装)を呼び出して実行するプログラムの実装方法を記載します。特にApexの呼び出しで複数のパラメータを引数として渡したいパターンについて整理します。 InvocableMethod アノテーション まず、Flowから呼び出すApexクラスのメソッドには、InvocableMethodアノテーションをつけて、staticでpublicまたはglobalで宣言します。InvocableMethodアノテーションをつけたメソッドは、クラスに1つのみが宣言可能となります。 InvocableVariable アノテーション InvocableMethodのメソッドで入力もしくは出力のクラス変数のパラメータを定義する際には、InvocableVariable アノテーションを使用します。なので、InvocableMethodのメソッドで複数のパラメータを渡したい場合等には、入力用のクラスを宣言して、そのクラス変数としてInvocableVariableアノテーションをつけます。 サンプル サンプルでは、複数の取引先と親ケースのIDと件名をFlow等から呼び出しの引数として渡して、それらに紐付けたケースを一括作成するような処理を行なっています。 参考 InvocableMethod アノテーションhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_InvocableMethod.htm InvocableVariable アノテーションhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_InvocableVariable.htm

【JavaScript】関数スコープとブロックスコープ

  • 2019.06.12

概要 ES6以前は、JavaScriptの変数はvarで宣言することのみが可能でした。ES6以降はletとconstを加えて、3種類で変数を宣言することが可能となりました。本記事では、これらを使って宣言した変数が関数スコープとブロックスコープでどのような違いがあるかを記載します。 関数スコープ 関数内でvarを使用して宣言した変数は、関数外で使用するとエラーとなります。 ブロックスコープ ifやfor等のブロック内でvarを使用して宣言した変数は、ブロック外で使用してもエラーとならず、そのまま使用することができてしまいます。 letやconstを使用した場合 ES6以降で登場したletやconstを使用することで上記のような関数スコープとブロックスコープの差をなくすことができます。※ 本記事ではletとconstの違いは触れません。簡単にいうと上書きできるかできないかです。 関数スコープ ブロックスコープ 参考 The Difference Between Function and Block Scope in JavaScripthttps://medium.com/@josephcardillo/the-difference-between-function-and-block-scope-in-javascript-4296b2322abe

Salesforce CLIを整理してみた

  • 2019.06.02

概要 本記事は、Salesforce CLIで使用可能なコマンドを整理したものとなります。筆者が気になったコマンドついては、個別に実行してどのような結果となるかを試してみました。ただし、これらのコマンドは毎リリースで仕様が更新されているので最新情報は下記のURLで確認してください。https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htmなお、本記事に記載の情報は、summer’19(Ver46)時点のものとなります。 コマンド整理 alias Commands alias:list CLIのコマンドで使用できる別名をリスト表示 alias:set CLIのコマンドで使用できる別名を設定 sfdx force:alias:listローカルで使用しているユーザIDに対する別名をリストで確認することができます。sfdx force:alias:set YourAlias=username@example.com別名を設定することもできます。 apex Commands apex:class:create Apexクラスの作成 apex:execute Apexクラスの実行 apex:log:get 最後のデバックログを取得 apex:log:list デバックログIDのリストを表示 apex:log:tail ターミナルでデバックログのテイルを有効化 apex:test:report 特定のテストを実行した結果を表示 apex:test:run Apexのテストを実行 apex:trigger:create Apexトリガーの作成 sfdx force:apex:class:create -n sfdxCliApexTest -d ./classes/クラス名とローカルのディレクトリを指定してApexクラスを作成します。 sfdx force:apex:execute -f ./classes/sfdxCliApexTest.clsローカルのApexクラスをファイルを実行することができます。 sfdx force:apex:log:list auth Commands auth:jwt:grant JWTフローで組織へ認証 auth:list 認証済の接続情報をリストで表示 auth:logout 認証済みの組織からログアウト auth:sfdxurl:store SFDXの認証URLを使用して組織へ認証 auth:web:login ブラウザのログイン画面経由で認証 sfdx force:auth:web:login -a <別名> -r <インスタンスURL>通常のWEBのログイン画面でユーザID、パスワードで認証できます。 sfdx force:auth:listローカルでSalesforce組織に対して認証済の接続情報をリストで表示します。 config Commands config:get デフォルトのスクラッチ組織/DebHub/インスタンスURLの設定を取得 config:list CLIのための設定変数をリストで表示 config:set CLIのためのLocalとGlobalの設定変数を更新 sfdx force:config:listローカルでCLIのための設定変数をリストで表示します。 data Commands data:bulk:delete CSVファイルのレコードリストをバッチで削除 data:bulk:status BulkAPIのJob/バッチステータスをポーリング data:bulk:upsert BulkAPIによるUPSERTのJobかバッチを作成 data:record:create レコードをINSERT data:record:delete 単一レコードをDELETE data:record:get 単一レコードを表示 data:record:update 単一レコードをUPDATE data:soql:query SOQLを実行 data:tree:export sObjectとツリーフォーマット(json)で組織からデータをエクスポート data:tree:import sObjectとツリーフォーマット(json)で組織へデータをインポート sfdx force:data:record:update -s Account -i 0017F00000ezMN3QAM -v “Name=GenePoint-Update”-sでオブジェクト名、-iでID、-vで更新カラムと値を引数で渡すことでUPDATEできる sfdx force:data:record:update -s Account -w “Name=’GenePoint'” -v “Name=’GenePoint-Update'”-wでWHERE句のように条件を指定することもできる sfdx force:data:soql:query -q “SELECT Id, Name FROM Account”SOQLを実行して結果を表示する sfdx force:data:tree:export -q “SELECT Id, Name FROM Account”SOQLを実行してjson形式でデータをエクスポートする doc Commands doc:commands:display コマンドのヘルプを表示 doc:commands:list コマンドのリスト表示 sfdx force:doc:commands:listforce名前空間のCLIコマンドを全て一覧で表示 lightning Commands lightning:app:create Lightningアプリケーションを作成 lightning:component:create AuraコンポーネントかLWCの枠を作成 lightning:event:create Lightningイベントの枠を作成 lightning:interface:create Lightningインターフェースの枠を作成 lightning:lint Auraコンポーネントコードに対して静的解析、または「lint」ツールを実行 lightning:test:create Lightningテストを作成 lightning:test:install Lightning Testing Serviceに非管理パッケージを組織にインストール lightning:test:run Auraコンポーネントのテストを実行 limits Commands limits:api:display APIコールやイベントの制限について最大数と残数を表示 sfdx force:limits:api:display mdapi Commands mdapi:convert メタデータAPIで取得したメタデータをDXプロジェクトで利用できるソース形式に変換 mdapi:deploy 作成、更新したコンポーネントを組織にデプロイ mdapi:deploy:cancel 非同期のデプロイをキャンセル mdapi:deploy:report 非同期のメタデータのデプロイ状況をチェック mdapi:describemetadata 組織で有効なメタデータタイプを表示 mdapi:listmetadata 特定のメタデータタイプのプロパティを表示 mdapi:retrieve 対象の組織からメタデータをxmlファイルのZipを取得 mdapi:retrieve:report 非同期のメタデータの取得状況をチェック sfdx force:mdapi:describemetadata sfdx force:mdapi:listmetadata -m CustomObject org Commands org:clone (Beta) 設定ファイルかkey-valueのペアで指定された値を使ってSandbox組織をクローン org:create 設定ファイルかkey-valueのペアで指定された値を使ってSandbox組織かスクラッチ組織を作成 org:delete スクラッチ組織を削除 org:display 対象の組織の説明を表示 org:list CLIで作成したもしくは、認証した組織をリスト表示 org:open ブラウザで組織を表示 org:shape:create […]

SOQLの基礎

  • 2019.05.26

概要 本記事では、SOQLの基礎的な事項を実行のサンプルコードをベースにして整理しております。まずSOQLとは、Salesforce Object Query Languageの略であり、データベース(オブジェクト)から必要となるデータを取得する際に利用するものとなります。一般的なSQLとの違いは、いくつかありますが一つはSQLでは複数のテーブルを自由に条件指定することで結合してデータを抽出することができますが、SOQLではオブジェクト同士にリレーションがある場合にのみ結合することができます。また、SQLの’UPDATE’や’DELETE’のようなDMLはSOQLでは使用できないので、Apexで実行する必要があります。 Apexの中でSOQLを実行する2つの方法(静的SOQL、動的SOQL)から紹介します。 静的SOQL(インラインSOQL) Apexでは[ ]句によって、静的なSOQLを記載することができます。[ ]句の中では、 下記のようにバインド変数を使用することで条件を指定できます。 動的SOQL Apexの処理の中で実行するSOQLを動的に編集することができます。実行するSOQL文をStringでDatabase.queryに渡すことができます。SOQLの中で一つのレコードの取得に限定しているのであれば、sObjectで受けることができます。 複数件以上のレコードを取得するのであれば、sObjectのリストで受けます。 サンプルは下記の通りとなります。 また、バインド変数を使用しない例では下記のようにSOQL文を組み立てることもできます。 SOQLの構文(演算子) SOQLで使用することができる各構文(演算子)を記載していきます。 =(等号) >,<,>=,<=(不等号) INCLUDES/EXCLUDES 複数選択リストでの条件を指定する際に使用します。下記の例では、PassportおよびAadhar Card、もしくはPAN Cardのレコードを抽出する条件となります。 LIKE SQLで使用するのと同じように部分一致の検索を行う際に使用します。% と _ がワイルドカードしてサポートされています。%は、0文字もしくは複数の文字列を表します。_は、1文字を表します。 IN SQLで使用するのと同じように複数の項目をOR条件で一致する値を指定する際に使用します。 NOT IN SQLで使用するのと同じように複数の項目をOR条件で一致しない値を指定する際に使用します。 SUBQUERY IN句/NOT IN句には、リレーションがある子オブジェクト、または親オブジェクト条件で指定することができます。 子オブジェクトを条件に指定 親オブジェクトを条件に指定 LIMIT 取得するレコードの上限を指定できます。 OFFSET 取得するレコードの開始行を指定することができます。 GROUP BY ある項目で集計することでCOUNT/SUM/MAX/MIN関数を使用することが集計単位ごとの値を算出できます。 GROUP BY ROLLUP GROUP BYにの機能に加えて、実行結果に小計行を出力されることができます。 [実行結果イメージ] [実行結果イメージ] HAVING GROUP BYで集計した結果に対して、取得するレコードの条件を付与します。 リレーションを使用した値の取得、および条件指定 子から親へのアクセス 子オブジェクトから親オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目により辿って親オブジェクトの所定の項目を指定できます。 カスタムオブジェクトの場合には、項目のAPI参照名の__cの部分を__rに変換して記載することになります。 親から子へのアクセス 親オブジェクトから子オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目の子リレーション名により辿って子オブジェクトの所定の項目を指定できます。contactsが子リレーション名になります。 カスタムオブジェクトの場合には、子リレーション名に__rを付与して記載することになります。 参考 動的SOQLhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_dynamic_soql.htm複数選択リストのクエリhttps://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_querying_multiselect_picklists.htm

【JavaScript】==と===の違いおよび型のチェック方法

  • 2019.05.20

概要 本記事では、JavaScriptにおける比較演算子の==と===の違い、および変数の型をチェックする方法を記載します。 ==と===の違い ==と===の違いとしては、簡単に言うと===の方が値だけでなく型まで含めて等しいかをチェックするのに対して、==では暗黙的な型変換により型を合わせた上で等しいかをチェックするという部分になります。下記に具体例を記載します。 また、別の記事で記載しておりますがJavaScriptの暗黙的な型変換は少し特殊な変換がなされるため、==を使用した場合には想定外にtrueに判定される時があります。 暗黙的な型変換についての詳細はこちらを参照。 したがって、JavaScriptのロジックにおける比較演算子は===を使用して厳格にすることが推奨されます。ただし、上記のような仕様を理解して上で==を使用するのは全く問題ないと思います。 型のチェック方法 JavaScriptの型をチェックする1つの方法は、typeofを使用することで、変数の型を返すのでそれを元にチェックすることができます。もう1つは、instanceofを使用することで、変数が指定する型と等しいかをチェックすることができます。それ以外にも型によって使えるものがあったり、typeofとinstanceofが使えるかも異なるので下記を参考にしてください。 String Number Array Function Object Nullとundefined Boolean Error Date Symbol まとめ 今回は、==と===の違いや変数の型チェックという基礎的ですが理解していないと予期せぬエラーの原因となる部分を整理しました。特に型チェックの方法は癖がありそうなので、注意したいところです。 参考 JavaScript — Double Equals vs. Triple Equalshttps://codeburst.io/javascript-double-equals-vs-triple-equals-61d4ce5a121a How to better check data types in javascripthttps://webbjocke.com/javascript-check-data-types/

1 5