dbf.TableName:='table.dbf';
dbf.TableLevel:=4;
dbf.FieldDefs.Add('item1', ftString, 10, true);
dbf.FieldDefs.Add('item2', ftInteger, 5, true);
dbf.FieldDefs.Add('item3', ftFloat, 10, true);
dbf.FieldDefs[dbf.FieldDefs.Count-1].Precision:=2;
dbf.CreateTable;
Создание dbf файла (dBASE IV) при помощи TDBF
Код:
В рантайме при создании целочисленного поля получаю EDatabaseError "Invalid field size" , тоже самое получаю при создании вещественного поля.
Если написать так:
Код:
dbf.FieldDefs.Add('item2', ftInteger);
dbf.FieldDefs.Add('item3', ftFloat);
dbf.FieldDefs[dbf.FieldDefs.Count-1].Precision:=2;
dbf.FieldDefs.Add('item3', ftFloat);
dbf.FieldDefs[dbf.FieldDefs.Count-1].Precision:=2;
то dbf будет создан с целочисленным полем размером 9 и вещественным формата 18.8
Как получить необходимую мне размерность?
Что-то у меня большие сомнения, что dbf, даже от dBASE IV, поддерживает такие форматы. Тогда это не ошибка TDbf, а ограничение самого формата. 10-значное целое число уже переходит границу 32-битного целого. Аналогично с вещественным. Не было таких размерностей в DOS.
Freeman все правильно сказал. Не было там размерностей для интов, выходящих за 32 бита, то есть числа более 4294967296 не могут там хранится в таком формате. Получается что максимум - 9-значное целое (закодировать 9999999999 мы уже не сможем). Так что либо отказывайтесь от dbf, либо - придумывайте, как изгольнуться.
Код:
var fieldDefs:TDbfFieldDefs;
begin
dbf.TableName:='table.dbf';
dbf.TableLevel:=4;
fieldDefs:=TDbfFieldDefs.Create(dbf);
fieldDefs.Add('item1', ftString, 10, true);
fieldDefs.Add('item2', ftInteger, 5, true);
fieldDefs.Add('item3', ftFloat, 10, true);
fieldDefs.Items[fieldDefs.Count-1].Precision:=2;
dbf.CreateTableEx(fieldDefs);
fieldDefs.Destroy;
end.
begin
dbf.TableName:='table.dbf';
dbf.TableLevel:=4;
fieldDefs:=TDbfFieldDefs.Create(dbf);
fieldDefs.Add('item1', ftString, 10, true);
fieldDefs.Add('item2', ftInteger, 5, true);
fieldDefs.Add('item3', ftFloat, 10, true);
fieldDefs.Items[fieldDefs.Count-1].Precision:=2;
dbf.CreateTableEx(fieldDefs);
fieldDefs.Destroy;
end.
Работает на ура