Force.com Workbook クラウドでアプリケーション開発を始めよう 30分チュートリアル Websites Integration User Interface App Logic Database 目次 目次 本書について.................................................................................................................................................................. 3 チュートリアル 1: カスタムアプリケーションの作成............................................................................................. 6 ステップ 1: カスタムオブジェクト [Merchandise] (製品) を作成する............................................................ 6 ステップ 2: カスタム項目 [Description] (説明)、[Price] (価格)、[Total Inventory] (在庫数) を追加する.... 8 ステップ 3: タブを作成する............................................................................................................................... 11 ステップ 4: カスタムアプリケーション [Warehouse] (製品在庫管理) を作成する.................................... 12 ステップ 5: Merchandise (製品) レコードを作成する..................................................................................... 13 まとめ.................................................................................................................................................................... 14 チュートリアル 2: リレーションの追加................................................................................................................... 15 ステップ 1: カスタムオブジェクト [Invoice Statement] (インボイス明細) を作成する............................. 15 ステップ 2: カスタムオブジェクト [Line Item] (品目) を作成する............................................................... 18 ステップ 3: オブジェクトにリレーションを設定する................................................................................... 19 ステップ 4: アプリケーションに [Invoice Statement] (インボイス明細) オブジェクトを追加する......... 20 ステップ 5: Invoice Statement (インボイス明細) レコードを作成する......................................................... 21 まとめ.................................................................................................................................................................... 22 チュートリアル 3: 数式と入力規則の使用............................................................................................................... 23 ステップ 1: 各 Line Item (品目) の合計金額を計算する................................................................................. 23 ステップ 2: 積み上げ集計項目を使用して Invoice Statement (インボイス明細) の金額を計算する........ 24 ステップ 3: 入力規則を使用して在庫をチェックする................................................................................... 25 ステップ 4: 入力規則をテストする................................................................................................................... 27 ステップ 5: 入力規則を修正する....................................................................................................................... 28 まとめ.................................................................................................................................................................... 29 チュートリアル 4: ワークフローと承認プロセスの使用....................................................................................... 30 ステップ 1: 品目の価格を取得するワークフロールールを作成する........................................................... 31 ステップ 2: 発注時に在庫数を更新するワークフロールールを作成する................................................... 33 ステップ 3: ワークフロールールをテストする............................................................................................... 34 ステップ 4: 承認プロセスで使用する電子メールテンプレートを作成する............................................... 35 ステップ 5: 承認プロセスを作成する............................................................................................................... 36 ステップ 6: カスタムのプロファイルを作成する........................................................................................... 38 ステップ 7: ユーザを作成する........................................................................................................................... 39 ステップ 8: 承認プロセスをテストする........................................................................................................... 40 まとめ.................................................................................................................................................................... 42 チュートリアル 5: Apex を使用したビジネスロジックの追加............................................................................. 43 ステップ 1: Apex トリガ定義を作成する......................................................................................................... 44 ステップ 2: リスト変数を定義する................................................................................................................... 45 ステップ 3: リストで反復処理を実行し、価格を更新する........................................................................... 46 ステップ 4: トリガをテストする....................................................................................................................... 48 まとめ.................................................................................................................................................................... 49 チュートリアル 6: アプリケーションへのテストの追加....................................................................................... 50 ステップ 1: テスト用の Apex クラスを作成する............................................................................................ 51 ステップ 2: クラスにテストメソッドを追加する........................................................................................... 51 ステップ 3: トリガ実行のためのコードを追加する....................................................................................... 52 ステップ 4: テストを実行する........................................................................................................................... 54 ステップ 5: カバー率を確認し、テストを改善する....................................................................................... 55 ⅰ 目次 まとめ.................................................................................................................................................................... 56 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成....................................... 57 ステップ 1: 開発モードを有効化する............................................................................................................... 57 ステップ 2: Visualforce ページを作成する....................................................................................................... 58 ステップ 3: スタイルシートを静的リソースとして追加する....................................................................... 59 ステップ 4: ページにコントローラを追加する............................................................................................... 61 ステップ 5: 在庫カウントシートを Visualforce ページとして表示する...................................................... 62 まとめ.................................................................................................................................................................... 64 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成........................................................... 65 ステップ 1: 製品カタログのページを作成する............................................................................................... 65 ステップ 2: Force.com ドメイン名を登録する................................................................................................. 67 ステップ 3: Force.com サイトを作成する......................................................................................................... 68 ステップ 4: 設定を変更してテストする........................................................................................................... 69 まとめ.................................................................................................................................................................... 70 チュートリアル 9: 製品購入ページの作成............................................................................................................... 71 ステップ 1: コントローラを作成する............................................................................................................... 71 ステップ 2: コントローラにメソッドを追加する........................................................................................... 72 ステップ 3: Visualforce で製品購入ページを作成する................................................................................... 74 ステップ 4: AJAX でページを更新する (オプション).................................................................................... 76 まとめ.................................................................................................................................................................... 77 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成... 79 ステップ 1: 個人情報を設定する....................................................................................................................... 80 ステップ 2: オフラインブリーフケース構成を作成する............................................................................... 81 ステップ 3: Enterprise WSDL を生成してクライアント証明書をダウンロードする................................. 83 ステップ 4: Adobe Flash Builder for Force.com をインストールして起動する............................................. 83 ステップ 5: Force.com Stratus プロジェクトを作成する................................................................................ 84 ステップ 6: Stratus アプリケーションコンポーネントの属性を設定する.................................................. 86 ステップ 7: アプリケーションの Window コンポーネントを作成する....................................................... 87 ステップ 8: アプリケーションをテストする................................................................................................... 93 まとめ.................................................................................................................................................................... 95 付録 ............................................................................................................................................................................... 96 サンドボックスの作成とログイン................................................................................................................ 96 Force.com IDE を使用したプロジェクトの作成.......................................................................................... 96 アプリケーションの配布................................................................................................................................ 97 ⅱ 本書について 本書について 本書では、Force.com プラットフォームでアプリケーションを作成する方法をチュートリアル形式で解説 します。Force.com では、あらゆるタイプのアプリケーションを作成できますが、そうしたアプリケーシ ョンでほぼ共通して使用される次のような機能を学びます。 • • • • データベース: アプリケーション内の情報をモデル化します。 ビジネスロジックとワークフロー: 条件にもとづき特定のタスクを自動的に実行します。 ユーザインターフェース: アプリケーションを利用するユーザにデータや機能を提供します。 公開 Web サイト: アプリケーションのデータや機能を Web 上に公開します。 本書のチュートリアルでは、シンプルな製品在庫管理アプリケーションを作成します。ゼロから作成する ため、まず製品の情報を記録するデータベースモデルを定義します。続いて、ビジネスロジックを追加し ます。具体的には、在庫が十分にあるかどうかをチェックする入力規則、製品の販売数にもとづいて在庫 を更新するワークフロールール、規定の金額を超過したインボイスが作成された場合にマネージャに電子 メール通知を送信する承認プロセス、未決済のインボイスの金額を更新するトリガロジックなどを実装し ます。データベースとビジネスロジックを完成させたら、続いて、担当者が製品の在庫状況をチェックで きるページ、顧客が製品カタログを参照できる公開 Web サイト、さらに製品購入用のページなども作成 します。最後のチュートリアルでは、Adobe Flash Builder for Force.com を使って、前のチュートリアルで 作成したアプリケーションと連携し、オフラインでも動作するアプリケーションを作成する方法を学びま す。 チュートリアルを順に進めていくことで、アプリケーションの作成手順とプラットフォームの機能の両方 を着実に学べるようになっています。一見、大変そうかもしれませんが、わかりやすく解説を加えていき ますので、ご安心ください。まずは始めてみてください。 学習環境の選択 学習では、開発用の Developer Edition 環境を使用します。この環境は、本書で取り上げるすべての機能を サポートしています。Developer Edition のアカウントは、developer.force.com/join から無料で取得できま す。 Force.com Free Edition 環境を使用することも可能ですが、Free Edition には次のような制約があります。 • 一部のチュートリアルではサンドボックスを使用する必要があるため、すべてのチュートリアルをサ ンドボックスで実行するのが効率的です。学習を始める前にあらかじめサンドボックスを作成してお く必要があります (作成手順については、「サンドボックスの作成とログイン」 (96 ページ) を参照)。 • Free Edition では、「チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプ リケーションの作成」を実行できません。Adobe Flash Builder for Force.com は現時点で開発者プレビュ ーの段階にあり、Developer Edition のみで利用可能です。 • 実際に表示される画面が本書のスクリーンショットと異なる場合があります。たとえば、Developer Edition の [Start Here] タブは、Free Edition では [Get Started] タブになっています。多くはわずかな違い であり、学習には影響ありません。 3 本書について • アプリケーションが完成したら、サンドボックス環境から運用環境へアプリケーションを移行できま す。詳細については、「アプリケーションの配布」 (97 ページ) を参照してください。 Free Edition のアカウントは、salesforce.com/jp/form/signup/freeforce-platform.jsp から取得できます。 本書の構成 これらのチュートリアルは、頭から順に学んでいけるよう構成されています。 チュートリアル レベル 所要時間 チュートリアル 1: カスタムアプリケーションの作成 初級 20 ~ 30 分 チュートリアル 2: リレーションの追加 初級 20 ~ 30 分 チュートリアル 3: 数式と入力規則の使用 初級 20 ~ 30 分 チュートリアル 4: ワークフローと承認プロセスの使用 中級 30 ~ 45 分 チュートリアル 5: Apex を使用したビジネスロジックの追加 上級 20 ~ 30 分 上級 20 ~ 30 分 チュートリアル 7: Visualforce を使用したカスタムユーザイ ンターフェースの作成 中級 30 ~ 45 分 チュートリアル 8: Force.com サイトを使用した公開 Web ペ ージの作成 中級 20 ~ 30 分 チュートリアル 9: 製品購入ページの作成 中級 30 分 上級 30 分 アプリケーションの作成 ロジックの追加 テストの作成 チュートリアル 6: アプリケーションへのテストの追加 ユーザインターフェースの拡張 オフラインでの開発 チュートリアル 10: Adobe Flash Builder for Force.com を使用 したデスクトップアプリケーションの作成 付録 サンドボックスの作成とログイン Force.com IDE を使用したプロジェクトの作成 アプリケーションの配布 4 本書について 補足について 各ステップの最後には「補足」のセクションが設けられています。このセクションは飛ばしてもかまいま せんが、実際の開発に役立つ情報を数多く紹介していますので、より詳細な知識を得たい方はぜひ参照し てください。 Force.com の開発者コミュニティ DeveloperForce (developer.salesforce.co.jp) では、Force.com についての詳 細情報やさまざまなリソースにアクセスできます。 • developer.force.com/workbook では、今回作成したアプリケーションを拡張できる追加のチュートリアルや 本書の最新バージョンにアクセスできます。 • 5 チュートリアル 1: カスタムアプリケーションの作成 チュートリアル 1: カスタムアプリケーションの作成 レベル: 初級 / 所要時間: 20 ~ 30 分 このチュートリアルでは、製品在庫を管理するカスタムアプリケーションを作成します。初めに、製品に 関する情報 (製品名、製品説明、価格など) を管理するためのデータオブジェクトを 1 つ定義します。 Force.com プラットフォームでは、こうしたデータオブジェクトのことを「カスタムオブジェクト」と呼 びます。カスタムオブジェクトは、データベースのテーブルのようなものだと考えることができます。 オブジェクトを作成すると、複数の標準項目が自動的に追加されるほか、オブジェクトの概要をリスト形 式で確認できるページ、詳細情報を確認できるページ、データを編集するためのページが自動的に生成さ れます。ユーザは必要に応じて独自の項目を追加して、さまざまなデータを管理したり参照したりできま す。ではこれから、製品名、製品説明、価格など、製品に関するさまざまな情報を参照、編集できる独自 のメニュー、タブ、オブジェクトを備えたアプリケーションの作成方法を順に説明します。 関連項目: ステップ 1: カスタムオブジェクト [Merchandise] (製品) を作成する ステップ 2: カスタム項目 [Description] (説明)、[Price] (価格)、[Total Inventory] (在庫数) を追加する ステップ 3: タブを作成する ステップ 4: カスタムアプリケーション [Warehouse] (製品在庫管理) を作成する ステップ 5: Merchandise (製品) レコードを作成する まとめ ステップ 1: カスタムオブジェクト [Merchandise] (製品) を作成す る Force.com プラットフォームには定義済みの標準オブジェクトが用意されていますが、そのほか、必要に 応じてカスタムオブジェクトを作成して、さまざまな情報を管理することができます。このステップで は、製品に関する情報を格納するカスタムオブジェクトを作成します。 1. ブラウザを起動して、https://login.salesforce.com に移動します。 2. ユーザ名 (電子メールアドレス形式) とパスワードを入力して [ログイン] ボタンをクリックします。 3. 右上の [設定] をクリックし、左側のメニューで [作成] ➤ [オブジェクト] の順にクリックして、[カス タムオブジェクト] ページを表示します。 6 チュートリアル 1: カスタムアプリケーションの作成 4. [新規カスタムオブジェクト] をクリックして、カスタムオブジェクトの定義の編集ページを表示しま す。 5. 各項目に次のように値を入力します。 • [表示ラベル] に「Merchandise」 (製品) と入力します。 • [Plural Label] に「Merchandise」 (製品) と入力します。※英語環境でのみ表示されます • そのほかの値は特に変更せず、デフォルトのままにしておきます。 6. [保存] をクリックします。これにより、新しいオブジェクトが作成されます。 補足 カスタムオブジェクトを作成して [保存] ボタンをクリックすると、次のようなカスタムオブジェクトの詳 細ページが表示されます。主な要素について簡単に確認しておきましょう。 7 チュートリアル 1: カスタムアプリケーションの作成 1. カスタムオブジェクト [Merchandise] (製品) の詳細ページ - このオブジェクトに関するあらゆる情報を 表示します。この後のステップで、新しい項目や、リレーション、入力規則などの機能を追加してい きます。 2. API 参照名 - 自動的に生成される値です (オブジェクトの作成のステップでは、入力を行う必要はあり ませんでした)。プログラムがオブジェクトを参照する際、この名前が使用されます。すべてのカスタ ムオブジェクトの API 参照名には末尾に「__c」が付加され、標準オブジェクトと容易に区別できるよ うになっています。 3. 標準項目 - [標準項目] 関連リストには、このオブジェクトで自動的に生成される項目が表示されます。 たとえば、レコードの作成者を自動的に追跡する [所有者] という項目もそのような標準項目の 1 つで す。 4. カスタム項目 - ここではまだ定義されていません。次のステップで説明します。API 参照名と同様、カ スタム項目でも名前の末尾に「__c」が付加されます。 関連項目: チュートリアル 1: カスタムアプリケーションの作成 ステップ 2: カスタム項目 [Description] (説明)、[Price] (価格)、[Total Inventory] (在庫数) を追加する ステップ 2: カスタム項目 [Description] (説明)、[Price] (価 格)、[Total Inventory] (在庫数) を追加する 先ほどのステップで [Merchandise] (製品) オブジェクトを作成しましたが、このオブジェクトでは、製品の 説明、価格、在庫数など、さまざまな情報を参照したり、管理することが必要です。そのような場合に は、カスタム項目を作成して追加します。 このステップでは、説明、価格、在庫数に関するカスタム項目を作成します。 1. 次の手順を実行し、製品に関する説明のテキストを格納する [Description] (説明) 項目を作成します。 a. 下方向にスクロールして [カスタム項目 & リレーション] 関連リストを表示します。 8 チュートリアル 1: カスタムアプリケーションの作成 b. [新規] をクリックして [カスタム項目の新規作成] ウィザードを起動します。 c. [データ型] で [テキストエリア] を選択し、[次へ] をクリックします。 d. 各項目に次のように値を入力します。 • [項目の表示ラベル] に「Description」(説明) と入力し、Tab キーを押します。 • [項目名] に、「Description」というテキストが自動的に入力されます。 • [必須項目] チェックボックスをオンにします。Merchandise (製品) レコードを作成する場合は必 ずその製品の説明を入力するというビジネスルールに対応するため、ここで必須項目の指定を 行います。 • 必要に応じて、[説明] 項目と [ヘルプテキスト] 項目の内容も入力します。今回は省略して先に 進みますが、実際にはこれらの項目ではできるだけ入力を行うようにしてください。 • [デフォルト値] 項目は空のままにしておきます。 e. [次へ] をクリックします。デフォルトのままの設定で、再び [次へ] をクリックします。 f. [保存 & 新規] をクリックします。これにより、[Description] (説明) 項目が保存され、ウィザードの ステップ 1 の画面に戻ります。 2. 次の手順を実行し、価格情報を格納する [Price] (価格) 項目を作成します。 a. [データ型] で [通貨] を選択し、[次へ] をクリックします。 b. 各項目に次のように値を入力します。 • [項目の表示ラベル] に「Price」(価格) と入力します。 • [文字数] に「16」 、[小数点の位置] に「2」を入力します。 • [必須項目] チェックボックスをオンにします。 c. そのほかの値はデフォルトのまま変更せず、[次へ] をクリックします。 9 チュートリアル 1: カスタムアプリケーションの作成 d. デフォルトのままの設定で、再び [次へ] をクリックします。 e. [保存 & 新規] をクリックします。これにより、[Price] (価格) 項目が保存され、ウィザードのステッ プ 1 の画面に戻ります。 メモ: このアプリケーションでは、価格に関する項目は 1 つしかなく、それを在庫価格と小売価 格の両方の用途で使用します。在庫価格用の項目を別に作成したい場合は、先ほどと同じ手順 を実行し、[項目の表示ラベル] に「Stock Price」(在庫価格) と入力します。 3. 次の手順を実行し、在庫情報を格納する [Total Inventory] (在庫数) 項目を作成します。 a. [データ型] で [数値] を選択し、[次へ] をクリックします。 b. 各項目に次のように値を入力します。 • [項目の表示ラベル] に「Total Inventory」(在庫数) と入力します。 • [必須項目] チェックボックスをオンにします。 c. そのほかの値はデフォルトのまま変更せず、[次へ] をクリックします。 d. デフォルトのままの設定で、再び [次へ] をクリックします。 e. [保存] をクリックします。これにより、[Total Inventory] (在庫数) 項目が作成され、カスタムオブジ ェクト [Merchandise] (製品) の詳細ページに戻ります。 以上により、各在庫製品について、製品名のほか、説明、価格、在庫数などの情報を管理できるようにな りました。 補足 [項目の表示ラベル] 項目に入力を行うと、[項目名] 項目には自動的に値が入力されます。この 2 つの項目 の違いを確認しておきましょう。[項目の表示ラベル] に入力したテキストは、アプリケーションのラベル 名として使用されます。そのため、ユーザにとってわかりやすい名前を指定する必要があります。ま た、このラベルにはスペースを含めることができます。一方、[項目名] はアプリケーション内部のコード で使用されます。そのため、スペースや許可されていない文字を含めることはできません。たとえば、[項 目の表示ラベル] で「Customer ph# :」(顧客の電話番号) と入力した場合、[項目名] に入力されるテキスト は「Customer_ph」となります (スペースがアンダースコアに変更され、「#」や「:」は削除されます)。 関連項目: チュートリアル 1: カスタムアプリケーションの作成 ステップ 1: カスタムオブジェクト [Merchandise] (製品) を作成する ステップ 3: タブを作成する 10 チュートリアル 1: カスタムアプリケーションの作成 ステップ 3: タブを作成する タブは、ユーザがオブジェクトに格納された情報に容易にアクセスするための機能です。このステップで は、先ほど作成したカスタムオブジェクトに対するタブを作成します。ユーザはこのタブをクリックし て、レコードの作成、参照、編集を行えます。 1. [設定] ページの左側のメニューで、[作成] ➤ [タブ] の順にクリックします。 2. [カスタムオブジェクトタブ] 関連リストで、[新規] をクリックして、[新規カスタムタブ] ウィザードを 起動します。 3. [オブジェクト] ドロップダウンリストから [Merchandise] (製品) を選択します。 4. [タブスタイル] のルックアップアイコンをクリックして、[箱] アイコンを選択します。 5. そのほかの値はデフォルトのまま変更せず、[次へ] をクリックします。 6. [次へ] をクリックし、[保存] をクリックします。これにより、タブが作成されます。 作成したタブは、自動的に画面の上部に追加されます (下図参照)。 補足 タブスタイルを選択する際、標準のアイコンと色の組み合わせを使用する必要はありません。[独自のスタ イルを作成] をクリックすると、任意の色とアイコン画像を使用できます。 関連項目: チュートリアル 1: カスタムアプリケーションの作成 ステップ 2: カスタム項目 [Description] (説明)、[Price] (価格)、[Total Inventory] (在庫数) を追加する ステップ 4: カスタムアプリケーション [Warehouse] (製品在庫管理) を作成する 11 チュートリアル 1: カスタムアプリケーションの作成 ステップ 4: カスタムアプリケーション [Warehouse] (製品在庫管 理) を作成する アプリケーションは複数のタブで構成されます。このステップでは、製品在庫管理のためのアプリケーシ ョンを作成し、まずタブを 1 つ追加します。後のステップで、さらに多くのタブを追加していきます。 1. [設定] ➤ [作成] ➤ [アプリケーション] の順にクリックします。 2. [新規] をクリックして [新規カスタムアプリケーション] ウィザードを起動します。 3. 各項目に次のように値を入力します。 • [アプリケーションの表示ラベル] に「Warehouse」(製品在庫管理) と入力します。 • [アプリケーション名] に「Warehouse」と入力します。 4. [次へ] をクリックします。 5. アプリケーションロゴの指定画面が表示されます。デフォルトの設定のまま [次へ] をクリックします。 6. [選択可能なタブ] リストボックスで、[Merchandise] (製品) を選択して [追加] をクリックし、[選択され たタブ] リストボックスに追加します。 7. [デフォルトの表示タブ] は [ホーム] のままにして、[次へ] をクリックします。 8. [参照可能] チェックボックスをオンにし、このアプリケーションをすべてのユーザプロファイルから 参照できるようにします。 9. [保存] をクリックします。これにより、アプリケーションが作成されます。 作成したアプリケーションは、自動的にページの右上の Force.com アプリケーションメニューに追加され ます。 補足 アプリケーションの作成では、「互いに関連し合うタブのみを使わなければならない」ということはあり ません。たとえば、「頻繁に使う」という基準でタブを選んでアプリケーションを作成することなども可 能です。もし、「[Start Here] タブをよく使う」ということであれば、今回作成したアプリケーションにも そのタブを追加できます。作成、購入、インストールしたアプリケーションは Force.com アプリケーショ ンメニューに追加され、簡単に切り替えが可能です。 12 チュートリアル 1: カスタムアプリケーションの作成 関連項目: チュートリアル 1: カスタムアプリケーションの作成 ステップ 3: タブを作成する ステップ 5: Merchandise (製品) レコードを作成する ステップ 5: Merchandise (製品) レコードを作成する 前のステップでは、カスタムアプリケーション [Warehouse] (製品在庫管理) を作成しました。Force.com で オブジェクトを定義すると、レコードの作成、読み取り、更新、削除をサポートするユーザインターフェ ースが自動的に作成されます。このステップでは、実際にレコードを作成して、カスタムアプリケーショ ンの動作を確認します。 1. Force.com アプリケーションメニューで [Warehouse] (製品在庫管理) アプリケーションを選択します。 2. [Merchandise] (製品) タブをクリックし、[新規] をクリックして新しいレコードを作成します。 3. 次のように、すべての項目に値を入力します。 • [Merchandise 名] (製品名) に「Wee Jet」と入力します。 • [Description] (説明) に「A small plane」 (小型機用) と入力します。 • [Price] (価格) に「9.99」と入力します。 • [Total Inventory] (在庫数) に「2000」と入力します。 次の画面を参考にしてください。 4. [保存] をクリックします。 補足 今回は 1 件のレコードを追加しましたが、複数のレコードを追加すると、アプリケーションの動作をより リアルに確認できます。新しいレコードを効率よく作成するには、[保存 & 新規] ボタンが便利です。 関連項目: チュートリアル 1: カスタムアプリケーションの作成 ステップ 4: カスタムアプリケーション [Warehouse] (製品在庫管理) を作成する まとめ 13 チュートリアル 1: カスタムアプリケーションの作成 まとめ 以上でこのチュートリアルは完了です。ここでは、在庫製品管理用のカスタムアプリケーションを作成し ました。Force.com では、[設定] ページに用意されたインターフェースやウィザードを使用して、非常に 簡単にオブジェクト、項目、タブを追加してアプリケーションを作成できます。今回作成したアプリケー ションはまだ完成途上ですが、レコードの表示、作成など、すでに多くの機能が組み込まれています。 次のステップでは、インボイス情報を活用して製品の入出庫状況を追跡する方法を説明します。 関連項目: チュートリアル 1: カスタムアプリケーションの作成 ステップ 5: Merchandise (製品) レコードを作成する 14 チュートリアル 2: リレーションの追加 チュートリアル 2: リレーションの追加 レベル: 初級 / 所要時間: 20 ~ 30 分 このチュートリアルでは、 「Invoice Statement」 (インボイス明細) と「Line Item」 (品目) という 2 つのオブ ジェクトを新規作成し、主従関係のリレーションを設定します。これにより、複数の品目を単一のインボ イスに関連付けることが可能になります。品目は、各製品の販売数を示す指標にもなるため、[Merchandise] (製品) オブジェクトと [Line Item] (品目) オブジェクトのリレーションも追加します。 Force.com のリレーションとは、リレーショナルデータベースの外部キーのようなものだと考えることが できます。ただし、Force.com では、基盤となる実装作業は不要で、オブジェクト間のリレーションを作 成するだけで設定が完了します。 前提条件 [Warehouse] (製品在庫管理) アプリケーション 「チュートリアル 1: カスタムアプリケーションの作成」 (6 ページ) の説明に従って、ベースとなるア プリケーションを作成しておく必要があります。 関連項目: ステップ 1: カスタムオブジェクト [Invoice Statement] (インボイス明細) を作成する ステップ 2: カスタムオブジェクト [Line Item] (品目) を作成する ステップ 3: オブジェクトにリレーションを設定する ステップ 4: アプリケーションに [Invoice Statement] (インボイス明細) オブジェクトを追加する ステップ 5: Invoice Statement (インボイス明細) レコードを作成する まとめ ステップ 1: カスタムオブジェクト [Invoice Statement] (インボイ ス明細) を作成する 製品の入出庫ではインボイスが必要になります。このステップでは、カスタムオブジェクト [Invoice Statement] (明細) を作成して、一意の番号、状況、説明などの情報を管理できるようにします。 1. [設定] ➤ [作成] ➤ [オブジェクト] の順にクリックします。 2. [新規カスタムオブジェクト] をクリックし、各項目に次のように値を入力します。 • [表示ラベル] に「Invoice Statement」(インボイス明細) と入力します。 • [Plural Label] に「Invoice Statements」と入力します。※英語環境でのみ表示されます • [レコード名] に「Invoice Number」(インボイス番号) と入力します。 15 チュートリアル 2: リレーションの追加 • [データ型] で [自動採番] を選択します。 • [表示形式] に「INV-{0000}」と入力します。 • [開始番号] に「1」と入力します。 3. そのほかの値は特に変更せず、[保存] をクリックします。 4. 作成したオブジェクトに、カスタム項目 [Status] (状況) を追加します。 a. 下方向にスクロールして [カスタム項目 & リレーション] 関連リストを表示し、[新規] をクリック します。 b. [データ型] で [選択リスト] を選択し、[次へ] をクリックします。 c. 各項目に次のように値を入力します。 • [項目の表示ラベル] に「Status」(状況) と入力します。 • そ の 下 の ボ ッ ク ス に 、 選 択 リ ス ト の 値 と し て 「 Open 」 ( オ ー プ ン ) 、「 Closed 」 ( ク ロ ー ズ)、「Negotiating」(交渉中)、「Pending」(ペンディング) と入力します。次のように、値ごとに 改行して入力してください。 Open Closed Negotiating Pending • [最初の値をデフォルト値とする] チェックボックスをオンにします。 16 チュートリアル 2: リレーションの追加 d. [次へ] をクリックします。 e. [項目レベルセキュリティ] で [参照のみ] を選択し、[次へ] をクリックします。 f. [保存 & 新規] をクリックします。 5. 続いて、必要に応じてインボイスに説明を入力できるよう、カスタム項目 [Description] (説明) を追加し ます。 a. b. c. d. [データ型] で [テキストエリア] を選択し、[次へ] をクリックします。 [項目の表示ラベル] と [項目名] に「Description」(説明) と入力します。 [次へ] をクリックします。デフォルトのままの設定で、再び [次へ] をクリックします。 [保存] をクリックして、[Invoice Statement] (インボイス明細) オブジェクトの詳細ページに戻りま す。 [カスタム項目 & リレーション] 関連リストを表示し、2 つのカスタム項目が作成できたことを確認しま す (下図参照)。 補足 今回は、カスタムオブジェクトの定義時に、データ型を [自動採番] に設定し、表示形式を指定しました。 これにより、レコードを新規作成すると、指定した開始番号にもとづき自動的に番号が割り当てられま す。番号は、「INV-002」のような形式で表示されます。 関連項目: チュートリアル 2: リレーションの追加 ステップ 2: カスタムオブジェクト [Line Item] (品目) を作成する 17 チュートリアル 2: リレーションの追加 ステップ 2: カスタムオブジェクト [Line Item] (品目) を作成する インボイスには、さまざまな品目が記載され、これにより、所定の価格で販売される製品の数が明らかに なります。そこで、まずこのステップ 2 では、品目に関する情報を管理するカスタムオブジェクトを作成 します (次のステップでは [Invoice Statement] (インボイス明細) オブジェクトと [Merchandise] (製品) オブジ ェクトを関連付けます)。 1. [設定] ➤ [作成] ➤ [オブジェクト] の順にクリックします。 2. [新規カスタムオブジェクト] をクリックし、各項目に次のように値を入力します。 • [表示ラベル] に「Line Item」(品目) と入力します。 • [Plural Label] に「Line Items」と入力します。※英語環境でのみ表示されます • [レコード名] を「Line Item Number」(品目番号) に変更します。 • [データ型] は [テキスト] のままにします。 3. そのほかの値は特に変更せず、[保存] をクリックします。 4. 続いて、読み取り専用のカスタム項目 [Unit Price] (単価) を追加します。後続のステップで、この項目 の値を [Merchandise] (製品) オブジェクトから取得するように設定を行います。[Merchandise] (製品) オ ブジェクトの [Price] (価格) 項目と混同しないよう、[Unit Price] (単価) という名称にしています。 a. 下方向にスクロールして [カスタム項目 & リレーション] 関連リストを表示し、[新規] をクリック します。 b. [データ型] で [通貨] を選択し、[次へ] をクリックします。 c. 各項目に次のように値を入力します。 • [項目の表示ラベル] に「Unit Price」(単価) と入力します。 • [文字数] 項目に「16」、[小数点の位置] に「2」を入力します。 d. [次へ] をクリックします。 e. [参照のみ] をクリックし、すべてのプロファイルでチェックボックスがオンになったことを確認 し、[次へ] をクリックします。次の画面では、[保存 & 新規] をクリックします。 18 チュートリアル 2: リレーションの追加 メモ: ここで [参照のみ] チェックボックスを選択できない場合は、前の画面で誤って [必須 項目] チェックボックスをオンにしている可能性があります。[前へ] をクリックして画面を 戻し、[必須項目] チェックボックスをオフにしてください。 5. 同様の手順で、今度はカスタム項目 [Units Sold] (販売個数) を追加します。 a. b. c. d. [データ型] で [数値] を選択し、[次へ] をクリックします。 [項目の表示ラベル] に「Units Sold」(販売個数) と入力し、[次へ] をクリックします。 デフォルトの設定のまま [次へ] をクリックします。 [保存] をクリックして、[Line Item] (品目) オブジェクトの詳細ページに戻ります。 補足 ここまでで、[Merchandise] (製品)、[Invoice Statement] (インボイス明細)、[Line Item] (品目) という 3 つのカ スタムオブジェクトを作成し、各オブジェクトにさまざまなカスタム項目を追加しました。テキスト、数 値、通貨などの値をユーザが入力する項目のほか、システムが指定した値を使用する項目もありました。 たとえば、デフォルトで「Open」という値を取得する選択リスト [Status] (状況)、自動的に番号が振られ る [Invoice_Number] (インボイス番号) などを定義しました。次のステップでは、さらに 2 つ項目を追加し ますが、これまでの項目とは異なり、他のオブジェクトから値を取得するように定義します。 関連項目: チュートリアル 2: リレーションの追加 ステップ 1: カスタムオブジェクト [Invoice Statement] (インボイス明細) を作成する ステップ 3: オブジェクトにリレーションを設定する ステップ 3: オブジェクトにリレーションを設定する これまでのステップで、データモデルを表すオブジェクトの作成を行いました。続いて、リレーションを 設定してオブジェクトを相互に関連付けます。「インボイス明細は複数の品目から構成され、品目は製品 の価格情報を取得する」という関係にもとづき、このステップでは、[Line Item] (品目) オブジェクトを [Invoice Statement] (インボイス明細) オブジェクトと [Merchandise] (製品) オブジェクトに関連付けます。 1. [Line Item] (品目) オブジェクトの詳細ページを表示し、[カスタム項目 & リレーション] 関連リストま でスクロールして、[新規] をクリックします。 2. [データ型] で [主従関係] を選択し、[次へ] をクリックします。 3. [関連先] で [Merchandise] (製品) を選択し、[次へ] をクリックします。 4. 続く 3 つの画面では、すべてデフォルトの設定のまま [次へ] をクリックします。 5. [Line Item] (品目) の情報は [Merchandise] (製品) レコードには表示しないため、[関連リストの追加] セ クションで [Merchandise レイアウト] (製品レイアウト) の左横のチェックボックスをオフにします。 6. [保存 & 新規] をクリックします。 7. [データ型] で [主従関係] を選択し、[次へ] をクリックします。 8. [関連先] で [Invoice Statement] (インボイス明細) を選択し、[次へ] をクリックします。 9. 続く 3 つの画面では、すべてデフォルトの設定のまま [次へ] をクリックします。最後に [保存] をクリ ックして、[Line Item] (品目) オブジェクトの詳細ページに戻ります。 19 チュートリアル 2: リレーションの追加 補足 今回のステップでは、[Invoice Statement] (インボイス明細) と [Line Item] (品目)、[Line Item] (品目) と [Merchandise] (製品) のそれぞれの間に主従関係のリレーションを設定しました。主従関係のリレーション では、親オブジェクトに積み上げ集計項目を作成して子オブジェクトの情報を集計することができます。 この機能については、後続のチュートリアルで取り上げます。 関連項目: チュートリアル 2: リレーションの追加 ステップ 2: カスタムオブジェクト [Line Item] (品目) を作成する ステップ 4: アプリケーションに [Invoice Statement] (インボイス明細) オブジェクトを追加する ステップ 4: アプリケーションに [Invoice Statement] (インボイス 明細) オブジェクトを追加する 前のチュートリアルでは、カスタムオブジェクト [Merchandise] (製品) のタブを作成して、アプリケーショ ンに追加しましたが、このステップでは、同様の手順を実行して、カスタムオブジェクト [Invoice Statement] (インボイス明細) のタブを作成し、アプリケーションに追加します。作成したタブは、自動的に画面の上 部に表示されます。 1. [設定] ページの左側のメニューで、[作成] ➤ [タブ] の順にクリックします。 2. [カスタムオブジェクトタブ] 関連リストで、[新規] をクリックして、[新規カスタムタブ] ウィザードを 起動します。 3. [オブジェクト] ドロップダウンリストから [Invoice Statement] (インボイス明細) を選択します。 4. [タブスタイル] のルックアップアイコンをクリックして、[プリント] アイコンを選択します。 5. そのほかの値はデフォルトのまま変更せず、[次へ] をクリックします。さらに、次のページでも [次 へ] をクリックします。 6. [カスタムアプリケーションに追加] ページでは、作成したタブを表示するアプリケーションを指定し ます。今回は [Warehouse] (製品在庫管理) 以外のすべてのチェックボックスをオフにします。 7. [保存] をクリックします。これにより、[Invoice Statement] (インボイス明細) タブが作成されます。 以上で、[Warehouse] (製品在庫管理) アプリケーションに [Invoice Statement] (インボイス明細) タブを追加 できました。 関連項目: チュートリアル 2: リレーションの追加 ステップ 3: オブジェクトにリレーションを設定する ステップ 5: Invoice Statement (インボイス明細) レコードを作成する 20 チュートリアル 2: リレーションの追加 ステップ 5: Invoice Statement (インボイス明細) レコードを作成す る チュートリアル 1 で述べたように、オブジェクトを作成すると自動的にユーザインターフェースが作成さ れ、そのオブジェクトのレコードを参照、編集、削除、更新できるようになります。作成したオブジェク トにリレーションを設定すると、さらに、関連先オブジェクトのレコードを操作することも可能になりま す。このステップではその手順を説明します。 1. [Invoice Statement] (インボイス明細) タブをクリックします。 2. [新規] をクリックします。 3. [Description] (説明) 項目に、「First Invoice」(最初のインボイス) と入力し、[保存] をクリックします。 Invoice Statement (インボイス明細) レコードの詳細ページが表示されます (下図参照)。 インボイス番号は自動的に割り当てられています。また、詳細ページの下には、空の [Line Item] (品目) 関 連リストがあります。これは、ステップ 3 で主従関係のリレーションの設定を行ったことにより、このペ ージに表示されるようになっています。では、この関連リストを使って Line Item (品目) レコードを Invoice Statement (インボイス明細) レコードのページに追加してみましょう。 1. [新規 Line Item] (新規品目) をクリックします。 2. 次のように、すべての項目に値を入力します。 • [Line Item Number] (品目番号) に「1」と入力します。 • [Unit Price] (単価) に「10」と入力します。 • [Units Sold] (販売個数) に「4」と入力します。 • [Merchandise] (製品) のルックアップアイコンをクリックして、製品 (Wee Jet) を選択します。 3. [保存] をクリックします。 21 チュートリアル 2: リレーションの追加 補足 このステップでは、[Line Item Number] (品目番号) 項目に数値を手動で入力しました。数値を指定するな ら、[Invoice Number] (インボイス番号) のように自動採番にしてもよいはずですが、あえてテキスト項目に しているのには理由があります。それは、この項目はテキスト情報として処理したほうが扱いやすく、チ ュートリアルの説明がわかりやすくなるためです。この番号を自動採番で取得することも可能ですが、そ の場合、「チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成」の内容がやや複雑にな ります。 関連項目: チュートリアル 2: リレーションの追加 ステップ 4: アプリケーションに [Invoice Statement] (インボイス明細) オブジェクトを追加する まとめ まとめ このチュートリアルでは、データモデルを表す複数のオブジェクトを作成し、オブジェクト間にリレーシ ョンを設定しました。Force.com のリレーションはリレーショナルデータベースの外部キーと似ています が、より抽象的なレベルで動作します。データベースの実装作業は不要なため、リレーションの作成だけ で設定が完了します。主従関係のリレーションでは、子レコードの情報を積み上げ集計することができま す。次のチュートリアルでは、複数の Line Item (品目) レコードの価格情報を集計して、Invoice Statement (インボイス明細) レコード上に表示できるようにします。リレーションを設定すると、ユーザインターフ ェースやクエリ言語を介して関連先のレコードを操作することも可能になりますが、その機能については 後続のチュートリアルで解説します。 次の「チュートリアル 3: 数式と入力規則の使用」 (23 ページ) では、数式と入力規則を使って、ベース のアプリケーションにビジネスロジックを追加します。 関連項目: チュートリアル 2: リレーションの追加 ステップ 5: Invoice Statement (インボイス明細) レコードを作成する 22 チュートリアル 3: 数式と入力規則の使用 チュートリアル 3: 数式と入力規則の使用 レベル: 初級 / 所要時間: 20 ~ 30 分 Force.com では、項目に数式や入力規則を追加して、アプリケーションに入力されるデータの品質の維 持、向上を図ることができます。設定作業では、定義済みの関数を使用します。これらの関数によっ て、データの操作、検証のほか、入力データにもとづいた計算などを自動的に実行することが可能になり ます。Force.com の関数は、スプレッドシートの関数によく似ています。スプレッドシートの関数は、シ ート内の他のセルの値を参照し、計算を実行して値を返しますが、Force.com の関数は、アプリケーショ ンのレコード内の項目を参照します。 このチュートリアルでは、[Warehouse] (製品在庫管理) アプリケーションに品目の合計金額を計算する数式 項目を追加します。さらに、この金額の値と主従関係のリレーションの属性を利用して、インボイスの合 計金額を自動的に計算できるようにします。最後に、在庫チェックを行う数式を設定して、製品の販売数 が在庫数を超えた場合に、ユーザが品目を追加できないようにします。 前提条件 [Warehouse] (製品在庫管理) アプリケーション ベースとなる [Warehouse] (製品在庫管理) アプリケーションを作成し、「チュートリアル 2: リレーシ ョンの追加」 (15 ページ) の説明に従ってリレーションを追加しておく必要があります。 関連項目: ステップ 1: 各 Line Item (品目) の合計金額を計算する ステップ 2: 積み上げ集計項目を使用して Invoice Statement (インボイス明細) の金額を計算する ステップ 3: 入力規則を使用して在庫をチェックする ステップ 4: 入力規則をテストする ステップ 5: 入力規則を修正する まとめ ステップ 1: 各 Line Item (品目) の合計金額を計算する 最初のステップでは、カスタムオブジェクト [Line Item] (品目) に [Value] (金額) という新しい数式項目を 作成します。設定作業では、品目の数と価格を掛け合わせて各品目の合計金額を計算する数式を追加しま す。 1. [設定] ➤ [作成] ➤ [オブジェクト] ➤ [Line Item] の順にクリックして、カスタムオブジェクト [Line Item] (品目) の詳細ページを表示します。 2. 下方向にスクロールして [カスタム項目 & リレーション] 関連リストを表示し、[新規] をクリックしま す。 23 チュートリアル 3: 数式と入力規則の使用 3. 4. 5. 6. 7. [データ型] で [数式] を選択し、[次へ] をクリックします。 [項目の表示ラベル] と [項目名] に 「Value」(金額) と入力します。 [数式の戻り値のデータ型] で [通貨] を選択します。 [次へ] をクリックします。 [差し込み項目の挿入] ドロップダウンリストから [Unit Price] (単価) を選択します。下のテキストボッ クスには「Unit_Price__c」と表示されます。 8. [演算子の挿入] ドロップダウンリストから [乗算] を選択します。 9. [差し込み項目の挿入] ドロップダウンリストから [Units Sold] (販売個数) を選択します。下のテキスト ボックスには「Unit_Price__c * Units_Sold__c」と表示されます。 10. [次へ] をクリックします。次の画面では、デフォルトの設定のまま [次へ] をクリックして、[保存] を クリックします。 詳細ページに戻ります。[カスタム項目 & リレーション] 関連リストに今作成した [Value] (金額) という項 目が新たに追加されました。 補足 [数式] データ型は、他の項目の値を使って自動的に値を計算したい場合に非常に便利です。今回は、同じ オブジェクト内の 2 つの項目の値を乗算する簡単な数式を作成しました。数式の入力時に [高度な数式] タ ブを使用すると、さらに複雑な処理を指定できます。 関連項目: チュートリアル 3: 数式と入力規則の使用 ステップ 2: 積み上げ集計項目を使用して Invoice Statement (インボイス明細) の金額を計算する ステップ 2: 積み上げ集計項目を使用して Invoice Statement (イン ボイス明細) の金額を計算する 前のステップでは、各品目の合計金額を計算できるようにしました。このステップでは、計算した値を足 し合わせて、Invoice Statement (インボイス明細) の合計金額を取得できるようにします。[Line Item] (品目) オブジェクト は [Invoice Statement] (インボイス明細) オブジェクトと主従関係にあるため、積み上げ集計 項目を使用して金額を求めることができます。積み上げ集計項目は、主従関係のリレーションが設定され ている場合に子オブジェクトの情報を集計するための機能です。今回は、各品目の合計金額を集計しま す。 24 チュートリアル 3: 数式と入力規則の使用 1. [設定] ➤ [作成] ➤ [オブジェクト] ➤ [Invoice Statement] の順にクリックして、カスタムオブジェ クト [Invoice Statement] (インボイス明細) の詳細ページを表示します。 2. 下方向にスクロールして [カスタム項目 & リレーション] 関連リストを表示し、[新規] をクリックしま す。 3. [データ型] で [積み上げ集計] を選択し、[次へ] をクリックします。 4. [項目の表示ラベル] に「Invoice Value」(インボイスの金額) と入力し、[次へ] をクリックします。 5. [集計対象オブジェクト] で [Line Item] (品目) を選択します。 6. [積み上げ種別の選択] で [合計] を選択します。 7. [集計する項目] リストボックスで [Value] (金額) を選択します。 8. 選択内容が正しいことを確認 (下図参照) したら、[次へ] をクリックします。 9. 次の画面はデフォルトの設定のまま [次へ] をクリックします。続いて、[保存] をクリックします。 補足 [Invoice Statement] (インボイス明細) タブをクリックして任意のレコードの詳細ページにアクセスする と、インボイスに含まれるすべての品目の合計金額を表示する積み上げ集計項目が追加されていることを 確認できます。項目の横に砂時計のアイコンが表示されている場合は更新がまだ完了していないため、少 し時間をおいてアクセスしてみてください。レコードに新しい品目を追加することで、この項目の動作を テストできます。 関連項目: チュートリアル 3: 数式と入力規則の使用 ステップ 1: 各 Line Item (品目) の合計金額を計算する ステップ 3: 入力規則を使用して在庫をチェックする ステップ 3: 入力規則を使用して在庫をチェックする このステップでは、オブジェクトの項目に入力規則を追加します。入力規則では、数式項目のときと同じ 数式言語を使用します。項目に入力規則を追加すると、入力された値が有効であるかどうかを自動的に判 断し、値が有効でなかった場合にエラーメッセージを表示することができます。次の手順を実行して入力 規則を作成し、エラー条件数式で true が返された場合にメッセージを表示するようにします。 25 チュートリアル 3: 数式と入力規則の使用 1. [設定] ➤ [作成] ➤ [オブジェクト] ➤ [Line Item] の順にクリックして、カスタムオブジェクト [Line Item] (品目) の詳細ページを表示します。 2. 下方向にスクロールして [入力規則] 関連リストを表示し、[新規] をクリックします。 3. [ルール名] 項目に「Order in stock」 と入力します。※ルール名は英数字のみ使用可能です 4. [エラー条件数式] の [項目の挿入] をクリックして、[項目の挿入] ポップアップウィンドウを表示しま す。 a. b. c. d. e. 左のボックスで [Line Item >] (品目 >) を選択します。 右のボックスで [Merchandise >] (製品 >) を選択します。 3 番目に新しく表示されたボックスで、[Total Inventory] (在庫数) を選択します。 [挿入] をクリックします。 次のように、数式の末尾に小なり記号「<」を入力します。 Merchandise__r.Total_Inventory__c < f. g. h. i. [項目の挿入] を再度クリックします。 左のボックスで [Line Item >] (品目 >) を選択します。 右のボックスで [Units Sold] (販売個数) を選択します。 [挿入] をクリックします。次のような数式が作成されていることを確認します。 Merchandise__r.Total_Inventory__c < Units_Sold__c 5. [構文の確認] をクリックし、エラーがないことを確認します。エラーが見つかった場合は、修正して から作業を再開します。 6. [エラーメッセージ] 項目に「You have ordered more items than we have in stock」(注文数が在庫数を超え ています) と入力します。 7. [エラー表示場所] で [項目] を選択し、ドロップダウンリストから [Units Sold] (販売個数) を選択しま す。 8. [保存] をクリックします。 26 チュートリアル 3: 数式と入力規則の使用 補足 [エラー条件数式] のボックスに直接数式を入力してもかまいませんが、今回のように [項目の挿入] ボタン を使うことで、使用可能なオブジェクトの中から数式に必要な要素を簡単に特定して入力できます。作成 した数式を詳しく見てみましょう。 Mechandise__r - [Merchandise] (製品) オブジェクトは [Line Item] (品目) オブジェクトに関連付けられて いるため、Line Item (品目) レコード上には Merchandise (製品) レコードを参照する項目が自動的に表示 されます。「Mechandise__r」はそうした参照が行われていることを示します。 • Total_Inventory__c - [Merchandise] (製品) オブジェクト上に作成したカスタム項目。合計在庫数を追跡し ます。 • Merchandise__r.Total_Inventory__c - Line Item (品目) レコードに関連付けられた Merchandise (製品) レコ ード上の [Total Inventory] (在庫数) 項目の値を取得する数式です。 • Units_Sold__c - 対象の Line Item (品目) レコード上の [Units Sold] (販売個数) 項目を参照します。 • 以上の要素を組み合わせ、Line Item (品目) レコードの販売個数を、同レコードに関連付けられた Merchandise (製品) レコードの在庫数と比較します。[エラー条件数式] のセクションに記載されているように、エラー メッセージはこの数式で true が返された場合に表示されます。ここでは、在庫数の値が販売個数の値より も小さい場合に true が返されます。 関連項目: チュートリアル 3: 数式と入力規則の使用 ステップ 2: 積み上げ集計項目を使用して Invoice Statement (インボイス明細) の金額を計算する ステップ 4: 入力規則をテストする ステップ 4: 入力規則をテストする このステップでは、ステップ 3 で作成した入力規則をテストします。 1. [Invoice Statement] (インボイス明細) タブをクリックして、作成済みのレコードを開きます。 2. 下方向にスクロールして [Line Item] (品目) 関連リストを表示し、任意の Line Item (品目) レコードの横 の [編集] リンクをクリックします。 3. [Units Sold] (販売個数) に在庫数よりも大きな値を入力します。 4. [保存] をクリックします。先ほどのステップで設定したエラーメッセージが表示されます。 5. [キャンセル] をクリックします。 27 チュートリアル 3: 数式と入力規則の使用 関連項目: チュートリアル 3: 数式と入力規則の使用 ステップ 3: 入力規則を使用して在庫をチェックする ステップ 5: 入力規則を修正する ステップ 5: 入力規則を修正する 先ほど作成した入力規則のロジックには、少し改良の余地があります。つまり、既存のレコードを編集し て [Units Sold] (販売個数) 項目を変更する場合、数が減るのであれば在庫チェックは必要ありませんし、数 が増えるのであれば、追加分の在庫があるかどうかのみをチェックすればよいのです。そこでこのステッ プでは、先ほどの入力規則にレコードが新規に作成されたものであるかどうかを判断する ISNEW() 関数を 追加して、こうしたシナリオに対応できるようにします。新規レコードでない場合は、PRIORVALUE() 関 数によって、既存の値を使用した処理を行うようにします。 1. [設定] ➤ [作成] ➤ [オブジェクト] ➤ [Line Item] の順にクリックして、カスタムオブジェクト [Line Item] (品目) の詳細ページを表示します。 2. 下方向にスクロールして [入力規則] 関連リストを表示し、[Order_in_stock] の横の [編集] をクリックし ます。 3. 既存の数式を次のように書き換えます。 IF( ISNEW(), Merchandise__r.Total_Inventory__c < Units_Sold__c , IF ( Units_Sold__c < PRIORVALUE(Units_Sold__c), FALSE, Merchandise__r.Total_Inventory__c < (Units_Sold__c - PRIORVALUE(Units_Sold__c)) ) ) 4. [構文の確認] をクリックし、エラーがないことを確認します。 5. [保存] をクリックします。 補足 修正した数式を詳しく見てみましょう。 • • • • • • IF は条件を示します。実行時に 2 つの条件分岐のうちのいずれかが適用されます。 ISNEW は条件の内容を示す関数で、作業対象のレコードが新規レコードである場合は true、既存レコ ードである場合は false を返します。 ISNEW が true の場合は、ステップ 3 のときと同様に、入力した販売個数が在庫数を超過していないか どうかをチェックします。 ISNEW が false の場合は、既存のレコードを更新していることになるため、PRIORVALUE 関数を使っ て既存の値と更新後の値を比較し、値が大きくなっているか小さくなっているかを確認します。 既存の値のほうが大きい場合、販売個数は減っているため、在庫の超過をチェックする必要はありま せん。そこで、FALSE を返してエラーが表示されないようにします。 既存の値のほうが小さい場合、販売個数は増えているため、追加分をまかなえる在庫があるかどうか をチェックします。 28 チュートリアル 3: 数式と入力規則の使用 関連項目: チュートリアル 3: 数式と入力規則の使用 ステップ 4: 入力規則をテストする まとめ まとめ このチュートリアルでは、数式項目と入力規則を作成し、アプリケーションデータの品質の維持、向上を 図る方法を説明しました。最初に、製品の価格と販売個数を掛け合わせて、各品目の価格を集計する数式 項目を作成しました。続いて、積み上げ集計項目を作成し、Invoice Statement (インボイス明細) レコード 上で複数の品目の合計金額を取得できるようにしました。 さらに、販売個数に対して在庫が不足している場合にエラーメッセージを表示する入力規則を作成しまし た。最後に、作成した入力規則を改良し、新規レコードの作成時と既存レコードの更新時という異なる状 況に応じて、適切な処理を実行できるようにしました。このように、アプリケーションの任意の項目に数 式や入力規則を設定すれば、条件に合わないデータは入力できないようになります。 関連項目: チュートリアル 3: 数式と入力規則の使用 ステップ 5: 入力規則を修正する 29 チュートリアル 4: ワークフローと承認プロセスの使用 チュートリアル 4: ワークフローと承認プロセスの使 用 レベル: 中級 / 所要時間: 30 ~ 45 分 Force.com プラットフォームでは、ワークフローと承認プロセスという機能を提供しています。カスタム アプリケーションでこれらを利用すると、社内手続きの標準化やビジネスプロセスの自動化が進み、業務 効率を高めることができます。効率化というメリットのほか、業務慣行を徹底させるという面でも効果が あります。 ワークフロールールでは、時間ベースのトリガ、条件、数式にもとづいて、電子メールアラート、タスク の割り当て、項目の更新、アウトバウンドメッセージの送信などのアクションを実行できます。承認プロ セスでは、社内のすべての承認処理を自動化できます。シンプルなものはもちろん、複雑なプロセスもサ ポートします。 このチュートリアルでは、まず 2 つのワークフロールールを作成して、その動作をテストします。1 つ目 のワークフロールールでは、新規に作成された Line Item (品目) レコードに、現行の製品価格を適用するよ うにします。2 つ目のワークフロールールでは、製品の品目情報が更新された場合に在庫情報を更新する ようにします。続いて、承認プロセスを 1 つ作成し、インボイスの金額が 2,000 ドルを超える場合にマネ ージャによる承認を課すようにします。 前提条件 数式と入力規則 「チュートリアル 3: 数式と入力規則の使用」 (23 ページ) の説明に従って、積み上げ集計項目と入力 規則を作成しておく必要があります。 関連項目: ステップ 1: 品目の価格を取得するワークフロールールを作成する ステップ 2: 発注時に在庫数を更新するワークフロールールを作成する ステップ 3: ワークフロールールをテストする ステップ 4: 承認プロセスで使用する電子メールテンプレートを作成する ステップ 5: 承認プロセスを作成する ステップ 6: カスタムのプロファイルを作成する ステップ 7: ユーザを作成する ステップ 8: 承認プロセスをテストする まとめ 30 チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 1: 品目の価格を取得するワークフロールールを作成する これまでのチュートリアルで、[Line Item] (品目) オブジェクトと [Merchandise] (製品) オブジェクトを作成 し、それぞれに価格情報を格納する項目を追加しました。[Line Item] (品目) オブジェクトでは [Unit Price] (単価) という名前で項目を追加し、参照のみのアクセス権を設定しました (なお、今回はすべてのデータ へのアクセス権を持つ管理者ユーザとしてログインしているため、ユーザインターフェース上には参照の みの設定は適用されていません)。このステップでは、Line Item (品目) レコードの作成時に [Unit Price] (単 価) 項目に Merchandise (製品) レコードの [Price] (価格) 項目の値を適用するワークフロールールを作成しま す。Force.com の宣言型のワークフロールールを使用すれば、このような複雑なロジックも簡単に作成で きます。 1. [設定] ➤ [作成] ➤ [ワークフローと承認申請] ➤ [ワークフロールール] の順にクリックします。 [ワークフローの理解] ページの説明に目を通してから、[次へ] をクリックします。 2. [すべてのワークフロールール] ページで、[新規ルール] をクリックします。 3. ワークフロールールウィザードのステップ 1 では、[オブジェクトの選択] で [Line Item] (品目) を選択 し、[次へ] をクリックします。 4. ワークフロールールウィザードのステップ 2 に進みます。最初に、[ルール名] に「Line Item Created」 と入力します。※ルール名は英数字のみ使用可能です 5. [評価条件] で、[レコードが作成されたときだけ] をオンにします。 6. [ルール条件] で [数式の評価が true になる] を選択します。 7. 下のテキストボックスに「true」と入力します。 8. 設定内容を確認 (下図参照) したら、[保存 & 次へ] をクリックします。 9. ワークフロールールウィザードのステップ 3 に進みます。[ルール適用時のアクション] で [ワークフロ ーアクションの追加] をクリックし、[新規項目自動更新] を選択して、新規項目自動更新の設定ページ を表示します。 10. [名前] に「Insert Merchandise Price」(製品の価格を挿入) と入力します。 11. [更新する項目] の左のドロップダウンリストから [Line Item] (品目) を、右のドロップダウンリストか ら [Unit Price] (単価) を選択します。 12. [数式を使用して新しい値を設定する] をオンにします。 13. [数式エディタの表示] をクリックします。 14. [項目の挿入] をクリックします。 15. 左のボックスで [Line Item >] (品目 >)、右のボックスで [Merchandise >] (製品 >) を選択し、3 番目に新 しく表示されたボックスで [Price] (価格) を選択します。 16. [挿入] をクリックします。 31 チュートリアル 4: ワークフローと承認プロセスの使用 17. [保存] をクリックして新規項目自動更新の設定ページを閉じ、ワークフローウィザードのステップ 3 に戻ります。 18. [完了] をクリックします。 19. [ワークフロールール] ページで [有効化] をクリックします。 重要: ワークフロールールの作成後、有効化を忘れないように注意してください。ルールを有効 化しないと、レコードの作成時や保存時に条件が評価されません。 補足 このステップを完了することで、今後、新しい Line Item (品目) レコードを作成して保存すると、対応す る Merchandise (製品) レコードの [Price] (価格) 項目の情報が自動的に取得され、[Unit Price] (単価) 項目に 表示されるようになります。なお、これは管理者ユーザの画面では編集可能な項目として表示され、標準 ユーザの画面では参照のみの項目として表示されますので注意してください。 このワークフロールールは品目の作成時にのみ適用されますが、これは、インボイスに品目を追加した後 に、金額が高くならないようにするためです。もし広告に出ていた価格よりもインボイスの金額が高かっ たら、顧客は困惑します。逆に、広告よりもインボイスの金額が低くなるのは歓迎されるため、そうした 変更を後で行うことには問題はありません。 ルールに対して、数式の評価が true になるという条件を適用したのは、新しいレコードが作成されるたび に、項目更新を実行したいためです。数式で式を評価することも可能ですが、ここでは特にその必要はあ りません。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 2: 発注時に在庫数を更新するワークフロールールを作成する 32 チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 2: 発注時に在庫数を更新するワークフロールールを作成 する 新しい Invoice Statement (インボイス明細) レコードを作成すると、デフォルトでは [Open] (オープン) とい う状況が割り当てられ、その都度、関連リストで追加した Line Item (品目) レコードの値を Merchandise (製 品) レコードの [Total Inventory] (在庫数) 項目に手動で反映させる必要が生じます。こうした処理は自動で 実行したほうが効率的です。そこで、このステップでは、もう 1 つワークフロールールを作成して、[Total Inventory] (在庫数) の値が自動的に更新されるようにします。設定作業では、新規に Line Item (品目) レコ ードを作成する場合は在庫数から販売個数を差し引き、既存の Line Item (品目) レコードを更新する場合 は、元の値と更新後の値の差分にもとづいて在庫数の値を調整するようにします。 1. [設定] ➤ [作成] ➤ [ワークフローと承認申請] ➤ [ワークフロールール] の順にクリックします。 2. [すべてのワークフロールール] ページが表示されます (ここで [ワークフローの理解] ページが表示され た場合は、そのまま [次へ] をクリックします)。 3. [すべてのワークフロールール] ページで、[新規ルール] をクリックします。 4. ワークフロールールウィザードのステップ 1 では、[オブジェクトの選択] で [Line Item] (品目) を選択 し、[次へ] をクリックします。 5. ワークフロールールウィザードのステップ 2 に進みます。最初に [ルール名] に「Line Item Updated」と 入力します。※ルール名は英数字のみ使用可能です 6. [評価条件] で、[レコードが作成されたか編集されたとき] をオンにします。 7. [ルール条件] で [条件が一致する] を選択します。 8. [項目] ドロップダウンリストから [Invoice Statement: Status] (インボイス明細: 状況) を選択します。同じ 行の [演算子] ドロップダウンリストから [次の文字列と一致する] を選択します。同じ行の [値] で、ル ックアップアイコンをクリックして [Open] (オープン) チェックボックスをオンにします。[選択したも のを挿入] をクリックします。 9. 設定内容を確認 (下図参照) したら、[保存 & 次へ] をクリックします。 10. ワークフロールールウィザードのステップ 3 に進みます。[ルール適用時のアクション] で [ワークフロ ーアクションの追加] をクリックし、[新規項目自動更新] を選択して、新規項目自動更新の設定ページ を表示します。 11. [名前] に「Update Stock Inventory」(在庫数更新) と入力します。 12. [更新する項目] の左のドロップダウンリストから [Merchandise] (製品) を、右のドロップダウンリスト から [Total Inventory] (在庫数) を選択します。 13. [数式を使用して新しい値を設定する] をオンにします。 14. [数式エディタの表示] をクリックします。 15. 次のコードを入力します。 33 チュートリアル 4: ワークフローと承認プロセスの使用 IF ( ISNEW(), Merchandise__r.Total_Inventory__c - Units_Sold__c , Merchandise__r.Total_Inventory__c - (Units_Sold__c - PRIORVALUE(Units_Sold__c)) ) 16. [構文の確認] をクリックして、エラーがないことを確認します。 17. [保存] をクリックして新規項目自動更新の設定ページを閉じ、ワークフローウィザードのステップ 3 に戻ります。 18. [完了] をクリックします。 19. [ワークフロールール] ページで [有効化] をクリックします。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 1: 品目の価格を取得するワークフロールールを作成する ステップ 3: ワークフロールールをテストする ステップ 3: ワークフロールールをテストする このステップでは、前のステップで作成したワークフロールールが正しく動作するかどうかをテストしま す。新しい Line Item (品目) レコードを作成して、価格情報の取得、在庫数の更新などが自動的に実行され るかどうかを確認してみましょう。 1. [Invoice Statement] (インボイス明細) タブをクリックします。 2. 作成済みのレコードをクリックします。 3. [新規 Line Item] (新規品目) をクリックし、次のように値を入力します。 • [Line Item Number] (品目番号) に「2」と入力します。 • [Unit Price] (単価) は空欄のままにしておきます。 • [Units Sold] (販売個数) に「1000」と入力します。 34 チュートリアル 4: ワークフローと承認プロセスの使用 • [Merchandise] (製品) 項目のルックアップアイコンをクリックして、[Wee Jet] を選択します。 4. [保存] をクリックします。 5. [Line Item] (品目) 関連リストで [2] をクリックします。[Unit Price] (単価) 項目に [Wee Jet] レコードの価 格が設定されています。 6. [Wee Jet] のリンクをクリックして、同製品のレコードを開きます。[Total Inventory] (在庫数) が 2,000 から 1,000 に減少しています (異なる値を設定した場合は結果が異なります)。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 2: 発注時に在庫数を更新するワークフロールールを作成する ステップ 4: 承認プロセスで使用する電子メールテンプレートを作成する ステップ 4: 承認プロセスで使用する電子メールテンプレートを作 成する ワークフローの作成に続いて、「インボイスの金額が 2,000 ドルを超えた場合、マネージャが承認を行う」 というビジネスルールを実装するために承認プロセスを作成します。このビジネスルールの実装では、ま ず、金額が 2,000 ドルを超えた際のマネージャへの通知に使用する電子メールテンプレートを作成し、続 いて、マネージャが実行する承認プロセスを作成します。 メモ: ここではデフォルトの通貨が米ドルであることを想定して説明を行っていますが、別の通貨を 使用している場合も同じ手順で操作を進められます。 このステップでは、マネージャへの通知に使用する電子メールテンプレートの作成方法を取り上げます。 承認プロセスについては次のステップで説明します。 1. [設定] ➤ [コミュニケーションテンプレート] ➤ [電子メールテンプレート] の順にクリックします。 2. [新規テンプレート] をクリックします。 3. 電子メールテンプレートウィザードのステップ 1 では、[テキスト] を選択し、[次へ] をクリックしま す。 4. 電子メールテンプレートウィザードのステップ 2 に進みます。最初に [有効] チェックボックスをオン にします。 5. [電子メールテンプレート名] に「Large Invoice Template」(インボイス金額超過) と入力します。 6. [件名] に「A large invoice has been submitted」(金額超過のインボイスが作成されました) と入力します。 7. [電子メール内容] に次のようなコードを含んだテキストを入力します。 {!Invoice_Statement__c.OwnerFullName} submitted for approval an Invoice Statement that totalled {!Invoice_Statement__c.Invoice_Value__c} on {!Invoice_Statement__c.LastModifiedDate} 8. 設定内容が正しいことを確認 (下図参照) したら、[保存] をクリックします。 35 チュートリアル 4: ワークフローと承認プロセスの使用 補足 今回設定した電子メール本文では、差し込み項目を使用しました 「{!Invoice_Statement__c.Invoice_Value__c}」など)。この部分は、電子メールの生成時に、承認プロセスの ( 対象となるインボイスの実際の値によって置き換えられます。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 3: ワークフロールールをテストする ステップ 5: 承認プロセスを作成する ステップ 5: 承認プロセスを作成する このステップでは、承認プロセスを作成して、インボイスの金額が 2,000 ドルを超えた場合にマネージャ による承認を行うようにします。この承認プロセスもワークフロールールと同様、簡単に作成して利用す ることができます。 1. [設定] ➤ [作成] ➤ [ワークフローと承認申請] ➤ [承認プロセス] の順にクリックします。 2. [承認プロセスを管理するオブジェクト] ドロップダウンリストから [Invoice Statement] (インボイス明 細) を選択します。 3. [承認プロセスの新規作成] ドロップダウンリストをクリックし、[ジャンプスタートウィザードを使 用] を選択します。 4. 承認プロセスのジャンプスタートウィザードのページが開きます。最初に [名前] に「Large Invoice Value」(インボイス金額超過) と入力します。 5. [承認割り当て電子メールテンプレート] の横のルックアップアイコンをクリックし、先ほど作成した [Large Invoice Template] (インボイス金額超過) を選択します。 6. [入力条件の指定] で、次のように指定します。 a. [項目] ドロップダウンリストから [Invoice Value] (インボイスの金額) を選択します。 b. 同じ行の [演算子] ドロップダウンリストから大なり記号 (>) を選択します。 c. [値] に「2000」と入力します。 36 チュートリアル 4: ワークフローと承認プロセスの使用 7. [承認者の選択] で、[標準またはカスタムの階層関係項目を使用して自動的に承認者を割り当てる] をク リックし、[マネージャ] を選択します。これにより、承認プロセスの元となるインボイスを作成した ユーザのマネージャが、承認者として割り当てられます (具体的な動作は、後続のステップで「Bob Smith」という名前のユーザを作成して確認します)。 8. [保存] をクリックします。 9. 承認プロセスを使用するには有効化が必要であることを通知するメッセージが表示されます。[OK] を クリックします。以上で承認プロセスを作成できました。続いて、このプロセスで、申請時、承認 時、却下時のアクションを定義します。 10. [承認プロセスの詳細ページの参照] をクリックします。 11. 次の表に従って、[申請時のアクション]、[最終承認時のアクション]、[最終却下時のアクション] の各 関連リストで、[新規アクションの追加] をクリックし、[項目自動更新] を選択して、項目自動更新のア クションを定義します。 関連リスト名 [名前] の値 [更新する項目] の値 [選択リストオプション] の 値 申請時のアクション Set Initial Approval Status (承認状況の初期値の設定) Status (状況) [特定値] を選択 し、[Pending] (ペンディン グ) を選択する 最終承認時のアクシ ョン Set Final Approval Status (承 Status (状況) 認状況の結果値の設定) [特定値] を選択 し、[Closed] (クローズ) を 選択する 最終却下時のアクシ ョン Set Final Rejection Status (却下状況の結果値の設定) [特定値] を選択し、[Open] (オープン) を選択する Status (状況) 12. [保存] をクリックします。 13. [承認プロセス] のメニューをクリックして、承認プロセスのリストに戻ります。 14. [有効化] をクリックして、作成した承認プロセスを有効化します。 37 チュートリアル 4: ワークフローと承認プロセスの使用 補足 アクションにはデフォルトでいくつかの承認ステップが関連付けられます。申請時のアクションと最終承 認時のアクションではレコードがロックされ、最終却下時のアクションではレコードのロックが解除され ます。これにより、承認待ちの間はレコードの変更を禁止し、承認が却下された時点でレコードの変更を 許可できます。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 4: 承認プロセスで使用する電子メールテンプレートを作成する ステップ 6: カスタムのプロファイルを作成する ステップ 6: カスタムのプロファイルを作成する 「プロファイル」とは、任意のユーザまたはユーザのグループに関連付けられる、権限と設定の集合で す。Force.com では複数の標準プロファイルをあらかじめ用意しています。カスタムオブジェクトを作成 すると、ほとんどの標準プロファイルでは、そのオブジェクトへのアクセス権限 ([参照]、[作成]、[編 集]、[削除]) はデフォルトで無効に設定されます。そのため、明示的に権限を付与しない限り、ユーザは カスタムオブジェクトとそのデータにはアクセスできません。こうしたカスタムオブジェクトへのアクセ ス権を変更するには、標準プロファイルの代わりに新しいプロファイルを作成して適用します。 このステップでは、[Warehouse] (製品在庫管理) アプリケーションのカスタムオブジェクトにアクセスする 必要があるユーザに対して割り当てるプロファイルを作成します。続いて、作成したカスタムプロファイ ルで各オブジェクトへのアクセス権を編集し、ユーザによるアクセスを許可します。なお、ユーザの作成 についてはこの次のステップで取り上げます。 1. [設定] ➤ [ユーザの管理] ➤ [プロファイル] の順にクリックします。 2. [新規] をクリックします。 3. [プロファイルのコピー] ページで、[既存のプロファイル] から [標準ユーザ] を選択します (Free Edition の場合は、[Force.com - Free User] を選択します)。 4. [ユーザライセンスプロファイル名] に「Basic User」(基本ユーザ) と入力します。 5. プロファイルの詳細ページで、[編集] をクリックします。 6. 下方向にスクロールして [カスタムオブジェクト権限] 関連リストを表示し、[Invoice Statement] (インボ イス明細)、[Line Item] (品目)、[Merchandise] (製品) の各オブジェクトについて、[参照]、[作成]、[編 集]、[削除] のチェックボックスをオンにします。 7. 設定内容が正しいことを確認 (下図参照) したら、[保存] をクリックします。 38 チュートリアル 4: ワークフローと承認プロセスの使用 補足 このように、カスタムプロファイルの作成や編集はとても簡単です。多くのプロファイルを編集する必要 がある場合は、高度なプロファイル管理を有効化し、プロファイルのリストビューから作業を行うと効率 的です。詳細については、オンラインヘルプで「プロファイルリストを使用したプロファイルの編集」の トピックを参照してください。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 5: 承認プロセスを作成する ステップ 7: ユーザを作成する ステップ 7: ユーザを作成する Force.com で作成したアプリケーションでは、デフォルトで複数のユーザによるログインが許可されてい ます。各ユーザには特定のプロファイルが割り当てられ、そのプロファイルにもとづいてアプリケーショ ンへのアクセス権限が規定されます。たとえば、特定のユーザグループに対して所定の項目の参照を許可 したり、禁止したりできるほか、厳格なデータ共有ルールを設定し、ユーザが自分のレコードと上司のレ コード以外は参照できないようにすることなども可能です。 このステップでは、新規ユーザを作成した後、[マネージャ] 項目を使って現在使用しているユーザアカウ ントへのリンクを設定します。これにより、新規ユーザが特定の条件に一致するインボイスを作成した場 合に、そのインボイスがマネージャに送信されるようになります。 1. [設定] ➤ [ユーザの管理] ➤ [ユーザ] の順にクリックします。 2. ビューを [すべてのユーザ] に切り替え、[新規ユーザ] をクリックします。 3. 各項目に次のように値を入力します。 • [名] に「Bob」と入力します。 • [姓] に「Smith」と入力します。 • [別名] に「bsmith」と入力します。 • [電子メール] にあなたの電子メールアドレスを入力します。Bob Smith の承認申請はこのアドレス 宛てに送信されます。 • [ユーザ名] には、[電子メール] に入力した電子メールアドレスがデフォルトで表示されますが、既 存のユーザ名は使用できないため、電子メールの書式を適用した架空のユーザ名に変更します。 メモ: このユーザ名は、ログイン時に必要になるためメモしておいてください。 [マネージャ] で、この Developer Edition (または Free Edition) のサインアップ時に作成したユーザ名 を指定します。 • [ユーザライセンス] で、[Salesforce] を選択します。 • [プロファイル] で、[Basic User] (基本ユーザ) を選択します。 • 39 チュートリアル 4: ワークフローと承認プロセスの使用 4. [保存] をクリックします。 先ほど指定した電子メールアドレスに、新規ユーザの登録を通知するメッセージが送信されます。ただ し、承認プロセスを実行に移すにはこのままセットアップを続ける必要があるため、まだ Bob Smith のア カウントではログインしないでください。もし Bob Smith としてログインしてしまった場合は、管理者ユ ーザのアカウントでログインし直してください。 Free Edition をお使いの場合、Bob Smith が [Warehouse] (製品在庫管理) アプリケーションを利用するに は、以下の手順を実行して [Basic User] (基本ユーザ) プロファイルを編集し、アプリケーションへのアク セスを許可する必要があります。Free Edition のユーザは 1 つのアプリケーションにしかアクセスできない ため、このアプリケーションがデフォルトのアプリケーションになります (Developer Edition では、この手 順は不要です)。 1. [設定] ➤ [ユーザの管理] ➤ [プロファイル] の順にクリックします。 2. [Basic User] (基本ユーザ) プロファイルの横の [編集] をクリックします。 3. [Warehouse] (製品在庫管理) の横の [デフォルト] ボタンをクリックします。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 6: カスタムのプロファイルを作成する ステップ 8: 承認プロセスをテストする ステップ 8: 承認プロセスをテストする このステップでは、作成した承認プロセスをテストして動作を確認します。まず、Bob Smith としてログ インし、金額が 2,000 ドルを超える Invoice Statement (インボイス明細) レコードを作成して、[承認申請] ボ タンをクリックします。すると、前のステップで作成した電子メールテンプレートを使った通知がマネー ジャ宛に送信され、さらに、Bob がこれ以降レコードを変更できないようにレコードがロックされます。 続いて、マネージャとしてログインし、インボイスを承認 (または却下) します。承認した場合、インボイ スの状況は [Closed] (クローズ) に変わりますが、却下した場合は [Open] (オープン) のままになります。な お、実際のシナリオでは、レコードの所有者に確認を求める電子メールを送信するなど、各社のビジネス プロセスに応じた手続きが必要になります。 テストを実施する前に、承認対象のレコードがホームページに表示されるようになっていることを確認し ます。 40 チュートリアル 4: ワークフローと承認プロセスの使用 1. [設定] ➤ [カスタマイズ] ➤ [ホーム] ➤ [ホームページのページレイアウト]の順にクリックしま す。 2. ホームページのページレイアウトの横の [編集] をクリックします (Free Edition の場合は、[VolunteerForce Home Page] の横の [編集] をクリックします)。 3. [未承認申請] チェックボックスがオンになっていることを確認します。オフになっている場合はクリ ックしてオンにします。 4. [次へ] をクリックして、[保存] をクリックします。 ここまでは、管理者ユーザとしてログインしてアプリケーションの作成を行ってきましたが、新しいレコ ードを作成して承認プロセスをテストするには、通常のユーザとしてログインし直す必要があります。 1. 前のステップで作成したユーザ Bob Smith としてログインします。Bob としてログインするのが初めて である場合は、最初にパスワードを変更する必要があります。 2. [Warehouse] (製品在庫管理) アプリケーションを選択します。 3. [Invoice Statement] (インボイス明細) タブをクリックします。 4. [新規] をクリックし、新しいレコードを作成します。 5. [新規 Line Item] (新規品目) をクリックして新しいレコードを作成し、金額が 2,000 ドルを超えるように 販売個数の値を設定します。 6. [保存] をクリックします。 7. [承認申請] をクリックします。 8. アプリケーションからログアウトします。 Bob Smith のマネージャ宛てに金額の超過を通知する電子メールが送信されます。前のステップで [マネー ジャ] 項目にはあなたのメールアドレスを設定しているため、そのメールを受信して確認します。続い て、管理者ユーザとしてアプリケーションに再度ログインします。ホームページの [未承認申請] 関連リス トに Bob の承認申請が表示されます (下のほうに表示されている場合はスクロールして確認してくださ い)。該当のレコードは、マネージャが承認を行うまでロックされます。[承認/却下] リンクをクリックし て、処理を進めます。今回は、[承認] をクリックします。 補足 作成した承認プロセスの詳細ページでは、承認プロセスの各ステップをアクションと共に図式で確認する ことができます。 1. [設定]、[承認プロセス] の順にクリックして、作成したプロセスを選択します。 2. [ダイアグラムの表示] をクリックします。新しいウィンドウが開き、承認プロセスが図式化されて表 示されます (下図参照)。 41 チュートリアル 4: ワークフローと承認プロセスの使用 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 7: ユーザを作成する まとめ まとめ ワークフロールールや承認プロセスを利用すると、ビジネスプロセスを自動化して、企業の業務慣行を徹 底させることができます。このチュートリアルでは、複数のオブジェクトの設定を編集して価格や在庫の 情報を自動的に更新するワークフローを作成したほか、条件が満たされた場合に指定した電子メールアド レス宛てに通知を送信する承認プロセスも作成しました。 重要: Free Edition を使用している場合、この先のチュートリアルはサンドボックス環境で実行する 必要があります。サンドボックスをまだ作成していない場合は、「サンドボックスの作成とログイ ン」 (96 ページ) の手順に従ってサンドボックスを作成してください。なお、サンドボックスのコ ピーでは既存のレコードはコピーされないため、ログイン後に、チュートリアル 1 の「ステップ 5: Merchandise (製品) レコードを作成する」 (13 ページ) とチュートリアル 2 の「ステップ 5: Invoice Statement (インボイス明細) レコードを作成する」 (21 ページ) の手順に従って、必要なレコードを作 成し直す必要があります。 関連項目: チュートリアル 4: ワークフローと承認プロセスの使用 ステップ 8: 承認プロセスをテストする 42 チュートリアル 5: Apex を使用したビジネスロジックの追加 チュートリアル 5: Apex を使用したビジネスロジック の追加 レベル: 上級 / 所要時間: 20 ~ 30 分 Apex は、Force.com で実行する強く型付けされたオブジェクト指向のプログラミング言語で、Java™ によ く似ています。Apex は、プログラム的なビジネスロジックをアプリケーションに追加するために使用し ます。たとえば、アプリケーションのユーザインターフェースレイヤに、トリガ、Web サービス、プログ ラムコントローラを作成することなどができます。 前のチュートリアルでは、宣言型のワークフロー機能を使用してビジネスロジックを追加しましたが、こ のチュートリアルでは、複数のレコードや複雑なロジックを扱う場合に最適な Apex を使用してロジック を追加します。 今回は、「製品の価格が下がった場合、それを顧客に還元する」というビジネスシナリオを考えます。そ こで、製品の価格が下がった場合に未決済のすべてのインボイスを更新する Apex トリガを作成します。 「トリガ」とは、レコードのライフサイクル内の特定のタイミングで実行されるコードセットのことで す。今回は、Merchandise (製品) レコードが更新されたタイミングで実行されるトリガを作成します。 Force.com でアプリケーションを作成する方法は 2 通りあります。1 つはこれまでのように Developer Edition の [設定] ページを利用する方法、もう 1 つは Force.com IDE を利用する方法です。Force.com IDE は、最初 のセットアップにやや時間がかかりますが、これを導入することで、構文の強調表示、コードの予測入力 をはじめとするさまざまな機能を使用できるようになるため、特にチームでの開発作業において生産性の 大幅な向上が可能になります。 メモ: Free Edition を使用している場合は、すべての開発作業をサンドボックス環境で行う必要があ ります。学習を始める前にあらかじめサンドボックスを作成しておく必要があります (作成手順につ いては、「サンドボックスの作成とログイン」 (96 ページ) を参照)。 前提条件 基本知識 Java、C# などのオブジェクト指向のプログラミング言語に関する基本を理解していると学習がスム ーズに進みますが、必須ではありません。また、Force.com IDE を使用してこのチュートリアルを実 行する場合は、Eclipse の知識を持っていると学習がスムーズに進みますが、こちらも必須ではあり ません。 ソフトウェア要件 このチュートリアルは、Force.com IDE を使って実行することもできます。その場合、Eclipse (3.3 ま たは 3.4 のいずれか)、および Force.com IDE プラグインが必要です (詳細は http:// wiki.developerforce.com/index.php/JP:Force.com_IDE を参照)。プロジェクトの作成手順について は、「Force.com IDE を使用したプロジェクトの作成」 (96 ページ) で解説しています。 43 チュートリアル 5: Apex を使用したビジネスロジックの追加 [開発モード]、[すべてのデータの編集] 権限、[Apex 開発] 権限 このチュートリアルでは、Apex を使用します。Apex クラスを作成するために、上記の設定が有効に なっていることを確認してください。 関連項目: ステップ 1: Apex トリガ定義を作成する ステップ 2: リスト変数を定義する ステップ 3: リストで反復処理を実行し、価格を更新する ステップ 4: トリガをテストする まとめ ステップ 1: Apex トリガ定義を作成する 最初のステップでは、トリガ名、トリガの対象にするオブジェクト、トリガを実行するアクションから成 るトリガ定義を作成します。[設定] ページを利用する場合、Force.com IDE を利用する場合の両方の手順を 示します。 Developer Edition の [設定] ページを利用する場合は、次の手順を実行します。 1. [設定] ➤ [作成] ➤ [オブジェクト] の順にクリックします。 2. [Merchandise] (製品) をクリックします。 3. カスタムオブジェクトの詳細ページを下方向にスクロールして [トリガ] 関連リストを表示し、[新規] をクリックします。 4. <name> と <events> の部分を変更して、次のようなコードを記述します。 trigger HandleProductPriceChange on Merchandise__c (after update) { } 5. [Quick Save] をクリックして、作業内容を保存します。これは構文エラーのチェックを兼ねています。 構文に誤りがある場合は保存できないため、修正して再度保存を実行します。 Force.com IDE を利用する場合は、次の手順を実行します。 1. Package Explorer でプロジェクトを右クリックし、[New] ➤ [Apex Trigger] の順にクリックします。 2. ダイアログボックスで、名前に「HandleProductPriceChange」と入力します。 3. [Object] ドロップダウンリストから [Merchandise__c] を選択します。 メモ: このオブジェクトがリストに表示されない場合は、[Refresh Objects] をクリックします (ト リガを実行するタイミングの指定が必要であることを警告するメッセージが表示されますが無 視してそのまま操作を続けます)。 4. [after update] を選択します。 44 チュートリアル 5: Apex を使用したビジネスロジックの追加 5. [Finish] をクリックします。これにより、編集画面にファイルが表示されます。 補足 このトリガはまだ何も実行しませんが、Merchandise (製品) レコードが更新されたときに実行するロジック を受けとるための設定は完了しました。後続のステップでロジックを作成していきますが、その前にトリ ガ定義の要素について確認しましょう。 HandleProductPriceChange - トリガ名です。 on Merchandise__c - トリガがアクションを実行するオブジェクトに関する記述です。ここでは、カスタ ムオブジェクト [Merchandise] (Merchandise__c) が指定されています。 • (after update) - トリガが実行するアクションのタイミングです。Apex トリガは、挿入、更新、削除とい ったイベントの前後で実行されますが、今回は、レコードが更新されたタイミングで実行されるトリ ガを定義しました。 • { } - このかっこ記号内に含まれるコードを「本体」と呼びます。これによりトリガの実行内容が決ま ります。次のステップでは、この部分を定義します。 • • 関連項目: チュートリアル 5: Apex を使用したビジネスロジックの追加 ステップ 2: リスト変数を定義する ステップ 2: リスト変数を定義する このステップでは、Line Item (品目) のリストを格納するリスト変数を定義します。すべての品目を含める 必要はなく、このコードの実行をトリガしたレコードセットに含まれ、かつ、状況が [Negotiating] (交渉 中) に設定されている品目のみを対象にします。 1. トリガ定義の { } 内に次のコメントを入力し、リスト変数を宣言します。 // update invoice line items associated with open invoices List<Line_Item__c> openLineItems = [ ]; メモ: コードには基本的にコメントを追加することをお勧めしますが、今回は説明をわかりやす くするため最小限のコメントしか追加していません。 2. [ ] 内に次のようなコードを記述し、[Line Item] (品目) カスタムオブジェクトの情報を取得するクエリ を定義します。 45 チュートリアル 5: Apex を使用したビジネスロジックの追加 List<Line_Item__c> openLineItems = [SELECT j.Unit_Price__c, j.Merchandise__r.Price__c FROM Line_Item__c j WHERE j.Invoice_Statement__r.Status__c = 'Negotiating' AND j.Merchandise__r.id IN :Trigger.new FOR UPDATE]; メモ: 本書では、コードの見やすさを考慮して長いコードを複数の行に分けて入力しています。 Apex では空白文字は無視されます。そのため、実際に入力するコードが必ずしもこのサンプル と同じにならなくても問題はありません。また、Apex では、大文字と小文字を区別しません。 たとえば、「SELECT」の代わりに「select」と入力してもかまいません。 補足 openLineItems リストは、カスタムオブジェクト [Line Item] (Line_Item__c) から取得したレコードのリスト を格納します。リストの内容は、Salesforce Object Query Language (SOQL) で記述された、[ ] 内のクエリに よって決まります。このクエリの内容を詳しく見てみましょう。 SELECT - オブジェクト内のどの項目を取得するかを決定します。 FROM - どのオブジェクトにアクセスするかを決定します。「Line_Item__c j」の「j」は別名を示しま す。これにより、「j」という短い別名を使って「Line_Item__c」を参照できるようになります。 • WHERE - この後に条件文が続きます。ここでは、状況が [Negotiating] (交渉中) になっているレコード のみを返すように指定しています。 • AND - 2 つ目の条件を指定します。ここでは、新規に作成されたレコードの ID のみを取得するように 指定しています。コードでは、更新対象のレコードの ID によって自動的に初期化される Trigger.new という特殊な変数を使用しています。 • FOR UPDATE - レコードをロックするよう指定します。これにより、他のプログラムやユーザによる 変更が禁止されます。このロックは、トリガの実行が完了するまで保持されます。 • • 関連項目: チュートリアル 5: Apex を使用したビジネスロジックの追加 ステップ 1: Apex トリガ定義を作成する ステップ 3: リストで反復処理を実行し、価格を更新する ステップ 3: リストで反復処理を実行し、価格を更新する 前のステップでは、Line Item (品目) のリストを作成し、openLineItems 変数に格納しました。続いて、for ループを使用してこのリストで反復処理を実行し、製品の価格が下がった場合に単価が更新されるように します。 1. 前のステップで入力した SOQL クエリの下の行で次のように入力し、for ループを宣言します。 for (Line_Item__c li: openLineItems) { } 2. { } 内に、次のように if 条件文を入力します。 46 チュートリアル 5: Apex を使用したビジネスロジックの追加 for (Line_Item__c li: openLineItems) { if ( li.Merchandise__r.Price__c < li.Unit_Price__c ){ } } 3. 続いて、次のように価格を更新するコードを入力します。 for (Line_Item__c li: openLineItems) { if ( li.Merchandise__r.Price__c < li.Unit_Price__c ){ li.Unit_Price__c = li.Merchandise__r.Price__c; } } 4. for ループが定義できたので、次に品目を更新するコードを定義します。コード末尾のかっこ (}) の直 前で、次のように入力します。 update openLineItems; 5. 作成したトリガは、開発中は無効にしておき、実際に使用するときに有効化します。 [設定] ページを利用している場合は、[Is Active] チェックボックスをオンにします。[Save] ボタンを クリックして保存すると、トリガが有効になります。 • Force.com IDE を使用している場合は、[Metadata] タブをクリックし、<status> を [Active] に変更し ます。 • 6. コードを次のように設定できていることを確認して、[Save] ボタンをクリックします。 trigger HandleProductPriceChange on Merchandise__c (after update) { List<Line_Item__c> openLineItems = [SELECT j.Unit_Price__c, j.Merchandise__r.Price__c FROM Line_Item__c j WHERE j.Invoice_Statement__r.Status__c = 'Negotiating' AND j.Merchandise__r.id IN :Trigger.new FOR UPDATE]; for (Line_Item__c li: openLineItems) { if ( li.Merchandise__r.Price__c < li.Unit_Price__c ){ li.Unit_Price__c = li.Merchandise__r.Price__c; } } update openLineItems; } 補足 最後の「update openLineItems」がデータベース内のレコードを更新するコードであることはお分かりだと 思います。ここではその前の for ループの内容を詳しく見てみましょう。 47 チュートリアル 5: Apex を使用したビジネスロジックの追加 for (Line_Item__c li: openLineItems) { } - 未決済の Line Item (品目) レコードのリストに対して反復処理を 行います。この反復処理により、対象の品目が変数 li に割り当てられます。 • if (li.Merchandise__r.Price__c < li.Unit_Price__c ) { } - Merchandise (製品) レコードの価格が現在の価格よ り低いかどうかをチェックし、結果が true の場合にのみアクションを実行します。 • li.Unit_Price__c = li.Merchandise__r.Price__c; - 対象の品目 (変数 li に割り当てられた品目) の単価を新し い製品価格で更新します。 • 関連項目: チュートリアル 5: Apex を使用したビジネスロジックの追加 ステップ 2: リスト変数を定義する ステップ 4: トリガをテストする ステップ 4: トリガをテストする このステップでは、アプリケーションでトリガをテストします。まず、Invoice Statement (インボイス明 細) レコードを新規作成して製品を 1 点以上注文するか、または既存のレコードを変更することによっ て、状況を [Negotiating] (交渉中) に変更します。次に、Invoice Statement (インボイス明細) レコード上に登 録されているいずれかの品目の単価を下げ、品目とインボイスの金額が更新されることを確認します。 1. 2. 3. 4. 5. 6. 7. 8. [Invoice Statement] (インボイス明細) タブをクリックします。 既存のレコードの名前の上でクリックします。 編集ページで [Status] (状況) を [Negotiating] (交渉中) に変更し、[保存] をクリックします。 インボイスの金額をメモした後、[Line Item] (品目) 関連リストで任意のレコードをクリックし、[Unit Price] (単価) の値もメモします。 [Merchandise] (製品) タブをクリックし、[Wee Jet] レコード (または、先ほどの品目リストに含まれてい た任意のレコード) を選択します。 レコードを編集し、価格を下げます 「.01」のように大きく変更してもかまいません)。 ( 先ほどの Invoice Statement (インボイス明細) レコードのページに戻ります。 インボイスと品目の金額が自動的に更新されたことを確認します。 補足 今回作成したトリガは、状況が [Negotiating] (交渉中) になっている Invoice Statement (インボイス明細) レ コードに登録されたすべての Line Item (品目) レコードに対して実行されます。製品説明を変更した、製品 価格を上げた、といった更新では、このトリガは実行されません。さらに手を加える場合は、更新され た Merchandise (製品) レコードのリストである Trigger.new セットに対して反復処理を行い、価格の条件を 渡すレコードのセットを新たに作成してから関連する Line Item (品目) レコードを取得するようにする と、より効率的なトリガになります。 関連項目: チュートリアル 5: Apex を使用したビジネスロジックの追加 ステップ 3: リストで反復処理を実行し、価格を更新する まとめ 48 チュートリアル 5: Apex を使用したビジネスロジックの追加 まとめ このチュートリアルでは、製品の価格が下がった場合に未決済のすべてのインボイスを更新するビジネス ロジックをアプリケーションに追加するために、Merchandise (製品) レコードが以前より低い価格で保存さ れたときに実行されるトリガを定義しました。特定の条件にもとづいて複数のレコードを更新したい場 合、トリガは非常に便利です。1 つのオブジェクトに対し、さまざまなイベントや条件にもとづいて実行 される複数のトリガを定義して、関連付けることができます。 Apex トリガを作成する際は、トリガの動作を検証するテストを自動化しておくことが重要です。テスト の詳細については、「チュートリアル 6: アプリケーションへのテストの追加」 (50 ページ) を参照してく ださい。 関連項目: チュートリアル 5: Apex を使用したビジネスロジックの追加 ステップ 4: トリガをテストする 49 チュートリアル 6: アプリケーションへのテストの追加 チュートリアル 6: アプリケーションへのテストの追 加 レベル: 上級 / 所要時間: 20 ~ 30 分 テストは、アプリケーション開発においてもっとも重要なステップの 1 つです。テストによって、コード が正しく動作し、リソースを浪費しないことを確認できます。テストを実施することは、エラーのないア プリケーションを開発するうえで重要であるほか、Force.com でアプリケーションを実行するための要件 にもなります。つまり、Force.com では、作成したすべての Apex コードを運用環境への導入前にテストす る必要があるのです。こうしたテストは、下位互換性の問題が発生しないことを確認する目的で、Force.com の新規リリースの導入の際にも実施されています。 Apex は、プログラム的にコードの動作と結果を検証する「単体テスト」をサポートし、テストの実行を 支援しています。すべての Apex コードには、リソースの消費量を規定する制限が指定されています (たと えば、1 回のトリガで実行可能なクエリ数の制限などがあります)。テストでは、コードが正常に動作する ことと、これらの制限を超えていないこともチェックできるようにします。このチュートリアルでは、前 のチュートリアルで作成した Apex トリガを実行する単体テストを定義して実行します。 前提条件 Apex に関するチュートリアル 「チュートリアル 5: Apex を使用したビジネスロジックの追加」 (43 ページ) の説明に従って Apex ト リガを作成しておく必要があります。 ソフトウェア要件 このチュートリアルは、Force.com IDE を使って実行することもできます。その場合、Eclipse (3.3 ま たは 3.4 のいずれか)、および Force.com IDE プラグインが必要です (詳細は http:// wiki.developerforce.com/index.php/JP:Force.com_IDE を参照)。プロジェクトの作成手順について は、「Force.com IDE を使用したプロジェクトの作成」 (96 ページ) で解説しています。 関連項目: ステップ 1: テスト用の Apex クラスを作成する ステップ 2: クラスにテストメソッドを追加する ステップ 3: トリガ実行のためのコードを追加する ステップ 4: テストを実行する ステップ 5: カバー率を確認し、テストを改善する まとめ 50 チュートリアル 6: アプリケーションへのテストの追加 ステップ 1: テスト用の Apex クラスを作成する すべての単体テストは、Apex クラスに格納されます。このステップでは、まず単体テストを格納するク ラスを作成します。 Developer Edition の [設定] ページを利用する場合は、次の手順を実行して Apex クラスを作成します。 1. [設定] ➤ [開発] ➤ [Apex クラス] の順にクリックします。 2. [新規] をクリックします。 3. 編集画面に次のコードを入力します。 @isTest private class TestHandleProductPriceChange { } 4. [Quick Save] をクリックして、入力内容を保存します。 Force.com IDE を利用する場合は、次の手順を実行して Apex クラスを作成します。 1. Force.com IDE 内でプロジェクトのフォルダを右クリックし、[New] ➤ [Apex Class] の順にクリック します。 2. [Create New Apex Class] ページで、名前に「TestHandleProductPriceChange」と入力します。 3. [Template] ドロップダウンで [Test Class] を選択します。 4. [Finish] をクリックします。これによりクラスが作成されます。 補足 「@isTest」という注釈は、この Apex クラス内に格納されるすべてのコードが、それ以外のコードをテス トするためのコードであることを Force.com に伝えます。次のステップでは、このクラスにテストを実行 するテストメソッドを追加します。 関連項目: チュートリアル 6: アプリケーションへのテストの追加 ステップ 2: クラスにテストメソッドを追加する ステップ 2: クラスにテストメソッドを追加する このステップでは、前のステップで作成したクラスに、テストを実行するメソッドを追加します。今回テ ストするのは、前のチュートリアルで作成したトリガです。これは、レコードが更新されたときにだけ実 行されるため、まずデータベース内にテストレコードを作成する必要があります。そこで、Invoice Statement (インボイス明細)、Merchandise (製品)、Line Item (品目) の各レコードを作成して、これらをデータベース に追加するメソッドを定義します。 1. まず 3 つのテストプロシージャを格納するテストメソッドを作成します。前のステップで作成したク ラスの { } 内に、次のコードを入力します。 51 チュートリアル 6: アプリケーションへのテストの追加 static testMethod void testPriceChange() { } メモ: IDE を使用している場合は、生成されたコメントやコードを書き換えてください。 2. 上記のコードの { } 内に、Invoice Statement (インボイス明細) レコードを作成してデータベースに追加 する次のようなコードを入力します。 Invoice_Statement__c invoice = new Invoice_Statement__c(Status__c = 'Negotiating'); insert invoice; 3. 先ほどのコードの末尾「insert invoice;」の直後で、Merchandise (製品) レコードを作成して追加する次 のようなコードを入力します。 Merchandise__c[] products = new Merchandise__c[]{ new Merchandise__c(Name = 'item 1', Description__c = 'test product 1', Price__c = 10, Total_Inventory__c = 10), new Merchandise__c(Name = 'item 2', Description__c = 'test product 2', Price__c = 11, Total_Inventory__c = 10) }; insert products; 4. 「insert products;」の直後で、Line Item (品目) レコードを作成して追加する次のようなコードを入力しま す。 Line_Item__c[] lineItems = new Line_Item__c[] { new Line_Item__c(Invoice_Statement__c = invoice.id, Merchandise__c = products[0].id, Unit_Price__c = 10, Units_Sold__c = 3), new Line_Item__c(Invoice_Statement__c = invoice.id, Merchandise__c = products[1].id, Unit_Price__c = 11, Units_Sold__c = 6) }; insert lineItems; 以上でデータの設定が完了しました。これにより、今回テスト対象となるトリガの実行条件の 1 つが満た されたことになります。つまり、Invoice Statement (インボイス明細) レコードの状況が [Negotiating] (交渉 中) に更新されるという条件です。次のステップでは、製品の価格を下げるコードを記述し、トリガの実 行に必要とされるもう 1 つの条件を定義します。 関連項目: チュートリアル 6: アプリケーションへのテストの追加 ステップ 1: テスト用の Apex クラスを作成する ステップ 3: トリガ実行のためのコードを追加する ステップ 3: トリガ実行のためのコードを追加する このステップでは、Merchandise (製品) レコードの価格を更新するコードを追加します。これにより、トリ ガ実行の条件が満たされることになります。 52 チュートリアル 6: アプリケーションへのテストの追加 1. 「insert lineItems;」の直後で、次のコードを入力します。 products[0].price__c = 20; Test.startTest(); update products; Test.stopTest(); メモ: このコードは、いずれかの Merchandise (製品) レコードの価格を引き上げ、その後 startTest () を呼び出します。これは、テストコード内で、実際のテストがどこから始まるかを指定する ものです。startTest() より上にある設定コードやデータベース操作は、テストとはみなされませ ん。テストでは、コードがガバナ制限 (作成した Apex コードで使用可能なリソースの上限) を 超過していないことも確認する必要があります。コードのどの部分が実際のテストに該当する かを指定することで、設定コード部分をガバナ制限の対象から外せるため、運用環境でのコー ドの動作をより正確にテストできます。 2. 製品価格の更新後は、品目の価格が変更されたかどうかをチェックする必要があります。ここで は、価格を高くするように設定したので、品目の価格は変更されないのが正しい動作です。「Test.stopTest ();」の直後で、次のコードを入力します。 lineItems = [SELECT id, unit_price__c FROM Line_Item__c WHERE id IN :lineItems]; system.assert(lineItems[0].unit_price__c == 10); 3. コードを次のように設定できていることを確認して、[Save] ボタンをクリックします。 @isTest private class TestHandleProductPriceChange { static testMethod void testPriceChange() { Invoice_Statement__c invoice = new Invoice_Statement__c (Status__c = 'Negotiating'); insert invoice; Merchandise__c[] products = new Merchandise__c[]{ new Merchandise__c(Name = 'item 1', Description__c = 'test product 1', Price__c = 10, Total_Inventory__c = 10), new Merchandise__c(Name = 'item 2', Description__c = 'test product 2', Price__c = 11, Total_Inventory__c = 10) }; insert products; Line_Item__c[] lineItems = new Line_Item__c[] { new Line_Item__c(Invoice_Statement__c = invoice.id, Merchandise__c = products[0].id, Unit_Price__c = 10, Units_Sold__c = 3), new Line_Item__c(Invoice_Statement__c = invoice.id, Merchandise__c = products[1].id, Unit_Price__c = 11, Units_Sold__c = 6) }; insert lineItems; products[0].price__c = 20; Test.startTest(); update products; Test.stopTest(); lineItems = [SELECT id, unit_price__c FROM Line_Item__c WHERE id IN :lineItems]; system.assert(lineItems[0].unit_price__c == 10); } } 53 チュートリアル 6: アプリケーションへのテストの追加 関連項目: チュートリアル 6: アプリケーションへのテストの追加 ステップ 2: クラスにテストメソッドを追加する ステップ 4: テストを実行する ステップ 4: テストを実行する Force.com には、テストを実行してコードのカバー率を確認できるテストフレームワークが用意されてい ます。このステップでは、実際にテストを実行してカバー率をチェックします。 メモ: 今回は Developer Edition の [設定] ページでの手順を取り上げますが、Force.com IDE を使用す ることも可能です。その場合は、Package Explorer でクラス名を右クリックし、[Force.com] ➤ [Run Tests] の順にクリックして作業を進めてください。このあとも [設定] ページを使った手順の説明が 続きますが、すべて Force.com IDE でも簡単に実行できます。 1. [設定] ➤ [開発] ➤ [Apex クラス] の順にクリックし、先ほど作成したテスト用のクラス [TestHandleProductsPriceChange] をクリックします。 2. [テストを実行] をクリックします。次のようなテスト結果のページが表示されます。 テスト結果のページでは、次のような数多くの主要データを確認できます。 テストが成功したかどうか。テストに追加した system.assert ステートメント内のブール条件が満たされ なかった場合は失敗とみなされ、このページにエラーが表示されます。コードが正常に動作するかど うかをテストするために、複数の assert ステートメントを追加することをお勧めします。 • 実行されたテストの内容。たとえば、デバッグログを見ると、入力規則「Order_in_stock」が実行され たことや、作成されたレコード、実行されたクエリの数などがわかります。 • コードのカバー率。他のクラスやトリガでテストされたコードの比率がわかります。 • 今回の HandleProductPriceChange トリガのカバー率は 80% でした。これは十分な結果ですが、テストをさ らに改善して、カバー率を 100% にしましょう。次のステップでは、カバー率の状況にもとづき、どこに テストケースを追加したらよいかを確認します。 54 チュートリアル 6: アプリケーションへのテストの追加 関連項目: チュートリアル 6: アプリケーションへのテストの追加 ステップ 3: トリガ実行のためのコードを追加する ステップ 5: カバー率を確認し、テストを改善する ステップ 5: カバー率を確認し、テストを改善する 前のチュートリアルで作成したトリガは「本番コード」、今回のチュートリアルでテスト用に作成したク ラス内のコードは「テストコード」となります。「コードカバー率」とは、本番コードがテストコードで カバーされる割合のことであり、テストコードを実行した場合に、本番コードがどの程度実行されるのか を表します。カバー率が 100% でない場合、実行されない部分にバグがあるかもしれません。このステッ プでは、このカバー率を視覚的に確認して、テストコードを修正します。 メモ: ここまでのチュートリアルを Force.com IDE を使用して進めている場合は、そのまま同環境を 使用できます。Force.com IDE と Developer Edition の [設定] ページの両方を使っている場合は、2 つ のツールを切り替えるたびに同期を実行する必要があります。同期は、Force.com IDE でクラスを右 クリックし、[Force.com] ➤ [Synchronize with Server] の順にクリックするだけで簡単に実行できま す。ちょっとした操作ですが忘れずに行ってください。 1. [コードカバー率] の、カバー率の数値 (ここでは「80」) の上でクリックします。 2. [Code Coverage] ページが開きます。青い部分がテストメソッドでカバーされた (実行された) コー ド、赤い部分がカバーされなかった (実行されなかった) コードです。この例では行 12 のコードが実行 されていません。理由は、製品の価格を下げていないからです。 3. 今回のように赤が表示された場合は 100% のカバー率を達成していないことになります。では、テスト メソッドを変更して、カバー率を改善しましょう。[Code Coverage] ウィンドウを閉じ、左側のメニュ ーで [開発] ➤ [Apex クラス] の順にクリックし、テストクラス [TestHandleProductPriceChange] を選 択します。 4. [編集] をクリックします。 5. 「products[0]」から } の手前 (最後から 2 番目の閉じかっこ) の行までを、次の内容で置き換えます。 products[0].price__c = 20; // raise price products[1].price__c = 5; // lower price Test.startTest(); update products; Test.stopTest(); 55 チュートリアル 6: アプリケーションへのテストの追加 lineItems = [SELECT id, unit_price__c FROM Line_Item__c WHERE id IN :lineItems]; System.assert(lineItems[0].unit_price__c == 10); // unchanged System.assert(lineItems[1].unit_price__c == 5); // changed!! 6. [保存] をクリックします。 7. 再び [テストを実行] をクリックします。今度はカバー率が 100% になりました。 関連項目: チュートリアル 6: アプリケーションへのテストの追加 ステップ 4: テストを実行する まとめ まとめ このチュートリアルでは、Apex トリガのテストを作成して実行した後、Force.com のテスト支援機能を使 用してコードカバー率を 100% にする方法をご紹介しました。開発時には、必ず単体テストを作成する必 要があります。特に開発期間が長期にわたる場合、単体テストが成功を左右します。 なお、コードカバー率を高めることだけがテストの目的ではありません。あらゆるシナリオを想定してチ ェックを行うことも同様に重要です。その点で、このチュートリアルで作成したテストケースには 1 つ検 討を要する箇所があります。このテストケースは、状況が [Negotiating] (交渉中) であるレコードのみを対 象としていましたが、[Negotiating] (交渉中) 以外の値もチェックすることが必要です。たとえば、 [Negotiating] (交渉中) 以外の値のときには、価格が変わっても何も対応する必要はないというシナリオが想定されま す。 関連項目: チュートリアル 6: アプリケーションへのテストの追加 ステップ 5: カバー率を確認し、テストを改善する 56 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 チュートリアル 7: Visualforce を使用したカスタムユ ーザインターフェースの作成 レベル: 中級 / 所要時間: 30 ~ 45 分 Visualforce は、Force.com が提供するコンポーネントベースのユーザインターフェース開発フレームワー クです。これまでのチュートリアルでは、自動的に生成されたユーザインターフェースを使用して、アプ リケーションの作成、カスタマイズを行いました。Visualforce を使用すると、HTML によく似たタグベー スのマークアップ言語、拡張や再利用が可能なコンポーネントのライブラリ、Apex ベースのコントロー ラモデルから成る独自のフレームワークなどを利用して、ユーザインターフェースをきめ細かく制御でき るようになります。Visualforce は MVC (Model-View-Controller) 開発アーキテクチャのユーザインターフェ ース設計をサポートしており、高い柔軟性を備えています。 このチュートリアルでは、Visualforce を使用して、[Warehouse] (製品在庫管理) アプリケーション用の新し いインターフェースを作成します。インターフェースには、在庫を一覧表示して製品ごとに在庫を更新で きるカウントシートを追加します。このカウントシートによって、製品の実際の数とシステムに登録され ている数が異なる場合に、実際の数で登録内容を上書きすることが可能になります。 前提条件 基本知識 HTML、XML などのマークアップ言語の基本を理解していると学習がスムーズに進みますが、必須 ではありません。 関連項目: ステップ 1: 開発モードを有効化する ステップ 2: Visualforce ページを作成する ステップ 3: スタイルシートを静的リソースとして追加する ステップ 4: ページにコントローラを追加する ステップ 5: 在庫カウントシートを Visualforce ページとして表示する まとめ ステップ 1: 開発モードを有効化する このステップでは、開発モードを有効化して、コードとページのプレビューを同時に確認できる Visualforce ページエディタ、コントローラの拡張を行える Apex エディタを利用できるようにします。 1. [設定] ➤ [私の個人情報] ➤ [個人情報] の順にクリックします。 2. [編集] をクリックします。 57 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 3. [開発モード] チェックボックスをオンにして、[保存] をクリックします。 関連項目: チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 ステップ 2: Visualforce ページを作成する ステップ 2: Visualforce ページを作成する このステップでは、在庫カウントシートのベースとなる Visualforce ページを作成します。 1. ブラウザで、現在使用しているサービスインスタンスの URL の末尾にテキスト「/apex/CountSheet」を 追 加 し ま す ( た と え ば 、 イ ン ス タ ン ス の URL が 「 https://na1.salesforce.com 」 の 場 合 は 「 https:// na1.salesforce.com/apex/CountSheet」となります)。すると、「CountSheet」というページが存在しないこ とを通知するメッセージが表示されます。 2. [Create Page CountSheet] リンクをクリックして、新しいページを作成します。 3. ページの左下にある [Page Editor] ボタンをクリックします。[Page Editor] タブが開き、新しく作成され たページのコードとプレビューが表示されます。ページにはデフォルトのテキストが記載されていま す (下図参照)。 58 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 4. 先頭に表示されている「Congratulations」というテキストは不要であるため、<h1> タグ内でそのテキス トを削除し、代わりに「Inventory Count Sheet」(在庫カウントシート) と入力します。コメントタグも 削除します。これにより、コードは次のようになります。 <apex:page> <h1>Inventory Count Sheet</h1> </apex:page> 5. Page Editor の保存ボタンをクリックします。ページがリフレッシュされ、今行った変更が反映されま す。 補足 Visualforce ページのコードは標準の HTML によく似ています。Visualforce ページは多くの場合、<h1> の ような HTML タグと <apex:> から始まる Visualforce 固有のタグから構成されます。 関連項目: チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 ステップ 1: 開発モードを有効化する ステップ 3: スタイルシートを静的リソースとして追加する ステップ 3: スタイルシートを静的リソースとして追加する このステップでは、ページ内の色、フォント、テキストの配置などを指定したカスタムのスタイルシー ト (CSS ファイル) を使用して、より洗練されたデザインのアプリケーションを作成します。ほとんどの Web ページでは、外観をカスタマイズするために CSS という標準 Web テクノロジを採用してお り、Force.com でもこれをサポートしています。アプリケーションのページからスタイルシートを参照す るには、スタイルシートを「静的リソース」としてアップロードする必要があります。静的リソースと は、Force.com 上に格納される単一のファイルまたはファイルの集合のことです。スタイルシートを作成 して静的リソースとして追加することで、あらゆる Visualforce ページからの参照が可能になります。 スタイルシートを静的リソースとして追加するには、次の手順を実行します。 59 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 1. ブラウザを起動して、developer.force.com/workbook/styles に移動します。ファイルをダウンロードし て、デスクトップに保存します。 2. アプリケーションに戻り、[設定] ➤ [開発] ➤ [静的リソース] の順にクリックし、[新規] をクリッ クします。 3. [名前] に「styles」と入力します。※名前は英数字のみ使用可能です 4. [参照] をクリックして、先ほどダウンロードした zip ファイルを選択します。 5. [キャッシュコントロール] 選択リストから [公開] を選択します。 6. [保存] をクリックします。 メモ: Visualforce ページを公開 Web サイトで公開している場合には、Force.com はキャッシュサーバ のグローバルコンテンツ配信ネットワークを利用して静的ファイルのコピーを保持します。 続いて次の手順を実行し、Visualforce ページでスタイルシートを参照するようにします。 1. 前のステップと同様に、ブラウザで、現在使用しているサービスインスタンスの URL の末尾にテキス ト「/apex/CountSheet」を追加します。 2. 先頭の <apex:page> タグを次のように変更して、標準スタイルシート、ヘッダー、サイドバーを無効に します。 <apex:page standardStylesheets="false" showHeader="false" sidebar="false"> 3. スタイルシートの場所を記述します。まず、先ほど変更したタグの下で改行し、「<apex:」と入力しま す。 4. エディタにはコードの入力機能があるため、コードの一部を入力すると、そのコンテキストで使用可 能な要素が入力候補としてドロップダウンリストに表示されます。「stylesheet」の文字をタイプしてい くと、リストに apex:stylesheet が表示されるのでそれを選択します。 5. 続いて、次のようにコードを追加し、スタイルシートの場所を指定します。 <apex:stylesheet value="{!URLFOR($Resource.styles, 'styles.css')}" /> 6. コードが次のように記述されていることを確認します。 <apex:page standardStylesheets="false" showHeader="false" sidebar="false"> 60 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 <apex:stylesheet value="{!URLFOR($Resource.styles, 'styles.css')}" /> <h1>Inventory Count Sheet</h1> </apex:page> 7. Page Editor の保存ボタンをクリックします。 ページの外観が大きく変わりました。タイトルのフォントと表示位置が変更され、また、これまで表示さ れていたヘッダーとサイドバーが見えなくなりました。 補足 入力したコードを詳しく見てみましょう。 $Resources は Visualforce からアクセスできるリソースを示すグローバル変数です。「$Resource.styles」 と記述することで、今回作成した「styles」という名前のリソースを参照します。 • URLFOR() は、静的リソースとそこに含まれるファイルを特定し、完成したページに表示する URL を 生成する関数です。Visualforce ページのレンダリング時に値を動的に評価する場合には、こうした構 文を使用します。 • 関連項目: チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 ステップ 2: Visualforce ページを作成する ステップ 4: ページにコントローラを追加する ステップ 4: ページにコントローラを追加する MVC (Model-View-Controller) 開発アーキテクチャをサポートする Visualforce では、基盤にあるデータベー スやロジックからビューとスタイルを簡単に切り離すことができます。MVC では、ビュー (Visualforce ペ ージ) とコントローラ間で情報をやりとりします。Force.com では、通常 Apex クラスがコントロールの役 割を担い、Visualforce ページにさまざまな機能を実装します。たとえば、ボタンがクリックされたときに 実行されるロジックをコントローラが提供するケースなどがあります。コントローラは、モデル (データ ベース) との情報のやりとりも行っており、これにより、ビューに表示するデータを提供します。 Force.com では、オブジェクトに関連付けられたデータを操作できる標準コントローラがデフォルトです べてのオブジェクトに対して提供されます。そのため、多くの場合、コントローラのコードを作成しなく てもすみますが、必要に応じて、標準コントローラを拡張して新しい機能を追加したり、カスタムコント ローラをゼロから作成することも可能です。このステップでは標準コントローラを使用します。 1. 作成した Visualforce ページのコードの上でクリックします (コードが表示されていない場合は、左下 の [Page Editor] ボタンをクリックしてエディタを開きます)。 2. 次のように、先頭の <apex:page> タグを編集して、標準コントローラ Merchandise__c を有効にします。 Page Editor では空白は無視されるため、改行してテキストを入力してもかまいません。 <apex:page standardStylesheets="false" showHeader="false" sidebar="false" standardController="Merchandise__c"> 3. 次のように、標準のリストコントローラの定義を追加します。 61 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 <apex:page standardStylesheets="false" showHeader="false" sidebar="false" standardController="Merchandise__c" recordSetVar="products"> 4. Page Editor の保存ボタンをクリックします。一見、何も変わっていないように見えますが、コントロ ーラを追加して変数 products を定義したため、ページ内ではこの変数を使用して Merchandise (製品) レ コードのリストを表示することが可能になっています。 補足 recordSetVar は、標準のリストコントローラを有効化する属性です。このリストコントローラはコントロ ーラの機能を拡張するもので、多数のレコードをページ区切りを使って表示します。recordSetVar で指定 した変数 products には、作成した Visualforce ページに表示されるレコードのセットが格納されます。 関連項目: チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 ステップ 3: スタイルシートを静的リソースとして追加する ステップ 5: 在庫カウントシートを Visualforce ページとして表示する ステップ 5: 在庫カウントシートを Visualforce ページとして表示す る このステップでは、在庫数を入力できる項目を備え、すべての Merchandise (製品) レコードを格納するテ ーブルを含んだ在庫カウントシートを、Visualforce ページとして完成させます。 1. </h1> タグの下で改行し、「<apex:f」と入力します。ドロップダウンリストに表示された候補の中から <apex:form> を選択します。このタグにより、ページの更新が可能になります。 2. Enter キーを押して、開始タグと終了タグを自動的に挿入します。 3. タグの間にカーソルを置き、データテーブルを記述します。「<apex:d」と入力し、ドロップダウンリス トに表示された候補の中から dataTable を選択して、Enter キーを押します。 4. <apex:dataTable> タグで、以下のような複数の属性を追加します。value 属性は、dataTable コンポーネ ントが繰り返し処理を行う品目のリストを示します。var 属性は、pitem 変数に、リストの各品目を 1 度ずつ割り当てます。rowClasses 属性は、偶数行、奇数行に対してそれぞれ異なる CSS スタイル名を 割り当てます。次のように入力します (複数行にまたがっても問題ありません)。 <apex:dataTable value="{!products}" var="pitem" rowClasses="odd,even"> 5. 続いて、データテーブル内の列を定義し、pitem 変数で適切な項目を参照してデータの取得元を特定で きるようにします。<apex:dataTable> の開始タグと終了タグの間に、次のコード (太字部分) を入力しま す。 <apex:dataTable value="{!products}" var="pitem" rowClasses="odd,even"> <apex:column headerValue="Product"> <apex:outputText value="{!pitem.name}"/> </apex:column> </apex:dataTable> 6. Page Editor の保存ボタンをクリックします。次のようなテーブルが表示されます。 62 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 headerValue 属性により、列のヘッダーのタイトルが取得されています。その下に、Merchandise (製品) レコードが表示されています。テーブルの行は、レコードが 1 件増えると 1 行追加されます。{! pitem.name} という式により、対象となる Merchandise (製品) レコードの製品名が表示されています。 7. 続いて、ヘッダーの列をさらに 2 つ追加します。<apex:column> の終了タグの後に次のようなコードを 入力します。 <apex:column headerValue="Inventory"> <apex:outputField value="{!pitem.Total_Inventory__c}"/> </apex:column> <apex:column headerValue="Physical Count"> <apex:inputField value="{!pitem.Total_Inventory__c}"/> </apex:column> メモ: 2 番目の列に「outputField」ではなく「inputField」というコードが使われている点に注意 してください。このフィールドには値が表示されますが、表示された値は変更することが可能 です。 8. Page Editor の保存ボタンをクリックします。ページのプレビューで、在庫カウントシートが更新され ます。このシートで、すべての Merchandise (製品) レコードを在庫数情報とともに確認したり、実際の 在庫数を入力して情報を更新したりできます。 9. 最後に、入力された実際の在庫数にもとづいて、ページの値を更新するボタンを追加します。</ apex:form>タグの直前に、次のようにコードを入力します。 <br/> <apex:commandButton action="{!quicksave}" value="Update Counts" /> ※実行するブラウザの種類により、表示が異なる場合があります。 補足 dataTable コンポーネントは、複数の行を持つテーブルを生成します。各行は、リストに対する繰り返 し処理によって取得されます。このページで使用した標準コントローラは Merchandise__c にセットさ れ、recordSetVar 属性は products という変数をとります。コントローラは、データベースから取得し た Merchandise (製品) レコードにもとづいて、変数に値を自動的に入力します。dataTable コンポーネン トでは、この値が入力されたリストを使用します。 • リストに対する繰り返し処理を行うには、対象となる行を参照する手段が必要です。そこ で、「var="pitem"」というコードによって、対象の行を保持する pitem 変数を割り当てています。 • 63 チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 rowClasses や styleClass は、前のステップで静的リソースとして追加した CSS スタイルシートのスタイ ルを使用する属性です。この属性がないとやや見ばえが悪くなりますが、削除しても特に問題はあり ません。 • 標準コントローラには、Force.com のあらゆるオブジェクトをサポートするさまざまなメソッドが用意 されています。たとえば、commandButton は、ボタンを表示し、標準コントローラ上で quicksave とい うメソッドを呼び出してレコードの値を更新します。今回は、実際の在庫数が入力された後、その値 にもとづいてページを更新する処理を行っています。 • 画面上では確認できませんでしたが、この在庫カウントシートでは多数のレコードをページ区切りを 使って表示することができます。レコードを 1 ページで表示しきれない場合、commandButton の下に 次のようなコードを追加します。これにより、ページを切り替えるアクションを実装できます。 • <apex:commandLink action="{!next}" value="Next" rendered="{!hasNext}" /> 関連項目: チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 ステップ 4: ページにコントローラを追加する まとめ まとめ 以上でこのチュートリアルは完了です。今回は、標準コントローラを使用して Visualforce ページを作成 し、[Warehouse] (製品在庫管理) アプリケーションのインターフェースを大幅に変更しました。このページ は非常に柔軟なカスタマイズが可能で、たとえば、列に関するコンポーネントを変更することで、行に表 示するデータを簡単に変更できます。ページの作成では、標準コントローラが提供するさまざまな機能を 利用しました。自動的にデータベースをクエリし、すべての Merchandise (製品) レコードを対象に値を検 索して products 変数に割り当てるようにしたほか、quicksave メソッドを使用してページの内容を簡単に更 新できるようにしました。 この Visualforce ページを公開 Web サイトに公開することもできます。詳細は、「チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成」 を参照してください。 関連項目: チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成 ステップ 5: 在庫カウントシートを Visualforce ページとして表示する 64 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 レベル: 中級 / 所要時間: 20 ~ 30 分 ここまでのステップで作成したアプリケーションでは、利用時にログインを行う必要があります。Force.com はマルチユーザ環境をサポートしていますが、たとえば、一般に公開する Web サイトなどでは、ログイ ンの手続きを省略する必要があります。 そのような場合、Force.com サイトを使用すれば、ユーザ名とパスワードによるログインが不要な公開 Web サイトや公開アプリケーションを作成できます。既存のアプリケーションとダイレクトに連携させて、ア プリケーション内のさまざまな情報を自社のブランド名を反映した URL を使って公開したり、Web サイ トの外観や操作性を企業のブランディングにもとづいてデザインしたりすることが可能です。Web サイト は Force.com のサーバでホスティングされるため、データの整合性の問題は起こりません。また、Force.com ネイティブの機能を使って作成されるため、Web サイトで収集したデータの検証は自動的に実行されま す。さらに、ポータルサイトを構築して、ユーザが公開サイトからシームレスに登録やログインを行える ようにすることもできます。 このチュートリアルでは、Force.com サイトを使った公開 Web ページの作成方法を説明します。最初に製 品カタログ情報を表示する Visualforce ページを作成し、Force.com ドメイン名を登録した後、Visualforce ページをサイトとして有効化し、公開します。 前提条件 Visualforce に関するチュートリアル 「チュートリアル 7: Visualforce を使用したカスタムユーザインターフェースの作成」 (57 ページ) の 手順に従って、Visualforce ページを作成しておく必要があります。 関連項目: ステップ 1: 製品カタログのページを作成する ステップ 2: Force.com ドメイン名を登録する ステップ 3: Force.com サイトを作成する ステップ 4: 設定を変更してテストする まとめ ステップ 1: 製品カタログのページを作成する このステップでは、前のチュートリアルで作成した Visualforce ページ (在庫カウントシート) をコピーし て、在庫数の代わりに製品説明と価格を表示するページを作成します。 65 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 1. [設定] ➤ [開発] ➤ [ページ] の順にクリックします。もし Visualforce の編集画面が表示されている 場合は、ブラウザの [戻る] ボタンを使って設定ページまで戻ります。 2. [CountSheet] の名前のリンクをクリックします。 3. [コピー] をクリックします。 4. [ページの編集] で、[表示ラベル] と [名前] の値を「Catalog」(カタログ) に変更します。 5. コードの編集画面で、<h1> タグの内容を「Merchandise Catalog」(製品カタログ) に変更します。 6. 次に示す行まで移動します。 <apex:column headerValue="Inventory"> <apex:outputField value="{!pitem.Total_Inventory__c}"/> </apex:column> 7. 「Inventory」を「Description」(説明) に、「Total_Inventory__c」を「Description__c」にそれぞれ変更しま す。Visualforce ページでは、このようにして、テーブルの構造を保持したまま、ヘッダータイトルと 表示されるデータを変更することができます。変更後のコードは次のようになります。 <apex:column headerValue="Description"> <apex:outputField value="{!pitem.Description__c}"/> </apex:column> 8. テーブルの次の列でも同様の変更を行い、価格が表示されるようにします。「Physical Count」を 「 Price 」( 価 格 ) に 変 更 し ま す 。 続 い て 、「 inputField 」 を 「 outputField 」 に 変 更 し 、 さ ら に、「Total_Inventory__c」を「Price__c」に変更します。変更後のコードは次のようになります。 <apex:column headerValue="Price"> <apex:outputField value="{!pitem.Price__c}"/> </apex:column> 9. 今回はこのページは参照のみのページとし、ユーザによる入力は許可しません。そのため、<apex:form> タグのペアと <apex:commandButton> タグを削除します。 10. コードを次のように設定できていることを確認して、[保存] をクリックします。 <apex:page standardStylesheets="false" showHeader="false" sidebar="false" standardController="Merchandise__c" recordSetVar="products" > <apex:stylesheet value="{!URLFOR($Resource.styles, 'styles.css')}"/> <h1>Merchandise Catalog</h1> <apex:dataTable value="{!products}" var="pitem" rowClasses="odd,even"> <apex:column headerValue="Product"> <apex:outputText value="{!pitem.name}"/> </apex:column> <apex:column headerValue="Description"> <apex:outputField value="{!pitem.Description__c}"/> </apex:column> <apex:column headerValue="Price"> <apex:outputField value="{!pitem.Price__c}"/> </apex:column> </apex:dataTable> </apex:page> 66 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 補足 このステップで取り上げた内容について、いくつか補足しておきます。 今回使用した Visualforce ページのように、Force.com プラットフォームの多くのコンポーネントは簡単 にコピーすることが可能です。 • Visualforce ページの標準コントローラを使用すると、さまざまなデータを容易に操作できます。たと えば、テーブル内の値を変更するだけで、異なる項目のデータを取得できます。 • 入力項目を出力項目に変更するのも簡単です。Visualforce の標準コントローラは非常に強力です が、必要に応じて標準コントローラを拡張してカスタム機能を追加したり、独自のコントローラを作 成したりすることも可能です。 • 関連項目: チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 ステップ 2: Force.com ドメイン名を登録する ステップ 2: Force.com ドメイン名を登録する サイトのホスティングで使用される一意の Force.com ドメインは、一意のドメイン接頭辞と「force.com」 という文字列を組み合わせて作成されます。たとえば、ドメイン接頭辞に「mycompany」を指定した場 合、ドメイン名は「http://www.mycompany.force.com」になります。 このステップでは、次の手順を実行して、自社の Force.com ドメインを登録します。 1. [設定] ➤ [開発] ➤ [サイト] の順にクリックします。 2. 一意の Force.com ドメイン名を設定します。なお、すでにドメイン名として使われている文字列は使用 できません。また、入力可能なのは英数字とアンダーバー (_) のみで、空白文字は使用できません。先 頭は英字から始まり、最後はアンダーバー以外の英数字にします。アンダーバーを連続して入力する ことはできません。セールスフォース・ドットコムでは、会社名を使用するか、会社名に一部変更を 加えた文字列を使用することをお勧めしています。 ヒント: いったん登録した Force.com ドメイン名を後から変更することはできません。 Free Edition では、ドメイン名は自動的に割り当てられ、変更はできません。カスタムのドメイ ン名を使用する場合は、カスタムの Web アドレスを作成してください。 3. [参加可能か調べる] をクリックして、入力したドメイン名がすでに使われていないかどうかを確認し ます。すでに使われている場合は、変更を求めるメッセージが表示されます。 4. [サイトの利用規約] リンクをクリックして内容を確認し、同意のチェックボックスをオンにします。 5. [私の Force.com ドメインの登録] をクリックします。利用規約に同意して Force.com ドメインを登録す ることにより、設定ページからサイトの利用状況や変更履歴を追跡できるようになります。登録は 48 時間以内に有効になります。 以上でこのチュートリアルは完了です。続いて、Force.com サイトの作成を進めます。 67 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 関連項目: チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 ステップ 1: 製品カタログのページを作成する ステップ 3: Force.com サイトを作成する ステップ 3: Force.com サイトを作成する ドメインの登録が完了したら、先ほど作成した Visualforce ページを新しい Web サイトのホームページと して設定します。 1. [設定] ➤ [開発] ➤ [サイト] の順にクリックして、[サイト] ページを表示します。 2. [新規] をクリックします。[サイトの編集] ページが表示されます。 3. 各項目に次のように値を入力します。 a. [サイトの表示ラベル] と [サイト名] に「Catalog」(カタログ) と入力します。 b. [有効なサイトのホームページ] に「Catalog」と入力します。 c. [有効] チェックボックスをオンにします。 4. [保存] をクリックします。 68 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 関連項目: チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 ステップ 2: Force.com ドメイン名を登録する ステップ 4: 設定を変更してテストする ステップ 4: 設定を変更してテストする 前のステップでは作成済みの Visualforce ページをホームページとして指定し、サイトを作成しました。後 は、サイトを公開するために必要な設定を行い、実際にアクセスできることを確認します。 Force.com には、データセキュリティを目的とした数多くのコントロールが用意されています。たとえ ば、公開ページであっても、ユーザが明示的に指定しない限りはデータは表示されないようになっていま す。このステップでは、[Merchandise] (製品) オブジェクトでそうしたコントロールを解除し、その後、サ イトへのアクセスを確認します。 1. [設定] ➤ [開発] ➤ [サイト] の順にクリックして、[サイト] ページを表示します。 2. [サイトの URL] で、先ほど作成したサイトのリンクをクリックします。すると、新しいタブまたは新 しいウィンドウ (ブラウザによって動作が異なります) が開きますが、表示されるのは製品カタログの ページではなく、「認証が必要です」というエラーメッセージです。既定では、不特定多数のユーザに 対してページのデータの参照は許可されていないため、以下の手順を実行して設定を変更します。 3. [サイトの表示ラベル] の [Catalog] (カタログ) をクリックします。 4. [公開アクセス設定] をクリックし、[プロファイルの詳細] セクションの [編集] をクリックします。 5. 下方向にスクロールして [カスタムオブジェクト権限] セクションを表示し、[Merchandise] (製品) オブ ジェクトの [参照] チェックボックスをオンにします。 6. [保存] をクリックします。 7. Web サイト (先ほど「認証が必要です」と表示されたページ) に戻り、ブラウザの更新ボタンをクリッ クします。次のような画面が表示されます。 69 チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 メモ: 「認証が必要です」というメッセージが依然として表示される場合は、[サイトの編集] ペ ージで [有効なサイトのホームページ] が「Catalog」に設定されていることを確認してくださ い。 補足 ここでは、サイトに Visualforce ページを 1 つ割り当て、これをサイトのホームページに指定しました が、必要に応じて新しい Visualforce ページを作成してサイトに追加することが可能です。たとえ ば、「Meme」というページを追加した場合、「http://workbook-developer-edition.na1.force.com/Meme」の ような URL (適宜お使いのドメイン名に置き換えてください) でアクセスすることができます。 • Developer Edition で作成した Force.com サイトでは、ページビュー、1 日当たりの帯域幅消費量が規定 値を超えないように注意する必要があります。 • Force.com サイトでは、グローバルコンテンツ配信ネットワークを利用して運用環境でキャッシュ機能 を実装し、ページへのアクセスを高速化することができます。設定は簡単で、各 Visualforce ページの コード内の page コンポーネントに、次のようなキャッシュの指示を追加します。 • <apex:page cache="true" expires="600"> 関連項目: チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 ステップ 3: Force.com サイトを作成する まとめ まとめ 以上のステップで公開 Web サイトが完成しました。これにより、世界中のユーザがログイン手続きをせ ずに、このサイトにアクセスしてページを閲覧できるようになります。手順を簡単に振り返ってみましょ う。まず既存の Visualforce ページをコピーして新しいページを作成し、ドメイン名を登録した後、作成し たページを Force.com サイトとして有効化し、ホームページに設定しました。最後にセキュリティの設定 を変更して、サイトへのアクセスを確認しました。 製品カタログのサイトが完成したので、続いて、ユーザがサイトから製品を注文できるようにしましょ う。「チュートリアル 9: 製品購入ページの作成」 (71 ページ) に進んでください。 関連項目: チュートリアル 8: Force.com サイトを使用した公開 Web ページの作成 ステップ 4: 設定を変更してテストする 70 チュートリアル 9: 製品購入ページの作成 チュートリアル 9: 製品購入ページの作成 レベル: 中級 / 所要時間: 30 分 Force.com は、オブジェクト指向のプログラミング言語 Apex を提供しています。Apex を使用すると、ク ラスやメソッドの作成、データベースの呼び出し、Web サービスの作成、電子メールの送信など、さまざ まな処理を実行できます。このチュートリアルでは、Apex でコントローラを作成し、それを使って、ユ ーザが製品を購入できるシンプルな Visualforce ページを作成します。Apex クラスの作成方法、Apex の構 文、Visualforce ページとコントローラ間で値を受け渡す方法などについて学びます。 前提条件 [Warehouse] (製品在庫管理) アプリケーション ベースとなる [Warehouse] (製品在庫管理) アプリケーションを作成し、「チュートリアル 2: リレーシ ョンの追加」 (15 ページ) の説明に従ってリレーションを追加しておく必要があります。 ソフトウェア要件 このチュートリアルは、Force.com IDE を使って実行することもできます。その場合、Eclipse (3.3 ま たは 3.4 のいずれか)、および Force.com IDE プラグインが必要です (詳細は http:// wiki.developerforce.com/index.php/JP:Force.com_IDE を参照)。プロジェクトの作成手順について は、「Force.com IDE を使用したプロジェクトの作成」 (96 ページ) で解説しています。 [開発モード]、[すべてのデータの編集] 権限、[Apex 開発] 権限 このチュートリアルでは、Apex を使用します。Apex クラスを作成するために、上記の設定が有効に なっていることを確認してください。 関連項目: ステップ 1: コントローラを作成する ステップ 2: コントローラにメソッドを追加する ステップ 3: Visualforce で製品購入ページを作成する ステップ 4: AJAX でページを更新する (オプション) まとめ ステップ 1: コントローラを作成する 前のチュートリアルでは Force.com の標準コントローラを使用しましたが、今回は独自のコントローラを 新規作成して使用します。通常、コントローラは、Visualforce ページに表示されるデータを取得します。 71 チュートリアル 9: 製品購入ページの作成 コントローラのコードは、コマンドボタンのクリックなど、ページに対するアクションへの応答として実 行されます。 ここで作成するシンプルな製品購入ページでは、2 つのメソッドを使用します。1 つは、製品購入ページ に表示する製品データを取得する getProducts() メソッド、もう 1 つは、ユーザが製品を選択したときに実 行する shop() メソッドです。 Developer Edition の [設定] ページを利用する場合は、次の手順を実行して Apex クラスを作成します。 1. [設定] ➤ [開発] ➤ [Apex クラス] の順にクリックします。 2. [新規] をクリックします。 3. クラス定義として次のコードを入力し、[Quick Save] をクリックします。 public class StoreFront { } Force.com IDE を利用する場合は、次の手順を実行して Apex クラスを作成します。 1. Force.com IDE でプロジェクトフォルダを右クリックし、[New] ➤ [Apex Class] の順にクリックしま す。 2. [Create New Apex Class] ページで、名前に「StoreFront」と入力します。 3. [Finish] をクリックします。 以上により、コントローラのベースとなるクラスが作成されました。次のステップでは、このクラスにメ ソッドや項目を追加します。 関連項目: チュートリアル 9: 製品購入ページの作成 ステップ 2: コントローラにメソッドを追加する ステップ 2: コントローラにメソッドを追加する このステップでは、前のステップで作成したカスタムコントローラにメソッドを追加します。まず shop() メソッドを追加します。このメソッドは、製品購入ページでユーザがボタンをクリックしたときに実行さ れるアクションのプレースホルダになります。続いて、製品情報と、製品の購入個数を指定する欄が表示 されるようにします。 1. 前のステップで入力した行「public class StoreFront {」の直後に、次のコードを入力します。 public PageReference shop() { return null; } 2. StoreFront クラスの内側 (直前の手順で追加したコードの直後で入力します) に、DisplayMerchandise の リストを保持するフィールドと、データを保持する「DisplayMerchandise」という内部クラスを定義し ます。 72 チュートリアル 9: 製品購入ページの作成 DisplayMerchandise[] products; public class DisplayMerchandise { public Merchandise__c merchandise { get; set; } public Decimal count { get; set; } public DisplayMerchandise(Merchandise__c item) { this.merchandise = item; } } 3. 次の行で、製品を初期化するメソッド getProducts() を以下のとおり定義します。 public DisplayMerchandise[] getProducts() { if (products == null) { products = new DisplayMerchandise[]{}; for (Merchandise__c item : [SELECT id, name, description__c, price__c FROM Merchandise__c WHERE Total_Inventory__c > 0]) { products.add(new DisplayMerchandise(item)); } } return products; } 4. コードを次のように設定できていることを確認して、[保存] をクリックします。 public class StoreFront { public PageReference shop() { return null; } DisplayMerchandise[] products; public class DisplayMerchandise { public Merchandise__c merchandise { get; set; } public Decimal count { get; set; } public DisplayMerchandise(Merchandise__c item) { this.merchandise = item; } } public DisplayMerchandise[] getProducts() { if (products == null) { products = new DisplayMerchandise[]{}; for (Merchandise__c item : [SELECT id, name, description__c, price__c FROM Merchandise__c WHERE Total_Inventory__c > 0]) { products.add(new DisplayMerchandise(item)); } } return products; } } 以上により、Apex の標準のクラスとメソッドを使用してデータベースにアクセスする、シンプルなコン トローラが完成しました。 73 チュートリアル 9: 製品購入ページの作成 補足 DisplayMerchandise クラスは、データベース内の Merchandise 型をラップし、新しい小数点フィールドを追 加します。このコンストラクタでは、既存の製品レコードを渡すことにより、新しい DisplayMerchandise インスタンスを作成します。インスタンス変数 products は、DisplayMerchandise インスタンスのリストと して定義されています。 getProducts() メソッドは、在庫数がプラスになっているすべての製品レコードを返す SOQL (Salesforce Object Query Language) クエリ (テキストを含んだ [ ] 部分の記述) を実行した後、クエリによって返されたレコー ドに対して反復処理を実行し、DisplayMerchandise のリストに追加して、その結果を返します。 関連項目: チュートリアル 9: 製品購入ページの作成 ステップ 1: コントローラを作成する ステップ 3: Visualforce で製品購入ページを作成する ステップ 3: Visualforce で製品購入ページを作成する このステップでは、Visualforce を使って製品購入ページを新規作成します。 1. ブラウザで、現在使用しているサービスインスタンスの URL の末尾にテキスト「/apex/StoreFront」を 追加します (例: https://na1.salesforce.com/apex/StoreFront)。すると、「StoreFront」というページが存在し ないことを通知するメッセージが表示されます。 2. [Create Page StoreFront] リンクをクリックします。 3. ページの左下にある [Page Editor] ボタンをクリックします。 4. エディタ内のコードを次のように書き換えます。 <apex:page standardStylesheets="false" showHeader="false" sidebar="false" controller="StoreFront" > <apex:stylesheet value="{!URLFOR($Resource.styles, 'styles.css')}"/> <h1>Store Front</h1> <apex:form> </apex:form> </apex:page> メモ: controller="StoreFront" 属性は、先ほど作成した Apex クラス「StoreFront」を、これから作 成する Visualforce ページでコントローラとして使用することを示します。 5. 次に、<form> タグ内でフォームの内容を設定します。製品に対して反復処理を行うテーブルと、shop メソッドを呼び出すボタンが表示されるよう、form タグ内に次のようなコードを入力します。 <apex:dataTable value="{!products}" var="pitem" rowClasses="odd,even"> <apex:column headerValue="Product"> <apex:outputText value="{!pitem.merchandise.name}"/> </apex:column> <apex:column headerValue="Price"> <apex:outputText value="{!pitem.merchandise.price__c}"/> </apex:column> 74 チュートリアル 9: 製品購入ページの作成 <apex:column headerValue="#Items"> <apex:inputText value="{!pitem.count}"/> </apex:column> </apex:dataTable> <br /> <apex:commandButton action="{!shop}" value="Buy" /> 6. [保存] をクリックします。次のようなページが表示されます。 補足 ここで追加した要素について、簡単に振り返ってみましょう。 dataTable の value 属 性 は 「 products 」 に 設 定 さ れ て い ま す 。 こ れ に よ り 、 テ ー ブ ル は 、 リ ス ト 「products」に対して反復処理を行います。今回は標準コントローラではなくカスタムコントローラを 使用しているため、Visualforce では、そのコントローラ内の getProducts() メソッドを自動的に検索しま す。 • コントローラ内の getProducts() メソッドは、DisplayMerchandise オブジェクトの配列を返します。 dataTable が反復処理を行うと、返された配列によって新しい行が作成され、Visualforce ページ内の pitem 変数に渡されます。 • この Visualforce ページには {!shop} アクションが含まれています。そのため、コントローラでは、この アクションと同名のメソッドが使用されます。 • 関連項目: チュートリアル 9: 製品購入ページの作成 ステップ 2: コントローラにメソッドを追加する ステップ 4: AJAX でページを更新する (オプション) 75 チュートリアル 9: 製品購入ページの作成 ステップ 4: AJAX でページを更新する (オプション) このステップでは、AJAX でページを更新する方法について説明します。必須のステップではないた め、省略してもかまいません。Visualforce では、処理対象のデータは、ユーザに意識されることなくコン トローラに渡されます。たとえば、このチュートリアルで作成したコントローラの shop() メソッドは、エ ンドユーザが Visualforce ページに入力した製品の購入個数のデータにアクセスします。ここで、AJAX の ページ更新機能を利用すると、アクセスした値にもとづいてページを自動的に更新することができます。 この機能は、電子メールで注文を行ったり、Web サービスを呼び出したり、製品を買い物かごに追加した りする際に使われています。 1. Visualforce ページの URL を入力します 「https://na1.salesforce.com/apex/StoreFront」のように、インスタ ( ンス名の後にページ名を追加します)。 2. Page Editor の編集画面を表示します。 3. </apex:form> のすぐ下の行に次のようなコードを入力します。 <apex:outputPanel id="msg">{!message}</apex:outputPanel> これにより、message コントローラがアクセスした製品データを表示する出力パネル「msg」が作成さ れます。ただし、この時点では message コントローラはまだ作成されていません。 4. そのため、保存ボタンをクリックすると、「message」という文字を含むメソッドやプロパティを作成 するためのリンクが表示されます。 5. [Apex プロパティ「StoreFront.message」を作成] リンクをクリックします。 6. コントローラが作成できたので、<apex:commandButton> タグに reRender 属性を追加します。 <apex:commandButton action="{!shop}" reRender="msg" value="Buy" /> 以上により、即座にページを更新する AJAX のインプレース更新機能を Visualforce ページで使用できるよ うになりました。この機能は、コントローラ上に shop() メソッドを呼び出してから、msg パネルを更新し ます。続いて、shop() メソッドを編集し、パネル内のメッセージのプロパティに、該当の製品リストの情 報が反映されるようにします。 1. [Page Editor] ボタンの横の [制御項目] ボタンをクリックします。 2. shop() メソッド (4 ~ 6 行目) を次のコードで置き換えます。 public PageReference shop() { message = 'You bought: '; for (DisplayMerchandise p: products) { if (p.count > 0) { message += p.merchandise.name + ' (' + p.count + ') } } return null; } '; メモ: これは、products 変数を使用するシンプルなコードであり、ユーザインターフェースで行 われたデータの変更が自動的に products 変数内のデータに反映されるようになります。 76 チュートリアル 9: 製品購入ページの作成 3. Page Editor の保存ボタンをクリックします。 4. 動作をテストします。製品の購入個数を入力して [Buy] をクリックします。すると、リストの下に製品 の購入個数を通知するメッセージが表示されます。 補足 今回追加したコードは、シンプルですが強力な機能を備えています。 ここでは、フォームで行われたデータの変更を products 変数に反映する Visualforce ページを作成しま した。同様の手順で、フォームや複雑な入力ページをスムーズに作成することができます。 • [Buy] ボタンをクリックすると、パネルの部分のみが更新されました。このような動作を実現するに は、通常、複雑な JavaScript の処理が必要になりますが、Visualforce では reRender 属性を指定するだけ ですみます。 • 関連項目: チュートリアル 9: 製品購入ページの作成 ステップ 3: Visualforce で製品購入ページを作成する まとめ まとめ Apex は、Java などの標準的な開発言語が備える機能を数多くサポートする、強力なオブジェクト指向言 語です。このチュートリアルでは、Apex クラスを作成し、配列、反復処理、データベースクエリなどの 機能を利用して製品購入ページを完成させました。オプションのステップ 4 では、コントローラに返され たデータにもとづいてメッセージを表示するよう、Visualforce ページを変更しました。AJAX の更新機能 を利用し、ページの該当箇所のみを更新する動作を実装できました。 このチュートリアルで説明した内容は、認証機能を実装したポータルを作成する際の参考になります。こ のようなポータルは、ユーザ名とパスワードを使った認証プロセスを経て製品の購入に進むようなページ を提供する場合に使用します。ただし、本書ではポータルの作成手順は扱っていません。本書で作成した アプリケーションと連携するポータルを作成する手順については、developer.force.com/workbook でご案内 します。このページには、本書の更新内容を随時掲載します。 引き続き、パッケージを作成するか、運用環境への導入を行うことによって、アプリケーションの配布を 試してみることも可能です。詳細は「アプリケーションの配布」 (97 ページ) を参照してください。 77 チュートリアル 9: 製品購入ページの作成 関連項目: チュートリアル 9: 製品購入ページの作成 ステップ 4: AJAX でページを更新する (オプション) 78 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 レベル: 上級 / 所要時間: 30 分 Adobe Flash Builder for Force.com では、Force.com のロジックとデータベース機能を活用して、Adobe Integrated Runtime (AIR®) 環境で動作するデスクトップアプリケーションを作成できます。「Force.com Stratus」と呼ばれるこれらのアプリケーションは、オンラインでもオフラインでも利用できるため、ユー ザはインターネット接続が不安定な環境でもデータにアクセスすることが可能になります。 このチュートリアルでは、Adobe Flash Builder for Force.com を使用して、オフライン環境で製品データを 利用できるシンプルな在庫追跡用の Force.com Stratus アプリケーションを作成します。このアプリケーシ ョンを導入すると、安定した Wi-Fi 接続が利用できない倉庫にいるときでも、タブレット PC を使って在 庫を管理できるようになります。このアプリケーションは、次のような Force.com Stratus アプリケーショ ンの標準機能を備えます。 ログイン画面: オンライン環境ではユーザに資格情報を要求し、その情報にもとづき Force.com との接 続を確立します。 • 競合の解決が可能なインターフェース: Force.com Stratus アプリケーションの値が入力規則に違反した 場合や他のユーザによる変更と競合した場合に、簡単に解決できます。 • ステータスバー: Force.com Stratus アプリケーションがインターネットに接続しているかどうかを表示 します。未解決のデータ競合やエラー数なども確認できます。 • 79 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 アプリケーションの作成では、MXML、ActionScript などの Adobe Flash テクノロジのコンポーネントのほ か、Adobe Flash Builder for Force.com が生成する Force.com Stratus クラスを使用します。なお、今回作成す るアプリケーションでは MXML や ActionScript の知識は不要です。作成、実行に必要なコードは、すべて このチュートリアル内に記載しています。 ヒント: Adobe Flash Builder for Force.com は、現時点で開発者プレビューの段階にあり、Developer Edition のみで利用可能です。正式リリース前に機能が大幅に変更される可能性があるため、開発者 プレビューの段階では運用環境向けのアプリケーションの作成は行わないでください。 関連項目: ステップ 1: 個人情報を設定する ステップ 2: オフラインブリーフケース構成を作成する ステップ 3: Enterprise WSDL を生成してクライアント証明書をダウンロードする ステップ 4: Adobe Flash Builder for Force.com をインストールして起動する ステップ 5: Force.com Stratus プロジェクトを作成する ステップ 6: Stratus アプリケーションコンポーネントの属性を設定する ステップ 7: アプリケーションの Window コンポーネントを作成する ステップ 8: アプリケーションをテストする まとめ ステップ 1: 個人情報を設定する Force.com Stratus アプリケーションは、Force.com の Connect Offline 機能を使用します。Force.com Stratus アプリケーションを作成、使用するには、次の手順を実行し、個人情報の設定画面で [オフラインユーザ] オプションを有効にする必要があります。 1. [設定] ➤ [ユーザの管理] ➤ [ユーザ] の順にクリックします。 2. 自分の名前の横の [編集] リンクをクリックします。 3. [オフラインユーザ] チェックボックスをオンにします。 4. [保存] をクリックします。 80 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 2: オフラインブリーフケース構成を作成する ステップ 2: オフラインブリーフケース構成を作成する Force.com Stratus アプリケーションがアクセスできるデータは、[設定] ページのオフラインブリーフケー ス構成の設定によって決まります。今回作成するアプリケーションは Merchandise (製品) レコードのデー タを利用します。そこで、次の手順を実行し、[Merchandise] (製品) オブジェクトを含むオフラインブリー フケース構成を作成します。 1. [設定] ➤ [デスクトップ管理者] ➤ [オフラインブリーフケース構成] の順にクリックします。 2. [新規オフラインブリーフケース構成] をクリックします。 3. オフラインブリーフケース構成の名前を指定します。たとえば、「Inventory Tracker App Data」(在庫追 跡アプリケーションのデータ) のように入力します。 4. [有効] チェックボックスをオンにします。 5. [選択可能なユーザ] リストから自分の名前を選択し、[追加] をクリックして [割り当てられたユーザ] リストに移動します。 6. [保存] をクリックします。オフラインブリーフケース構成の詳細ページが表示されます。 7. [データセット] 関連リストの [編集] をクリックします。 8. [追加...] をクリックします。 9. [Merchandise] (製品) を選択し、[OK] をクリックします。 10. [並び替えの基準] で [Merchandise 名] (製品名) を選択します。 81 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 11. [完了] をクリックします。 補足 オフラインブリーフケース構成は、Force.com Stratus アプリケーションや Force.com Connect Offline でアク セスを許可するレコードを指定するパラメータのセットです。Connect Offline は、インターネット接続が 確立されていないオフライン環境で、オンライン環境と同じブラウザベースのインターフェースを使用し て Force.com アプリケーションのデータのサブセットにアクセスできるクライアントアプリケーションで す。Connect Offline では、取引先、活動、取引先責任者、商談、リード、カスタムオブジェクトの各レコ ードを参照、編集、作成、削除できます。オブジェクト間にリレーションが設定されている場合は、対応 付けられたレコードでも同様の操作が可能です。たとえば、商談レコードに製品やスケジュールのレコー ドを追加して、それらのレコードを編集することも可能です。 複数のブリーフケース構成を作成し、各構成を異なるユーザやプロファイルに割り当てることによっ て、さまざまなタイプのオフラインユーザのニーズを同時に満たすことができます。たとえば、リードと 商談を含んだ営業担当者用の構成、取引先と商談を含んだアカウントエグゼクティブ用の構成などを別々 に作成することが可能です。 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 1: 個人情報を設定する ステップ 3: Enterprise WSDL を生成してクライアント証明書をダウンロードする 82 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 ステップ 3: Enterprise WSDL を生成してクライアント証明書をダ ウンロードする Web サービスは統合の手段としてよく利用されます。Force.com は、Web サービスコールの着信と発信を サポートする強力な機能セットを提供するほか、アプリケーション内のデータへのアクセスを許可する Web サービスのエンドポイントを自動的に生成します。Force.com のオブジェクトは、Enterprise WSDL と いう Web サービス記述言語 (Web Services Definition Language) を使用して記述します。オブジェクトや Web サービスを柔軟に記述できるこの WSDL により、他のシステムとの統合が可能になります。 Adobe Flash Builder for Force.com では、Enterprise WSDL を開発プロジェクトにインポートできます。 Enterprise WSDL をインポートすると、その WSDL 内に含まれるすべてのオブジェクトに対して ActionScript クラスが生成され、これにより、ActionScript コードで Force.com のオブジェクトを参照できるようになり ます。 このチュートリアルでは、Enterprise WSDL を開発プロジェクトにインポートして [Merchandise] (製品) オ ブジェクトのクラスを作成しますが、このステップでは、まず Enterprise WSDL を作成してローカルコピ ーを保存し、続いて、クライアントアプリケーションから Force.com にアクセスする際の認証で使用する クライアント証明書をダウンロードします。 1. 2. 3. 4. 5. [設定] ページで、 [開発] ➤ [API] の順にクリックします。 [Enterprise WSDL の作成] をクリックします。 ブラウザのメニューで、[ファイル] ➤ [名前を付けて保存] の順にクリックします。 [ファイル名] に「enterprise.wsdl」と入力し、任意の場所に保存します。 API のメニュー画面に戻り、[クライアント証明書の作成] をクリックし、現在使用しているコンピュー タのクライアント証明書を作成して保存します。 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 2: オフラインブリーフケース構成を作成する ステップ 4: Adobe Flash Builder for Force.com をインストールして起動する ステップ 4: Adobe Flash Builder for Force.com をインストールし て起動する Adobe Flash Builder for Force.com は、スタンドアロンの Adobe Flash Builder としてインストールされ、Eclipse プラットフォームベースの Adobe 統合開発環境 (IDE) として機能します。 1. developer.force.com/flashbuilder にアクセスし、右側の [Download Now] ボタンより登録し、Adobe Flash Builder for Force.com の .exe ファイルをダウンロードします。 2. インストーラをダブルクリックします。 3. インストールが完了したら、[スタート]、[すべてのプログラム]、[Adobe Flash Builder 4 Plug-in Eclipse ランチャー] の順にクリックします。 83 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 3: Enterprise WSDL を生成してクライアント証明書をダウンロードする ステップ 5: Force.com Stratus プロジェクトを作成する ステップ 5: Force.com Stratus プロジェクトを作成する Adobe Flash Builder for Force.com のインストールが完了すると、Flash Builder で [Force.com Stratus Project] という新しいプロジェクトタイプを使用できるようになります。このプロジェクトでは、Enterprise WSDL をインポートして、Force.com のオブジェクト用の ActionScript クラスを自動生成することができます。 Flash Builder では、インポートした WSDL にもとづき、コードのヒント、コンパイラの警告メッセージを 表示します。 1. Flash Builder で [ファイル] メニューを開き、[新規] ➤ [プロジェクト] の順にクリックします。新規 プロジェクトウィザードが表示されます。 2. [Flash Builder] フォルダをクリックして [Force.com Stratus Project] を選択し、[次へ] をクリックします。 3. プロジェクト名として「Inventory Tracker」(在庫追跡) と入力し、[デスクトップ (Adobe AIR で実行)] を選択します。 4. [次へ] をクリックします。 84 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 5. 出力フォルダの設定はデフォルトのまま変更せず、[次へ] をクリックします。 6. [アプリケーション ID] 項目に「com.salesforce.InventoryTracker」と入力します。AIR 実行環境とオペレ ーティングシステムは、この ID によってアプリケーションを識別します。確実に一意の ID を設定す るには、このようなドメイン名の逆表記を使用するとよいでしょう。 7. [終了] をクリックします。 8. ステップ 3 で作成した Enterprise WSDL を選択し、[次へ] をクリックします。 以上で Force.com Stratus プロジェクトを作成できました。Flash Builder のパッケージエクスプローラー内 のディレクトリ構造は次のようになります。 85 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 4: Adobe Flash Builder for Force.com をインストールして起動する ステップ 6: Stratus アプリケーションコンポーネントの属性を設定する ステップ 6: Stratus アプリケーションコンポーネントの属性を設定 する すべての Force.com Stratus アプリケーションは、Stratus アプリケーションコンポーネント内に格納されま す。Stratus アプリケーションコンポーネントは、Force.com Stratus アプリケーションを Force.com に接続 し、Force.com のログイン認証機能を提供し、Force.com と Force.com Stratus アプリケーション間でのデー タの初期同期処理を実行します。 Force.com Stratus プロジェクトには、Stratus アプリケーションテンプレートを含む main.mxml ファイルが デフォルトで提供されています。このステップでは、main.mxml ファイル内の stratus:StratusApplication 要 素の属性を変更し、[Inventory Tracker] (在庫追跡) アプリケーション用に設定します。 1. [src] ➤ [(デフォルトのパッケージ)] の順にクリックし、main.mxml ファイルを表示します (すでにフ ァイルが表示されている場合は操作の必要はありません)。 2. stratusName 属性を「Inventory Tracker」に変更します。この属性は、アプリケーションのタイトルバー に表示される名前を制御します。 3. requiredTypes 属性を「Merchandise__c」に設定します。この属性は、Force.com Stratus アプリケーショ ンが参照する Force.com アプリケーション内のオブジェクトを指定します。 4. 完成したコードを次に示します。 86 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 <?xml version="1.0" encoding="utf-8"?> <stratus:StratusApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:stratus="com.salesforce.stratus.*" stratusName="Inventory Tracker" stratusClass="services.stratus.Stratus" mainWindowClass="MainWindow" requiredTypes="Merchandise__c" > </stratus:StratusApplication> 5. ファイルを保存します。 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 5: Force.com Stratus プロジェクトを作成する ステップ 7: アプリケーションの Window コンポーネントを作成する ステップ 7: アプリケーションの Window コンポーネントを作成す る 今回作成する [Inventory Tracker] (在庫追跡) アプリケーションは、画面が上下に分割されています。 Merchandise (製品) レコードのリストを下の画面に表示し、リスト内でレコードを選択すると、上の画面で そのレコードの詳細を確認できるようにします。さらに、レコード内の各データをクリックすると内容を 変更できるようにします。また、変更を Force.com に保存するためのボタンはレコードの詳細データの真 下に表示します。 このアプリケーションの主要機能のロジックは、Stratus コンポーネントのほか、Spark、Halo という 2 つ の Adobe コンポーネントセットを使用する ActionScript と MXML によって規定されます。Stratus コンポ ーネントは Adobe Flash Builder for Force.com が生成するコンポーネントで、コード内で Force.com のロジ ックやデータにアクセスするプロセスを簡素化します。 このステップでは、Force.com Stratus プロジェクトの作成時に Adobe Flash Builder for Force.com が生成する デフォルトの Window コンポーネントに、[Inventory Tracker] (在庫追跡) アプリケーションのロジックを追 加します。デフォルトの Window コンポーネントは MainWindow.mxml ファイルに格納され、次のように 記述されています。 <?xml version="1.0" encoding="utf-8"?> <s:Window xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" xmlns:stratus="com.salesforce.stratus.*" showStatusBar="false" backgroundColor="#e7e7e7" width="800" height="600" windowComplete="onWindowComplete()" > 87 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 <s:layout> <s:VerticalLayout/> </s:layout> <s:VGroup width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"> <s:Label text="Your content goes here"/> </s:VGroup> <fx:Script> <![CDATA[ import com.salesforce.stratus.StratusMessage; private function onWindowComplete():void { }new StratusMessage(StratusMessage.STATUS_INFO, "Application initialized").showAsStatus(); // your code goes here } ]]> </fx:Script> <stratus:StatusBar/> </s:Window> デフォルトのコードに含まれる要素について説明します。 • • • • • • • Spark の Window コンポーネント - Force.com Stratus アプリケーションの名前空間、背景色、幅、高さ などを指定します。そのほか、このコンポーネントには、ユーザのログイン時に実行する関数を指定 する windowComplete 属性や、アプリケーションで Flash Builder の標準のステータスバーを表示するか どうかを指定する showStatusBar 属性が含まれています。ここでは showStatusBar 属性は false に設定さ れており、標準のステータスバーの代わりに Stratus のステータスバーが表示されます。 Spark の Layout コンポーネント - 設定内容にもとづいてレイアウトエレメントを配置します。 Spark の VerticalLayout コンポーネント - レイアウトエレメントを上から下へ垂直方向に配置します。 オプションで、各エレメント間の間隔を指定したり、エレメントの周囲にパディングを設定できます。 Spark の VGroup コンポーネント - ユーザインターフェースのエレメントをグループ化して垂直方向に 配置します。 Spark の Label コンポーネント - 垂直方向に配置されたグループのラベルを作成します。 XML の Script コンポーネント - ActionScript を入力できます。このコンポーネントには、Force.com Stratus アプリケーションの起動時にデータを初期化するデフォルトの ActionScript が含まれています。 Stratus の StatusBar コンポーネント - Force.com Stratus アプリケーションの下部にステータスバーを表示 します。 以下の手順を実行してこのデフォルトのコードを変更し、[Inventory Tracker] (在庫追跡) アプリケーション のロジックを実装します。 1. 次の Label コンポーネントを削除します。 <s:Label text="Your content goes here"/> 2. VGroup コンポーネント内で Stratus の FieldContainer コンポーネントを追加します。このコンポーネン トは、データをグループ化することによって、複数の項目を 1 回の操作で処理できるようにしま す。また、選択されたレコードの詳細を画面上部に表示する役割も担います。 次のように、FieldContainer コンポーネントの幅を 100% に設定し、「_editFieldContainer」という ID を入力します。後続の手順で、この ID を参照するコードを記述します。 <stratus:FieldContainer id="_editFieldContainer" width="100%"> </stratus:FieldContainer> 3. FieldContainer コンポーネント内で、以下のようにコードを入力し、画面に表示する [Merchandise] (製 品) オブジェクトの項目ごとに LabelAndField コンポーネントを追加して、Force.com が内部的に使用す 88 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 る API 名によって各項目を参照するようにします。LabelAndField コンポーネントは、Force.com の項 目の値とラベル名を表示する Stratus コンポーネントです。FieldAndLabel コンポーネントに追加した項 目は、Force.com Stratus アプリケーション上でも、通常の Force.com アプリケーションを利用する場合 と同様に機能します (たとえば、日付のデータ型を持つ項目をクリックするとカレンダーが表示されま す)。これらの項目では、項目間の依存関係がサポートされるほか、インライン編集機能、フロート表 示機能、エラー通知機能、情報アイコンによるヘルプテキストの表示機能が自動的に提供されます。 <stratus:LabelAndField <stratus:LabelAndField <stratus:LabelAndField <stratus:LabelAndField field="Merchandise__c.Name" /> field="Merchandise__c.Description__c" /> field="Merchandise__c.Price__c" /> field="Merchandise__c.Total_Inventory__c" /> 4. LabelAndField コンポーネントを追加したら、次に示す FieldContainer エレメントの終了タグが設定され ていることを確認します。 </stratus:FieldContainer> 5. Spark コ ン ポ ー ネ ン ト の 標 準 ボ タ ン を 追 加 し 、「 Save 」 ( 保 存 ) と い う ラ ベ ル 名 を 指 定 し、「onEditSaveClick」という関数を実行するように設定します (この関数は後続の手順で作成します)。 <s:Button label="Save" click="onEditSaveClick()"/> 6. アプリケーションのユーザインターフェースで、[Save] (保存) ボタンの下に Merchandise (製品) レコー ドのリストを表示するようにします。ActionScript の標準コンポーネント DataGrid を使用して、次のよ うにコードを入力します。 <mx:DataGrid id="_dataGrid" width="100%" height="100%" dataProvider="{_gridDataProvider}" itemClick="onDataGridItemClick()"> <mx:columns> <mx:DataGridColumn dataField="Name"/> <mx:DataGridColumn dataField="Description__c" headerText="Description"/> <mx:DataGridColumn dataField="Price__c" headerText="Price"/> <mx:DataGridColumn dataField="Total_Inventory__c" headerText="Total Inventory"/ > </mx:columns> </mx:DataGrid> dataProvider 属性が参照する変数、itemClick 属性が参照する関数は、それぞれ後続の手順で作成しま す。 7. VGroup エレメントの要素である Stratus コンポーネント StatusBar が残っています。これはデフォルト のコードの要素ですが、今回はそのままにしておきます。最後に VGroup エレメントの終了タグを設定 します。 <stratus:StatusBar/> </s:VGroup> 8. 以上で、[Inventory Tracker] (在庫追跡) アプリケーションのユーザインターフェースを適切に配置でき ました。続いて、ActionScript を追加し、Force.com Stratus アプリケーションで Force.com アプリケーシ ョンのデータを取得できるようにします。まず <fx:Script> エレメント内の <![CDATA[ セクションか ら、ActionScript で使用するクラスをインポートします。以下のようにコードを記述します。 89 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 import import import import import import mx.collections.ArrayCollection; mx.data.IManaged; com.salesforce.stratus.StratusWrapper; com.salesforce.stratus.StratusResponder; services.stratus.Merchandise__c; com.salesforce.stratus.StratusMessage; ここで使用するクラスについて説明します。 • • • • • • ArrayCollection - 任意の配列をアクセスおよび操作が可能なコレクションとして公開する ActionScript のラッパー。 IManaged - 管理対象オブジェクトのコントラクトを提供する ActionScript のインターフェース。 StratusWrapper - Adobe のデータ管理サービス Data Management Service (DMS) が提供する機能をラッ プする Stratus コンポーネント (DMS は、クライアントサーバ間のデータ同期処理モデルを実現す る Adobe AIR プラットフォームの主要コンポーネントの 1 つです)。 StratusResponder - NULL 応答を返す関数が内部的な問題を引き起こさないようにするための Stratus コンポーネント。 Merchandise__c - Adobe Flash Builder for Force.com によって生成された、[Merchandise] (製品) オブジ ェクトの ActionScript クラス。 StratusMessage - データ競合などの情報メッセージや標準的なコンテキストエラーを提供する Stratus コンポーネント。 9. Merchandise (製品) レコードのデータを格納する変数を作成します。この変数により、リストに表示さ れるデータが決まります。 [Bindable] private var _gridDataProvider:ArrayCollection = null; 10. DMS 機能へのアクセスで使用する変数を作成します。 private var _stratusWrapper:StratusWrapper; 11. デフォルトのコードでは、onWindowComplete() 関数は、アプリケーションのロード時にデータベース をクエリします。これを変更して、Merchandise (製品) レコードのデータを返すようにします。関数を 次のように書き換えます。 public function onWindowComplete():void { new StratusMessage(StratusMessage.STATUS_INFO, "Application initialized").showAsStatus(); _stratusWrapper = StratusWrapper.getInstance(); _stratusWrapper.query("select * from Merchandise__c", new StratusResponder( function(rows:ArrayCollection):void { _gridDataProvider = rows; }, null )); } この WindowComplete については、Window エレメント内の要素として、ステップの冒頭で説明してい ます。 12. ユーザがデータに加えた変更をユーザインターフェースからメモリにコピーする onEditSaveClick 関数 を作成します。 private function onEditSaveClick():void { _editFieldContainer.fieldCollection.updateObject(new StratusResponder 90 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 (commitToDB, null)); } この関数は、ユーザが [Save] (保存) ボタンをクリックしたときにトリガされ、ユーザが入力したデー タが有効であるかどうかを評価するシンプルな入力規則を適用し、データが有効である場合には commitToDB 関数を呼び出します (この関数は次の手順で作成します)。 13. メモリ内のデータをデータベースにコミットして FieldContainer から該当データを消去する commitToDB 関数を作成します。 private function commitToDB(managedObject:IManaged):void { _stratusWrapper.save(managedObject, new StratusResponder( function(result:StratusMessage):void { _editFieldContainer.fieldCollection.clear(); }, null )); } 14. Force.com Stratus アプリケーションのユーザインターフェースに FieldContainer のデータを表示する関 数を作成します。前の手順で設定した ID (_editFieldContainer) を使用して、FieldContainer を参照しま す。 private function onDataGridItemClick():void { var merchandise:Merchandise__c = _dataGrid.selectedItem as Merchandise__c; _editFieldContainer.fieldCollection.render(merchandise); } 15. ファイルを保存します。 完成したコードを次に示します。 <?xml version="1.0" encoding="utf-8"?> <s:Window xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" xmlns:stratus="com.salesforce.stratus.*" showStatusBar="false" width="800" height="600" backgroundColor="#e7e7e7" windowComplete="onWindowComplete()"> <s:layout> <s:VerticalLayout/> </s:layout> <s:VGroup width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"> <stratus:FieldContainer id="_editFieldContainer" width="100%"> <stratus:LabelAndField field="Merchandise__c.Name" /> <stratus:LabelAndField field="Merchandise__c.Description__c" /> <stratus:LabelAndField field="Merchandise__c.Price__c" /> <stratus:LabelAndField field="Merchandise__c.Total_Inventory__c" /> </stratus:FieldContainer> <s:Button label="Save" click="onEditSaveClick()"/> <mx:DataGrid id="_dataGrid" width="100%" height="100%" 91 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 dataProvider="{_gridDataProvider}" <mx:columns> <mx:DataGridColumn <mx:DataGridColumn <mx:DataGridColumn <mx:DataGridColumn > </mx:columns> </mx:DataGrid> <stratus:StatusBar/> </s:VGroup> <fx:Script> <![CDATA[ import import import import import import itemClick="onDataGridItemClick()"> dataField="Name"/> dataField="Description__c" headerText="Description"/> dataField="Price__c" headerText="Price"/> dataField="Total_Inventory__c" headerText="Total Inventory"/ mx.collections.ArrayCollection; mx.data.IManaged; com.salesforce.stratus.StratusWrapper; com.salesforce.stratus.StratusResponder; com.salesforce.stratus.StratusMessage; services.stratus.Merchandise__c; [Bindable] private var _gridDataProvider:ArrayCollection = null; private var _stratusWrapper:StratusWrapper; public function onWindowComplete():void { new StratusMessage(StratusMessage.STATUS_INFO, "Application initialized").showAsStatus(); _stratusWrapper = StratusWrapper.getInstance(); _stratusWrapper.query("select * from Merchandise__c", new StratusResponder( function(rows:ArrayCollection):void { _gridDataProvider = rows; }, null )); } private function onEditSaveClick():void { _editFieldContainer.fieldCollection.updateObject(new StratusResponder(commitToDB, null)); } private function commitToDB(managedObject:IManaged):void { _stratusWrapper.save(managedObject, new StratusResponder( function(result:StratusMessage):void { _editFieldContainer.fieldCollection.clear(); }, null )); } private function onDataGridItemClick():void { var merchandise:Merchandise__c = _dataGrid.selectedItem as Merchandise__c; _editFieldContainer.fieldCollection.render(merchandise); } ]]> </fx:Script> </s:Window> 92 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 6: Stratus アプリケーションコンポーネントの属性を設定する ステップ 8: アプリケーションをテストする ステップ 8: アプリケーションをテストする このステップでは、作成した [Inventory Tracker] (在庫追跡) アプリケーションのテストを行います。 1. テストで使用するコンピュータがインターネットに接続されていることを確認します。 2. Flash Builder で、[Inventory Tracker] (在庫追跡) プロジェクトを右クリックし、[実行] ➤ [デスクトッ プアプリケーション] の順にクリックします。アプリケーションのログイン画面が表示されます。 3. Force.com アプリケーションへのログインで使用しているユーザ名とパスワードを入力し、ログインボ タンをクリックします。アプリケーションのユーザインターフェースが表示されます。 4. リスト内のレコードを 1 つ選択し、データを変更して、[Save] (保存) をクリックします。 5. Force.com アプリケーションにログインし、先ほどの変更が反映されていることを確認します。 93 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 6. 続いて、競合解決の動作をテストします。Force.com アプリケーションで任意の項目の値を変更して [保存] をクリックした後、[Inventory Tracker] (在庫追跡) アプリケーションの同じ項目に先ほどと異な る値を入力し、[Save] (保存) をクリックします。ステータスバーにデータの競合を伝えるメッセージが 表示されます。 7. ステータスバーの [Resolve] (解決) をクリックして競合解決のインターフェースを起動します。 Force.com アプリケーションと Inventory Tracker アプリケーションの両方の値が表示されます。保存 する値を選択して、[登録] をクリックします。 94 チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーションの作成 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 7: アプリケーションの Window コンポーネントを作成する まとめ まとめ このチュートリアルでは、インターネットに接続していない環境でも Force.com アプリケーションのデー タを参照、編集できるシンプルな Force.com Stratus アプリケーションを作成して、Adobe Flash Builder for Force.com の基本的な知識を学びました。複雑なコーディング作業は必要ありませんでした。Adobe Flash Builder for Force.com を利用すると、強力な機能を備えた Force.com Stratus アプリケーションを作成し て、ユーザが Force.com アプリケーションのメリットを最大限に享受できるようにすることが可能になり ます。 関連項目: チュートリアル 10: Adobe Flash Builder for Force.com を使用したデスクトップアプリケーション の作成 ステップ 8: アプリケーションをテストする 95 付録 サンドボックスの作成とログイン Free Edition を使用している場合、本書のすべてのチュートリアルはサンドボックス環境で行う必要があり ます。サンドボックスの作成手順は次のとおりです。 1. 2. 3. 4. 5. Free Edition にログインします。 [設定] ➤ [データの管理] ➤ [Sandbox] の順にクリックします。 [新規 Sandbox] をクリックします。 [名前] を入力します (例: 「Dev」など)。 [コピー開始] をクリックします。 運用環境のコピーが完了するまで、少し時間がかかります。進捗状況を確認するには、ブラウザの画面を 更新してから [状況] 項目の表示をチェックします。コピーが完了するとメールの通知が届くため、そのま まにしておいても問題ありません。 コピーが完了したら、サンドボックス環境にログインします。 1. コピー中に別のページに移動した場合は、[設定] ➤ [データの管理] ➤ [Sandbox] を再度クリックし ます。 2. 名前の横の [ログイン] リンクをクリックします。 3. ログインページが表示されます。パスワードを入力して、[ログイン] をクリックします。 補足 ログイン画面に表示されるユーザ名は、通常の場合と異なり、「通常のユーザ名 + サンドボックス名」と いう形式になります。これは、複数のサンドボックス環境へのログインを可能にする目的で Force.com に よって自動的に生成された名前です。ブラウザのアドレスバーに表示される URL も通常のインスタンス の URL とは異なり、サンドボックスごとに、コピー元のインスタンスとは異なるサンドボックス用の URL が割り当てられます。 Force.com IDE を使用したプロジェクトの作成 Force.com IDE でプロジェクトを作成するには、次の手順を実行します。 1. [File] ➤ [New] ➤ [Force.com Project] の順にクリックします。 2. 利用中のエディションの資格情報をはじめとする設定情報を入力します。 a. [Project name] にプロジェクト名を入力します。1 つの組織で複数のプロジェクトを実行する可能性 を想定し、各プロジェクトを識別できるような名前を付けることをお勧めします。ここでは 「Workbook」と入力します。 b. [Username] にユーザ名を入力します (管理者ユーザのアカウントが必要です)。ユーザ名は電子メー ルアドレスの形式をとります。 c. [Password] にパスワードを入力します。 96 付録 アプリケーションの配布 d. サンドボックス環境で開発を行う場合は、[Environment] リストボックスから [Sandbox] を選択しま す。 e. [次へ] をクリックします。 メモ: 現在の IP が信頼できるネットワーク範囲として認識されていない場合 は、LOGIN_MUST_USE_SECURITY_TOKEN エラーが表示されます。これを解決するには、[設 定] ページで [私の個人情報] ➤ [私のセキュリティトークンのリセット]の順にクリックし て、セキュリティトークンをリセットする必要があります。 3. プロジェクトに含めるコンポーネントを指定する [Choose Initial Project Contents] ページで、[Finish] を クリックします。これにより、Apex や Visualforce のコンポーネントが取得されます。 アプリケーションの配布 アプリケーションが完成したら、さまざまな方法でアプリケーションを配布することができます。たとえ ば、アプリケーションを複数の組織に配布することを想定している場合は「パッケージ」を作成します。 単一の組織に限定して配布する場合は「展開」という手段を使用できます。 パッケージ パッケージとは、コンポーネント、コード、アプリケーションなどが詰まったスーツケースのようなもの で、アプリケーションを複数の組織に配布する場合によく利用します。Force.com プラットフォームで は、「未管理パッケージ」と「管理パッケージ」という 2 種類のパッケージをサポートしています。 未管理パッケージ - すべてのソースコードを含むバンドルコンポーネントのコピーを配布する場合に使 用します。通常、アップグレードオプションのない無償のパッケージとなります。パッケージの公開 者は、パッケージが配布先の組織にインストールされた後は、その組織内のパッケージのコンポーネ ントを管理することはできなくなります。 • 管理パッケージ - 公開者の知的財産やライセンスが保護された状態で、バンドルコンポーネントのコピ ーを配布する場合に使用します。管理パッケージを使用すると、顧客がインストールしたアプリケー ションがバージョンアップしたときにアップグレードを簡単に配布できます。AppExchange でアプリ ケーションをリリースする場合は、管理パッケージを作成することをお勧めします。 • 97 付録 アプリケーションの配布 パッケージの詳細については、オンラインヘルプで「パッケージの概要」のトピックを参照してくださ い。 展開 次のいずれかの方法で、作成したコードを利用中の運用環境に配布できます。 コマンドラインインターフェース - Force.com Migration Tool を使用します。詳細については、Force.com 開発者コミュニティの記事 wiki.developerforce.com/index.php/Migration_Tool_Guide (英語) を参照してく ださい。 • グラフィカルユーザインターフェース - Force.com IDE を使用します。詳細については、Force.com 開発 者コミュニティの記事 http://wiki.developerforce.com/index.php/JP:Force.com_IDE を参照してください。 • 98 株式会社セールスフォース・ドットコム 〒 106-6139 東京都港区六本木 6-10-1 六本木ヒルズ森タワー 39 階 0120-733-257 [email protected] www.salesforce.com/jp Copyright ©2009, salesforce.com, inc. All rights reserved. Salesforce.com and the“no software”logo are registered trademarks of salesforce.com, inc., and salesforce.com owns other registered and unregistered trademarks. Other names used herein may be trademarks of their respective owners. BK_ForcePlatformWorbook_v2_0_091709_J
© Copyright 2024 Paperzz