Всем привет дорогие читатели сайта. Многие пользователи хотят программным путем создать таблицу DBF. У многих это получается, но получается таким образом, что они не могут создать поле Numeric с определенной точностью целых и дробных частей числа.
Поэтому, если Вы хотите создать DBF-таблицу на Delphi со своим количество знаков до запятой и после, то данная статья для Вас. Здесь будет описан механизм, который поможет нам создать подобную таблицу без участия настроек BDE, то есть, нам без разницы будут эти настройки, мы все равно создадим со своими данными. Для этих целей нам понадобится компонент TDBF, который можно скачать из сети, а также стандартный компонент TTable, который находится на вкладке BDE.
При помощи компонент TDBF мы создадим нужную структуру таблицы, а при помощи компонента TTable мы будем записывать данные в эту таблицу. В примере я делаю выгрузку из ADOQuery (он получает данные из MS SQL) в DBF-файл, код у меня получился следующим:
procedure TForm1.Action3Execute(Sender: TObject);
var
DBF1:TDBF;
i:integer;
begin
try
// Создадим DBF таблицу для отходов
DBF1:=TDBF.Create(Form1);
DBF1.AddFieldDefs('DATE_OP',bfString,10,0);
DBF1.AddFieldDefs('TTN_SER',bfString,2,0);
DBF1.AddFieldDefs('TTN_NO',bfNumber,7,0);
DBF1.AddFieldDefs('UNN',bfNumber,11,0);
DBF1.AddFieldDefs('NAME',bfString,40,0);
DBF1.AddFieldDefs('COST',bfNumber,20,0);
DBF1.AddFieldDefs('CODE_1C',bfNumber,6,0);
DBF1.AddFieldDefs('PLAT_NO',bfNumber,10,0);
DBF1.AddFieldDefs('PLAT_DATE',bfString,10,0);
DBF1.TableName:=Ini.ReadString('MAIN','PATCH_DBF','')+'\'+DateToStr(Date)+'.dbf';
DBF1.CreateTable;
DBF1.CodePage:=ANSI;
tWast.TableName:=DBF1.TableName;
tWast.Active:=True;
//Заполним таблицу некоторыми данными
tWast.Active := True;
tWast.Insert;
tWast.Fields[0].Value:=ADOQuery1.Fields.FieldByName('DOC_DATE').AsVariant;
if length(ADOQuery1.Fields.FieldByName('OPERATIONNUM').AsVariant)=9 then
begin
tWast.Fields[1].Value:=Copy(ADOQuery1.Fields.FieldByName('OPERATIONNUM').AsVariant,1,2);
tWast.Fields[2].Value:=Copy(ADOQuery1.Fields.FieldByName('OPERATIONNUM').AsVariant,3,7);
end;
if length(ADOQuery1.Fields.FieldByName('OPERATIONNUM').AsVariant)<9 then
begin
tWast.Fields[1].Value:='НН';
tWast.Fields[2].Value:=ADOQuery1.Fields.FieldByName('OPERATIONNUM').AsVariant;
end;
if length(ADOQuery1.Fields.FieldByName('OPERATIONNUM').AsVariant)=0 then
begin
tWast.Fields[1].Value:='НН';
tWast.Fields[2].Value:='1111111';
end;
tWast.Fields[3].Value:=ADOQuery1.Fields.FieldByName('UNN').AsVariant;
tWast.Fields[4].Value:=ADOQuery1.Fields.FieldByName('Name').AsVariant;
tWast.Fields[5].Value:=ADOQuery1.Fields.FieldByName('SUMMA3').AsVariant;
tWast.Fields[6].Value:=StrToInt(Form5.CODE1C);
tWast.Fields[7].Value:=ADOQuery1.Fields.FieldByName('PLATNO').AsVariant;
tWast.Fields[8].Value:=DateToStr(ADOQuery1.Fields.FieldByName('DATEPLAT').AsVariant);
tWast.Post;
tWast.Active:=False;
Application.MessageBox(PChar('Выгрузка прошла успешно по пути: '+#13#10+DBF1.TableName),'Внимание!',MB_OK+MB_ICONINFORMATION);
FreeAndNil(DBF1);
ADOQuery1.First;
except
on e:Exception do
Application.MessageBox('Ошибка выгрузки данных','Внимание!',MB_OK+MB_ICONINFORMATION);
end;
end;
В принципе все понятно. Установите компонент TDBF, его необходимо подключить в uses, затем создаем его. При помощи него создаем dbf-таблицу: указываем поля, тип, точно всех полей, нужно число символов до запятой и после. Затем при помощи TTable мы наполняем данную таблицу. Все отлично получается создавать таблицу подобным образом. Так что удачи и до новых встреч.
Также советуем почитать на PressDev.RU
Короткая ссылка: http://pressdev.ru/?p=6650