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

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

Чтение информации из dbf [D6, dBase, FoxPro]


Страницы:   1 2 3

Делфенок ©   (2005-05-18 20:23:00) 

Добрый день. Какими средствами (ADO, специальные компоненты и т.д.) лучше всего пользоваться, чтобы прочесть информацию в список из любого поля dbf. Ориентировочно эта тема уже поднималась, но конечного ответа я так и не нашел. И еще, если все-таки пользоваться ADO, то какого поставщика выбирать OLE DB или Jet (советуют второе, но почему?). Заранее спасибо.


Yurisimus   (2005-06-02 10:10:00) [1]

ANB :
Да я уже в принципе начал, подрубился через ADO, чтобы была возможность выполнять SQL запросы использовал Query. Да и с типом Float разобрался при создании таблицы, правда для этого сначала сбацал файл MS Excel, а уж потом сохранил его как *.dbf... Дальше проще, просто выполнять SQL запросы и все... привожу пример из проги, хотелось бы проще при использовании TDBF, примерно так:
   (прописал функции (GetMyDir и GetMyFile) на разделение пути и файла)
   Dbf1.FilePathFull:=GetMyDir(SaveDialog1.FileName);
   Dbf1.TableName:=GetMyFile(SaveDialog1.FileName);
   Dbf1.FieldDefs.Add('id',ftInteger);
   Dbf1.FieldDefs.Add('name',ftString,100);
   Dbf1.FieldDefs.Add('price',ftCurrency,(5,2)); //вот это поле и не создается...с ftFloat тоже не работает...
   Dbf1.FieldDefs.Add('edizm',ftString);
   Dbf1.FieldDefs.Add('srok',ftString,10);
   Dbf1.FieldDefs.Add('norma',ftInteger);
   Dbf1.FieldDefs.Add('proizvod',ftString,50);
   Dbf1.FieldDefs.Add('firma',ftString,50);
   Dbf1.CreateTable;

А вот через ADO и Excel:

 qrXLTo.Close;
 connXLTo.Close;
 if dlgSaveXL.Execute then
 begin
   {Create XLS File}
   MyExcel:=CreateOleObject('Excel.Application');
   MyExcel.WorkBooks.Add;
   MyExcel.WorkBooks[1].WorkSheets[1].Name:='Analiz';
   MyExcel.Cells[1,1]:='id';
   MyExcel.Cells[1,2]:='name';
   MyExcel.Cells[1,3]:='price';
   MyExcel.Cells[1,4]:='edizm';
   MyExcel.Cells[1,5]:='srok';
   MyExcel.Cells[1,6]:='norma';
   MyExcel.Cells[1,7]:='proizvod';
   MyExcel.Cells[1,8]:='firma';
   MyExcel.Cells[2,1]:='0';
   MyExcel.Cells[2,2]:='abcd';
   MyExcel.Cells[2,3]:=1.23;
   MyExcel.Cells[2,4]:='abcd';
   MyExcel.Cells[2,5]:='abcd';
   MyExcel.Cells[2,6]:='abcd';
   MyExcel.Cells[2,7]:='abcd';
   MyExcel.Cells[2,8]:='abcd';
   ColumnRange:=MyExcel.Workbooks[1].WorkSheets[1].Columns;
   ColumnRange.Columns[1].ColumnWidth:=7;
   ColumnRange.Columns[2].ColumnWidth:=100;
   ColumnRange.Columns[3].ColumnWidth:=10;
   ColumnRange.Columns[4].ColumnWidth:=7;
   ColumnRange.Columns[5].ColumnWidth:=10;
   ColumnRange.Columns[6].ColumnWidth:=7;
   ColumnRange.Columns[7].ColumnWidth:=50;
   ColumnRange.Columns[8].ColumnWidth:=50;
   MyExcel.ActiveWorkbook.SaveAs(dlgSaveXL.FileName+'.dbf', 11, false, false, false, false);
   MyExcel.ActiveWorkbook.Close(SaveChanges:=True);

   try
     // Нахожу запущенный экземпляр Excel...
     MyExcel:=GetActiveOleObject('Excel.Application');
     // Удаляю чтобы не висел в задачах...
     MyExcel:=0;
   except
   end;

   Dbf1.FilePathFull:=GetMyDir(dlgSaveXL.FileName);
   Dbf1.TableName:=GetMyFile(dlgSaveXL.FileName)+'.dbf';
   Dbf1.Active:=true;
   Dbf1.AddIndex('id_idx','id',[ixPrimary]);

Сами видите что если работать через ADO&Excel то получается много писанины, поентому и хотелось бы компонентик найти чтобы двумя строчками все это забацать...


Anatoly Podgoretsky   (2005-06-02 10:01:00) [2]

ANB ©   (02.06.05 09:51) [49]
Модифицированый BCD формат, а даты в System Date Format SDF


ANB   (2005-06-02 09:54:00) [3]


> Yurisimus   (02.06.05 09:50) [48]
сам писать возмешься ? Дам сырцы по чтению. Запись так себе, но работает без ошибок. Добавление и индексы - делать самому. Создание таблицы - тоже, но это, имхо, не трудно. (Просто грамотно описать заголовок и запихать в файл, структура файла есть) Индексы я сроду не пытался делать - влом было.


ANB   (2005-06-02 09:51:00) [4]


> Anatoly Podgoretsky ©   (02.06.05 09:42) [46]
- да чаво там представлять то как хранится. Залез нортоном и посмотрел. Строка там лежит. Нагло для всех полей. Числа тоже строками лежат. Прямо так 1234.50


Yurisimus   (2005-06-02 09:50:00) [5]

Анатолий :
Ну ты все никак не уймешься... :) Для ВСЕХ типов в TDBF невозможно проставить кол-во знаков после запятой...

И все же хотелось бы послушать мнения по теме, то есть запись и чтение данных из DBF, а не слушать препирания друг друга... Есть ли компонент осуществляющий такие функции или все же придется все это прописывать вручную??? :)


Anatoly Podgoretsky   (2005-06-02 09:44:00) [6]

Yurisimus   (02.06.05 09:36) [45]
FCurrency не поддержан, вместо него есть более мощный тип Number


Anatoly Podgoretsky   (2005-06-02 09:42:00) [7]

ANB ©   (02.06.05 09:26) [44]
Тебе не тяжело будет нажать на пробел в колонке Type диалога создания таблицв в Database Desktop?
И нестоит говорить как хранится не представляя сущности.


Yurisimus   (2005-06-02 09:36:00) [8]

Анатолию :
Ладно, скажем так - ftCurrency, но и для него не проставляется кол-во знаков после запятой...

ANB : Ну кто же этого не знает, я просто привел как пример общепонятные и общедоступные типы полей, кто знает - поймет...

Здесь также был рассмотрен компонент halcyon, стоит ли вообще тратить на него время или такой же глюкавый как и TDBF???


ANB   (2005-06-02 09:26:00) [9]


> 3) Ну и поддержка хотябы 3 видов полей - string,integer
> и float
таких типов в DBF никогда не было.
Были Char (фиксированная строка), Memo (для длинных строк, но огребаешь проблемы), Number (с фиксированной запятой, хранится в сиде строки) и Date (дата в виде строки). А, еще логическое было. Може чего и пропустил, но флоат и интегер там отсутствовали.
Сомневаюсь, что с такой функциональностью ты найдешь компоненты. Это же получится обычная старая добрая СУБД Fox.


Anatoly Podgoretsky   (2005-06-02 09:20:00) [10]

Одна из серьезных проблем это порча таблиц, нарушение стуктуры базы.


Anatoly Podgoretsky   (2005-06-02 09:19:00) [11]

Yurisimus   (02.06.05 09:04) [41]
Кто же для денег использует Float :-)
Это надо себя очень не любить.
Float в xBase применяется для очень больших (свыше 18/20 знаков) или малых чисел.
Сам TDbf очень глюкавый компонент, применение оправдано только для простых Embeded систем.


Yurisimus   (2005-06-02 09:04:00) [12]

Я тут натолкнулся на следующий глюк в компоненте TDBF - не могу создать поле типа Float, у него не прописываются Precision и Size, а если без них прописывать, то создается слишком большое число 18 сайз и после запятой 9 знаков, жуть... А мне надо для цены использовать всего лишь float(5,2)... Какие есть нормальные компоненты для работы с *.dbf-ками??? Именно интересует следующие функции:
1) Создание таблицы
2) Создание индексного файла
3) Ну и поддержка хотябы 3 видов полей - string,integer и float
Если кто знает такой компонентик плиз подскажите, а то муторно все это прописывать своими ручками...


ANB   (2005-05-19 16:55:00) [13]


> они дату в строке держат и пустая дата = пустая строка
- ну да, я строки и достаю напрямую из dbf. Кстати, просто читатель не так уж и тяжело пишется. Для ДБФ + МЕМО я писал 3 дня в расслабухе, ну индексы еще можно за 1-6 дней подрубить. Там другое хуже - индексы могут быть разных форматов.


ANB   (2005-05-19 16:53:00) [14]


> а ты скорее всего через драйвер VFP работал, который из
> пустой строки 0 "делает", а дальше он уже пошол как дата
> т.к. дата и ожидается
- точно. Я через ADO коннектился, и юзал драйвер VFP. БДЕ низзя было использовать, так как потом бы никто не смог развернуть. Хотя через АДО еще хуже вышло, проще было инсталляшку написать :))) И в таком, как у меня, виде работал только Empty(Fld).


Anatoly Podgoretsky   (2005-05-19 16:40:00) [15]

Делфенок   (19.05.05 15:12) [36]
А ничего, смутно написано. Советы ты получил.

sniknik ©   (19.05.05 16:37) [37]
Больше, даже фильтр должен работать Fld = NULL


sniknik   (2005-05-19 16:37:00) [16]

> Да сам попробуй - возьми DBF от FoxPro с пустыми датами, подключись через ADO и посмотри в гриде. Да и не было понятия null ни в фоксе ни в клиппере.
ну и что, что не было? они дату в строке держат и пустая дата = пустая строка. дальше зависит от движки кто как интерпретирует Jet(в паре с BDE) к примеру пререводит это состояние в null, даже запросы с WHERE DAT IS NULL работают правильно.
а ты скорее всего через драйвер VFP работал, который из пустой строки 0 "делает", а дальше он уже пошол как дата т.к. дата и ожидается.

недоработка фоксового драйвера (имхо), не исправляют похоже специально, у них много таких(с индексами. созданием еще к примеру)... а в самой среде фокса все нормально...


Делфенок   (2005-05-19 15:12:00) [17]

To Anatoly Podgoretsky:
вы просили мини тз, а выслал, а результат?... ваш ответ?...


ANB   (2005-05-19 15:10:00) [18]

Да сам попробуй - возьми DBF от FoxPro с пустыми датами, подключись через ADO и посмотри в гриде. Да и не было понятия null ни в фоксе ни в клиппере.


Anatoly Podgoretsky   (2005-05-19 15:08:00) [19]

ANB ©   (19.05.05 15:00) [32]
Не сваливай свои ошибки на системы программирования.


Anatoly Podgoretsky   (2005-05-19 15:07:00) [20]

ANB ©   (19.05.05 15:00) [32]
Да что ты говоришь


Страницы:   1 2 3

Наверх

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