3.3 データの書き出し
|
|
ここでは、CSVファイルを書き出すフローを作っていきます。 CSVファイルを書き出す方法は、テキストファイルを書き出す方法と似ています。 ストリーム形式を「CSV」に設定するところが少し異なるだけです。 なお、元になるデータは、RDBから取得することにしましょう。 それでは、以下のようにコンポーネントを配置し、フローを作ってください。
さらに、Fieldタブでテーブル「品目マスタ」を全フィールド読み込むように設定します。
マッパーを開いて、下図のようにマッピング設定をしてください。
これでCSVファイルを書き出すフローが完成しました。 このフローを実行してみましょう。
その結果、指定したディレクトリに「writeCsv.csv」が作られたことを確認してください。
|
|
ASTERIAでは、RDBでデータを格納するときに、SQL文を書く必要がありません。 RDBへのデータの書き出し方法には、以下のモードが用意されています。
|
|
ここでは、CSVファイルからデータを読み、RDBにデータを追加するフローを作ってみましょう。 以下のコンポーネントを配置して、フローを作ってください。
Mapperは、後続のRDB(Put)に矢印を接続することで、自動的に OutputStreamFormat が Recordに設定され、フィールド設定も RDB(Put)側の設定が自動的に反映されます。 そのため、マッピング設定は、RDB(Put)のプロパティを設定した後に行います。
Field(Input)タブを開き、「品目マスタ」テーブル全体をフィールド定義に追加します。
つづいて、マッパーを開いて下図のようにマッピング設定をしてください。
これで、RDBへデータを追加するフローは完成しました。 さっそくフローを実行したいところですが、その前に書き込むテーブルの現在の状態を確認しておきましょう。 「3.2.3 RDBからデータを読み込む (1テーブル) 」で作成したフロー(以下、「品目マスタ表示フロー」と呼びます)を実行して、テーブルの中身を確認します。
なお、ここではテーブルの中身を全件読み込んで確認したいので、品目マスタ表示フローを作ったときに設定した、WHERE句を指定する Conditionの指定を空白に戻しておいてください。
先ほど作ったフローを実行することで、このテーブルに対して、次のCSVファイルの内容を追加することになります。
それでは、作成したフローを実行してデータを追加してみましょう。 実行ダイアログから、フローを実行します。
これで、RDBが更新されました。 もう一度、品目マスタ確認フローを実行して、テーブルの中身を確認してみましょう。
これで、CSVファイルからデータを読み込み、RDBに追加することができました。
|
|
ここでは、CSVファイルからデータを読み、その内容でRDBを更新するフローを作成していきます。
フローは、先ほど「データの追加」で作成したものをコピーして利用してください。 まず、先ほど作成したフローの上で右クリックし、メニューから「コピー」を実行します。 さらに、右クリックしてメニューから「貼り付け」を実行してください。
そうすれば、「〜のコピー」という名前のフローが作成されます。 そのフローの上で右クリックして、「名前の変更」を実行し、フロー名を変更します。
これで、フローのコピーは完了しました。
コピーできたら、各コンポーネントのプロパティを変更していってください。
Fieldタブのフィールド名一覧で、「品目番号」のKey項目をTrueにしてください。
これで、RDBのデータを更新するフローが完成しました。 それではまず、品目マスタ確認フローを実行して、テーブルの状態を確認しておきます。
このテーブルのデータを、次のCSVファイルの内容で更新します。
それでは、作成したフローを実行してデータを追加してみましょう。 実行ダイアログから、フローを実行します。
これで、RDBのデータが更新されました。 もう一度、品目マスタ確認フローを実行して、テーブルの中身を確認してみましょう。
これで、CSVファイルからデータを読み込み、RDBを更新することができました。
|
|
ここでは、CSVファイルからデータを読みこみ、そこに含まれる内容でRDBからデータを削除するフローを作成していきます。
今度はデータの更新で作成したフローをコピーし、「writeRDBDelete」という名前にしてください。 そして、各コンポーネントのプロパティを変更していきましょう。
RDB(Put)コンポーネントのField(Input)タブで定義されているフィールドを、「品目番号」だけを残して削除します。
最後に、マッパーをダブルクリックして開き、以下のようなマッピングになっていることを確認して保存してください。(保存を忘れると実行できないので注意してください。)
これで、RDBのデータを削除するフローが完成しました。 それではまず、品目マスタ確認フローを実行して、現在の状態を確認しましょう。
フローを実行することで、このテーブルに対して、次のCSVファイルのキー項目のレコードを削除することになります。
それでは、作成したフローを実行してデータを削除してみましょう。 実行ダイアログから、フローを実行します。
これで、RDBからレコードが削除されました。 もう一度、品目マスタ確認フローを実行して、テーブルの中身を確認してみましょう。
これで、CSVファイルからキーを読み込み、RDBから該当するレコードを削除することができました。
|
|
このモードは、RDBのデータを上書き更新するときに便利な機能です。 Insert/Updateモードを利用することで、入力データとキー項目が一致するデータがない場合はInsert、すでにある場合にはUpdateを発行する処理を、コンポーネントを1つ置くだけで実現することができます。 それでは、実際にフローを作ってみましょう。 以下のようにコンポーネントを配置してください。
RDB(Put)コンポーネントのField(Input)タブで、「品目マスタ」テーブルのすべてのフィールドを定義に追加してください。
ポイントは「品目番号」のKey列を「True」に設定することです。 この「品目番号」をキーとして扱い、同じレコードがなければInsert、あればUpdateすることになります。 最後にMapperを以下のようにマッピングして、フローは完成です。
このフローを実行してみる前に、「品目マスタ」テーブルに入っているレコードを確認しておきましょう。品目マスタ確認フローを実行し、「品目マスタ」テーブルを全件取得して表示します。
次に、入力するCSVファイル「insertUpdateItem.csv」を確認しておきましょう。
データの確認ができたので、フローを実行してみましょう。 「品目マスタ」テーブルが更新されているか、品目マスタ確認フローを実行して確認してみましょう。
実行結果から、既存の「HM001」の価格が「92000」に更新され、先ほどは存在しなかった「HM501」と「HM502」が追加されていることがわかります。
テーブルの内容を初期状態に戻したいときは、「[HOME]/input_data/asbook.mdb」ファイルを、CD-ROM内の同ファイルで上書きコピーすれば戻すことができます。
本書では、RDB(Put)コンポーネントのModeプロパティは、「Insert/Update」しか扱っていませんが、「Update/Insert」というモードも存在します。 この2つの機能の違いは、InsertとUpdateの発行順序が違うだけです。 従って、ほとんどの場合には機能的に差はありません。 この2つのモードは、パフォーマンスの差を基準に使い分けてください。 「Insert/Update」は、Insertが失敗したらUpdateを発行するので、Insertが成功すればUpdateは発行されません。 そのため、Insertが成功する確率が高いケースでは「Insert/Update」を、Updateが成功する確率が高いケースでは、「Update/Insert」を使うべきです。
|
|
ここでは、メールを送信するフローを作ります。 メールを送信するためには、SimpleMailコンポーネントを利用します。 このコンポーネントは、Textストリームを入力するとその内容を本文としてメールを送信します。 以下のようにコンポーネントを配置して、フローを作ってください。
つづいて、マッパーを開いて下図のようにマッピング設定をしてください。
これで、メールを送信するフローが完成しました。 このフローは「textMailingList.csv」を1行ずつ読み込み、4つのフィールドをそれぞれFrom、To、Subject、本文として利用します。
フローを実行することで、CSVファイルには3行のレコードがあるので、3通のメールが送信されることになります。 ここで、BlackJumboDogが立ち上がっていることを確認しておいてください。 立ち上がっていなければ、立ち上げておきましょう。 では、作成したフローを実行してみましょう。
フローが正常に終了すると、指定したメールアドレスにメールが送信されます。
メールを受信すると、3件の新着メールが来ていることを確認できました。
メールアドレスの形式は、 username@domain.net の形式以外にも、 real name <username@domain.net> 形式があります。To欄に宛名を付加したい場合には、この形式に文字列を組み立ててToプロパティに差し込んたメールを送信すればいいでしょう。
|
|
ここでは、添付ファイルつきのメールを送信するフローを作ります。 添付ファイルつきのメールを送信するためには、AttachmentMailコンポーネントを使います。 このコンポーネントは、入力ストリームを添付ファイルとして送信します。 本文は、コンポーネントプロパティの Bodyに指定することになります。 以下のコンポーネントを配置し、フローを作成してください。
ここで、フロー変数の設定をします。 フロー変数についての詳しい説明は「4.1.3 変数・定数」で説明しますので、ここでは手順に従って設定してください。 まず、フロー上のいずれかのコンポーネントを選択して、インスペクタのVariableタブを選択します。
Flow VariablesのName欄に、「From」、「To」、「Subject」、「Body」、と入力します。
以上で、4つのフロー変数が設定できました。
つづいて、1つ目のマッパーを開いて、下図のようにマッピングしてください。
さらに、2つ目のマッパーを開き、下図のようにマッピングします。
これで、添付ファイルつきメールを送信するフローが完成しました。 このフローは「attachmentMailingList.csv」を1行ずつ読み込み、5つのフィールドをそれぞれFrom、To、Subject、本文、添付ファイル名として利用します。
フローを実行することで、CSVファイルには3行のレコードがあるので、3通のメールが送信されることになります。 ではさっそく実行してみましょう。
フローが正常に終了すると、指定したメールアドレスにメールが送信されます。
メールを受信すると、3件の添付ファイルつきのメールが来ていることを確認できます。
|
|
ここでは、Excelファイルにデータを書き出すフローを作ってみましょう。 Excelファイルからのデータの読み込みと同様の手順で、帳票テンプレートを確認しながらデータ項目の定義を行うことで、簡単にExcelファイルにデータを出力することができます。 以下のコンポーネント配置して、フローを作ってください。
さらに、Fieldタブで「品目マスタ」テーブルのフィールドを読み込むように設定します。 テーブルの右クリックメニューで「テーブル全体をフィールド定義に追加」を実行して、フィールドを定義しておいてください。
ここで、Excel Builderを使って、書き込むデータ項目を設定します。 まず、フローに配置した ExcelOutputコンポーネントをダブルクリックしてください。 以下のダイアログが表示されたら、「マクロを有効にする」をクリックします。
Excelが立ち上がったら、「[HOME]/input_data/ItemTemplateExcel.xls」を読み込みます。
ツールバーの左下にある、Excel Builderのアイコンをクリックして、Excel Builderを立ち上げます。
Excel Builderの画面が表示されました。 これからこのダイアログで、書き込むデータ項目を指定していきます。 まず、「単一セル」のタブを選択し、「追加」ボタンをクリックしてください。 範囲指定ダイアログが表示されるので、Excelシート上の「更新日」の1つ右のセル(E6)を選択して、「$E$6」と表示されたことを確認してから、「OK」ボタンを押して次に進みます。
次に、「項目入力」ダイアログが表示されます。 ここでは、項目名を「更新日」と入力して、「OK」ボタンを押します。
このような操作を繰り返して、以下のリストに表示されている単一セルを追加していってください。
次に、明細を書き込む設定に取りかかりましょう。 まず、「レコード」タブを選択して、「追加」ボタンをクリックしてください。 そうすると、「範囲指定」ダイアログが開くので、Excelシート上で明細の範囲(B9〜E50)を選択します。
「$B$9:$E$50」と表示されていることを確認してから、「OK」ボタンをクリックすると、 「レコード名入力」ダイアログが表示されるので、「明細」と入力してください。
そうすると、レコードリストに「明細」という行が追加されますので、その上でクリックして選択します。
「明細」レコードの定義がレコードフィールドリストに表示されました。
ここで、フィールド名を変更しておきましょう。 しっかり名前をつけておくことで、データ項目のマッピングのときに意味がわかりやすくなるからです。 レコードフィールドリストの一番上の行を選択して、「変更」ボタンをクリックすると、「名前入力」ダイアログが表示されます。 Excelシートの明細ヘッダの1カラム目は「品目番号」なので、ここでも「品目番号」と入力して、「OK」ボタンを押してください。
そうすると、以下のダイアログが表示されます。 今回の実習では、キー指定は使用しないので「いいえ」をクリックしてください。
この操作で、フィールドAのフィールド名を変更することができました。 同様の操作を繰り返し、BからEのフィールドについても、以下のようにフィールド名を変更してください。
以上で、Excelファイルへ書き込むセルの定義が完了しました。 「登録」ボタンをクリックして、Excelのウィンドウを閉じて終了してください。 次に、ExcelOutputコンポーネントのField(Input)タブを選択して、以下のように型定義を変更してください。
これでExcelOutputコンポーネントの設定は完了しました。 ここで、マッパーをダブルクリックして開き、以下のようにマッピングします。
このマッパーでは、NOW関数で現在の日時を取得して、それをFORMATDATE関数で「yyyy/MM/dd」形式でフォーマットした結果を、更新日セルに差し込む処理を実現しています。 マッピングが終了したら、マッパーを保存してから閉じてください。 最後に、FileSystem(Put)コンポーネントのプロパティを設定します。
これで、RDBから読み出したデータを、Excelファイルに書き込むフローが完成しました。 このフローを実行すると、指定したファイルパスにExcelファイルが出力されます。
ExcelOutputコンポーネントで設定しておいた単一セル、レコードの領域に、RDBから読み出したデータが書き込まれていることを確認してください。
|
|
ここで作成するフローは、あらかじめExcelで作成しておいたテンプレートに従って、動的にPDFファイルを生成します。 フローを作る手順は、ExcelコンポーネントによるExcelデータの書き出しと似ています。 以下のようにコンポーネントを配置して、フローを作成します。
ここで、「3.2.3 RDBからデータを読み込む (1テーブル)」を参考にして「品目マスタ」を読み込むよう設定します。
それではPDF Builderを起動してみましょう。
PDFコンポーネントのアイコンをダブルクリックしてください。
するとExcelが起動します。このとき、マクロのセキュリティ設定が「中」の場合には次のダイアログが表示されますので、「マクロを有効にする」をクリックします。
|
マクロのセキュリティ設定が「高」の場合、PDF Builderを実行することができません。設定を「中」に変更してからいったんExcelを終了し、再度PDFコンポーネントをダブルクリックしてExcelを起動して下さい。 |
Excelの画面上部に以下のようなボタンが出ていれば準備完了です。
ここで、Excelが立ち上がったら、PDFの帳票設計の雛形となるExcelファイルを読み込みましょう。ここでは、「[HOME]/input_data/ItemTemplatePdf.xls」を使いますので、「ファイル」→「開く」からこのファイルを開いてください。
ここで、先ほどのPDFのボタンをクリックしてダイアログを呼び出します。
PDF Builderの画面が表示されました。これからこのダイアログで、PDFに出力するデータ項目を指定していきます。
プリンターがインストールされていない場合: ここでPDF Builderボタンをクリックしたときに以下のようなダイアログが出てしまった場合には、プリンタの設定が必要となります。ここではWindows XPの場合にダミーのFAXをインストールして回避する方法を提示します。
コントロールパネルから「プリンタとFAX」を開き、画面左上の「ローカルのFAXプリンタのインストール」をクリックします。
すると、自動的にインストールが始まります。
このように、FAXがインストールされれば終了です。PDFボタンが動作するようになっていますので設定を続けてください。
まず、「単一セル」のタブを選択し、「追加」ボタンをクリックしてください。範囲指定ダイアログが表示されるので、Excelシート上の「更新日」の1つ右のセル(F7)を選択して、「$F$7」と表示されたことを確認してから、「OK」ボタンを押して次に進みます。
次に、「項目入力」ダイアログが表示されます。ここには、データ項目名「更新日」と入力して、「OK」ボタンを押します。
以上のようになっていれば単一セルの設定は終了です。 次に、レコードの設定に取りかかりましょう。 「レコード」タブを選択して、「追加」ボタンをクリックしてください。そうすると、「範囲指定」ダイアログが開くので、Excelシート上で明細の範囲(C10〜F45)をドラッグして選択します。
「$C$10:$F$45」と表示されていることを確認してから、「OK」ボタンをクリックすると、「レコード名入力」ダイアログが表示されるので、「明細」と入力して「OK」ボタンをクリックします。
すると、ダイアログに「明細」という行が追加されます。
続いて、フィールド名を変更しましょう。明細の各フィールドに意味のわかる名前をつけておくことで、のちにマッピングを行うときにわかりやすくなるからです。ダイアログ下段のレコードフィールドリストから一番上の行「C」を選択して「変更」ボタンをクリックすると、「名前入力」ダイアログが表示されます。 Excelシートの明細1カラム目の見出しは「品目番号」なので、同じ「品目番号」と入力して、「OK」ボタンをクリックしてください。
この操作で、フィールドCのフィールド名を変更することができました。同様の操作を繰り返し、DからFのフィールドについても、以下のようにフィールド名を変更してください。
次に、Excelシート上に貼り付けられているインフォテリアのロゴ画像のデータを読み込む設定をしましょう。 「画像」タブを選択して、「追加」ボタンをクリックしてください。すると、「画像選択」ダイアログが開くのでここでExcelシートに貼り付けられている画像オブジェクト(Picture 1)をプルダウンして選択します。なお、サポートされる画像フォーマットはPNGとJPEGです。
ここで「OK」をクリックすると、続いてファイル選択ダイアログが開くので、Excelテンプレートと同じ「input_data」ディレクトリにある画像データファイル「infoteria-logo.png」を選択し、「開く」ボタンをクリックします。
すると、指定画像名に「Picture 1」が追加されます。
最後に、PDFとしての体裁の設定を行います。 「環境設定」タブをクリックして下さい。
今回はA4サイズのPDFを出力するので、ページ設定はそのままにして、「印刷範囲」ボタンをクリックします。すると「範囲指定」ダイアログが開くので、A1からドラッグを開始して印刷範囲(A1〜H50)の全体を選択します。
「OK」をクリックすると、印刷範囲の設定は完了です。
印刷範囲の選択について: 今回のサンプルでは、すでにA4サイズに合わせて調整済みのテンプレートを提供していますが、ゼロからテンプレートを作成するときにはExcel上でページ設定をしておいたのち、全セルが選択されている状態でメニューから「ファイル」→「印刷範囲」→「印刷範囲の設定」とすることでページ境界が表示されるようになりますので、この状態でテンプレート作成を進めるとよいでしょう。
ASTERIA 3 Service Pack 3 (Build 3.3.2300)では、「環境設定」タブの「セキュリティ」でPDFデータにセキュリティ機能を付加できるようになりました。PDFコンポーネントプロパティのSecurityでも設定することができます。
それではプレビューしてみましょう。「プレビュー(PDF)」ボタンをクリックします。すると、PDF閲覧ソフトが起動され、出力イメージを確認することができます。
これで問題ないことが確認できましたので、設定を保存しましょう。 「登録」ボタンをクリックします。 そうすると、登録完了を知らせるダイアログが表示されます。
これでPDFの設定は完了です。Excelを終了してASTERIAデザイナに戻りましょう。 PDFコンポーネントの設定が完了したら、直前のマッパーの設定ができるようになっていますので、マッパーを開いて下図のようにマッピング設定をしてください。
このマッパーでは、FORMATCURRENCY関数を使って、金額データに通貨記号をつけてコンマ区切りにフォーマットしています。 また、NOW関数で取得した現在の日時を、FORMATDATE関数を使って「yyyy/M/d」形式で更新日セルに差し込む処理も行います。 これでPDFファイルを生成する処理は完成です。実行ダイアログから実行すると、FilePutコンポーネントで指定したファイルパスにPDFファイルが生成されます。
このように出力されていれば成功です。
Excelシートに設定した表示属性のうち、PDFコンポーネントが扱うことができるのは以下のものです。テンプレート作成の参考にしてください。
本書ではサーバとデザイナが同一マシンということを想定していますが、PDF Builderで定義に用いるExcelテンプレートはデザイナ側に必要だということにご注意ください。 また、PDF Builderで定義した表示情報は、画像も含めてすべてプロジェクトファイル内に独自の形式に持ち直されてサーバ側で保存されます。従って、一旦PDF定義を登録してしまえばExcelテンプレートはもう必要ありません。この点はExcelコンポーネントと異なります。ただし、ふたたびテンプレートから定義をやり直したい場合には、同じExcelテンプレートが初期作成時と同じファイルパスに必要となりますのでご注意ください。 |