这个数据表如何导出?(100分)

  • 主题发起人 主题发起人 qdshen
  • 开始时间 开始时间
Q

qdshen

Unregistered / Unconfirmed
GUEST, unregistred user!
这个数据表如何导出?
一个Access数据库中的Table,结构如下:

BH Datas(是Memo字段)
1 abc,1.03;cdf,1.02;efg,1.14;fghi,1.18
4 abc,1.13;cdf,1.12;efg,1.33;fghi,1.38
567 abc,1.33;cdf,1.22;efg,1.53;fghi,1.48
23 abc,1.53;cdf,1.32;efg,1.63;fghi,1.68

我想要把这个表导出为data.dbf,结构如下:

BH abc cdf efg fghi
1 1.03 1.02 1.44 1.18
4 1.13 1.12 1.33 1.38
567 1.33 1.22 1.53 1.48
23 1.53 1.32 1.63 1.68

这个表中大概有五千个类似记录,而且每天不断更新。
请教诸位高手,我该如何做?请给出详细代码
 
只能一条一条倒. 读一个Memo, 分解字符串, 添加/修改到dbf中相应字段.
 
用两个TABLE分别连接ACCESS与DBF数据库.
将连接ACCESS的TABLE第一个字段值直接赋给DBF的相应字段即可.
将ACCESS库的第二个字段作为字符串进行分割,可取得其余四个字段的字段名及对应值.
然后与连接DBF的TABLE中的字段名进行比较,将值赋给相应的字段即可.
代码很简单,自己写一下就可以了!
 
Access库我不熟,但我想Memo字段转成Char字段可以吧,接下来:
Query1.colse;
Query1.SQL.Clear;
Query1.SQL:='select * from Table';
Query1.open;
Table1.TableName:='data.dbf'
Table1.open;
While not Query1.Eof do
Begin
TempStr:=Query1.FieldByName('Datas').AsString;
Table1.Append;
for i:=1 to 4 do
begin
delete(TempStr,1,pos(',',TempStr));
Table1.Fields.AsString:=copy(TempStr,1,Pos(';',TempStr)-1);
delete(TempStr,1,pos(';',TempStr));
end;
Query1.next;
Table1.Post;
end;
 
将表导出为:Text,删除所有BH,abc等,建一个定好字段的表(BH,abc,cdf,efg,fghi),将Text导入.
 
s:=query1.fieldbyname('datas').asstring;
stringreplace(s,'abc','',[rfReplaceAll]);
stringreplace(s,'; cdf','',[rfReplaceAll]);
stringreplace(s,'; efg','',[rfReplaceAll]);
stringreplace(s,'; fghi','',[rfReplaceAll]);
conn.exec('insert into table2 values('+query1.fieldbyname('BH').asstring+s+')');
说明:query1是与access表相联的。
conn是与data.dbf相联的。
data.dbf的结构是BH,abc,cdf,efg,fghi均是数值型字段。
 
To All
我试试
 
如果abc,cdf,efg,fghi后面不止一个数据
像这样 abc,1.23,1.24,1.25,2.0;cdf,1.02,1.03,1.02,1.0;......
而我只想要倒数第二个数值,该如何是好?
我是低手,程序请详细一点,分不够再加。
 
//只想要倒数第二个数值
你还有何要求,请一一提将出来!
电脑对于重复而繁杂的工作特别在行,而对你这“偶尔”的要求确无法实现,即:
你今天取倒数第二个,后天取正数第20个,...这不明白着刁难编程者吗?!如若确实要
这样做,则你必须告诉电脑何为倒数第二个,何为正数第20个等等!

另:你的问题,我想并不难实现(如果你的abc,cdf是‘常量’的话!)可以不用memo字段,而用
字符串就可以解决!
 
>Jams
我确实只想要倒数第二个数值,何谓刁难?
你写出全部代码,分全给你!

另:这个access数据库是别人程序里的
我只想导出有用的数据。
 
var
s,temp:tstringlist;
i:integer;
begin
s:=tstringlist.create;
temp:=tstringlist.create;
s.text:=query.fieldbyname('datas').asstring;
stringreplace(s.text,';',#13+#10,[rfReplaceAll]);
for i:=0 to s.count-1 do
begin
temp.text:=s.strings;
stringreplace(temp.text,',',#13+#10,[rfReplaceAll]);
s.strings:=temp.strings[temp.count-2];
end;
stringreplace(s.text,#13+#10,',',[rfReplaceAll]);
conn.exec('insert into table2 values('+query1.fieldbyname('BH').asstring+','+s.text+')');
end;
 
TO hhzh426
>>>conn.execsql('insert into table2 values('+query1.fieldbyname('BH').asstring+','+s.text+')');
这句SQL编译不对.
 
你假如要天天處理相類似的工作﹐建議寫個程序了﹐若你只是一次或几次﹐那么建議你將
其匯入到Excel里﹐那樣最快。若格式固定﹐程序很好寫﹐前面已有人寫了例子﹐你可以略
改一下即可。
 
>>>hhzh426
快来!!!!!!!!
急急急!
 
conn.execsql('insert into table2
values('''+query1.fieldbyname('BH').asstring+''','''+s.text+''')');
试试。
 
conn.execute(...)
sorry!!!
 
>>>hhzh426
还是不对
 
有什么提示???
 
首先我想是应该用ExecSQL('...');
提示为“Too many actual parameters”
 
execsql后面没有参数。
execute是tadoconnection的方法
execsql是tadoquery的方法。
如果用adoquery:
adoquery1.close;
adoquery1.sql.text:='insert into table2
values('''+query1.fieldbyname('BH').asstring+''','''+s.text+''')';
adoquery1.open;
如果用adoconnection:
conn.execute('insert into table2
values('''+query1.fieldbyname('BH').asstring+''','''+s.text+''')');
你再试试!
 
后退
顶部