1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-08

##はじめに
この記事は、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をクリック
    image.png
  • CAP Projectを選択し、Startをクリック
    image.png
  • プロジェクト名を入力し、Basic Sample Filesにチェックを入れてFinishをクリック

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

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

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

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

###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というファイルは不要なので削除します。
image.png

サンプルファイルの中身を見てみましょう。アソシエーション、またはコンポジションしている項目は、項目名が<エンティティで定義した項目名>_<アソシエーション先のキー項目>となります。(例:_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で必要になります。
image.png
次に、各エンティティが取得できるかどうかテストしてみましょう。

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

####6.2. アソシエーションでTasksエンティティを取得
以下をアドレスバーに入力すると、PJA00101にひもづくタスクが取得できます。
URI: .../catalog/Projects('PJA00101')/toTasks
image.png

####6.3. アソシエーションでMembersエンティティを取得
さらに、2番目のタスクにアサインされたメンバーを取得してみましょう。
URI: .../catalog/Projects('PJA00101')/toTasks(projectCode='PJA00101',taskId=2)/toMembers
image.png

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

##参考(CAPについて)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?