Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как создать DBF, используя только DAO ? [D7, dBase, FoxPro]


B@BY ©   (2005-09-28 16:27:00) 

Здравствуйте мастера!
Необходима функция для создания DBF в определенной директории и именем, и опред. структурой БД с помощью DAO.

Как объявить DAO в uses.
И как будет выглядеть функция, переделанная из VB на Delphi:

Private Function CreateDBF(PathDBF As String, NameDBF As String) As Boolean
Dim NewDB As Database
Dim NewTable As TableDef
Dim NewFld As Field

Set NewDB = OpenDatabase(PathDBF, False, 0, "Dbase IV")
Set NewTable = NewDB.CreateTableDef(NameDBF)

Set NewFld = NewTable.CreateField("NUM", dbText, 14)
NewTable.Fields.Append NewFld
…
Set NewFld = NewTable.CreateField("MASS", dbDouble)
NewTable.Fields.Append NewFld
…
Set NewFld = NewTable.CreateField("COMMENT", dbText, 120)
NewTable.Fields.Append NewFld

NewDB.TableDefs.Append NewTable

NewDB.Close
//CreateDBF = True
End Function


Заранее спасибо.


Desdechado   (2005-09-29 14:10:00) [1]

> Насчет пешком под стол ...
На личности не надо.
Можно всю жизнь программировать БД и не представлять себе многих вещей, которые в повседневной практике не нужны. А можно за год наковырять (читай, набить шишек) столько нюансов, сколько другие и представить не могут.
DBF - самый "разболтанный" формат, каждый под себя его крутит. А таких "каждых" - по пальцам не посчитать.


isasa   (2005-09-29 12:56:00) [2]

>маловато ты DBF'ов видел
см. профиль. Насчет пешком под стол ... Промолчу.


ANB   (2005-09-29 12:27:00) [3]

А DAO поддерживает SQL ? Если поддерживает, то почему бы не воспользоваться DDL ?


B@BY   (2005-09-29 12:12:00) [4]

Вопрос заключался в том как создать DBF с помощью DAO, а не с помощью ресурсов или как предложил > isasa ©   (28.09.05 18:06) [4].

Так что пришлось самому :(( искать ответы в инете... ( http://excode.ru/?mod=article&id=index&topicid=76&ex=575b8fb3a8c8120935669f594ca8f1ef ; http://megalib.com/books/478/350.htm ; http://www.sources.ru/delphi/db/create_table_in_access_with_dao.shtml ) и смог найти то что нужно было мне :)).
В общем мне нужно было что-то вроде этого:


unit Unit1;
interface
uses
 Dialogs, Forms, Classes, Controls, StdCtrls, ComObj;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   function CreateDBF(PathDBF: String; NameDBF: String): Boolean;
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 if CreateDBF('D:\-\','qwe.dbf')=False then ShowMessage('Ошибка создания DBF')
   else ShowMessage('DBF успешно создан');
end;

function  TForm1.CreateDBF(PathDBF: String; NameDBF: String): Boolean;
var access, NewDB, NewTable, NewFld: variant;
begin
try
 try
   access := GetActiveOleObject('DAO.DBEngine.35');
 except
   access := CreateOleObject('DAO.DBEngine.35');
 end;
 NewDB := access.OpenDatabase(PathDBF, False, 0, 'Dbase IV');
 NewTable := NewDB.CreateTableDef(NameDBF);
...
 NewFld := NewTable.CreateField('NUM', 10 , 14); //dbText = 10
 NewTable.Fields.Append(NewFld);
...
 NewFld := NewTable.CreateField('MASS', 7); //dbDouble = 7
 NewTable.Fields.Append(NewFld);
...
 NewFld := NewTable.CreateField('COMMENT', 10, 120);
 NewTable.Fields.Append(NewFld);

 NewDB.TableDefs.Append(NewTable);

 NewDB.Close;
 Result:=True;
except
 Result:=False;
end;
end;
end.


FOR > Digitman ©   (28.09.05 17:37) [3]
> непонятно, зачем тебе Access, DAO, ADO (и прочая лабуда) для создания DBF ..
> в Делфи с этим не самым худшим образом справится BDE, которому для этой цели всякие там Access, DAO, ADO - как корове седло ...

Во первых у меня много наработок на DAO в Visual Basic'e, и поэтому не хотелось на данный момент изучать структуру другого компонента.
А во вторых в инете написано что BDE нужно устанавливать отдельно (т.к. не входит в состав Windows или Office), а DAO входит в состав MSOffice, и поэтому устанавливать на каждом компе BDE меня не устраивает.

P.S. Может мне нужно было почитать http://ln.com.ua/~openxs/articles/smart-questions-ru.html (как правильно задавать вопросы) , прежде чем задавать вопрос???...


ANB   (2005-09-29 09:19:00) [5]

Формат DBF Clipper и FoxPro отличаются. Принципиально - структура стандартная, а вот заполнение поле - чуть чуть разное.

ЗЫ. А через Local SQL это никак сделать нельзя ?


Desdechado   (2005-09-28 22:46:00) [6]

маловато ты DBF'ов видел, имхо
они как арбузы - все съедобные, вот только формой, полосатостью, толщиной кожуры, размером и цветом семечек отличаются


isasa   (2005-09-28 20:57:00) [7]

что махать флагом о возможности так создать файл с любой структурой,
Сабж о DBF файлах, не надо ничего придумывать!


Desdechado   (2005-09-28 20:37:00) [8]

нули писать, конечно, можно
но в каких-нибудь версиях DBF эти байты вполне могут использоваться, и ноль уже будет что-то конкретное означать, а что именно - еще вопрос

пустой-то пустой, но далее-то с ним надо как-то работать, а это зависит от того, как мы его создадим

это я к тому, что махать флагом о возможности так создать файл с любой структурой, подходящий по формату под что угодно, - нельзя


isasa   (2005-09-28 18:38:00) [9]

а байты 12-27, 29-31 ?
Прописываем $00.

Кодировка - по вкусу 866 или 1251 - строковые хранятся как есть,
числовые,
123,0123 -> N(9,4)-> ' 123.0123'

Так DBF создаем пустой! :))


Desdechado   (2005-09-28 18:24:00) [10]

а как с кодировочками? или наличием индексов, особенно многотэговых?
а байты 12-27, 29-31 ?


isasa   (2005-09-28 18:19:00) [11]

Да, добавлю. Естественно, баловаться с vtvj-полями в этом случае не стоит.
Тип файла = $03 - без memo-поля


isasa   (2005-09-28 18:15:00) [12]

Desdechado ©   (28.09.05 18:09) [5]


Нормально открывается :).
Например файл, сделаный под dBase II, спокойно открывался FoxPro for Windows v 1.5


isasa   (2005-09-28 18:12:00) [13]

> Длина записи (в байтах) определяется суммированием указанных длин всех полей.

Плюс единица - признак удаления (' '($20) - рабочая, '*'($2A) - помечена для удаления)


Desdechado   (2005-09-28 18:09:00) [14]

2 isasa
вот со структурой возможны варианты
версий DBF столько всяких разных, что на всех описания не напасешься, а тем паче веток в программе генерации DBF


isasa   (2005-09-28 18:06:00) [15]

Desdechado ©   (28.09.05 16:33) [1]
>сохранить бинарник файла DBF заданной структуры в ресурсе ЕХЕ


Пишем
type
TDBFHeaderDescrRec = record ...
 TDBFFieldDescrRec = record ...
по описанию

Структура таблиц(.DBF)
   Файл базы данных состоит из записи заголовка и записей с данными. В записи заголовка определяется структура базы данных и содержится вся другая информация, относящаяся к базе данных. В файле она начинается с нулевой позиции.
Записи с данными следуют за заголовком (байты располагаются последовательно) и включают в себя фактическое содержимое полей. Длина записи (в байтах) определяется суммированием указанных длин всех полей.

Запись заголовка .DBF файлa

Байты Описание
00 Тип файла: 0x03 без memo-поля 0xE5 с мемо полем
01-03 Дата последнего изменения ГГММДД, где ГГ записывается со смещением -0x30
04-07 Число записей в файле
08-09 Положение первой записи с данными
10-11 Длина одной записи с данными (включая признак удаления)
12-27 Зарезервированы
28 0x00 файл НЕ содержит структурный .NSX 0x01 файл содержит структурный .NSX
29 Зарезервирован
30-31 Зарезервировано, содержит 0x00
32..32x(n+1) Подзаписи полей, где n - число полей
32x(n+1)+1 Признак завершения записи заголовка 0x0D

Подзаписи полей

Байты Описание
00-10 Название поля (максимально - 10 символов, если меньше 10, то дополняется пустым символом (0х00))
11 Тип данных:
          C   Character (символьный)
          N   Numeric (числовой)
          D   Date (дата)
          L   Logical (логический)
          M   Memo
12-15 Зарезервировано
16 Длина поля (в байтах)
17 Длина дробной части в байтах
18 Зарезервирован


Сам файл

<Запись заголовка>
<Данные>
$1A


Пустой


<Запись заголовка>
$1A


Digitman   (2005-09-28 17:37:00) [16]


> B@BY ©   (28.09.05 17:04) [2]


непонятно, зачем тебе Access, DAO, ADO (и прочая лабуда) для создания DBF ..

в Делфи с этим не самым худшим образом справится BDE, которому для этой цели всякие там Access, DAO, ADO - как корове седло ...


B@BY   (2005-09-28 17:04:00) [17]

Мне нужно разобраться как вобщем создать DBF на Delphi с помощью DAO.
Как объявить DAO, как создать таблицу, поле.
Ведь иногда может понадобиться динамическая структура БД...


Desdechado   (2005-09-28 16:33:00) [18]

один из действенных, но не очень "легальных" способов
действует даже при отсутствии любых DB-компонентов и драйверов
сохранить бинарник файла DBF заданной структуры в ресурсе ЕХЕ, а при необходимости выгружать его в файл потоком


Наверх

Титульная страница Поиск, карта сайта Написать письмо