このページでは、アプリケーション側(HaluProject)のディレクトリ構成と、各フォルダに配置するファイルの役割・規約・呼び出しタイミング、画面・バッチ・帳票の処理の流れを説明します。データの経路は「データ移送の仕組み」、フレームワークの内部構造は「HaluServer詳細」を参照してください。
ディレクトリ構成
アプリケーション側(HaluProject)のディレクトリ構成は次のとおりです。

プロジェクトのルートフォルダは、アプリケーションごとにApplicationの下に作成します。ルートフォルダ名は、アプリケーションのURLの一部(/Application/{ルートフォルダ名}/…)になります。
Sampleの場合は次のとおりです。
・ルートフォルダ:HaluProject\Halu\Application\Sample
・ログイン画面のURL:http://{サーバー}:{ポート}/Application/Sample/Html/Apps/Login/index.html
※Sampleには、ほかに設計書(docs)・DBバックアップのフォルダが含まれます。
必要なファイル一式
画面・バッチ・帳票を作成するときに必要なファイルの一覧です。配置先は、プロジェクトのルートフォルダからのパスです。各ファイルの役割は、配置するフォルダの見出し(Html・Json・Serverなど)で説明します。
画面
画面は、Html・Json・Serverの各フォルダの下のApps/{画面名}/に配置するファイルで構成されます。トランザクション名({トランザクション名})は、appspec.jsのrequestInfoに登録する名前です。
| 配置先 | ファイル | 要否 |
|---|---|---|
Html/Apps/{画面名} | index.html | 必須 |
Html/Apps/{画面名} | {画面名}.appspec.js | 必須 |
Html/Apps/{画面名} | {画面名}.main.js | 必須 |
Html/Apps/{画面名} | {画面名}.controller.js | 必須 |
Html/Apps/{画面名} | {画面名}.model.js | 必須 |
Html/Apps/{画面名} | {画面名}.view.js | 必須 |
Html/Apps/{画面名}/css | program.css | 任意(画面固有のスタイルがある場合) |
Json/Apps/{画面名} | {画面名}_dataset.json | 必須(appspec.jsのjsonInfoで"no"にした場合は不要) |
Json/Apps/{画面名} | {画面名}_validation.json | 必須(appspec.jsのjsonInfoで"no"にした場合は不要) |
Json/Apps/{画面名} | {画面名}_{トランザクション名}_tran.json | 必須(トランザクションごと) |
Json/Apps/{画面名} | {画面名}_{トランザクション名}_sql.json | 必須(トランザクションごと。tran.jsonのrequest.modelが"yes"でない場合は不要) |
Server/Apps/{画面名} | {画面名}_controller.py | 任意(tran.jsonのrequest.progが"yes"の場合) |
Server/Apps/{画面名} | {画面名}_model.py | 任意(sql.jsonのprogが"yes"の場合) |
Server/Apps/{画面名} | {画面名}_view.py | 任意(tran.jsonのresponse.progが"yes"の場合) |
バッチ
バッチは、次の4つの定義で構成されます。処理用の定義を除く3つは、それぞれ次の定義を指定して連携します。
・起動画面:起動プログラムを指定する
・起動プログラム:起動用の定義を指定する
・起動用の定義:処理用の定義({処理名}と{処理のトランザクション名})を指定する
・処理用の定義:処理対象のデータを1件ずつ処理する
起動プログラムのファイル名と、起動用の定義のフォルダ名には、同じ名前({起動名})を付けます。
◇起動画面
| 配置先 | ファイル | 要否 |
|---|---|---|
Json/Apps/{画面名} | {画面名}_{トランザクション名}_tran.json | 必須(バッチを起動するトランザクションごと) |
Json/Apps/{画面名} | {画面名}_{トランザクション名}_sql.json | 必須(バッチを起動するトランザクションごと) |
◇起動プログラム
| 配置先 | ファイル | 要否 |
|---|---|---|
Server/{起動プログラムのフォルダ} | {起動名}.py | 必須 |
配置先は、起動画面のsql.jsonに、起動プログラムのパスとして指定します。
実行結果の出力先は、起動プログラムの中で指定します。
Sampleでは、配置先はServer/BatchLoad/、実行結果の出力先はServer/BatchLoadOut/です。
◇起動用の定義
| 配置先 | ファイル | 要否 |
|---|---|---|
Json/Apps/{起動名} | {起動名}_{起動のトランザクション名}_tran.json | 必須(request.modelを"yes"にする) |
Json/Apps/{起動名} | {起動名}_{起動のトランザクション名}_sql.json | 必須 |
Json/Apps/{起動名} | {起動名}_validation.json | 必須 |
Server/Apps/{起動名} | | 任意(tran.jsonのrequest.progが"yes"の場合) |
Server/Apps/{起動名} | {起動名}_model.py | 任意(sql.jsonのprogが"yes"の場合) |
◇処理用の定義
| 配置先 | ファイル | 要否 |
|---|---|---|
Json/Apps/{処理名} | {処理名}_{処理のトランザクション名}_tran.json | 必須 |
Json/Apps/{処理名} | {処理名}_{処理のトランザクション名}_sql.json | 必須 |
Server/Apps/{処理名} | {処理名}_model.py | 任意(sql.jsonのprogが"yes"の場合) |
処理用のモデル({処理名}_model.py)のメソッドでは、コミットとクローズを呼び出さないでください。二重処理になります。
再処理には、SampleのServer/BatchRerun/にあるプログラム(すべてのバッチで共通)を使用するため、バッチごとに作成するファイルはありません。新しいアプリケーションでは、このフォルダをSampleからコピーします。
帳票
帳票は、印刷を呼び出す画面の定義と、帳票フォルダの定義で構成されます。帳票フォルダ名({帳票名})と、帳票フォルダで使用するトランザクション名({帳票のトランザクション名})は、呼び出し元の画面のsql.jsonで指定します。
◇呼び出し元の画面
| 配置先 | ファイル | 要否 |
|---|---|---|
Json/Apps/{画面名} | {画面名}_{トランザクション名}_tran.json | 必須(印刷のトランザクションごと) |
Json/Apps/{画面名} | {画面名}_{トランザクション名}_sql.json | 必須(印刷のトランザクションごと) |
◇帳票フォルダ
| 配置先 | ファイル | 要否 |
|---|---|---|
Json/Apps/{帳票名} | {帳票名}_{帳票のトランザクション名}_tran.json | 必須 |
Json/Apps/{帳票名} | {帳票名}_{帳票のトランザクション名}_sql.json | 必須 |
ExcelTemplate/Apps/{帳票名} | {テンプレート名}.xlsx | 必須 |
Server/Apps/{帳票名} | {帳票名}_model.py | 任意(sql.jsonのprogが"yes"の場合) |
Server/Apps/{帳票名} | {帳票名}_view.py | 任意(tran.jsonのresponse.progが"yes"の場合) |
Server/Apps/{帳票名} | {帳票名}_form.py | 必須(tran.jsonのresponse.excelinfo.progを"yes"にする) |
作成した帳票(Excel・PDF)は、DownLoad/Apps/{帳票名}/に保存されます。
Html
Htmlフォルダには、画面を構成するファイルを配置します。フォルダの構成は次のとおりです。
・Apps/{画面名}/:画面ごとのファイル(index.html・JavaScriptなど)
・css/:アプリケーション全体で共通のスタイル
・js/:画面タイプのMixin
・SvelteComponent/:複数の画面で使用する部品(Svelteコンポーネント)
・images/・fonts/:アプリケーションで使用する画像・フォント
各画面は、フレームワーク共通のMixinとjs/の画面タイプのMixinを組み込み、Apps/{画面名}/に画面固有の設定(Appspec)と処理を追加して作成します。
Apps
Html/Apps/{画面名}/には、1つの画面を構成するファイルを配置します。ファイルの一覧は「必要なファイル一式」を参照してください。
controller.js・model.js・view.jsでは、それぞれ基本クラス($H.Controller・$H.Model・$H.View)を継承したクラスを定義し、次の順にMixinを組み込みます(include)。
- フレームワーク共通のMixin(下の表)
- 画面タイプのMixin(例:
MultiTableListFormControllerMixin) - 画面固有の処理(
include({ … })で追加するメソッド)
appspec.jsでは、$H.AppSpecを継承したクラスに、フレームワーク共通のMixinと画面の設定(include({ … }))を組み込みます。
Mixinは、$H.Libraryの下の名前で指定します(例:Controller.include($H.Library.ControllerMixin))。
| ファイル | 組み込むフレームワーク共通のMixin |
|---|---|
| appspec.js | AppSpecMixin |
| controller.js | EnterTabPFKeyMixin・ControllerMixin |
| model.js | ValidationMixin・ModelMixin・HtmlTransitionMixin |
| view.js | FormatMixin・OutlineMixin・LoadTemplateMixin・ViewMixin |
後から組み込んだメソッドが前のものを上書きするため、画面固有の処理で同じ名前のメソッドを定義した場合、Mixinの処理をオーバーライドできます。
◇名前空間
$H(Haluの別名)はHalu全体の名前空間で、フレームワークのクラスや共通の処理はこの名前空間に属します。
各画面は、$Hの下に画面ごとの名前空間($H.Application.{画面名})を持ち、各ファイルはこの名前空間を通じて1つの画面として結び付きます。appspec.jsで名前空間を作り、controller.js・model.js・view.jsはそこにController・Model・Viewのクラスを登録します。main.jsは、登録されたクラスを使用して画面を開始します。$Hの構成は「HaluServer詳細>Html>js>名前空間と基本クラス」を参照してください。
◇index.html
画面のレイアウトを記述し、画面で使用するJavaScript・CSSを読み込むファイルです。
入力・表示する項目にはhalu-ds-id・halu-ds-fieldを指定し、Datasetの項目と対応づけます。属性の記述方法は「データ移送の仕組み>画面処理の仕組み>画面(DOM)とDatasetの同期」を参照してください。
画面の項目を含むformには、id="mainForm"を指定します。入力チェックのイベントは、#mainFormを起点に登録されます。ボタンのidは、AppspecのnavButtonEventに指定するセレクタと一致させます。JavaScript・CSSは、次の順に読み込みます。
- CSS(Bootstrap・
halu-custom_default.css・project.css・program.css)と、halutheme-preload.js - ライブラリ(jQuery・jQuery UI・Bootstrap・
jquery.loadTemplate・bignumber) - フレームワーク本体(
halumvc.js・各Mixin・webstorage.js) - 画面タイプのMixin(view・model・controllerの順)
- 画面固有のファイル(appspec.js・model.js・view.js・controller.js・main.jsの順)
- Svelteコンポーネント(
AppComponents.js・HaluComponents.js。type="module")
ファイルの一覧と順序は、Sampleのindex.htmlに合わせます。
◇appspec.js
Appspec({画面名}.appspec.js)は、画面ごとの設定を定義するファイルです。Controller・Model・Viewは、この定義に従って動作します。
設定は次の3つに大別されます。
| 分類 | 内容 | 主なプロパティ |
|---|---|---|
| 基本情報 | ファイルとJSONの配置パス、読み込むJSON、使用するトランザクション、遷移先・遷移元の画面名 | urlInfo・jsonInfo・requestInfo・externalInfo・nextname・beforename |
| イベント・項目の定義 | ボタン・ファンクションキー・入力チェック・カスタムイベントなどのイベントと呼び出すメソッド、および項目の設定(初期フォーカス・セレクトボックス・チェックボックス) | navButtonEvent・enterTabPFKey・validationEvent・selectorEvent・pubsub{Check/Derive/Other}Event・{first/f12}FocusItem・selectbox・checkboxDetail |
| セッションストレージ | 画面遷移時に保存・引き継ぐデータ | sessionStorage{Header/Detail/Footer}Key・{next/before}StorageData・selectStorage{Request/Response}Data |
{ }の中に「/」で区切って並べた語は、そのいずれか1つが入ることを表します(例:pubsubCheckEvent)。各プロパティの仕様は「ドキュメント>Appspec項目一覧」を参照してください。
このうちrequestInfoは画面の中心となる設定です。トランザクション名と、リクエストのチェック・レスポンスの編集・エラー処理の3つのメソッドを1組で登録します。
トランザクション名は、Json/Apps/{画面名}/{画面名}_{トランザクション名}_tran.json/_sql.jsonのファイル名と対応します。
// [トランザクション名, チェック関数, レスポンス編集関数, エラー関数]
requestInfo: [
["select", "on照会OfCheckRequestData", "on照会OfEditResponseData", "onErrorResponseData"]
, ["insert", "on登録OfCheckRequestData", "on登録OfEditResponseData", "onErrorResponseData"]
]
◇main.js
ページの読み込みが終わったときに実行される、画面の処理の起点となるファイルです。名前空間に登録されたクラスからAppspecを作成し、initialSettingで画面の初期設定を行います。Controller・Model・Viewは、この初期設定の中で作成されます。
◇controller.js
画面で発生するイベント(ボタンのクリック・キー操作・入力など)を受けて、Model・Viewの処理を呼び出すファイルです。
共通の処理はMixinにあるため、controller.jsには画面固有の処理(イベントの処理と、requestInfoに登録する処理)だけを記述します。controller.jsのメソッドは、Appspecのイベント定義とrequestInfoに登録した場合に呼び出されます。
◇model.js
画面のデータ(Dataset)に関する処理を記述するファイルです。
共通のデータ処理はMixinにあるため、model.jsには画面固有のデータ処理(レスポンスデータの編集、送信前のデータのチェックなど)だけを記述します。model.jsのメソッドは、主にControllerから呼び出されます。
◇view.js
画面の表示(DOMへの反映)に関する処理を記述するファイルです。
共通の表示処理はMixinにあるため、view.jsには画面固有の表示処理(モードに応じて項目の入力可否や表示を切り替える処理など)だけを記述します。view.jsのメソッドは、主にControllerから呼び出されます。
◇処理の流れ
画面を開いてからイベントを受け付けるまで、処理は次の順に進みます。
- index.htmlが、フレームワーク・画面タイプのMixin・画面の各ファイルを読み込む(このとき、appspec.js・controller.js・model.js・view.jsが名前空間にクラスを登録する)
- ページの読み込みが終わると、main.jsがAppspecを作成し、
initialSettingを呼び出す - Appspecが、Controller・Model・Viewを作成する
- Modelが、JSON(dataset.json・validation.json・tran.json)の読み込みを開始する
- Controllerが、Appspecのイベント定義をもとに、イベントとメソッドを結び付ける
- dataset.jsonの読み込みが終わると、ControllerがView・Modelの初期処理(
initExecute)を呼び出す(画面タイプのMixinでは、Viewはテンプレートの読み込みとダイアログの準備を、ModelはDatasetの値の初期化を行う) - validation.jsonの読み込みが終わると、ControllerがViewに書式の情報(validation.jsonの
format)を渡す requestInfoの先頭に登録したトランザクションのtran.jsonの読み込みが終わると、Controllerが自身の初期処理(initExecute)を呼び出す(画面タイプのMixinでは、ここから画面の初期表示の処理を行う)- 画面でイベントが発生した場合、5で結び付けたControllerのメソッドが呼び出される
トランザクションを実行したときの処理の流れは、「HaluServer詳細>Html>js>リクエスト処理のクライアントサイド内部」を参照してください。
css
Html/css/には、アプリケーション全体で共通に使用するスタイルを配置します。
・bootstrap-5.3.0/:Bootstrap
・halu-custom_{テーマ名}.css:テーマ(画面の配色)ごとのスタイル。色だけを定義する
・project.css:色以外の共通スタイル(レイアウト・サイズなど)。色は、var(--bs-*)で参照する
各画面のindex.htmlでは、halu-custom_default.cssを読み込みます。
ほかのテーマのCSSは、ログイン時にsessionStorageのキー{アプリケーション名}.Login.CSSファイル名に保存したファイルを、halutheme-preload.jsが画面の表示前に読み込みます。
halutheme-preload.jsは、halu-custom_default.cssのlinkより後に読み込みます。
ログイン画面やテーマの切替では、画面タイプのViewのMixinがテーマのCSSを追加で読み込みます。
Sampleでは、ログイン画面でシステム用のテーマを、ログイン後にユーザーのテーマを保存しています。テーマのCSSを変更したときは、すべてのindex.htmlのhalu-custom_default.cssの?var=を更新します。画面固有のスタイルはApps/{画面名}/css/program.cssに記述し、ここには配置しません。
js
Html/js/には、画面タイプのMixinを配置します。
画面は、次の表のlist〜selectionのいずれかの標準画面タイプで作成します。ログイン画面とメニュー画面は、表の「その他」の専用のMixinで作成します。画面タイプごとに処理と画面遷移のパターンが決まっているため、同じタイプの画面は同じ流れで動作します。

| 画面タイプ | 用途 | Mixin | Sampleの画面 |
|---|---|---|---|
list | 一覧照会(検索・ページング) | multiTableListForm | 受注一覧(OrderList) |
mainte | 1件の登録・訂正・削除 | singleRecordForm | 受注明細一覧(OrderDetailListMainte) ※受注1件分のヘッダーと、その明細を登録・訂正する画面 |
list-mainte | 一覧+行編集 | singleTableListForm | 商品一覧登録(ProductListMainte) |
upload | ファイルアップロード ・バッチ実行 | 専用のMixinなし(singleTableListFormを使用) | 受注データアップロード (OrderUpload) |
selection | 選択ダイアログ | dataSelectionDialog | 商品選択ダイアログ(ProductSelectionDialog) |
| その他 | ログイン・メニュー | login・tabMenu | ログイン(Login)、メニュー(StartMenu・AdminMenu) |
各Mixinは、controller・model・viewの3ファイルで1組です(例:multiTableListForm.controller.mixin.js)。
フレームワーク共通のMixin(ControllerMixinなど)は、HaluServer側のHtml/js/に配置されています。内容は「HaluServer詳細>Html>js」を参照してください。
◇list(一覧照会)
検索条件に合うデータを一覧に表示します。通常は、一覧の行を選択して、次の画面(mainteなど)に進みます。
◇mainte(1件の登録・訂正・削除)
1件のデータを表示して、登録・訂正・削除を行います。表示だけを行う照会のモードも使用できます。通常は、listで選択したデータを引き継いで開きます。
◇list-mainte(一覧+行編集)
一覧を表示し、一覧の上で直接データを登録・訂正・削除します。別の画面には移らず、1つの画面で完結します。
◇upload(ファイルアップロード・バッチ実行)
ファイルをアップロードし、その内容を一括で処理します。Sampleでは、アップロードした内容をチェックした後、バッチ処理を起動して取り込みます。専用のMixinはないため、list-mainteのMixin(singleTableListForm)を使用し、アップロードの処理を追加して作成します。
◇selection(選択ダイアログ)
ほかの画面(list・mainte)からダイアログとして呼び出し、一覧から選んだ1件の値を呼び出し元に返します。
呼び出し元のAppspecには、selectStorageRequestDataとselectStorageResponseDataを定義します。各プロパティの仕様は「ドキュメント>Appspec項目一覧>セッションストレージ」を参照してください。
選択ダイアログ側のボタンのid・メソッド名・カスタムイベント名には、Dialogサフィックスを付けます(例:#選択Dialog・on選択Dialog)。
◇ログイン・メニュー
標準画面タイプのほかに、ログイン画面とメニュー画面には専用のMixinが用意されています。
・ログイン(login):ログインIDとパスワードで認証し、認証後の画面に遷移する
・メニュー(tabMenu):タブで表示する項目を切り替え、選択した項目の画面に遷移する
Sampleのログインでは、遷移先のメニュー画面と画面のテーマを、ログインしたユーザーの設定から決めます。
◇関連ドキュメント
画面タイプのMixin(MultiTableListFormControllerMixinなど)のメソッドの詳細は、「ドキュメント>JSDoc(HaluProject)」を参照してください。
SvelteComponent
Html/SvelteComponent/には、ヘッダー・フッターなど、複数の画面で使用する部品(Svelteコンポーネント)を配置します。
Sampleには、次のコンポーネントが含まれます。
| コンポーネント | 内容 |
|---|---|
Header | 画面上部のヘッダー(ロゴ・画面タイトル・ログイン情報) |
Footer | 画面下部のフッター |
HaluLogo | ヘッダーのロゴ(Headerの中で使用) |
LoginInfo | ヘッダーのログイン情報(Headerの中で使用) |
これらのコンポーネントは、それぞれsrc/components/{コンポーネント名}/にある次の2つのファイルで構成されています。
・{コンポーネント名}.svelte:コンポーネントの本体
・{コンポーネント名}.main.js:画面にコンポーネントを表示する処理
各コンポーネントはsrc/components/AppComponents/AppComponents.main.jsで読み込まれ、ビルドした場合にbuild/AppComponents.jsにまとめられます。
ビルドの設定はvite.config.jsに記述されています。
各画面は、build/AppComponents.jsを読み込んでコンポーネントを使用します。
これらのコンポーネントは、index.htmlでcomponentID属性を付けた要素の位置に表示されます。コンポーネントに渡す値は、props-で始まる属性で指定します。この方式は、各コンポーネントの{コンポーネント名}.main.jsで実装されています。
<div componentID="Header" props-Title="画面タイトル"></div>フレームワーク共通のコンポーネント(各種ダイアログ)は、HaluServer側にビルド済みのHaluComponents.jsとして用意されています。各画面は、AppComponents.jsと同じく、このファイルを読み込んで使用します。内容は「HaluServer詳細>Html>SvelteComponent」を参照してください。
Json
Jsonフォルダには、画面・バッチ・帳票の動作を定義するJSONを配置します。定義するのは、扱うデータ項目(dataset)・入力チェック(validation)・リクエストとレスポンスの構造(tran)・SQL(sql)の4種類です。フレームワークは、この定義に従って項目の移送・入力チェック・SQLの実行を行います。
Apps
Json/Apps/の下には、画面・バッチ・帳票ごとのフォルダを作成します。画面のフォルダには、dataset.jsonとvalidation.jsonを1つずつ配置し、tran.jsonとsql.jsonは、AppspecのrequestInfoに登録したトランザクションごとに1組ずつ配置します。
ファイル名と要否は「必要なファイル一式」、定義どうしの連携は「データ移送の仕組み>画面処理の仕組み>JSON定義の連携」を参照してください。
◇sql.jsonのSQL生成
sql.jsonには、SQLごとに、SQLに渡す項目(input)と、結果として受け取る項目(output)を定義します。
SQLは、sql.genesqlに記述した対象のテーブル(from)・条件(where)・並び順(order)と、input・outputの項目から、フレームワークが生成します。
生成するSQLの種類は、sql.typeに"select"・"insert"・"update"・"delete"のいずれかで指定します。
定義で表せないSQLは、sql.freesqlに直接記述します。sql.typeが"nosql"の場合、SQLは実行されず、inputの値の受け渡しだけに使用されます。
各キーの詳細は「ドキュメント>JSONキー一覧>sql.json」を参照してください。
◇progとbefore/afterキー
progは、その処理でアプリケーション固有のPythonの使用の要否を指定するキーです。progは次の4か所にあり、それぞれ読み込むファイルが決まっています。
progの場所 | "yes"の場合に読み込むファイル |
|---|---|
tran.jsonのrequest | Server/Apps/{フォルダ名}/{フォルダ名}_controller.py |
| sql.json | Server/Apps/{フォルダ名}/{フォルダ名}_model.py |
tran.jsonのresponse | Server/Apps/{フォルダ名}/{フォルダ名}_view.py |
tran.jsonのresponse.excelinfo(帳票) | Server/Apps/{フォルダ名}/{フォルダ名}_form.py |
{フォルダ名}は、Json/Apps/の下のフォルダ名(画面名・帳票名など)です。progが"no"の場合、またはprogがない場合は、フレームワークの標準の処理だけで実行され、Pythonのファイルは不要です。progが"yes"の場合は、対応するファイルが必要です。ファイルがない場合は、実行時にエラーになります。
before/afterキーに、呼び出すメソッドを記述します。記述する場所は、次のとおりです。
・tran.json:request.records[n]・response.records[n]
・sql.json:sqls[n]
・帳票のExcel:response.records[n].excelinfo
メソッドは"メソッド名('引数', ...)"の形式で記述します。引数は、すべて文字列として渡されます。複数のメソッドは、配列で並べます。
メソッドが呼び出されるタイミングは「Server>Apps>フックの呼び出しタイミング」を参照してください。
◇関連ドキュメント
各JSONのキーの詳細は、「ドキュメント>JSONキー一覧」を参照してください。
Server
Serverフォルダには、サーバーで実行されるアプリケーション固有のPythonを配置します。画面の処理はフレームワークがJSONの定義に従って実行するため、ここに配置するのは、JSONだけでは表せない処理と、バッチ処理の起動・再処理に限られます。
フォルダの構成は次のとおりです。
・Apps/{フォルダ名}/:画面・バッチ・帳票ごとのPython(before/afterキーで呼び出すメソッド)
・Commons/:複数の画面・バッチ・帳票で使用する共通のPython
・BatchLoad/・BatchLoadOut/・BatchRerun/:バッチ処理の起動プログラム・その実行結果・再処理のプログラム
Apps
Server/Apps/{フォルダ名}/には、before/afterキーから呼び出すメソッドを記述したPythonのファイルを配置します。ファイルは、JSONの定義だけでは足りない処理がある場合に作成します。
各ファイルには、ファイル名と同じ名前のクラスを定義し、before/afterキーで指定するメソッドはそのクラスに記述します(例:{フォルダ名}_model.pyの{フォルダ名}_modelクラス)。progと読み込まれるファイルの対応は「Json>Apps>progとbefore/afterキー」、メソッドが呼び出されるタイミングは「Server>Apps>フックの呼び出しタイミング」を参照してください。
◇フックの呼び出しタイミング
アプリケーションサーバーは、1つのリクエストを、リクエストの受付 → 入力チェック → SQLの実行(sql.jsonに定義したSQLの数だけ) → レスポンスの作成の順に処理します。
各段階の前後にフックがあり、before/afterキーにメソッド名を記述した場合、該当するタイミングでそのメソッドを呼び出します。
フックを使用するには、対応するprogを"yes"にします。
フックは次のとおりです。
| # | タイミング | 指定する場所 | 呼び出されるファイル | 典型的な用途 |
|---|---|---|---|---|
| 1 | 各レコードの入力チェックの前 | tran.jsonのrequest.records[n].before | {フォルダ名}_controller.py | 入力値の変換(ハッシュ化・正規化など)・補完 |
| 2 | 各レコードの入力チェック(validation.json)の後 | tran.jsonのrequest.records[n].after | {フォルダ名}_controller.py | 権限・業務ルールのチェック |
| 3 | 各SQLの実行前 | sql.jsonのsqls[n].before | {フォルダ名}_model.py | SQLに渡す値の加工、条件句の動的な組み立て、処理対象の絞り込み |
| 4 | 各SQLの実行後 | sql.jsonのsqls[n].after | {フォルダ名}_model.py | 実行結果の後処理、採番値の次のSQLへの引き継ぎ、後続のSQLのスキップ |
| 5 | 各レコードのレスポンスへのマッピング前 | tran.jsonのresponse.records[n].before | {フォルダ名}_view.py | レスポンスの定義の書き換え(使用する場面は少ない) |
| 6 | 各レコードのレスポンスへのマッピング後 | tran.jsonのresponse.records[n].after | {フォルダ名}_view.py | ページング値の計算、表示用の整形 |
フックのメソッドは、戻り値で、処理の続行の要否を返します。
| 戻り値 | 動作 |
|---|---|
'OK' | 処理を続ける |
'ERROR' | 処理を打ち切る。打ち切る範囲は、次の表のとおり。エラーの応答にはならない |
'ALLPASS' | 後続のSQLの処理をすべて打ち切る(フック3・4のみ) |
'ERROR'を返した場合の動作は、フックによって異なります。
| フック | 'ERROR'を返した場合 |
|---|---|
1 | 入力チェックを行わない |
2 | 後続のレコードの処理を行わない |
3・4 | 後続のSQLを実行しない |
| 5 | レスポンスへのマッピングを行わない |
| 6 | 効果なし |
エラーの応答にするには、戻り値を'ERROR'にするだけでは足りません。
フック1・2はself.requestdict、3・4はself.sqldictのmessageで、statusに"ERROR"を、msgにメッセージを設定します。フック5・6では、処理を中断できません。
sql.jsonの処理の後にstatusが"ERROR"の場合、アプリケーションサーバーはロールバックします。それ以外の場合は、コミットします。'ERROR'を返しても、statusを設定しない場合は、実行済みのSQLがコミットされます。
self.sqldict['message']['status'] = 'ERROR'
self.sqldict['message']['msg'] = 'メッセージ'
return 'ERROR'帳票フォルダの定義では、プリントサーバーが、フック3〜6に加えて、Excelに書き込む前後(response.records[n].excelinfoのbefore/after)に、{フォルダ名}_form.pyのメソッドを呼び出します。
バッチでは、起動用の定義でフック1〜4、処理用の定義でフック3・4だけが呼び出されます。
◇関連ドキュメント
アプリケーションのPythonから使用できるフレームワークの処理(commons.jsonchunkのgetjsonchunkbyidなど)の詳細は、「ドキュメント>Docstring」を参照してください。
Commons
Server/Commons/には、複数の画面・バッチ・帳票で使用する共通のPythonを配置します。各画面・バッチ・帳票のPythonからは、モジュール名でimportして使用できます(例:from PaginationModel import Pagination_model)。
フレームワーク共通のPythonの処理は、HaluServer側のServer/Libraries/に配置されています。内容は「HaluServer詳細>Server>Libraries」を参照してください。
バッチ関連フォルダ
Sampleでは、Server/の下に、バッチ処理で使用する次のフォルダを配置しています。フォルダ名と場所は任意で、起動画面のsql.json(バッチロードパス名)と起動プログラムの中で、パスを指定します。
| フォルダ | 内容 |
|---|---|
BatchLoad/ | バッチ処理の起動プログラム({起動名}.py) |
BatchLoadOut/ | 起動プログラムの実行結果の出力先 |
BatchRerun/ | バッチ処理を再処理するプログラム(すべてのバッチで共通) |
起動プログラムは、起動用の定義のtran.jsonのパスと実行結果の出力先を指定してフレームワークのBatchStartupを作成し、起動引数(sys.argv)をそのまま渡して呼び出す定型のプログラムです。batchParamの値は、この起動引数で渡されます。
import sys
from halumain.haluconf import HaluConf
from batchstartup.batchstartup import BatchStartup
def main(args):
conf = HaluConf()
file_path = conf.apppath + "/{アプリケーション名}/Json/Apps/{起動名}/{起動名}_{起動のトランザクション名}_tran.json"
output_path = conf.apppath + "/{アプリケーション名}/Server/BatchLoadOut/{起動名}_{起動のトランザクション名}_result.txt"
batch_run = BatchStartup(file_path, output_path)
batch_run.call(args)
if __name__ == '__main__':
args = sys.argv
main(args)
各フォルダに配置するファイルは「必要なファイル一式>バッチ」、処理の流れは「バッチ>処理の流れ」、データの受け渡しの概要は「データ移送の仕組み>バッチ処理の仕組み」を参照してください。
ExcelTemplate
ExcelTemplateフォルダには、帳票のExcelテンプレート({テンプレート名}.xlsx)を配置します。テンプレートはExcelTemplate/Apps/{帳票名}/に配置し、ファイル名は、帳票のtran.jsonのresponse.excelinfo.templateと一致させます。
帳票の書式は、テンプレートのSheet1シートに作成します。プリントサーバーはSheet1をページごとに複製してデータを書き込み、ExcelとPDFをDownLoad/Apps/{帳票名}/に出力します。出力するExcelからSheet1は削除されます。ページ設定とセルの書式は、Sheet1から各ページに引き継がれます。
テンプレートのページ設定は、「横1ページに収める」にします。明細行のセルは、1行目と2行目以降で書式を揃え、「縮小して全体を表示する」を使用しません。
PDFへの変換に使用するLibreOfficeは、標準の実行環境(Linux)で、WindowsのExcelと字幅が異なるため、列が別のページにあふれる場合があります。
excelinfoに指定するキーは、「ドキュメント>JSONキー一覧>帳票出力のキー」を参照してください。
UpLoad
UpLoadフォルダには、画面からアップロードされたファイルが保存されます。保存先は、通常はUpLoad/Apps/{画面名}/です。
アップロードは、tran.jsonを使用する画面の処理とは別のリクエストで行います。画面のJavaScriptは、ファイル(file)と保存先のパス(data)を/HaluASGI/HaluUploadに送信します。Webサーバーは、ファイルを元のファイル名のまま保存し、保存先のフォルダがない場合は作成します。また、同じ名前のファイルがある場合は上書きします。
保存先に指定できるのは、Application/の下のUpLoadを含むパスだけです。Webサーバーはファイルの種類とサイズを検査しません。そのため、画面のJavaScriptで検査します。
保存したファイルを処理するには、画面がファイル名をtran.jsonのrequestの項目として送信します。画面のPythonが、そのファイルを読み込みます。
DownLoad
DownLoadフォルダには、ダウンロード対象となるファイルを配置します。
帳票では、プリントサーバーがDownLoad/Apps/{帳票名}/にExcelとPDFを出力します。Excelのファイル名は、帳票のtran.jsonのresponse.excelinfo.savefileで指定します。PDFのファイル名は、{Excelのファイル名(拡張子なし)}.pdfです。同じ名前のファイルがある場合は、プリントサーバーが上書きします。
ダウンロードは、tran.jsonを使用する画面の処理とは別のリクエストで行います。画面のJavaScriptは、ファイルのパス(file)、ファイルの種類(type)、ダウンロード時のファイル名(download)を/HaluASGI/HaluDownloadに送信します。この送信は、postDownloadASGIメソッドで行い、Sampleではmodel.jsから呼び出します。
ダウンロード時のファイル名を省略した場合は、Webサーバーが、ファイルの元の名前を使用します。
指定できるのは、Application/の下のDownLoadを含むパスのファイルだけです。ダウンロードしても、ファイルは削除されません。DownLoad配下のファイルは、自動では削除されないため、定期的に削除してください。
バッチ
バッチ処理で使用するid
バッチ処理では、4つの定義(起動画面・起動プログラム・起動用の定義・処理用の定義)の間で、決まったidの項目を使用してデータを受け渡します。
各定義のファイルは「必要なファイル一式>バッチ」、データの受け渡しの概要は「データ移送の仕組み>バッチ処理の仕組み」を参照してください。
次の4つのidを、sql.jsonとtran.jsonのrequestに定義します。
| id | 定義する場所 | 内容 |
|---|---|---|
batchStartup | 起動画面のsql.json | 起動プログラムのパス(バッチロードパス名)とバッチ処理名(ログ出力用)。このidが定義されている場合、アプリケーションサーバーが起動プログラムを起動する。 定義されていない場合は、バッチは起動されず、画面には正常終了が返る |
batchParam | 起動画面のsql.json、起動用の定義のtran.json(request)とsql.json、処理用の定義のtran.json(request) | バッチに渡すパラメータ(例:ログインユーザーの情報)(省略可) |
batchKey | 起動用の定義のsql.json、処理用の定義のtran.json(request) | 処理対象のキー。起動用の定義ではselectで一覧を取得し、処理用の定義では1件分を受け取る |
batchControll | 起動用の定義のsql.json | 管理情報。ロードパス名(処理用の定義のフォルダ)、処理モード(処理用の定義のファイル名の前半。{処理名}_{処理のトランザクション名})、分割数、処理名(バッチ管理テーブルに記録する名前。フォルダ名の{処理名}とは別)など |
tran.jsonのrequestのbatchParamとbatchKeyには、項目名が一致する項目に値が設定されます。受け渡し元と同じ項目名を定義してください。batchStartup・batchParam・batchControllはSQLを実行しないため、sql.typeに"nosql"を指定します。
各キーの詳細は「ドキュメント>JSONキー一覧>バッチ処理のキー」を参照してください。
処理の流れ
バッチサーバーは、あらかじめ起動しておきます。起動の方法は、「起動方法」を参照してください。
バッチ処理は、次の順に進みます。
- 起動画面が、バッチを起動するトランザクションのリクエストをアプリケーションサーバーに送信する
- アプリケーションサーバーは、sql.jsonを実行する。SQLの処理後に
statusが"ERROR"でなく、batchStartupがある場合は、batchParamの項目を起動引数にして起動プログラムを起動する - 起動プログラムが、起動用の定義のtran.jsonのパスと実行結果の出力先(Sampleでは
BatchLoadOut/)を指定して、起動処理(BatchStartup)を呼び出す - 起動処理が、起動引数を
requestのbatchParamに設定し、入力チェック(validation.json)とsql.jsonを実行する - 起動処理が、sql.jsonの実行結果(
batchParam・batchKey・batchControll)をバッチサーバーに渡す - バッチサーバーが、受け取った内容を管理テーブルに登録する
- バッチサーバーが、キーの一覧を分割数で分ける。分割ごとに、バッチサーバーがキーを1件ずつ、パラメータとあわせて処理用の定義のtran.jsonの
requestに設定し、sql.jsonを実行する
起動画面は、バッチの完了を待たずに応答を受け取ります。
起動引数は名前:値の形で渡すため、値にスペースや「:」は含められません。
実行状況(開始日時・終了日時)は、分割ごとに管理テーブルに記録されます。Sampleでは、バッチ一覧(BatchList)とバッチ分割一覧(BatchDivisionList)で確認できます。管理テーブルのキーとパラメータを使用した場合、分割単位で再処理できます。再処理は、Server/BatchRerun/のBatchRerun.pyに、DB名・バッチ管理ID・分割番号・分割数を渡して実行します。
帳票
帳票で使用するid
帳票出力では、呼び出し元の画面のsql.jsonで印刷する対象と帳票フォルダを指定し、帳票フォルダの定義で帳票に出力する値を取得します。各定義のファイルは「必要なファイル一式>帳票」、データの受け渡しの概要は「データ移送の仕組み>帳票出力処理の仕組み」を参照してください。
次の2つのidを、呼び出し元の画面のsql.jsonと帳票フォルダのtran.jsonのrequestに定義します。どちらも省略できません。
| id | 定義する場所 | 内容 |
|---|---|---|
printKey | 呼び出し元の画面のsql.json、帳票フォルダのtran.json(request) | 印刷する対象のキー。 呼び出し元の画面では、SQLの実行結果( output)をキーの一覧とし、帳票フォルダでは1件分を受け取る |
printParam | 呼び出し元の画面のsql.json、帳票フォルダのtran.json(request) | 帳票フォルダ(html)、帳票のトランザクション名(mode)、帳票に渡すパラメータ(例:検索条件)。常に1行。このidが定義されている場合、アプリケーションサーバーが帳票出力を開始する |
呼び出し元の画面のsql.jsonは印刷対象のキー(printKey)を選定し、帳票フォルダのsql.jsonは、printKeyとprintParamを使用して帳票に出力する値を取得します。
キーが複数ある場合は、キー1件ごとに帳票フォルダの定義を実行し、1つの帳票にまとめて出力します。
帳票フォルダのtran.jsonのrequestのprintKeyとprintParamには、項目名が一致する項目に値が設定されます。受け渡し元と同じ項目名を定義してください。
printParamはSQLを実行しないため、sql.typeに"nosql"を指定します。
処理の流れ
プリントサーバーは、あらかじめ起動しておきます。起動の方法は、「起動方法」を参照してください。
帳票出力は、次の順に進みます。
- 呼び出し元の画面が、印刷のトランザクションのリクエストをアプリケーションサーバーに送信する
- アプリケーションサーバーは、sql.jsonを実行する。SQLの処理後に
statusが"ERROR"でなく、printParamがある場合は、sql.jsonの実行結果をプリントサーバーに渡す - プリントサーバーが、
printParamのhtml・modeで帳票フォルダのtran.jsonを読み込み、requestのprintKey(キー1件分)とprintParamに値を設定する - プリントサーバーが、帳票フォルダのsql.jsonを実行する
- プリントサーバーが、tran.jsonの
responseの定義に従ってレスポンスを作成する - プリントサーバーが、
excelinfoの定義に従って、ページヘッダー・明細・ページフッターの順にExcelのセルに値を書き込む - キーが複数ある場合は、キーごとに3〜6を繰り返す
- プリントサーバーが、Excelを
DownLoad/Apps/{帳票名}/に保存し、LibreOfficeでPDFに変換する - プリントサーバーが、
excelinfo(出力したExcelのパス・pdfnameなど)とメッセージだけをレスポンスとして返す - 呼び出し元の画面が、レスポンスの
excelinfoをもとにPDFをダウンロードする
呼び出し元の画面は、帳票ができるまで応答を待ちます。キーごとに、新しいページから書き込みます。
帳票の作成に失敗した場合や、PDFが10秒以内に作成されない場合は、エラーのレスポンスが返ります。画面側で、失敗を判定する処理は不要です。
呼び出されるのは、次のメソッドです。
・{帳票名}_model.py:sql.jsonのsqls[n].before/after
・{帳票名}_view.py:tran.jsonのresponse.records[n].before/after
・{帳票名}_form.py:response.records[n].excelinfoのbefore/after(ページ番号の設定など)
入力チェック(validation.json)とrequest.records[n]のbefore/afterは実行されません。
excelinfoに指定するキーは「ドキュメント>JSONキー一覧>帳票出力のキー」、ダウンロードの仕組みは「DownLoad」を参照してください。
