![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать 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 заданной структуры в ресурсе ЕХЕ, а при необходимости выгружать его в файл потоком