SAP Public CloudでFioriからファイルアップロードする方法①の続きです。
1. データモデル
今回のサンプルでは、下記のようなデータモデルを設計しました。
Root Entity:ファイルアップロードの履歴を保持
Child Entity:その履歴に紐づくアップロードファイルの明細を保持
Root と Child の関係は 0..* となっており、1つのアップロード履歴に対して複数の明細(ファイル)を登録できる構成です。
このように 履歴と明細を分けることで、
いつ・誰が・どんな処理でアップロードしたか(履歴)
実際にアップロードされたファイルや付随情報(明細)
をそれぞれ整理して管理できるようになります。
2. CDSview
2.1 Root Entity
Interface view
ファイルアップロードの「履歴」を表すRoot Entityです。
@Semantics.largeObject を付与することで、Fiori FileUploaderから取り込んだファイルをBase64形式で受け取ることが可能になります。
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '##GENERATED #'
define root view entity ZR_PRFILEHEAD
as select from ztprfilehead as header
composition [0..*] of ZR_PRFILEITEM as _item
{
key key_uuid as KeyUUID,
@Semantics.largeObject:{
mimeType: 'Mimetype',
fileName: 'Filename',
acceptableMimeTypes: ['application/vnd.openxmlformats', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','text/csv','text/html'],
contentDispositionPreference: #ATTACHMENT
}
attachment as Attachment,
@Semantics.mimeType: true
mimetype as Mimetype,
filename as Filename,
upload as Upload,
execute_file as ExecuteFile,
status as Status,
process_number as ProcessNumber,
success_number as SuccessNumber,
error_number as ErrorNumber,
@Semantics.user.createdBy: true
local_created_by as LocalCreatedBy,
@Semantics.systemDateTime.createdAt: true
local_created_at as LocalCreatedAt,
@Semantics.user.localInstanceLastChangedBy: true
local_last_changed_by as LocalLastChangedBy,
@Semantics.systemDateTime.localInstanceLastChangedAt: true
local_last_changed_at as LocalLastChangedAt,
@Semantics.systemDateTime.lastChangedAt: true
last_changed_at as LastChangedAt,
_item
}
2.2 Child Entity
Interface view
こちらはファイルの内容を保持するChild Entityです。
取込んだCSVやExcelの1行ごとのデータを格納するイメージになります。
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '##GENERATED #'
define view entity ZR_PRFILEITEM
as select from ztprfileitem as item
association to parent ZR_PRFILEHEAD as _header
on _header.KeyUUID = $projection.KeyUUID
{
key key_uuid as KeyUUID,
key item_uuid as ItemUUID,
product as Product,
@Semantics.quantity.unitOfMeasure: 'Baseunit'
requestedquantity as Requestedquantity,
baseunit as Baseunit,
plant as Plant,
purchasingorganization as Purchasingorganization,
purchasinggroup as Purchasinggroup,
status as Status,
message as Message,
criticality as Criticality,
@Semantics.systemDateTime.createdAt: true
local_created_at as LocalCreatedAt,
@Semantics.user.localInstanceLastChangedBy: true
local_last_changed_by as LocalLastChangedBy,
@Semantics.systemDateTime.localInstanceLastChangedAt: true
local_last_changed_at as LocalLastChangedAt,
@Semantics.systemDateTime.lastChangedAt: true
last_changed_at as LastChangedAt,
_header
}
3. Behavior Definition
Behavior Definition (BDEF) では、アップロード処理の流れを制御します。
getDataFile:ファイルを取り込んだ際に Child Entity に展開する処理
execute_filedata:保存ボタン押下時に標準データの登録を行う処理
managed implementation in class ZCL_PRFILEHEAD unique;
strict ( 2 );
with draft;
define behavior for ZR_PRFILEHEAD alias header
persistent table ztprfilehead
draft table ZDPRFILEHEAD
etag master LocalLastChangedAt
lock master total etag LastChangedAt
authorization master( global )
{
field ( readonly )
KeyUUID,
Status,
ProcessNumber,
SuccessNumber,
ErrorNumber,
LocalCreatedAt,
LocalCreatedBy,
LastChangedAt,
LocalLastChangedAt,
LocalLastChangedBy;
field ( numbering : managed )
KeyUUID;
create;
update;
delete;
draft action Edit;
draft action Activate;
draft action Discard;
draft action Resume;
draft determine action Prepare;
// ファイルデータ読込
determination getDataFile on modify { field Attachment; }
// ファイルデータ登録
determination execute_filedata on save { create; }
// リカバリ実行
action ( features : instance ) recovery_execute result [1] $self;
association _item { create; with draft; }
mapping for ZTPRFILEHEAD
{
KeyUUID = KEY_UUID;
Attachment = ATTACHMENT;
Mimetype = MIMETYPE;
Filename = FILENAME;
Upload = UPLOAD;
ExecuteFile = EXECUTE_FILE;
Status = STATUS;
ProcessNumber = PROCESS_NUMBER;
SuccessNumber = SUCCESS_NUMBER;
ErrorNumber = ERROR_NUMBER;
LocalCreatedBy = LOCAL_CREATED_BY;
LocalCreatedAt = LOCAL_CREATED_AT;
LocalLastChangedBy = LOCAL_LAST_CHANGED_BY;
LocalLastChangedAt = LOCAL_LAST_CHANGED_AT;
LastChangedAt = LAST_CHANGED_AT;
}
}
define behavior for ZR_PRFILEITEM alias item
persistent table ztprfileitem
draft table ZDPRFILEITEM
lock dependent by _header
authorization dependent by _header
{
field ( readonly )
KeyUUID,
LocalCreatedAt,
LastChangedAt,
LocalLastChangedAt,
LocalLastChangedBy;
field ( numbering : managed )
ItemUUID;
update;
delete;
association _header;
mapping for ZTPRFILEITEM
{
KeyUUID = KEY_UUID;
ItemUUID = ITEM_UUID;
Product = PRODUCT;
Requestedquantity = REQUESTEDQUANTITY;
Baseunit = BASEUNIT;
Plant = PLANT;
Purchasingorganization = PURCHASINGORGANIZATION;
Purchasinggroup = PURCHASINGGROUP;
Status = status;
Message = message;
Criticality = criticality;
LocalCreatedAt = LOCAL_CREATED_AT;
LocalLastChangedBy = LOCAL_LAST_CHANGED_BY;
LocalLastChangedAt = LOCAL_LAST_CHANGED_AT;
LastChangedAt = LAST_CHANGED_AT;
}
}
4. まとめ
ここまでで、SAP Public Cloudにおける「Fioriからファイルアップロード」を実現するために必要なデータモデル → CDS View → Behavior Definitionの流れを紹介しました。
データモデル
履歴(Root)と明細(Child)の2階層構造でファイルを管理できるように設計しました。
CDS View
@Semantics.largeObject を使うことで、Fiori FileUploaderからBase64形式のファイルを受け取り、保持する仕組みを用意しました。
Behavior Definition
ファイルアップロードや取込処理を「determination」で制御し、Child Entityへデータを展開する動作定義を行いました。
③では、Behavior Definition内のABAPソースコードを紹介したいと思います!