请问用程序代码生成的数据库,怎样加缺省值?(100分)

  • 主题发起人 主题发起人 Wrong
  • 开始时间 开始时间
W

Wrong

Unregistered / Unconfirmed
GUEST, unregistred user!
如下代码可生成一个数据库,请问我想对字段加缺省值怎么办,当然用desktop database是
不行的,因为我是临时生成数据库。
Procedure Createysjgysdtable(PathToTable : String);
begin
with TTable.Create(Application) do
begin
Active := False;
DatabaseName := PathToTable;
TableName := 'ysjgysd.DB';
TableType := ttDefault;
FieldDefs.Add('收料库名',ftString,10,False);
FieldDefs.Add('合同编号',ftString,6,False);
FieldDefs.Add('录入日期',ftDate,0,False);
FieldDefs.Add('年份',ftString,4,False);
FieldDefs.Add('月份',ftSmallint,0,False);
FieldDefs.Add('验收单号',ftString,6,False);
FieldDefs.Add('供货编码',ftString,8,False);
FieldDefs.Add('供货单位',ftString,36,False);
FieldDefs.Add('发票号码',ftString,8,False);
FieldDefs.Add('发票日期',ftDate,0,False);
FieldDefs.Add('入库日期',ftDate,0,False);
FieldDefs.Add('供应编码',ftString,12,False);
FieldDefs.Add('类别',ftString,14,False);
FieldDefs.Add('物资名称',ftString,16,False);
FieldDefs.Add('型号规格',ftString,16,False);
FieldDefs.Add('包装尺寸',ftString,18,False);
FieldDefs.Add('计量单位',ftString,6,False);
FieldDefs.Add('计划单价',ftFloat,0,False);
FieldDefs.Add('ABC分类',ftString,2,False);
FieldDefs.Add('实收数',ftFloat,0,False);
FieldDefs.Add('实际单价',ftFloat,0,False);
FieldDefs.Add('货款',ftFloat,0,False);
FieldDefs.Add('运杂管理费',ftFloat,0,False);
FieldDefs.Add('实际总金额',ftFloat,0,False);
FieldDefs.Add('计划总金额',ftFloat,0,False);
FieldDefs.Add('质量保证',ftString,30,False);
FieldDefs.Add('减扣单价',ftFloat,0,False);
FieldDefs.Add('短缺或盈量',ftFloat,0,False);
FieldDefs.Add('拒付金额',ftFloat,0,False);
FieldDefs.Add('备注',ftString,60,False);
FieldDefs.Add('确认',ftBoolean,0,False);
FieldDefs.Add('验收员',ftString,8,False);
CreateTable;
Free;
end;
end;
 
如果数据库支持默认值的话,可以使用SQL 语句
create table table1(field1 varchar(10) default 'defval',...)来生成表
default指定的就是默认值
但是Paradox不支持默认值,没办法了
 
为什么不直接用SQL生成数据库以及表呢?
 
procedure fDbiDoRestructure(Tbl: TTable; Field: TField; MinVal, MaxVal, DefVal: pLongint; Required: Boolean);
var
hDb: hDbiDb;
TblDesc: CRTblDesc;
VChk: pVChkDesc;
Dir: string;
NumVChks: Word;
OpType: CROpType;
begin
NumVChks := 0;
SetLength(Dir, dbiMaxNameLen + 1);
Check(DbiGetDirectory(Tbl.DBHandle, False, PChar(Dir)));
SetLength(Dir, StrLen(PChar(Dir)));
VChk := AllocMem(sizeof(VChkDesc));
try
FillChar(TblDesc, sizeof(CRTblDesc), #0);

VChk.iFldNum := Field.Index + 1;
Tbl.DisableControls;
Tbl.Close;
Check(DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil,
hDb));
Check(DbiSetDirectory(hDb, PChar(Dir)));
with VChk^ do begin
bRequired := Required;
if (MinVal <> nil) then begin
Inc(NumVChks);
bHasMinVal := True;
move(MinVal^, aMinVal, sizeof(MinVal^));

end
else
bHasMinVal := False;
if (MaxVal <> nil) then begin
Inc(NumVChks);
bHasMaxVal := True;
move(MaxVal^, aMaxVal, sizeof(MaxVal^));
end
else
bHasMaxVal := False;
if (DefVal <> nil) then begin
Inc(NumVChks);
bHasDefVal := True;
move(DefVal^, aDefVal, sizeof(DefVal^));
end

else
bHasDefVal := False;
end;
TblDesc.iValChkCount := NumVChks;
TblDesc.pVChkDesc := VChk;
OpType := crADD;
TblDesc.pecrValChkOp := @OpType;
StrPCopy(TblDesc.szTblName, Tbl.TableName);
StrCopy(TblDesc.szTblType, szParadox);
Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil,
nil, False));
finally
Check(DbiCloseDatabase(hDb));
FreeMem(VChk, sizeof(VChkDesc));

Tbl.EnableControls;
Tbl.Open;
end;
end;

调用BDE的API函数可以做到
要uses dbTables,db,bde;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
855
DelphiTeacher的专栏
D
后退
顶部