[Delphi:90232] ClientDataSet と Csv

1,491 views
Skip to first unread message

松本英俊

unread,
Jan 17, 2008, 8:40:53 PM1/17/08
to Del...@ml.users.gr.jp
まつもとです
ClientDataSetのデータをCsv形式に書き出すことはできました。
が、CsvファイルをClientDataSetに取り込む方法が解りません。
ClienDataSet1.Fields[0].****
といろいろ試しましが期待どうりにはなりません。
どうすればいいのでしょうか

BDS2006 pro
Xp pro


大津修一

unread,
Jan 18, 2008, 11:54:21 PM1/18/08
to Del...@ml.users.gr.jp
大津と申します。

> が、CsvファイルをClientDataSetに取り込む方法が解りません。
> ClienDataSet1.Fields[0].****

 このような形になると思います。

var
sl:TStringList;
csv:String;
begin
csv := '1000,suzuki,Tokyoy';
sl:=TStringList.Create ;
sl.Delimiter:=',' ;
sl.DelimitedText := csv;
with ClientDataSet1 do begin
Last;
Insert;
FieldByName('Number').AsInteger :=sl[0];
FieldByName('Name').AsString :=sl[1];
FieldByName('Address').AsString :=sl[2] ;
Post;
end;
sl.Free;
end;


 Postの位置は別途考える必要があります。


//////////////////////////////////////////////////////////////////

EMAIL: oh...@digipub-net.com
HP : http://www.digipub-net.com/

Delphiに関するドキュメント補完サイト:
http://www.digipub.biz/11/ap/Book/DelphiSpace/pDelphiSpace.aspx

ECO(Enterprise Core Object)に関するドキュメント補完サイト:
http://www.digipub.biz/11/ap/Book/Eco/pEcoSpace.aspx


松本 英俊

unread,
Jan 21, 2008, 1:55:14 AM1/21/08
to Del...@ml.users.gr.jp
まつもとです。
大津さん ありがとうございます。
行いたいことは、csvファイルをDBGridに表示させたいのです。
ADOConnection などを使ってDBGridに表示することはできます。

procedure TForm1.Button1Click(Sender: TObject);


var
sl:TStringList;
csv:String;
begin
csv := '1000,suzuki,Tokyoy';
sl:=TStringList.Create ;
sl.Delimiter:=',' ;
sl.DelimitedText := csv;
with ClientDataSet1 do begin
Last;
Insert;

FieldByName('Number').AsAsInteger :=sl[0]; *1


FieldByName('Name').AsString :=sl[1];
FieldByName('Address').AsString :=sl[2] ;
Post;
end;
sl.Free;
end;

これを実行すると
 IntegerとStringには互換性がないとエラーが出ます
 *1のAsIntegerをAsStringにするとコンパイルはできます。
コンパイル後、Button1をクリックすると
「データセットは閉じているため、この操作は実行できません」とメッセージが出ます。

で、Lastの前行にOpenを挿入すると
「ClientDataSet1 :データプロバイダ/パケットがありません」とエラーが出ます。


どうすればいいのか
申し訳ありませんが、教えていただけませんか。
なお、ClientDataSet1 の右クリックから項目の新規作成で「Number」を作成しています


大津修一

unread,
Jan 21, 2008, 2:52:44 AM1/21/08
to Del...@ml.users.gr.jp
松本さん

 大津です。

> FieldByName('Number').AsAsInteger :=sl[0]; *1

 はうっかりしていました。StrToInt()などで、整数化する必要がありました。

 サンプルプログラムは、すでにClientDataSet1がデータベースやローカルファ
イルに結合している前提で書いています。以下のエラーは、それができていない
ことによると思われます。

> で、Lastの前行にOpenを挿入すると
> 「ClientDataSet1 :データプロバイダ/パケットがありません」とエラーが出ます。
>
 

 またCSVファイルに出力した元のClientDataSet1のフィールド定義があるはず
なので、それに合わせて

FieldByName('XXXXX').AsXXXXXXX

を設定し、まずOpenしてから、サンプルのようなプログラムを実行することに
なります。

 CSVファイル自体は、StringList.LoadFromFileか何かで読み込み、一行ずつ読
み込む処理をループさせればいいと思います。

*************************************
 大津 修一
Shuichi Ohtsu


Delphiに関するドキュメント補完サイト:
http://www.digipub.biz/11/ap/Book/DelphiSpace/pDelphiSpace.aspx

ECO(Enterprise Core Object)に関するドキュメント補完サイト:
http://www.digipub.biz/11/ap/Book/Eco/pEcoSpace.aspx

*************************************

松本 英俊

unread,
Jan 21, 2008, 3:48:24 AM1/21/08
to Del...@ml.users.gr.jp
まつもとです
大津さん 丁寧な返信ありがとうございます。

>  サンプルプログラムは、すでにClientDataSet1がデータベースやローカルファ
> イルに結合している前提で書いています。以下のエラーは、それができていない
> ことによると思われます。

>  またCSVファイルに出力した元のClientDataSet1のフィールド定義があるはず
> なので、それに合わせて

ClientDataSet1に単独で任意の(他のアプリケーションソフト(Excelなど)で吐き出した)
csvファイルの内容をセットしたいのです。

>  CSVファイル自体は、StringList.LoadFromFileか何かで読み込み、一行ずつ読
> み込む処理をループさせればいいと思います。
そのようにしようと思っています。

任意のcsvファイルなのでフィールド名は
F1...F10...Fn
などとしたいと思っています。

> サンプルプログラムは、すでにClientDataSet1がデータベースやローカルファ
>イルに結合している前提で書いています。以下のエラーは、それができていない
>ことによると思われます。

ADOConnectionなどを利用せずに、ClientDataSet1だけにcsvファイルの
内容をClientDataSet1にとりこみたいのですが。????不可能

大津修一

unread,
Jan 21, 2008, 6:51:09 AM1/21/08
to Del...@ml.users.gr.jp
松本さん

 大津です。
>
> ADOConnectionなどを利用せずに、ClientDataSet1だけにcsvファイルの
> 内容をClientDataSet1にとりこみたいのですが。????不可能
>
>
 予めClientDataSet1のフィールド属性が決まらないのであれば、とりあえずす
べてをStringとし、必要フィールド数だけ定義しておきます。
 次にこれをローカルファイルに反映させておきます。これは以下のように新た
なローカルファイル(XMLファイル)を作成します。

procedure TfrmMain.btnMakeThemeTbXmlClick(Sender: TObject);
begin
try
ClientDataSet1.Close;
except
end;
if SaveDialog1.Execute then begin
if FileExists(SaveDialog1.FileName) then begin
ShowMessage('同名のファイルがすでに存在します。'
+#13+'違うファイル名を選択してください');
exit;
end;
ClientDataSet1.FileName:= SaveDialog1.FileName;
ClientDataSet1.CreateDataSet;
ClientDataSet1.SaveToFile(ClientDataSet1.FileName);
ClientDataSet1.Close;
end;

end;


 次にこのローカルファイルを再度オープンし、前回お示ししたような方法で読
み込めばいいと思います。

Reply all
Reply to author
Forward
0 new messages