怎样在BDE中的QUERY控件里取得一个DBF表中字段的长度(200分)

  • 主题发起人 主题发起人 一剑封喉
  • 开始时间 开始时间

一剑封喉

Unregistered / Unconfirmed
GUEST, unregistred user!
在query控件中要对一个DBF表进行查询,要取得该表中一个字段的长度,
可是用length,datalength,len程序都出错,请教那位大侠知道,可否告知。
 
对表的描述要从bde函数方面想吧。
下面这个应该有帮助。
try it:

Retrieve a description of the specified field type.

This example uses the following input:

fDbiGetFieldTypeDesc(szPARADOX, 'PDOX 7.0', 'ALPHA', MyFieldType);

The procedure is:

procedure fDbiGetFieldTypeDesc(DriverType, TableType, FieldType: PChar;

var FieldTypeInfo: TStringList);

function BoolVal(InBool: Boolean): string;
begin
if InBool then Result:= 'True'
else Result:= 'False';
end;

var
FieldTypeRec: FLDType;
begin
Check(DbiGetFieldTypeDesc(DriverType, TableType, FieldType, FieldTypeRec));
FieldTypeInfo.Add
('Field ID Type: ' + IntToStr(FieldTypeRec.iId));
FieldTypeInfo.Add('Symbolic Name: ' + StrPas(FieldTypeRec.szName));

FieldTypeInfo.Add('Descriptive Text: ' + StrPas(FieldTypeRec.szText));
FieldTypeInfo.Add('Physical / Native Type: ' + IntToStr (FieldTypeRec.iPhyType));
FieldTypeInfo.Add('Default Translated Type: ' + IntToStr (FieldTypeRec.iXltType));
FieldTypeInfo.Add('Default Translated Subtype: ' + IntToStr (FieldTypeRec.iXltSubType));
FieldTypeInfo.Add('Maximum Units Allowed (1): ' + IntToStr (FieldTypeRec.iMaxUnits1));
FieldTypeInfo.Add('Maximum Units Allowed (2): ' + IntToStr (FieldTypeRec.iMaxUnits2));

FieldTypeInfo.Add('Physical Size: ' + IntToStr (FieldTypeRec.iPhySize));
FieldTypeInfo.Add('Field Required: ' + BoolVal(FieldTypeRec.bRequired));
FieldTypeInfo.Add('Supports user-specified default: ' + BoolVal(FieldTypeRec.bDefaultVal));
FieldTypeInfo.Add('Supports Min Val constraint: ' + BoolVal(FieldTypeRec.bMinVal));
FieldTypeInfo.Add('Supports Max Val constraint: ' + BoolVal(FieldTypeRec.bMaxVal));
FieldTypeInfo.Add('Supports Referential Integerity: ' + BoolVal(FieldTypeRec.bRefIntegrity));

FieldTypeInfo.Add('Supports Other Checks: ' + BoolVal(FieldTypeRec.bOtherChecks));
FieldTypeInfo.Add('Can Be Keyed: ' + BoolVal(FieldTypeRec.bKeyed));
FieldTypeInfo.Add('Multiple Fields of this Type: ' + BoolVal(FieldTypeRec.bMultiplePerTable));
FieldTypeInfo.Add('Minimum Units Required (1): ' + IntToStr (FieldTypeRec.iMinUnits1));
FieldTypeInfo.Add('Minimum Units Required (2): ' + IntToStr (FieldTypeRec.iMinUnits2));
FieldTypeInfo.Add('Field Type Can be Created: ' + BoolVal(FieldTypeRec.bCreateable));

end;
 
千中元哥们,你告诉我的好象与我说的差很多,我现在已经能够独自操作一个对一个DBF表的增加删除以及一系列操作,只是在QUERY
控件中写SQL时,不能取得这个DBF表中一个字段的长度,不知道用哪个函数,你知道怎么解决吗?
 
取Query.Fields.Fields[n].DataSize/Query.Fields.Fields[n].Size就可以得到
字段的长度啦。
 
想直接在sql语句中得到字段的长度,就象select count(*)一样?
datalength是sql server里才有的,local sql不支持,可能没办法在sql语句中得到
 
各位大侠,小弟紧急,麻烦你们快点回复,必有重谢,这么多富翁,怎么就没有人可怜可怜我呢?
 
在TFieldDef中有个Size属性,不知道可不可以,你试试吧。
Query1.FieldDefList[0].Size;
 
直接读dbf表的表头。
 
panyongze兄,你能不能说的更详细一点
 
panyongze兄,你到是说话呀,那位大侠救我
 
给你一段简单的例子。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
type
sz1=array[1..10] of char;
sz2=array[1..20] of char;
sz3=array[1..14] of char;
jllx1=record
bsf,nian,yue,ri:byte;
zjls:longint;
zdgs:word;
qt:sz2;
end;

jllx2=record
zdm:sz1;
wz1:byte;
zdlx:char;
wz2:longint;
zdkd,xsw:byte;
qt:sz3;
end;
var
infile:file;
br,i,j:integer;
fname,sss:String;
txx:jllx1;
zdb:jllx2;

begin
fname:='c:/abc.dbf';
assignfile(infile,fname);
reset(infile,1);
blockread(infile,txx,sizeof(txx),br);

listbox1.Items.Clear;
j:=round((txx.zdgs-1)/32-1);
for i:=1 to j do begin
blockread(infile,zdb,sizeof(zdb),br);
sss:=zdb.zdlx+' | '+inttostr(zdb.zdkd)+' | '+inttostr(zdb.xsw)+' '+zdb.zdm;
listbox1.Items.Add(sss);
end;
closefile(infile);
end;

end.
 
多人接受答案了。
 
后退
顶部