简单,两个运行中动态生成数据库的问题,一个50分.(100分)

  • 主题发起人 kingkong
  • 开始时间
K

kingkong

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
tbl:ttable;
begin
tbl:=ttable.create(self);
with tbl do
begin
DatabaseName:='DefaultDD';
tablename:='c:/aaaa/Test.dbf';
with fielddefs do
begin
clear;
add('No',ftInteger,0,false);
add('Name',ftString,0,false);
end;
with indexdefs do
begin
clear;
add('primary','no',[ixPrimary,ixUnique]);
end;
CreateTable;
end;
DataSource1.DataSet:=tbl;
DBGrid1.DataSource:=DataSource1;

tbl.Active:=True;
end;
 
if not Table1.Exists then begin
with Table1 do begin
{ The Table component must not be active }
Active := False;
{ First, describe the type of table and give }
{ it a name }
DatabaseName := 'DBDEMOS';
TableType := ttParadox;
TableName := 'CustInfo';
{ Next, describe the fields in the table }
with FieldDefs do begin
Clear;
with AddFieldDef do begin

Name := 'Field1';
DataType := ftInteger;
Required := True;
end;
with AddFieldDef do begin
Name := 'Field2';
DataType := ftString;
Size := 30;
end;
end;
{ Next, describe any indexes }
with IndexDefs do begin
Clear;
{ The 1st index has no name because it is
{ a Paradox primary key }
with AddIndexDef do begin

Name := '';
Fields := 'Field1';
Options := [ixPrimary];
end;
with AddIndexDef do begin
Name := 'Fld2Indx';
Fields := 'Field2';
Options := [ixCaseInsensitive];
end;
end;
{ Call the CreateTable method to create the table }
CreateTable;
end;
end;
 
to Jhdandcl:
抱歉,你应该看清楚问题再回答,我的两个要求是:
1.动态生成能被FoxPlus打开的数据库,FoxPlus数据库的扩展名是".dbf',你的程序生成的
数据库扩展名为".db";
2.如何加上一个数值型字段,条件是名称为"Money",长度15位,有2位小数.
 
to kingkong:
1、你程序代码的错误之处Jhdandcl写得很明白了,
第一要保证你创建的数据表处于未打开的状态,你才能新建或重写数据表,即要么你
的c:/aaaa/test.dbf不存在,或者存在,但处于未被任何程序调用该数据库;
第二,就是你的创建表的语句是不正确的,首先得保证你的bde中有dbase类型的别名
存在,然后才能建数据表,如你的语句中,DatabaseName:='DefaultDD'不知是
否是dbase类型的并真正存在,如果是并真正存在才能建立数据表格。
第三,假设存在的情况,语句中应该还缺一句TableType:=ttdbase;吧?
调用Table.FieldDefs.Add(const Name:string;DataType: TFieldType; Size: Word; Required: Boolean)
增加表格的各个字段,其中Name为字段名,DataType 为字段类型(常用的有ftInteger,ftString,ftDate,
ftBoolean 等),Size为字段长度,Required为该字段是否允许有空值。
调用Table.IndexDefs.Add(const Name, Fields: string; Options: TIndexOptions)方法增加表格的索引文
件,其中Name为索引文件名,Fields为索引字段,options 为索引参数的集合,常用的索引参数有ixPrimary
(主键)、ixDescending(降序)、 ixUnique(具有唯一值)等。
第四步,调用Table.CreateTable 建立表格。
罗嗦之处,请见谅!
2、你的第二个问题,因为我不能建立含有名称为"Money",长度15位,有2位小数的.dbf
文件,但有个方法可以知道的,你先用foxbase或foxpro建立一个数据表,再在delphi
中的DataBase Desktop中打开该数据表,查看其结构应该明白"money"字段在delphi对
应的名称。

 
to 阿黛:
不好意思,我说的建立字段"Money"可能不明确,
实际上我只想建立一个字段(任意名称),条件是
数值型字段,长度15位,有2位小数或多位小数.谢过
先.
 
DatabaseName:='DefaultDD';
把别名‘DefaultDD'的driver定义为foxpro即可,我的程序中都是这样动态生成的
 
怎么回事,我原来的kingkong帐号不能再提问了,也不能回复别人
的贴子,我的帐号很久以前已经确认了,警灯没有亮起,为什么出现
这种情况,现在的注册了一个新的帐号"kingkong2",有没有办法让我原来
的帐号恢复正常;
 
怎么没人回答了,难到建立一个有小数的数值型字段这么难吗?[red][/red][:(!]
 
BDE建库用session很简单,建表我从来都是用SQL语句的。
 
现在大家都是惜字如金,请大家说祥细一些(就以Table控件为例),谢谢先!!!
 
怎么回事,难到大家的字段都不用小数点吗?
这也太离谱了吧!有谁知道??
如果能解决,我再给100分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
如果能解决,我再给100分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
如果能解决,我再给100分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
如果能解决,我再给100分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
如果能解决,我再给100分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
integer是整数型字段,不能有小数点,而且要在程序中生成两位小数,一般要是ftfloat
类型的,是要根据表的类型来定,基本上所有的数据表都 有如下字段
TStringField 字符串类型的字段
TSmallIntField 短整数类型的字段 -32768-32767
TIntegerField 整数类型的字段
TWordField 正整数类型的字段0-65535
TBooleanField 布尔型字段
TFloatField 浮点数类型的字段
TCurrenCyField 货币型字段
TDataField 日期型
TimeField 时间型
TBCDField 小数位数固定的浮点数
TDataTimeField 日期时间型字段
在foxpro中可以定义,货币型,或数值型就可以了,不必再加小数位,它默认小数位为两
位不就满足了你的要求,还有就是你自已建立一个数据表,以后要生成新表,只要拷贝就行了,
何必如此麻烦!!

 
我的程序数据库字段事先是不确定的,有一个小模块
用于客户自己修改库结构,你说的ftfloat,在程序中
的写法是add('Name',ftfloat,15,2,false)这样吗?
恐怕不行吧...
 
唉,大富翁的高人越来越少了........
 
add('Name',ftfloat,0,false)就行了,可以输入两位的实数了,或者在foxpro中使用
add('Name',ftnumber,0,false)
 
to 阿黛:
如果我设置的字段超过2位小数,比如有6位小数呢?谢谢........
 
这个问题回答到此已没有意义了,在delphi的帮助中写的很明白了,利用动态方式add建立
数据表只有规定的类型可以定义的,像定义小数这种类型其实说穿了就是定义成float型的,
系统规定了float的长度,不是你编程就能解决的,我说了,除非你先定义一个数据表,否则
就只有用规定的语句。float的定义是有很多位小数的(并不是就是两位或者陆位),其他的只
有自已在程序录入数据的界面再想其他的办法了。
其他的数据类型在DELPHI帮助中去找,在索引中输add,往下找Tfidlsdefs仔细看看了。
 
顶部