Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Как создать DBF, используя только DAO ?   Найти похожие ветки 

 
B@BY ©   (2005-09-28 16:27) [0]

Здравствуйте мастера!
Необходима функция для создания 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-28 16:33) [1]

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


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

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


 
Digitman ©   (2005-09-28 17:37) [3]


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


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

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


 
isasa ©   (2005-09-28 18:06) [4]

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


 
Desdechado ©   (2005-09-28 18:09) [5]

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


 
isasa ©   (2005-09-28 18:12) [6]

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

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


 
isasa ©   (2005-09-28 18:15) [7]

Desdechado ©   (28.09.05 18:09) [5]


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


 
isasa ©   (2005-09-28 18:19) [8]

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


 
Desdechado ©   (2005-09-28 18:24) [9]

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


 
isasa ©   (2005-09-28 18:38) [10]

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

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

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


 
Desdechado ©   (2005-09-28 20:37) [11]

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

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

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


 
isasa ©   (2005-09-28 20:57) [12]

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


 
Desdechado ©   (2005-09-28 22:46) [13]

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


 
ANB ©   (2005-09-29 09:19) [14]

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

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


 
B@BY ©   (2005-09-29 12:12) [15]

Вопрос заключался в том как создать 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 12:27) [16]

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


 
isasa ©   (2005-09-29 12:56) [17]

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


 
Desdechado ©   (2005-09-29 14:10) [18]

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.047 c
1-1129874063
Layner
2005-10-21 09:54
2005.11.13
Как в цикле найти все виз. компаненты на форме


2-1130246477
syte_ser78
2005-10-25 17:21
2005.11.13
table.active


3-1127554610
hooky-mars
2005-09-24 13:36
2005.11.13
Access как сервер


2-1129659571
Алексей2
2005-10-18 22:19
2005.11.13
Сложение,вычитание


14-1129810870
wHammer
2005-10-20 16:21
2005.11.13
Как перевести исходники с версии 6 на версию 5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский