前編の続きです。
作成したテーブルの最大レコード数を確認する
ところでダウンロードしたインボイスデータのレコード数を見ると1つのエクセルファイルで数十万行でした。大昔5250からCRTPFしてテーブル(PF)作成すると、最大レコード数が1,000とか10,000レコードだったのですが、今回SQLスクリプト実行からテーブル作成するとどうなっているか気になり、前回作成したDb2 for i のテーブルの属性を調べてみました。(DSPFDコマンド)
結果、最大レコード数は*NOMAXで作成されていました。このまま設定変更せずとも大丈夫でした。
※もしも、最大レコード数がインポートするインボイス(ほか)データよりも小さい場合は、CHGPFコマンドでSIZEパラメーターで最大レコード数を十分大きくします。下記の例では初期レコード数をNOMAXに変更しています。*
※ Db2 for i はOracleでいう表スペースという概念が無く、テーブルに作成されたレコード行数に応じて上記のSIZEパラメーターで指定した値に従って、テーブルサイズが拡張される実装なので *NOMAX と指定してもテーブルが過剰にストレージを消費することはありません。データベーステーブルのストレージ領域を未使用のまま予約する、というようなことはありませんので、あくまでテーブルの設計として何レコードを最大とするか、や、何レコードまでを自動拡張としてユーザーや管理者にメッセージを出すか(指定レコード数以上を追加しようとした際、メッセージが出て、指示待ちになる)を指定するものです。
エクセルのデータをインポートする
今回はメジャーなACSのデータ転送機能を使ってみます。
PC上のインボイスデータ(CSV)をDb2 for i にロードするのですが、ACSデータ転送はその際、Db2 for i テーブルのカラム情報を.fdfxファイルとして作成しておく必要があります。
テーブルカラム情報(.fdfxファイル)はテキストファイル形式なのでメモ帳他手作業で作成もできますが面倒なので、同じくACSデータ転送機能でDb2 for iからPCにデータをエクスポートすると.fdfxファイルを生成してくれますので、.fdfxファイルを作成するためにDb2 for i のテーブルからPCにエクスポートを実行します。
ACS データ転送の開始方法
こ場合、下記のようにタブが2つ表示され、1つ目がデータのアップロード、2つ目がダウンロードです。
上図で ↑上向き矢印がDb2 for i へのアップロード、↓下向き矢印がダウンロードです。
まずダウンロード(エクスポート)を実行します。
こちらの場合、タブは1つしか表示されません。(下図はダウンロードを選択した場合)
Db2 for iカラム情報 .fdfxファイルを作成するためのダウンロードを実行
まず、Db2 for i のテーブル名を ライブラリー(スキーマ)名/テーブル名(メンバー名) の形式で指定します。
たとえば、ライブラリー名だけ指定して、参照ボタンを押すと、
上図ではダウンロードするテーブルを展開して、メンバー名を選択後、右上の選択ボタンをクリックしています。
最下部の 選択されたファイルおよびメンバー という欄にダウンロードするファイル・メンバー名が表示されています。この状態で OK ボタンを押します。
参考:ダウンロードするレコードの選択、ソート順の指定なども可能
今回は使用しませんが、データ・オプション ボタンを押すと以下のようなパネルが表示されSQLと同様な条件指定してレコードのダウンロードができます。
続けて、PC側のファイル情報を指定します。
ファイルタイプをCSVを選択します。他にXLSXなどが選択できます。
今回は指定しませんが拡張ボタンを押すと、下図のようにテーブルカラム名を1行目に追加するか? 数値カラムのダウンロード形式を指定する等のオプションも選択できます。
が、個々は今回スキップして、最下部のクライアント・ファイル記述を保持 をチェックします。これで アップロードに使用する .fdfxファイルを生成してくれます。
ファイル名に.fdfxの名前をしています。 今回は D:\Qiita\インボイス\INVOICE.fdfx としました。
ダウンロード設定の画面に戻るので、Db2 for iテーブルをダウンロードするファイル名を指定します。
今回は D:\Qiita\インボイス\INVOICE.CSV としました。
以上で設定が完了しました。
ダミーレコードをDb2 for i テーブルに追加する。
ACSデータ転送機能のダウンロードはDb2 for i のテーブルレコード数がゼロ件だとエラーになってしまうため、1行、ダミーレコードをDb2 for i のテーブル(今回は INVOICE_LIB/INVOICE)にインサートします。
方法はSQLその他、多様ですが、今回は使い慣れているDFUでやってみます。
5250端末からSTRDFU → Opt.5.一時プログラムを使用したデータの更新 を実行します。
ここで一つトリックがあり、スキーマ名=ライブラリー名を今回、INVOICE_LIB と10文字以上をしていたためDFUだとライブラリー名が10桁に短縮されたIBM i OSオブジェクト名を指定しないといけません。(SQLだとこのような制約はありません)
IBM i OSオブジェクト名のネーミングルールは末尾が 00001 (または00002,00003,,)となりその前に5文字のスキーマ名が付く形になります。今回は INVOI00001 となります。分からない場合は WRKOBJコマンド で INVOI* のように指定して探します。
ライブラリー を INVOI00001 と指定して、カーソルを1つ上のデータ・ファイルに合わせてテーブル名 INVOICEを指定します。
または、PF4キーを押すとテーブルの一覧が表示されます。この一覧から INVOICE を選択します。
エンターキーを押すとデータ入力画面に遷移するので適当なデータを入力します。(今回入力するデータは本物のインボイスデータをアップロードする間に消去します。)
今回は一番上のカラムに 1 を入力して、エンターキーを押します。5250では表示可能なカラム数に制約があり入力画面が複数に分かれています。エンターキーを2回押すと下記の画面に戻ります。これで1行の入力が完了します。
ここでPF3キーを押してデータ入力を終了すると、入力されたレコード件数が表示されます。
このままエンターキーを押すとダミーデータの入力が完了します。
ACSデータダウンロードの実行と .fdfx ファイルの生成
以上でデータ転送の実行準備が出来ました。(ふー)
ACSデータ転送の画面に戻り、転送の開始 ボタンを押します。
下図のように転送結果が表示されます。
下記では何度かレコード追加しているため4件のレコードがダウンロードされていますが、上記の手順通りの場合、転送レコードは1件になります。
.fdfxファイルを確認してみる
テキストファイルですので適当なエディターで開くと定義内容を確認できます。
.fdfx ファイルの簡単な説明
上図の.fdfxファイルの一部をテキスト起こしすると下記になります。
[Data Transfer File Description]
FieldCount=21
FileType=12
ClientFileEncoding=UTF-8
DataTransferVersion=1.0
[Options]
DateFormat=3
DateSep=1
DcmlSep=1
TimeFormat=5
TimeSep=1
[F0001]
Length=11
Name=SEQUENCENUMBER
Type=2
[F0002]
Length=15
Name=REGISTRATEDNUMBER
Type=2
[F0003]
Length=2
Name=PROCESS
Type=1
[F0004]
Length=1
Name=CORRECT
Type=1
[F0005]
Length=1
Name=KIND
Type=1
[Data Transfer File Description] 以降
ダウンロードするDb2 for iのテーブル情報やPCのファイル情報
[F0001]以降
カラム1つ1つの情報です。
Length=11
Name=SEQUENCENUMBER
Type=2
という属性が読み取れます。
F002(2つめのカラム)以降も同様です。
・・という事でようやく準備が整いました。次回インボイスデータをアップロードしてみます。