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 のエクスポート


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 関係の記事へのリンクです.





01_エクセル ( シート ) へのエクスポート


添付の 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;




04_タブ区切りテキストファイルへのエクスポート


添付の 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;




05_固定長テキストファイルへのエクスポート


添付の 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;




06_JET データベースへのエクスポート


添付の 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.