Delphi Programming / Object Pascal
[掲載 2005年05月14日] [更新 2013年03月27日] Delphi サンプルプログラム集 |
620_ADO で Paradox のエクスポート |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE Pro + Msjet40.dll 4.00.9756.0 |
|
620_ADO_Export.zip [4,566 KB] 2013年03月26日版 (EXE 同梱) |
- 2010年05月27日
- エクスポート先の種類ごとのプロジェクトに分けた
- 動作確認環境変更
- 2013年03月27日
- Windows 7 U64(SP1) + Delphi XE Pro で動作確認
- 記事の修正・編集等
|
ADO で Paradox データベースのデータをエクセルやテキストファイルに出力するサンプルです.
テキストファイルの場合,本ページのサンプルのコードでは,データの更新 (削除・追加等) ができなため,既にファイルが存在する時はそのファイルを削除しています.
元の Paradox のデータは [DB_Pdx] フォルダにあります.
SQL の結果をエクスポートしたい場合は,次の様に指定できます. |
LstrSelect := 'SELECT * INTO ' + LFileName + ' '
+ 'IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM ParaTest WHERE 食品群 LIKE "%菜%" ';
LstrSelect := 'SELECT * INTO ' + LFileName + ' '
+ 'IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM (SELECT * FROM ParaTest WHERE 食品群 LIKE "%菜%" )';
このページのサンプルプログラムでは,下図のような Paradox データベースのデータをエクスポート先に出力します.この図は,Delphi に付属しているデータベースデスクトップを,管理者権限で起動して表示しています. |
|
図1
テーブルの構造 |
|
図2
データ
|
以下は,サンプルプログラム集の ADO 関係の記事へのリンクです. |
添付の Paradox のデータをエクセルのシートへ出力する例です.
このサンプルでは,Excel 2007 以降の .xlsx 形式の出力はできません. |
|
図3
設計時画面 |
エクスポートの結果として出力された Excel のデータです. |
|
図4
実行結果
- 出力されたエクセルのデータ
- [キロカロリ] で昇順ソートしている
|
リスト1
Paradox のデータをエクセルに出力 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ExtCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// FormCreate時に各種初期設定
// ADOConnecton1,ADOQuery1はFormに配置しデフォルトの状態で使用
// それ以外の設定はこのサンプルコード内で行っている
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.Connected := False;
ADOConnection1.KeepConnection := False;
ADOConnection1.LoginPrompt := False;
ADOConnection1.Mode := cmReadWrite;
ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0';
ADOConnection1.ConnectionString := 'Data Source=../DB_Pdx;'
+ 'Extended Properties="Paradox 5.x;"';
ADOQuery1.Connection := ADOConnection1;
//Windows VisataとWindows 7では接続した後に接続文字列を設定しないと正常動作不可
ADOConnection1.Connected := True;
ADOQuery1.ConnectionString := ADOConnection1.ConnectionString;
end;
//=============================================================================
// フォームを閉じたら接続を切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection1.Connected := False;
end;
//=============================================================================
// Paradoxの表データをExcel(シート)へエクスポート
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LExcelPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//対象のExcelのブック
LExcelPath := '../Data/ADOTest.Xls';
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LExcelPath) then DeleteFile(LExcelPath);
//SQL文の作成
//ここではSheet1に出力
//必要であれば*部分に取得したい項目名を並べる
LstrSelect :='SELECT * INTO [Sheet1] IN ' + AnsiQuotedStr(LExcelPath, '"') + ' '
+ AnsiQuotedStr('Excel 8.0;', '"');
LstrFrom :='FROM ParaTest ORDER BY キロカロリ ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
end.
02_CSV テキストファイルへのエクスポート ( スキーマ設定なし ) |
添付の Paradox のデータをカンマ区切りの CSV ファイルへ出力する例です.
このサンプルでは,スキーマの設定を使用していません.スキーマの設定を使用しない場合,CSV ファイルの第 1 行目にタイトルが出力されます. |
|
図5
設計時画面 |
エクスポートして出力された CSV ファイルをテキストエディタで表示しているところです.文字列はダブルクーテンションで括られ (囲まれ) て出力されます. |
|
図6
出力結果 |
このサンプルではスキーマの定義は使用していませんが,データの出力先のフォルダに schema.ini という名前のファイルが作成され,次のようなスキーマの定義が作成されます.
[ ] 内は,出力したデータファイルの名前で,各項目の Width の値は,元の Paradox で定義している長さとなります. |
|
図7
スキーマの定義
|
リスト2
Paradox のデータを CSV ファイルへ出力
Button1Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// Paradoxの表データをCSVテキストファイルへエクスポート
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOCsv1.csv';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' '
+ 'IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM ParaTest ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
03_CSV テキストファイルへのエクスポート ( スキーマ設定あり ) |
添付の Paradox のデータをカンマ区切りの CSV テキストファイルに出力します.
このサンプルではスキーマの定義を使用しています. |
|
図8
設計時画面 |
スキーマの定義は,添付のスキーマファイル,schema.ini 内に書いてあります.[ ] 内が出力されるファイルの名前です.ColNameHeader=False は項目名の行を出力しない設定です. |
[ADOCsv2.csv]
ColNameHeader=False
CharacterSet=932
Format=CSVDelimited
Col1=番号 Short
Col2=食品群 Char Width 30
Col3=食品名 Char Width 30
Col4=キロカロリ Short
|
出力された CSV ファイルをテキストエディタを表示したところです.
タイトル行は出力されていません. |
|
図9
出力結果
|
リスト3
Paradox のデータを CSV テキストファイルへ出力
Button1Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// Paradoxの表データをCSVテキストファイルへエクスポート 2
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOCsv2.csv';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//食品群の野菜類だけをエクスポート
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' '
+ 'IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM ParaTest WHERE 食品群="野菜類" ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
添付の Paradox のデータをタブ区切りのテキストファイルへ出力します.
タブ区切りのテキストデータとして出力するには,スキーマファイルでの設定が必要です.スキーマの設定がないと CSV データとして出力することになります. |
|
図10
設計時画面 |
添付のスキーマファイル,schema.ini 内のスキーマの設定です.[ ] 内が出力データを保存するファイル名です.
ColNameHeader=True は元の Pardox のデータの項目名も出力する指定です.項目名は Col1, Col2, 等の名前を変えれば,元の項目名と異なる項目名にすることもできます. |
[ADOTab.txt]
ColNameHeader=True
MaxScanRows=0
Format=TabDelimited
Col1=番号 Short
Col2=食品群 Char
Col3=食品名 Char
Col4=キロカロリ Short
|
エクスポートの結果をテキストエディタで表示しています.第 1 行目に項目名が出力されています. |
|
図11
出力結果 |
リスト4
Paradox のデータをタブ区切りのテキストデータとして出力
Button1Click 以外のコードは前のサンプルと同じ |
//=============================================================================
// Paradoxの表データをタブ区切りのテキストファイルへエクスポート
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOTab.txt';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' '
+ 'IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM ParaTest ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
添付の Paradox のデータを固定長テキストデータとして出力します.
固定長テキストデータとして出力するには,必ずスキーマファイルで各項目ごとに出力後のデータ長を設定しなければなりません.各データはこの長さで出力されます.スキーマファイル内に設定がない場合は,CSV のテキストデータ形式で出力されます. |
|
図12
設計時画面 |
添付のスキーマファイル,schema.ini 内のスキーマの設定です.[ ] 内が出力先のファイル名です.
ColNameHeader=False は項目名を出力しない指定です. |
[ADOFix.txt]
ColNameHeader=False
Format=FixedLength
Col1=番号 Short Width 6
Col2=食品群 Char Width 20
Col3=食品名 Char Width 23
Col4=キロカロリ Short Width 8
|
エクスポートしたデータをテキストエディタで表示した結果です.
項目名は出力されていません. |
|
図13
出力結果 |
リスト5
Paradox のデータを固定長テキストデータとして出力
Button1Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// Paradoxの表データを固定長テキストファイルへエクスポート
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOFix.txt';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' '
+ 'IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM ParaTest ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
添付の Paradox のデータを JET データベースの表へ出力します.
JET データベースの出力先の表に該当項目がない場合は出力できません.データ (レコード) の重複を避けるために,出力先の表のデータを全て削除してから取り込んでいます.
このサンプルコードでは,実際には JET データベースにインポートする形式となっています. |
|
図14
設計時画面 |
|
図15
実行結果
- JET エンジンデータベースのデータを表示
- [インポート] をクリック
- [確認表示] をクリック
|
リスト6
Paradox のデータを JET データベースへ出力 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ExtCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// FormCreate時に各種初期設定
// ADOConnecton1,ADOQuery1はFormに配置しデフォルトの状態で使用
// それ以外の設定はこのサンプルコード内で行っている
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.Connected := False;
ADOConnection1.KeepConnection := False;
ADOConnection1.LoginPrompt := False;
ADOConnection1.Mode := cmReadWrite;
ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0';
ADOConnection1.ConnectionString := 'Data Source=../Data/ForExport.mdb;';
ADOQuery1.Connection := ADOConnection1;
//Windows VisataとWindows 7では接続した後に接続文字列を設定しないと正常動作不可
ADOConnection1.Connected := True;
ADOQuery1.ConnectionString := ADOConnection1.ConnectionString;
end;
//=============================================================================
// フォームを閉じたら接続を切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection1.Connected := False;
end;
//=============================================================================
// [JET DB データ削除]ボタン
// 対象となるmdbの該当テーブルのデータを全て削除
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
//mdbの該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETE FROM 食品カロリ表 ');
ADOQuery1.ExecSQL;
Screen.Cursor := crDefault;
end;
//=============================================================================
// [実行]ボタン
// Paradoxの表データをJETデータベースへエクスポート
// JETデータベースにParadoxのデータをインポートと同じなので
// FormのOnCreateでJETデータベースの接続設定を行っている
//
// Paradoxの表にも,JET DBの表にも同じ項目(フィールド)があることが前提
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LParadoxDir : String;
LstrInto : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//mdbの該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
Button1Click(nil);
//対象のParadoxのデータベース名(Paradoxはフォルダがデータベース名)
LParadoxDir := '../DB_Pdx';
//SQL文の作成
LstrInto := 'INSERT INTO 食品カロリ表 (番号, 食品群, 食品名, キロカロリ) ';
LstrSelect := 'SELECT 番号, 食品群, 食品名, キロカロリ ';
LstrFrom := 'FROM ParaTest IN ' + AnsiQuotedStr(LParadoxDir, '"') + ' '
+ AnsiQuotedStr('Paradox 5.x;', '"');
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrInto);
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
//=============================================================================
// [確認表示]ボタン
// JETデータベースのテーブルを開いてDBGridに表示
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT 番号, 食品群, 食品名, キロカロリ FROM 食品カロリ表');
ADOQuery1.Open;
ADOQuery1.EnableControls;
Screen.Cursor := crDefault;
end;
end.
|