在庫・発注照会の実装範囲
- 部品在庫と発注状況をAgentforceから照会する構成です。
- 検索処理はApexの@InvocableMethodで呼び出します。
- Agent Builderには、製造管理の質問を受けるManufacturingSupportトピックを設定しました。
現場からの在庫・納期の問い合わせ
想定した問い合わせは、次のようなものです。
- ベアリングの在庫は何個ありますか?
- 発注したサーボモーターはいつ届きますか?
- 安全在庫を下回る部品はありますか?
- 遅延している発注はありますか?
Salesforce Agentforceで試したかったのは、質問の言葉から検索条件を渡せるかどうかです。部品名で在庫を調べた後、そのまま登録済みの発注状況を尋ねました。
| 項目 | 内容 |
|---|---|
| 対象読者 | 製造業のIT担当者、Salesforce管理者、生産管理担当者 |
| 前提知識 | ApexとSalesforceの管理設定 |
| 作業範囲 | Apex開発とAgent Builder設定 |
| 環境の想定 | Salesforce Enterprise Edition以上とAgentforceライセンスを想定しています。画面・操作名は2026年4月のものです。 |
完成イメージ
既存のエージェントに製造管理用のトピックを追加して検証しました。
在庫照会
ユーザー
ベアリングの在庫を教えてください
エージェント
ベアリング 6205ZZ、型番BRG-6205ZZの現在庫は8個です。安全在庫15個を下回っているため「要発注」となっています。保管場所は部品庫C-2棚です。
発注データには、この部品の未入荷発注20個が登録されています。在庫検索の「要発注」は現在庫と安全在庫の比較による表示で、手配済みの20個を判定に含めていません。
発注ステータス確認
ユーザー
遅延している発注はありますか?
エージェント
「遅延」として登録されている発注が見つかりました。
| 項目 | 内容 |
|---|---|
| 発注番号 | PO-20260315-001 |
| 部品 | ベアリング 6205ZZ / BRG-6205ZZ |
| 数量 | 20個 |
| 仕入先 | あおば精機株式会社 |
| 納期項目の登録値 | 2026-03-28 |
| ステータス | 遅延 |
| 遅延理由 | 仕入先の在庫切れ |
| 備考の入荷予定 | 2026-04-02入荷予定 |
遅延理由と入荷予定は、発注の備考に登録した内容です。「遅延」は登録されたステータスです。
システムの構成
在庫はカテゴリや安全在庫割れ、発注は仕入先や未納状態で絞ります。この入力条件の違いに合わせて、私は在庫検索と発注照会のアクションを分けました。
- Topic Selectorが質問に応じてManufacturingSupportを選択します。
- InventorySearchActionの検索先はInventory__cです。
- OrderStatusActionはPurchase_Order__cを検索します。
- Agentforceは検索結果のテキストを受け取り、日本語の回答に整えます。
- 在庫データには、部品の型番、数量、単位、保管場所を持たせます。
- 在庫判定に使う値は、現在庫数と安全在庫数です。
- 発注データは、発注番号ごとに部品と仕入先を持つ構成です。
1. 在庫・発注用のカスタムオブジェクトを作成する
設定 > オブジェクトマネージャー > 作成 > カスタムオブジェクトから、Inventory__cとPurchase_Order__cを作成します。
Inventory__c(部品在庫)
| 項目名 | API参照名 | データ型 | 説明 |
|---|---|---|---|
| 部品名 | Name | テキスト | 部品の名称。例はベアリング 6205ZZ |
| 型番 | PartNumber__c | テキスト(50) | 型番コード。例はBRG-6205ZZ |
| カテゴリ | Category__c | 選択リスト | 機械部品 / 電子部品 / 素材 / 消耗品 |
| 現在庫数 | CurrentStock__c | 数値 | 現在の在庫数量 |
| 安全在庫数 | SafetyStock__c | 数値 | 需要や供給の変動に備える在庫数 |
| 単位 | Unit__c | テキスト(20) | 個 / 本 / 枚 / 缶 / 台 など |
| 保管場所 | Location__c | テキスト(100) | 倉庫・棚番号。例は部品庫C-2棚 |
Purchase_Order__c(発注)
| 項目名 | API参照名 | データ型 | 説明 |
|---|---|---|---|
| 発注番号 | Name | テキスト | PO番号。例はPO-20260315-001 |
| 部品名 | PartName__c | テキスト(100) | 発注した部品の名称 |
| 型番 | PartNumber__c | テキスト(50) | 発注した部品の型番 |
| 数量 | Quantity__c | テキスト(50) | 数量と単位。例は20個 |
| 仕入先 | Supplier__c | テキスト(100) | 仕入先企業名 |
| 発注日 | OrderDate__c | 日付 | 発注した日付 |
| 納期 | DeliveryDate__c | 日付 | 納品予定日 |
| ステータス | Status__c | 選択リスト | 発注済み / 製造中 / 出荷待ち / 納品済み / 遅延 |
| 備考 | Note__c | テキストエリア | 遅延理由など |
Quantity__cは数量と単位を合わせた表示用の文字列です。
項目のアクセス権
FLS(項目レベルセキュリティ)では、エージェントの実行ユーザーに参照を許可する項目を設定します。
プロファイルからの設定は、設定 > オブジェクトマネージャー > 対象オブジェクト > 項目とリレーション > 対象項目 > 項目レベルセキュリティの設定で行います。
権限セットを使う場合は、設定 > 権限セット > 新規 > オブジェクト設定で参照権限を付与し、Apexクラスへのアクセスも設定します。
デモデータの登録
登録には手入力か、設定 > データ > データインポートウィザードを使います。在庫の数値と単位は別項目、発注の遅延理由と入荷予定は備考に入れる構成です。
Inventory__cのデモデータ
| 部品名 | 型番 | カテゴリ | 現在庫 | 安全在庫 | 表示用の判定結果 |
|---|---|---|---|---|---|
| ステンレス鋼板 SUS304 | MTL-SUS304-2B | 素材 | 45枚 | 30枚 | 安全在庫以上 |
| 六角ボルト M8×30 | BLT-M8-30 | 機械部品 | 120本 | 200本 | 安全在庫割れ |
| ベアリング 6205ZZ | BRG-6205ZZ | 機械部品 | 8個 | 15個 | 安全在庫割れ |
| コンデンサ 100μF 25V | ELC-CAP100U25 | 電子部品 | 350個 | 200個 | 安全在庫以上 |
| 切削油 ネオクール | OIL-NC-18L | 消耗品 | 3缶 | 5缶 | 安全在庫割れ |
| アルミフレーム 40×40 | ALF-4040-2000 | 素材 | 22本 | 10本 | 安全在庫以上 |
| サーボモーター HG-KR23 | MOT-HGKR23 | 機械部品 | 2台 | 3台 | 安全在庫割れ |
| エンドミル φ10 4枚刃 | TLS-EM10-4F | 消耗品 | 6本 | 10本 | 安全在庫割れ |
Purchase_Order__cのデモデータ
| 発注番号 | 部品 | 仕入先 | ステータス・備考 |
|---|---|---|---|
| PO-20260315-001 | ベアリング 6205ZZ | あおば精機株式会社 | 遅延。仕入先在庫切れのため4/2入荷予定 |
| PO-20260318-002 | 六角ボルト M8×30 | みどり金属工業株式会社 | 納品済み |
| PO-20260320-003 | サーボモーター HG-KR23 | はるか電機株式会社 | 製造中。4/10予定 |
| PO-20260322-004 | エンドミル φ10 4枚刃 | こだま工具販売株式会社 | 出荷待ち |
| PO-20260325-005 | 切削油 ネオクール | みどり金属工業株式会社 | 発注済み |
| PO-20260326-006 | コンデンサ 100μF 25V | はるか電機株式会社 | 発注済み |
2. 在庫検索アクションの入力と検索条件
| 機能 | 説明 |
|---|---|
| キーワード検索 | 部品名・型番を検索。入力を空白で分割して条件を作成 |
| カテゴリフィルタ | 機械部品、電子部品、素材、消耗品で絞り込み |
| 在庫不足フィルタ | lowStockOnly=trueで安全在庫割れの部品のみ抽出 |
| 安全在庫割れ判定 | 現在庫と安全在庫を比較 |
コード(主要部分)
@InvocableVariableで入力を受け取り、部品名と型番の検索条件を組み立てる部分です。
String.escapeSingleQuotesで引用符を処理しています。入力に含まれる%と_は、LIKEのワイルドカードとして働きます。
public with sharing class InventorySearchAction {
// ── Agentforceからの入力パラメータ定義 ──
public class SearchRequest {
@InvocableVariable(required=false label='部品名・型番'
description='検索したい部品名または型番')
public String partName;
@InvocableVariable(required=false label='カテゴリ'
description='カテゴリでフィルタ(機械部品、電子部品、素材、消耗品)')
public String category;
@InvocableVariable(required=false label='在庫少フラグ'
description='trueの場合、安全在庫を下回っている部品のみ表示')
public Boolean lowStockOnly;
}
// ── 動的SOQLの構築 ──
@InvocableMethod(label='在庫検索' description='部品・資材の在庫数量を検索します。')
public static List<SearchResponse> searchInventory(List<SearchRequest> requests) {
SearchRequest req = requests[0];
String query = 'SELECT Name, PartNumber__c, Category__c, '
+ 'CurrentStock__c, SafetyStock__c, Unit__c, Location__c '
+ 'FROM Inventory__c';
List<String> conditions = new List<String>();
// キーワード検索
if (String.isNotBlank(req.partName)) {
for (String token : req.partName.trim().split('\\s+')) {
String escaped = String.escapeSingleQuotes(token);
conditions.add('(Name LIKE \'%' + escaped + '%\' OR PartNumber__c LIKE \'%' + escaped + '%\')');
}
}
// ... WHERE句の結合、クエリ実行、レスポンス生成
// 検索結果をテキストに整形し、現在庫 < 安全在庫 なら「要発注」と判定して返却
}
}在庫検索の実装上の要点
@InvocableMethodを付けたこのメソッドは、requests[0]を処理します。- 各検索語をNameとPartNumber__cの部分一致条件にしています。
CurrentStock__c < SafetyStock__cが在庫の判定条件です。
3. 発注ステータス確認アクションの設計
OrderStatusActionには、発注番号・部品名・仕入先による検索と、未納状態での絞り込みを持たせます。
| 項目 | InventorySearchAction | OrderStatusAction |
|---|---|---|
| 検索対象 | Inventory__c | Purchase_Order__c |
| 入力パラメータ | partName, category, lowStockOnly | searchQuery, supplierName, pendingOnly |
| キーワード検索対象 | 部品名 Name / 型番 PartNumber__c | 発注番号 Name / 部品名 PartName__c / 型番 PartNumber__c |
| フィルタ条件 | カテゴリ完全一致 / 安全在庫割れ | 仕入先部分一致 / 未納ステータス |
| ソート | Name昇順 | 納期 DeliveryDate__c昇順 |
| 特殊処理 | 現在庫と安全在庫を比較 | ステータスが「遅延」なら備考の遅延理由を表示 |
| 機能 | 説明 |
|---|---|
| キーワード検索 | 発注番号・部品名・型番で検索 |
| 仕入先フィルタ | 仕入先名で部分一致検索 |
| 未納フィルタ | pendingOnly=trueで「発注済み・製造中・出荷待ち・遅延」のみ抽出 |
| 遅延理由表示 | ステータスが「遅延」の場合、備考を回答に使用 |
4. デプロイ
ローカルのDXプロジェクトに取得済みの設定を、認証済みのサンドボックスへ配備するコマンドです。カスタムオブジェクトを先に、Apexクラスを後にデプロイします。
# カスタムオブジェクトのデプロイ
sf project deploy start \
--source-dir force-app/main/default/objects/Inventory__c \
--source-dir force-app/main/default/objects/Purchase_Order__c \
--target-org your-sandbox
# Apexクラスのデプロイ
sf project deploy start \
--source-dir force-app/main/default/classes \
--target-org your-sandbox5. GenAiFunctionをデプロイする
アクションの登録にはGenAiFunction(Agentforceのアクションを定義するメタデータ)を使います。
InventorySearch(在庫検索)
genAiFunctions/InventorySearch/にXMLと、入出力用のinput/schema.json、output/schema.jsonを配置します。
<GenAiFunction xmlns="http://soap.sforce.com/2006/04/metadata">
<description>部品・資材の在庫数量を検索します。</description>
<developerName>InventorySearch</developerName>
<invocationTarget>InventorySearchAction</invocationTarget>
<invocationTargetType>apex</invocationTargetType>
<isConfirmationRequired>false</isConfirmationRequired>
<masterLabel>在庫検索</masterLabel>
</GenAiFunction>OrderStatus(発注ステータス確認)
genAiFunctions/OrderStatus/ディレクトリにも同様のXMLを作成します。developerNameをOrderStatus、invocationTargetをOrderStatusAction、masterLabelを発注ステータス確認に変更してください。
# GenAiFunctionメタデータのデプロイ
sf project deploy start \
--source-dir force-app/main/default/genAiFunctions \
--target-org your-sandbox6. Agent Builderでの設定
設定 > Einstein > エージェントから対象エージェントを開き、Agent Builderを起動します。
トピックの作成
「New Topic」ボタンからトピックを作成します。
| 設定項目 | 値 |
|---|---|
| Topic Label | ManufacturingSupport |
| Description | 製造業の在庫管理・発注管理に関する質問に回答する |
| Scope | 在庫照会、発注ステータス確認、照会時の安全在庫割れ表示 |
Instructions(指示文)の設定
- ユーザーが在庫について質問した場合は、在庫検索アクションを使用してください
- 発注ステータスや納期について質問された場合は、発注ステータス確認アクションを使用してください
- 安全在庫を下回っている部品がある場合は「要発注」と明確に警告してください
- 発注が遅延している場合は、遅延理由と新しい納期予定日を伝えてください
- 回答は日本語で、具体的な数値を含めて回答してくださいアクションの追加
トピックの「Actions」で「Add from Asset Library」を開き、在庫検索と発注ステータス確認を選択します。
| アクション名 | 対応するApexクラス |
|---|---|
| 在庫検索 | InventorySearchAction |
| 発注ステータス確認 | OrderStatusAction |
バージョンの確定と有効化
設定を保存し、Previewで「ベアリングの在庫」と入力して検索対象と回答の数値を照合します。その後、Save、Commit Version、Activateの順に操作します。
動作検証
テスト1:在庫照会
Previewで「ベアリングの在庫を教えてください」と入力しました。インタラクション概要には、トピック選択、在庫検索、回答生成の順で処理が表示されました。表の処理時間は、この在庫照会1回の各区間に表示された値です。
| ステップ | 内容 | 処理時間 |
|---|---|---|
| 入力 | 「ベアリングの在庫を教えてください」 | - |
| 推論Topic Selector | 質問内容を解析し、ManufacturingSupportトピックを選択 | 520ms |
| トピックに移行 | ManufacturingSupport | - |
| 推論ManufacturingSupport | partName=「ベアリング」で在庫検索アクションを呼ぶと判断 | 395ms |
| アクション 在庫検索 | InventorySearchActionを実行、1件の結果を返却 | 586ms |
| 推論ManufacturingSupport | 検索結果を日本語に整形して回答を生成 | 822ms |
テスト2:遅延として登録された発注の照会
続けて「遅延している発注はありますか?」と入力しました。
発注照会で確認した動作
- 発注の質問を受けたトピックもManufacturingSupportでした。
- 発注ステータス確認アクションへの入力は
pendingOnly=trueです。この条件はデモ表の6件中、納品済みを除く5件を対象にするため、遅延だけを求める質問とは範囲がずれます。 - 回答には備考の遅延理由が含まれていました。
本番環境への発展
ERPとの連携
ERPへ接続する場合は、在庫検索の取得先を変更する設計になります。
| データの所在 | 方式 | 照会方法 |
|---|---|---|
| Salesforceカスタムオブジェクト | SOQL | Salesforce内の在庫データを検索 |
| SAP / Oracle ERPのOData公開データ | Salesforce ConnectでOData接続 | 接続先で更新されたERP在庫データを参照 |
| 自社在庫管理システム | Apex HTTPコールアウト | 既存システムのAPIを直接呼び出し |
| 移行期のスプレッドシート | CSVをカスタムオブジェクトにインポート | 既存の表をSalesforceへ取り込んで照会 |
照会条件の追加と機能拡張
| ユースケース | 対応するアクション・追加開発 |
|---|---|
| 「在庫が少ない部品を一覧で見せて」 | 在庫検索のlowStockOnly=true |
| 「あおば精機への発注状況は?」 | 発注ステータス確認のsupplierName指定 |
| 「今月納品予定の発注は?」 | 発注ステータス確認に日付フィルタを追加 |
| 「部品Xの発注を自動で起票して」 | 発注作成アクションを新規開発 |
| 「在庫推移のグラフを見せて」 | 在庫履歴 + レポートアクション |
今回の構成
| 要素 | 内容 |
|---|---|
| カスタムオブジェクト | Inventory__cに部品在庫8件、Purchase_Order__cに発注6件 |
| Apexクラス | InventorySearchActionが在庫検索、OrderStatusActionが発注状況確認を担当 |
| GenAiFunction | 2つのアクションをAgent Builderに登録するメタデータ |
| Agentforceトピック | ManufacturingSupportで製造管理の質問に対応 |
デモデータの企業名はすべて架空です。
Agentforceの導入・構築についてお気軽にご相談ください
はてなベースでは、Salesforce Agentforceを活用した業務効率化の導入支援を行っています。在庫管理・発注管理のAI化にご興味がある方はお気軽にお問い合わせください。