SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ActiveReports)byメシウス(AD)

OutSystems上で簡単なシステムを作成し、ActiveReportsJSを活用した帳票機能を構築する

JavaScript帳票ライブラリ「ActiveReportsJS」の活用事例

  • X ポスト
  • このエントリーをはてなブックマークに追加

ActiveReportsJSのレポート定義

 ActiveReportsJSが提供するデザイナーアプリケーションを使ってレポート定義を作っていきます。

作成するレポート

 個別の注文情報に対する請求書を、以下のようなレポートとして作成します。

[レポートイメージ
レポートイメージ

 サンプルアプリケーションのOrderDetail画面で持っている以下のAggregateがデータソースとして使えます。

  • GetOrder: 見出し部分のデータソースとして
  • GetOrderItemsByOrderId: 一覧部分のデータソースとして
[OrderDetail画面で取得しているデータ
OrderDetail画面で取得しているデータ

サンプルデータを準備する

 ActiveReportsJSのレポートへのデータソース設定には、以下の方法があります。

  • 外部URLから取得する
  • レポート自体に埋め込む

 OutSystemsは簡単にREST APIを作成できますが、REST APIとWebアプリケーションは、ユーザーの認証を共有しないので、レポート自体に埋め込む方法を取ります。このとき、レポートにデータ構造を知らせるため、サンプルデータが必要になります。

 OrderDetailのAggregateをレポート用画面に一時的にコピーし、結果をJSON Serializeすることでサンプルデータを取得しましょう。OrderManagementモジュールを開き、Order UI Flowに新しい画面を作り、名前はOrderDetailReportに変更。続いて、OrderDetail画面から、Input ParameterのOrderId、AggregateのGetOrder(見出しデータ)とGetOrderItemsByOrderId(一覧データ)をコピーして下さい。

元々あるOrderDetailの3つの要素をOrderDetailReportにコピー&ペースト
元々あるOrderDetailの3つの要素をOrderDetailReportにコピー&ペースト

 ここまでで、作成したOrderDetailReport画面を開く際に、必要なデータが取得されるようになっています。続いて、このデータをJSONに変換したうえで画面に表示しましょう。

 以下の手順は見出しデータ(GetOrder)、一覧データ(GetOrderItemsByOrderId)それぞれに対して行います。ここでは一覧データを例に説明します。

 GetOrderItemsByOrderId AggregateにOn After Fetchイベントハンドラーを作成(GetOrderItemsByOrderIdを選択し、画面右下のプロパティから、Events > On After Fetchのドロップダウンリストを展開、New Client Actionを選択)。

 On After Fetchでは、JSONSerializeによって、GetOrder Aggregateの結果をJSON文字列に変換し、画面表示用のLocal VariableにAssignします(JSONSerializeとAssignはService Studio左側のToolboxからドラッグ&ドロップでFlowに配置)。

On After Fetchの実装
On After Fetchの実装

 JSONSerializeでは、Aggregateの結果(Aggregate名.Listで、DBから出力したレコードのリストを表す)を指定します。

Aggregateの結果をJSON Serializeする
Aggregateの結果をJSON Serializeする

 JSON Serializeした結果を後続のAssignで画面のLocal Variableに保存します(Local Variableは、画面を選択して右クリックし、Add Local Variableを選択。Data TypeはText)。

 Local Variableを画面上にドラッグ&ドロップすると、値を表示するExpressionが配置されます。ここまで実装したらPublishし、ブラウザで画面を表示します(※)。画面に表示されたJSON文字列をテキストエディタなどに一時保存しておいて下さい。

 (※)Service Studio上で画面を選択して右クリック、Open in Browserでその画面がブラウザで開きます。Input Parameter OrderIdが必要なので、ブラウザが開いたら、URLの末尾に「&OrderId=1」を追加してください。1は実在するOrderレコードのIdにする必要があるので、もしIdがお使いの環境でずれて発番されているようなら合わせてください。

レポート定義ファイルを作成

 ActiveReportsJS Designerアプリケーションを起動します。画面上部のファイルメニューをクリックし、新規作成 > 新規レポートの作成からページレポートを選択します。

新規レポートの作成
新規レポートの作成

データを連結

 コピーしておいたサンプルデータのJSONをレポートに埋め込みます。見出しデータで説明しますが、一覧データでも同じ手順を行って下さい。どこからデータを取得するかを定義するデータソースを作成します。画面右上のデータタブを開き、データソース右側の「+ 追加」をクリック。

データソースの追加
データソースの追加

 表示されたダイアログで、以下を入力し、「変更を保存」ボタンをクリック。

  • 名前:DataSource見出し
  • 形式:埋め込みを選択(ダイアログの下半分がJSONデータ入力用に変わる)
  • JSONデータ:用意しておいた見出しデータのサンプルを貼り付ける
データソースの追加 - ダイアログ
データソースの追加 - ダイアログ

 次に、データソースからデータセットを作成します。作成したデータソース右側の「+」アイコンをクリック。

データセットの追加
データセットの追加
  • 名前:DataSource見出し
  • JSONパス:全てのデータを指す「$.*」

 と入力し、「検証」ボタンをクリック。データソースに含まれるフィールドの数が、データベースフィールド項目に反映されます。「変更を保存」ボタンをクリックして入力を保存。

データセットの追加 - ダイアログ
データセットの追加 - ダイアログ

 一覧データでも同じことをすると、以下のようになります。

データセット設定完了後
データセット設定完了後

レポートデザイン

 ActiveReportsJSのレポートデザインは、OutSystemsで画面をデザインする操作と似ています。画面左側のメニューからレポートコントロールをUI上にドラッグ&ドロップで配置し、画面右側でプロパティを設定します。

固定の文字列にはTextBoxコントロール

 画面左側からTextBoxコントロール(コントロール名はマウスオーバーすると表示される)をドラッグ&ドロップして、レポート内に配置します。

TextBoxコントロールの配置
TextBoxコントロールの配置

 配置したコントロールを選択した状態で、画面上部のツールバーや右側のプロパティタブを使って表示内容を調整します。

 「請求書」項目の場合の設定例。

請求書項目のプロパティ
請求書項目のプロパティ
画像はImageコントロールで

 画像を配置したい場所にImageコントロールをドラッグ&ドロップ。

Imageコントロール
Imageコントロール

 手元の画像をレポート内に埋め込みたいときは、外観 > 画像プロパティのリストを展開し、「埋め込み」を選択します。「+ 読み込む」から、使いたい画像ファイルを選択して下さい。

Imageコントロールのプロパティ
Imageコントロールのプロパティ

 この記事のサンプルレポートでは以下の画像を使っています。

社印イメージ
社印イメージ
動的な文字列をTextBoxに表示する

 以下の2か所を、見出しデータセットから動的に表示します。

動的に表示するTextBoxコントロール
動的に表示するTextBoxコントロール

①注文番号

 見出しデータセットの、注文番号(Order.Code)を表示する設定を行います。TextBoxコントロールを選択し、プロパティの値項目右の「●」と式をクリックすると、式エディタが開きます。

式エディタを起動
式エディタを起動

 式欄に出力したい文字列を設定しますが、波括弧({})で囲んだ部分(補間構文)は実行時に評価された結果で置き換えられます。また、ダイアログ左のツリーからデータセット > DataSet見出しと展開し、その下にあるOrder.Codeをダブルクリックすると、この項目を出力する補間構文を式のカーソル位置に挿入してくれます。

 First関数呼び出しが挿入されますが、見出しデータには1件しかデータがないはずなので問題ないでしょう。実際の出力は「注文番号:ORD0001」のようになります。

Order.Codeを編集する式
Order.Codeを編集する式

②宛先

 こちらは請求書送付先となる企業名(Account.Company)を出力します。式は「{First([Account.Company], "DataSet見出し")} 御中」、実行結果例は「Business fluence 御中」のようになります。

Tableへのバインディング

 一覧データには、Tableコントロールを使います。他のコントロールと同じようにドラッグ&ドロップで配置します。

Tableコントロールを配置
Tableコントロールを配置

 配置したTable上でクリックすると以下の状態になります。

Tableの調整
Tableの調整

 列間にマウスオーバーし、現れた+のアイコンをクリックして5列に増やして下さい。次に行ヘッダの位置にあるヘッダ、詳細、フッタを表すアイコンの内、フッタを表すものを選択し、Deleteキーで削除します。このレポートでは一覧内に集計行を表示しないためです。

 各セルにはTextBoxコントロールがあるため、値の設定を行います。ヘッダ行のセルには、固定の文字列を入力して下さい。詳細行には式を入力します。

  1. 商品名の詳細: {[Product.Name]}
  2. 単価の詳細: {[Product.Price]}
  3. 数量の詳細: {[OrderItem.Quantity]}
  4. 値引の詳細: {IIF([OrderItem.Discount] = 0, "", ToString([OrderItem.Discount]) + "%")}
  5. 小計の詳細: {PricePerRow}

 「値引」項目は、IIF(条件式,条件がTrueのときの式, 条件がFalseのときの式)という関数を使っています。OutSystemsにもIfという同じ役割を果たすBuilt-in Functionがありますね。

 「小計」項目は、計算フィールドという機能を使って、DataSetにあらかじめ計算式結果に対応する項目をPricePerRowという名前で用意しておき、その値を表示する指定です。

 計算フィールドを追加するには、一覧データのDataSet右側の編集アイコン(ペンのアイコン)をクリックしてダイアログを表示し、計算フィールド右側の表示アイコン(ハンバーガーアイコン)をクリック。

DataSet一覧の編集 - 開始
DataSet一覧の編集 - 開始

 フィールド名=PricePerRow、値={[OrderItem.Quantity] * [Product.Price] * ((100 - [OrderItem.Discount]) / 100)}と入力し、「変更を保存」ボタンをクリックして確定します。式の意味は、数量 × 単価 × (1-割引率)で割引適用後の小計を出しています。

DataSet一覧の編集 - 計算フィールド
DataSet一覧の編集 - 計算フィールド
集計項目

 Table内で計算フィールドを作っておいたのはここで計算結果を流用するためです。「ご請求金額」の右隣のTextBoxコントロールの値に以下の式を入力して下さい。

 {Sum(PricePerRow, "DataSet一覧")}

 DataSet一覧というDataSet内のPricePerRowをSumという関数で足し合わせた結果を表示する式です。

次のページ
レポート画面を実装する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ComponentZine(ActiveReports)byメシウス連載記事一覧

もっと読む

この記事の著者

渡部 潤司(ワタナベ ジュンジ)

 Low-Code開発プラットフォームのOutSystems専門技術者/OutSystems MVP。 業務でOutSystemsの技術支援、アーキテクト、教育など担当しながら、関連情報をBlogやQiitaに投稿しています。 Expert Web DeveloperなどOutSystemsの各種認...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

提供:メシウス株式会社

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20262 2024/10/30 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング