RMENU
Rmenuサイト
実践５『エクセル印刷機能』作成

実 践 ５『エクセ ル印刷機能 』作成
事前確認
手順

画面確認

プログラムのコピー

 事前確認
作成する画面タイトル：『REST（一覧）』の印刷ボタン
作成するプログラム名：DG_620R へJSON4つ

コピー元プログラム名：DG_600R からJSON4つ
習得内容：作成したプログラムに印刷機能を追加する

手順
事前確認

エクセルの用意クライアント側の作成

サーバー側の作成

手順

テンプレートの作成

Html

データセットJSON

画面の確認

出力先フォルダー作成

Rubyの作成

モデル作成•コピー元からコピペ

Appspec

トランJSON•印刷一括

プログラムのコピー

コントローラ

•印刷一括のbefore作成•印刷個別のbefore作成•印刷個別•afterの作成

モデルSQLJSON•両SQL共通の作成
•印刷一括
•印刷個別

ビュー作成
•コピー元からコピペ•テンプレートの設定•エクセルを作成する

画面の確認画面タイトル：『REST一覧』
プログラム名：［DG_620R］

作成箇所：ヘッダー上部に赤線の「印刷ボタン」を作成します。
説明：この画面は2つの印刷ボタンがあり、2種類のエクセルを印刷できます●［一覧表印刷（個別）ボタン］
印刷したい行にチェックを入れて選択したデータのみを印刷●［一覧表印刷（一括）ボタン］
一覧画面に表示されている全てのデータを印刷※2つのボタン＝2つのデータ作成方法があるため、プログラムを2つ作成します
・個別印刷時は［printchecksql/printchecktran］が動く
・一括印刷時は［printallsql/printalltran］が動く【詳細説明】
個別印刷の場合は、出力したいデータにチェックを入れる。
チェックボタンにチェックが１つも入っていない場合は、エラーが表示される。

 画面確認（ボタン操作時）➀ 印刷ボタンをクリックする② 左下にエクセルが出力される③ エクセルを開くと表示されているテーブルのデータが印刷できますプログラムのコピー

印刷のプログラムを雛型からコピーし作成します➀コピー元プログラム名：［DG_600R］の［JSON］を開き、4つのJSONをコピーします［printallsql］［printalltran］［printchecksql］［printchecktran ］②作成先プログラム名：［DG_620R］のJSONを開き、貼り付けます
図の様にプログラム名を手打ちで書き換えます［DG_600R］→［DG_620R］へ③プログラム内のプログラム名を一括で変換する
操作方法：秀丸を利用する［新規ページ］を開く→ツールバー［検索］クリック→［grepの実行］クリック→
条件を入力→［置換を実施］クリック→ ［DG_600R］を［DG_620R］へ置き換え→完了

実践５ 『エ クセ ル印刷機能 』 作成
エクセルの用意

エクセル確認

テンプレート作成

出力先フォルダー作成

 作成したいエクセルを準備します➀エクセルをもらいます②Rmenu へエクセルのテンプレートを作成します③生成されたエクセルの出力先を作成しますエクセルの確認

エクセルを用意し、内容を確認します
出力したいエクセルワークシートは事前に作成したものを用意し、このワークシートに画面のデータが入り、印刷ができるように作成します。
※エクセルの拡張子は［.xlxs］である事と隠れているセルがないか確認します。（エラーを防ぐため）

テンプレート作成

プログラムでデータを作成した時の出力先エクセルワークシートを先に指定のフォルダーへ準備します。
➀Html・JSONの下に［PdfTemplate］があるので開く②プログラム名のファルダーを新規作成します［DG_620R］③作成したフォルダーへエクセルを貼り付け完了

注意※元のエクセルシートの拡張子を確認すること（マクロが付いていると使用不可）※元のエクセルシートの全ての列を確認すること（隠れている列があるとデータの出力先がズレます）

出力先フォルダー作成

プログラムが生成したエクセルワークシートの出力先を作成する。
［Download］へエクセルの出力先になる［空のフォルダー］を作成します。
➀Htmlの上に［ Download ］があるので開く②プログラム名のファルダーを新規作成します ［DG_620R］
エクセルの用意ができたのでプログラムを作成していきます。

【詳細説明】
印刷ボタンを押すと、この中にファイルが生成されて、作ったエクセルを、この中に書き込む。
書き込んだエクセルファイルをサーバーにここにあると情報を渡す。
ダウンロードしたら不要なため自動的に消えるようになっている。

実践５ 『エクセ ル印刷機能 』作成
クライアント側の作成
Html

Appspec

コントローラモデル クライアント側から作成します

Html：印刷ボタンを作成
Appspec：イベント設定
コントローラ：動きの設定、モデルへ指示を出す
モデル：モデルで処理をしコントローラへデータを返す（モデルは後日Mixinへプログラムを移しました。）

Html

Htmlで印刷ボタンを作成します
ボタンの作成は実践2で作成済の為、項目名を確認します。
➀［id］［name］［画面に表示されるテキスト］の3か所を確認します※黄色の部分を統一させるAppspec

コピー元Appspec［on印刷］を作成します➀コピー元プログラムのAppspecを開き、印刷ボタンのイベント設定をコピペで持ってきます。
②イベント処理、トランザクション関数定義などボタン2つ分の2行づつ作成する（黄色の行）※注意「カンマ」や「閉じカッコ」に気を付けること

 Appspec【詳細説明】

ボタンイベントの設定

Index.htmlに記述されているidは、左記：appspecのボタンイベント設定の項目と同じでなければいけない。
画面上でボタンが押されると、この部分へ指示が出される。

 Appspec【詳細説明】

トランザクションの定義

印刷に関するトランザクションを追加する。
トランザクションとは、サーバーとのやり取りのことであり、トランザクションに記述された名前と同じファイルが必ずjsonファイルに存在する。

Jsonファイルに、上記で追加したトランザクションの内容を追加する。
コピー元からJSONをコピーし、ファイル名をプログラム名変更する。

最初に行ったプログラムのコピー作業を指しますコントローラ➀イベント処理②リクエストデータ処理

コントローラで3つの処理を作成します➀イベント処理（後日、共通プログラムへ移した為作成不要になりました）「ボタンクリック時の動き」を作成しています②リクエストデータ処理（後日、共通プログラムへ移した為作成不要になりました）「モデルへ指示を出す動き」を作成しています③レスポンスデータ処理「モデルから帰ってきたデータを受け取る動き」を作成しています③レスポンスデータ処理 コントローラ➀イベント処理（後日共通プログラムへ移した為作成不要になりました）

ボタンクリック時の動きを作成します。
コピー元からイベント処理をかたまりごとコピペし［on一覧印刷個別］と［on一覧印刷一括］を作成する。
※赤文字の指示は（）の中のプログラムを実行する指示です［個別印刷］ボタンがクリックされると［printchecksql/printchecktran］が動き［一括印刷］ボタンがクリックされると［printallsql/printalltran］が動くようにコントローラのイベント処理で作成されています。

 コントローラ②リクエストデータ処理（後日共通プログラムへ移した為作成不要になりました）

コピー元からイベント処理をかたまりごとコピペし、［on一覧印刷個別］と［on一覧印刷一括］を作成する。

 コントローラ③レスポンスデータ処理（ﾚｽﾎﾟﾝｽは指示にプログラム名を含み、共通プログラムでは処理できない為、各プログラムで作成する。）

1.コピー元からイベント処理をかたまりごとコピペし、［on一覧印刷個別］と［on一覧印刷一括］を作成する
2.赤枠のプログラム名部分を作成する［REST］

 コントローラ【詳細説明】

ボタンイベント処理
印刷機能というのは、複数のプログラムで使用している為、共通プログラムに記述している。

mastermaintelist2.controller.mixin-2.1.1.js

this.ajaxExcute(“～”)とは、このトランザクションを実行しなさい。という意味である。
画面でボタンを押されると、appspecのボタンイベント定義に記述された内容を元に、左記のイベントを発生させる。

 コントローラ【詳細説明】
リクエストデータ 編集 チェック処理

トランザクションを実行する前に行うチェック内容を記述する。

この場合は、Modelに同じ関数名で記述された処理を呼び出している。

 コントローラ【詳細説明】
レスポンスデータ 編集処理 ※パターンではなくDG_640Rに記述

但し、この情報をmodelへ引き渡すことによりmodelは共通プログラムで処理を行う事ができる。
※詳しくは、modelで説明

トランザクションを実行し、DBから戻ってきた時に行う処理を記述する。
この場合は、Modelに同じ関数名で記述された処理を呼び出している。
このレスポンス編集処理では、エクセルのタイトル部分に名前をセットしている。
タイトルにはシステム名を明記しないと何の情報かというのがわからない。
そのため共通プログラムではなく個々のプログラムで記述する必要がある。

モデル➀ リクエストデータ処理② レスポンスデータ処理

上記2つの処理を作成します（後日、共通プログラムmixinへ移した為作成不要になりました）➀リクエストデータ処理「印刷チェック行の管理NO」と「エラーメッセージ」を作成しています②レスポンスデータ処理「生成するエクセルのファイル名」と「印刷実行日時」を作成しています モデル➀リクエストデータ処理
手順：
1.コピー元モデルから図の処理をコピペする
説明：「印刷チェック行の管理NO」と「エラーメッセージ」を作成しています●印刷チェック行の管理NO
チェック時にどのデータが選択されたのかを管理するＮＯ［印刷入出力要素NO］をつくり印刷する行を管理します。
ここで新しい項目名ができたので、データセットJSONに記述がいります。
●エラーメッセージ作成［一覧印刷個別］の方が指示が多い。
チェックした項目だけを印刷する為に、チェック無し状態で印刷ボタンがクリックされた時はエラーメッセージを表示する設定があるため。

 モデル②レスポンスデータ処理
手順：
1.コピー元のモデルから図の処理をコピペする
2.赤枠内の項目名を作成する
これは生成されるエクセル名です［REST一覧個別］と［REST一覧一括］
3.エクセル名に印刷日時を追記します［+datetime+］（コピー元にあるのでそのままで使います）

説明：「生成するエクセル名を作成」と「印刷実行日時」を作成しています● 「印刷実行日時」［Var datetime＝］で印刷時刻を作成しています● 「生成するエクセル名を作成」［argHash］でdownloadフォルダーへ
このタイトル+日付け名のエクセルを生成します モデル【詳細説明】
リクエストデータ 編集 チェック処理
まず画面上で一覧表印刷（個別）が押されると、まずmodelで下記チェックを行う。

チェックなしで実行時チェックありで実行時

０番目

１番目

個別印刷は画面上で印刷にチェックを入れたデータのみ印刷を行う機能のため、画面上でのチェックは必須である。
チェックをせずに一覧表印刷（個別）ボタンを押した場合、左記のエラーを表示させる。

Index.html(tbody)

チェックされたデータの入出力要素NOをまずW_選択にセットし、その内容を次にrequestRecord：印刷入出力要素NOにセットしている。

 モデル【詳細説明】
リクエストデータ 編集 チェック処理
コントローラから呼び出された関数。
トランザクションを実行する前に行うチェック内容を記述する。
コントローラと同じく共通プログラムに記述している。

mastermaintelist2.model.mixin-2.1.1.js

For文で印刷ボタンがチェックされているかを確認している。

印刷ボタンにチェックされたデータの入出力要素noを上から順番に数える。[i]W_選択という空の配列を用意し、上から順番に0番目、１番目という形で配列の中に追加している。
印刷ボタンにチェックされた数が0以上であれば、配列：W_選択の内容をrequestRdcord:印刷入出力要素NOにセットしている。
チェックの数が0件の場合は、エラーを表示させる。

一括印刷は、印刷部分のチェック有無にかかわらず画面上に表示されているデータを全件処理する為、個別印刷のようなチェックは必要ない。

上記の項目がOKであれば、トランザクションを実行する。

 モデル【詳細説明】
レスポンスデータ 編集処理
コントローラのリクエストチェック処理・モデル編集処理、モデルのリクエストチェック処理については、個別印刷・一括印刷とそれぞれの関数が記述されていた。
しかしモデルのレスポンス編集処理において記述された処理は１つである。

レスポンスデータ編集処理には、トランザクションを実行し、DBから戻ってきた時に行う処理を記述する。
サーバーでは、もともと存在するエクセルのテンプレート情報を読み込み、そこへDBから取得したデータ情報をエクセルに貼り付けている。
つまりこのレスポンスデータ編集処理を行う時点で、エクセルの中身はできている状態である。
ここでは完成したエクセルをパソコンでダウンロードするときに、タイトル部分に名前をセットしている。

mastermaintelist2.model.mixin-2.1.1.js

Controllerのレスポンスデータ編集処理を確認。
datetimeに日付をセットしている。

いつダウンロードしたデータなのかをわかるようにするため、日付と時刻を設定し、ファイル名にしている。
ここでタイトルをセットしている。
Listnameに帳票一覧個別、rest一覧一括などcontrollerから受け取った情報がセットされる。
今回はエクセルファイルだが、CSV、画像などいろんな種類のデータをダウンロードする処理がある。
’type”とはダウンロードするファイルの種類を表し、csv,jpgなどに変更することでダウンロードするファイルの種類も変更する。

 モデル【詳細説明】
レスポンスデータ 編集処理
エクセルデータ

上記のmodelは共通プログラムである。
その為、個別印刷・一括印刷かだけではなくこの関数を必要とする全てのプログラムの処理を行う。

Controller:レスポンスデータ 編集処理

そこで個々のcontrollerから受け取った情報をlistnameにセットするようにしている。

そうすることで、modelは共通プログラムに記述することができ、なおかつプログラムは１つで済む。

実践５ 『エクセ ル印刷機能 』作成
サーバー側の作成
データセット
JSON

トランJSONSQLJSON

 サーバー側を作成します

データセットJSON：モデルで作成した項目を追加作成
トランJSON： printchecktranJSON/printalltranJSONの2つを作成しますSQLJSON： printchecksqlJSON/printallsqlJSONの2つを作成しますデータセット JSON
データセットJSONを作成します➀モデルでできた項目名をデータセットに作成する。
［印刷入出力要素NO］の項目ができたのでデータセットできるように追加する。
このNOは印刷個別時にチェックされた行を認識するためのＮＯです②個別印刷と一括印刷の両方で使用する

トランJSON➀printchecktranJSON②printalltranJSON

トランJSONを3ステップで作成します
データセットJSONを参考に項目を作成します➀printchecktranJSONの作成②printalltranJSONの作成③Afterの作成③Afterの作成

 トランJSON➀printchecktranJSONを作成する
データセットJSONを参考に項目を作成します

Ｃｈｅｃｋは選択された項目だけを印刷する為［印刷入出力要素NO］があるものを印刷する
そのため、トランに項目を用意する トランJSON②printalltranJSONを作成する
データセットJSONを参考に項目を作成します
Allはすべてを印刷する為画面に［検索restID］［検索rest名］があるものを全て印刷するのに、2つの項目が必要になる トランJSON③Afterの作成[ａｆｔｅｒ]のプログラム名の作成[ａｆｔｅｒ(アフター)]はｒｕｂｙのviewへ飛ぶ指示です。
プログラム名を[DG_620R]で作成する
createExcel(クリエイトエクセル)は「レスポンス結果はエクセルの項目へrubyのviewを使って書き込んで」の指示。
※レスポンスに項目名を書かずrubyへデータを送り、rubyに項目名を作成します。
両方のトランJSONの下部にAfterがありますこれはRubyのビューを使う指示です トランJSON 【詳細説明】

作成中

SQLJSON
➀両sqlの作成②printchecksqlJSONSQLJSONを3ステップで作成します➀両sqlの作成②printchecksqlJSON［印刷個別］ボタンクリック時のＳＱＬを作成します③printallsqlJSON［印刷一括］ボタンクリック時のＳＱＬを作成します③printallsqlJSON SQLJSON➀両ＳＱＬのアウトプットを作成

1.アウトプットをそれぞれ作成する「SQLは印刷一括の[printallsql]と印刷個別[printchecksql]があり必要項目名をそれぞれ作成。」[id：明細]のアウトプット作成する。
（上部2つはコピー元と同じの為そのままで良い）ジェネレートSQLの為、アウトプットの［field］と［table］に注意して作成する※【Printallsqlとprintchecksqlの構造】3つのSQLで構成されている

 SQLJSON②printchecksqlJSON※(赤枠を確認し、青枠内を作成します。)

1.ジェネレートSQLを作成する
項目名の作成と、[入出力要素区分]を忘れないように注意する。
2.インプットの項目名を［印刷入出力要素NO］へ変更する。（選択した行をインプットさせる）
3.[before]に指示があるのでrubyのモデルを使用している

 SQLJSON③printallsqlJSON※(赤枠を確認し、青枠内を作成します。)
1.ジェネレートSQLを作成する※項目名の作成と、[入出力要素区分]を忘れないように注意する。
2.インプットの項目名を［検索restID/名］へ変更する。
3.[before]に指示があるのでrubyのモデルを使用している。

 SQLJSON 【詳細説明】

作成中実践５ 『エクセ ル印刷機能 』作成
R UBY の作成

モデルRuby

ビューRuby Rubyを作成します
プログラムの場所：server→プログラム名→各ruby（コントローラ/モデル/ビュー）にあります。

モデルRuby：SQLJSONのbeforeから来る
ビューRuby：トランJSONのAfterから来る

モデルRuby➀コピーして作成②printcheckSQLの③printallSQLのbeforeを作成

beforeを作成

上記2つのRubyを作成します➀コピー元からプログラムをコピーして作成②printcheckSQLのbeforeを作成③printallSQLのbeforeを作成

 モデルRuby➀コピーして作成
SQLの[before]に記載があった場合、[server]→[モデルRuby]のファイルを開き、指示を確認する。
[before]の後の文書が指示の飛ぶ場所が書かれています。
個別と一括の2つあります。

コピー元から上記の［def～end］部分をコピペし、[プログラム名]と[項目名]を変更する。

 モデルRuby②printcheckSQLのbeforeを作成

printchecksql（個別）で指示されているｒｕｂｙを作成する
1.コピー元の[def]を検索し、[“before”: “set検索条件OfDG_620R(‘header’, ‘印刷入出力要素ＮＯ’, ‘明細’)”,]部分をコピぺする

2.プログラム名[DG_620R]の作成と、［項目名］を作成する。
※ここではSQL文を作成しているため、DBの項目名を使用しないとエラーになるので注意 モデルRuby③printallSQLのbeforeを作成
Printallsql（一括）で指示されているｒｕｂｙを作成する。

1.コピー元の[def]を検索し、[“before”:"setSql_DG620ROfDrmTools('header', '明細','genesql')",]部分をコピペ

2.プログラム名[DG_620R]の作成と、［項目名］を作成する。
※ＳＱＬ文になる所はDBの項目名を使用しないとエラーになるので注意ビューRuby③テンプレートへ➀コピーして作成②テンプレートの設定

データを作成する用意できたデータをビューRubyでアウトプットを作成します➀コピー元からプログラムをコピーして作成②テンプレートの設定③テンプレートへデータを作成する

 ビューRuby➀コピーして作成
トランJSONのAfterにある［ createExcelOFDG_620G ］
をビューrubyへ作成します。
1.コピー元のビューRubyを開き、［ createExcelOFDG_620G ］をdef～endまでをコピぺする
2.③で利用するプログラムを一緒にコピペする
テンプレートへデータを入れるた
めに赤枠内の[createprintOFDG_620G]が必要なので一緒にコピペする
3.［プログラム名］［項目名］
を作成する

 ビューRuby②テンプレートの設定

テンプレートの場所を指示し読み込み→初めに作成したテンプレート名[REST一覧_テンプレート.xlsx]を出力先にする指示を作成する。

 ビューRuby③-1テンプレートへデータを作成する

1.エクセルシートへタイトルを表示する位置を指定します。
シートのA列1行は［0］［0］で指示する。（セルの位置） ビューRuby③-2テンプレートへデータを作成する

2.エクセルシートのMAX行数を設定する（エクセルシートを何行まで表示するのかを指示します。）
図の場合は52行目までを1枚に印刷します。
52行以上になると次のページへデータを回し印刷します。

 ビューRuby③-3テンプレートへデータを作成する
3.データをどのセルへ出力するか設定する
トランのレスポンスと同じ。
データの出力先をココで指示します。
［row］［数字］で横列のセルの位置を指定します。
※0,1,2,3,4,5＝3-A,3-B,3-C,3-D,3-E,,,［項目名］［Value］でセルへ入れる物を指示する。

完成