CAPとSAP Fiori toolsでコーディングなしのプロトタイプを作る(2)CAPプロジェクトの作成


はじめに

この記事は、SAP Inside Track 2021で発表した「CAPとSAP Fiori toolsでコーディングなしのプロトタイプを作る」に関する補足資料のパート2です。

ステップ

  1. SAP Business Application Stuidoのセットアップ
  2. CAPプロジェクトの作成(今回の記事)
  3. Fioriプロジェクトの作成

準備

Gitリポジトリからサンプルデータをダウンロードします。
https://github.com/miyasuta/InsideTrack-cap-fiori/tree/main/data

CAPプロジェクトの作成

SAP Business Application Studio(BAS)のスペースに入り、プロジェクトを作成します。

1. テンプレートからCAPプロジェクトを生成

  • File>New Project from Templateをクリック
  • CAP Projectを選択し、Startをクリック
  • プロジェクト名を入力し、Basic Sample Filesにチェックを入れてFinishをクリック

※ここにチェックを入れることでサンプルファイルが作成されるので、それを上書きして使うことができます

  • 右下に以下のポップアップが現れたら、Open in New Workspaceをクリック プロジェクトが開く。Basic Sample Filesにチェックを入れたので、赤枠のファイルが作成されている

2. ODataサービスを実行

サンプルファイルがあるので、すでにこのプロジェクトはODataサービスとして実行することができます。

  • Terminsl>New Terminslをクリック
  • ターミナルが開いたらnpm installと打って必要なモジュールをローカルにインストール
  • cds watchでサービスを実行し、ポップアップが出たらOpen in New Tabをクリック ブラウザが開く。ここからメタデータやエンティティにアクセスできる

3. db/data-model.cdsを編集

data-model.cdsファイルを以下の内容で上書きします。

namespace insidetrack.sample;

entity Projects {
    key projectCode : String                   @title : 'Project Code';
        projectName : String                   @title : 'Project Name';
        toCustomer  : Association to Customers @title : 'Customer';
        toManager   : Association to Users     @title : 'Manager';
        startsAt    : DateTime                 @title : 'Starts At';
        endsAt      : DateTime                 @title : 'Ends At';
        toStatus    : Association to Status    @title : 'Status';
        toTasks     : Composition of many Tasks
                          on toTasks.projectCode = $self.projectCode;
}

解説

  • namespace:エンティティをデータベースにテーブルやビューとして登録するときのプリフィックスになるものです。また、サービス定義からエンティティを参照するときにも使います。
  • title:項目のラベルを定義しています。@マークがついているのはアノテーションで、項目に情報を付加するために使います。
  • Association:他のエンティティへの関連(参照)を定義します。例えばAssociation to Customersは、このあとで定義するCustomerというエンティティとの関連を表します。関連を持たせることで、Customerエンティティから名称を取得したりすることができます。
  • Composition:Associationと似ていますが、Compositionはヘッダ-明細のように、親のエンティティに子のエンティティが従属する関係を表します(親がなければ子も存在しない)。

詳しく知りたい方は、公式ドキュメントを参照してください。

その他のエンティティも追加します。

entity Tasks {
    key projectCode : String                @title : 'Project Code';
    key taskId      : Integer               @title : 'Task Id';
        description : String                @title : 'Description';
        startsAt    : DateTime              @title : 'Starts At';
        endsAt      : DateTime              @title : 'Ends At';
        toStatus    : Association to Status @title : 'Status';
        toMembers   : Composition of many Members
                          on  toMembers.projectCode = $self.projectCode
                          and toMembers.taskId      = $self.taskId;
        toProject   : Association to Projects
                          on toProject.projectCode = $self.projectCode;
}

entity Members {
    key projectCode : String               @title : 'Project Code';
    key taskId      : Integer              @title : 'Task Id';
    key toMember    : Association to Users @title : 'Member';
        toTask      : Association to Tasks
                          on  toTask.projectCode = $self.projectCode
                          and toTask.taskId      = $self.taskId;
        toProject   : Association to Projects
                          on toProject.projectCode = $self.projectCode;
}

entity Customers {
    key customer : String @title : 'Customer';
        name     : String @title : 'Name';
}

entity Users {
    key user      : String @title : 'User ID';
        firstName : String @title : 'First Name';
        lastName  : String @title : 'Last Name';
        fullName  : String @title : 'Full Name';
}

entity Status {
    key status : Integer @title : 'Status';
        text   : String  @title : 'Text';
}

4. srv/cat-service.cdsを編集

cat-service.cdsを以下の内容で上書きします。

using insidetrack.sample as sample from '../db/data-model';

service CatalogService {
    entity Projects  as projection on sample.Projects;
    entity Tasks     as projection on sample.Tasks;
    entity Members   as projection on sample.Members;
    entity Customers as projection on sample.Customers;
    entity Users     as projection on sample.Users;
    entity Status    as projection on sample.Status;
}

解説

  • using insidetrack.sample as sample...:data-modeファイルのinsidetrack.sampleというnamespaceを、ここではsampleという名前で参照するという宣言をしています。
  • service CatalogService{...}:data-modeファイルで定義したエンティティを、ODataのエンティティとして公開することを宣言しています。entity Projects as projection on sample.Projectsは、data-modeファイルのProjectsというエンティティを、そのまま(項目を絞ったりはせずに)Projectsという名前で公開することを表しています。ODataとして公開するときにエンティティの名前を変えても問題ありません。

5. サンプルファイルをインポート

準備のステップでダウンロードしておいたサンプルファイルをdb/dataフォルダにドラッグ&ドロップでインポートします。ファイル名は<namespace>-<エンティティ名>.csvとします。
※もともと入っていたmy.bookshop-Books.csvというファイルは不要なので削除します。

サンプルファイルの中身を見てみましょう。アソシエーション、またはコンポジションしている項目は、項目名が<エンティティで定義した項目名>_<アソシエーション先のキー項目>となります。(例:_toCustomer_customer)

insidetrack.sample-Projects.csv
projectCode;projectName;toCustomer_customer;toManager_user;startsAt;endsAt;toStatus_status
PJA00101;排水管交換;CST001;MANAGER01;2020-01-25;2020-02-4;3
PJA00102;エアコン導入;CST002;MANAGER02;2020-01-30;2020-02-14;3
PJA00103;エアコン清掃;CST003;MANAGER02;2020-11-01;2020-11-01;3
PJA00104;掃除ロボット導入;CST004;MANAGER03;2020-12-01;2021-01-31;2
PJA00105;ドローンテスト;CST004;MANAGER03;2021-04-02;2021-05-02;1

6. ODataサービスのテスト

ブラウザをリフレッシュすると、以下のように追加したエンティティが表示されます。$metadataをクリックすると、メタデータを見ることができます。このメタデータがFiori toolsで必要になります。

次に、各エンティティが取得できるかどうかテストしてみましょう。

6.1. Projectエンティティを取得

上の画面でProjectsのリンクをクリックすると、Projectのデータが取得できます。
URI: .../catalog/Projects

6.2. アソシエーションでTasksエンティティを取得

以下をアドレスバーに入力すると、PJA00101にひもづくタスクが取得できます。
URI: .../catalog/Projects('PJA00101')/toTasks

6.3. アソシエーションでMembersエンティティを取得

さらに、2番目のタスクにアサインされたメンバーを取得してみましょう。
URI: .../catalog/Projects('PJA00101')/toTasks(projectCode='PJA00101',taskId=2)/toMembers

ここまででODataサービスは完成です。次回はFioriのUIを作成していきます。

参考(CAPについて)