Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2011, 09:36   #1
cafra
Новичок
Джуниор
 
Регистрация: 12.07.2011
Сообщений: 2
По умолчанию Сверка двух dbf

Добрый день. Очень нужна помощь компетентных программистов. Стоит задача проверить структуру двух dbf файлов. Т.е. проверить количество полей, имена полей и их типы. Проблема заключается в проверке типов полей. Не могу понять как можно сверить типы. В основном это касается типа numeric. Пожалуйста подскажите как можно узнать у numeric количество символов и остаток
cafra вне форума Ответить с цитированием
Старый 12.07.2011, 10:45   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
как можно узнать у numeric количество символов и остаток
в структуре файла DBF для numeric задаётся количество символов (длина поля в байтах) и количество символов после десятичной точки.


1) это разовая задача?
может быть, Вам проще воспользоваться любым вьевером,
например, CDBF.EXE умеет сохранять структуру в текстовый файл

2) или Вам обязательно нужно разработать программу ? Если да - то через что работаете с DBF? (рекомендую TDBF)

3) когда у меня возникла подобная задача на практике (программа на FoxPro), то задача была решена следующим образом: за основу взяты исходники утилит Леса Пинтера - DATADICT/DATAFIX CDXDICT/CDXFIX. идея в том, что строится словарь, в который сохраняются все структуры всех имеющихся DBF файлов. При необходимости структуры файлов могут быть изменены согласно словарю.
Удобно сопровождать, когда DBF файлов сотни (это реально!) и нужно изменять структуру некоторых.
Ну и по следам этих утилит была написана программка DATACHK
цитирую:
Цитата:
* DATAFIX.PRG
*
* Версия 2.0 13-10-1998
* + Добавлена проверка на "лишние базы" -
* т.е. в отчете отображаются имена DBF файлов,
* которые не описаны в словаре данных.
* + Исключение: файлы FOXUSER.DBF и DATACHK.DBF
* не попадают в отчет, даже если они не описаны в словаре
* Версия 3.0 27-04-1999
* + Изменена процедура сравнения полей:
* 1. Расшифровываются при несовпадении кол-ва полей все поля,
* которых нет в одной из баз или длина,тип не совпадает
* 2. Не проверяются поля по порядку (только предупреждение,
* если порядок полей отличается от порядка в словаре, а
* все описания полей совпадают со словарём
* + Добавлена процедура отображения версии и даты программы
* + Сперва выводятся список тех файлов, которых нет физически,
* хотя они описаны в словаре


p.s. а вообще, если нужно, могу помочь...
В принципе, в стандартном DBF файле прочитать заголовок - раз плюнуть - структура проста как топор! Можно вообще напрямую читать, без всяких библиотек/технологий доступа...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2011, 11:23   #3
cafra
Новичок
Джуниор
 
Регистрация: 12.07.2011
Сообщений: 2
По умолчанию

Я хотел читать структуру, но начальнику не нравится идея, а функция должна быть написана на делфи
Код:
function Verifydbfs(dbf1,dbf2:Tdbf;out list: Tstringlist):boolean;
var i,j: integer; name:boolean;
begin
  if dbf1.FieldCount<>dbf2.FieldCount then
  list.Add('Количество полей не равное');
  for i := 0 to dbf1.FieldCount-1 do
  begin
    name:=false;
    for j := 0 to dbf2.FieldCount-1 do
    begin
      if AnsiUpperCase(dbf1.Fields[i].FullName)=AnsiUpperCase(dbf2.Fields[j].FullName) then
      begin
        name:=true;
        if dbf1.Fields[i].DataType<>dbf2.Fields[j].DataType  then
          list.Add('Поле '+dbf1.Fields[i].FullName+' имеет тип  '
                    +DataTypeToStr(dbf2.Fields[j].DataType)+' вместо '
                    +DataTypeToStr(dbf1.Fields[i].DataType));
        if dbf1.Fields[i].Size<>dbf2.Fields[j].Size  then
          list.Add('Поле '+dbf1.Fields[i].FullName+' имеет неверный размер '
                    +IntToStr(dbf2.Fields[j].Size)+' вместо '
                    +IntToStr(dbf1.Fields[i].Size));
        break;
      end;
    end;
    if name=false then list.Add('Поля '+dbf1.Fields[i].FullName
                                +' в таблице не существует.')
  end;
  if list.count=0 then Result:=true else Result:=False;
end;
Пока остановился на таком варианте, но он далеко не идеален
cafra вне форума Ответить с цитированием
Старый 12.07.2011, 13:01   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) если у Вас в DBF2 есть куча дополнительных полей (которых нет в dbf1) то они в отчёт не попадут... (впрочем, количество полей не совпадёт, так что функция вернёт False)

2)
я бы рекомендовал количество знаков после запятой тоже сверять.
примерно так:
Код:
      begin
        name:=true;
        if dbf1.Fields[i].DataType<>dbf2.Fields[j].DataType  then
          list.Add('Поле '+dbf1.Fields[i].FullName+' имеет тип  '
                    +ShowTypeField(dbf2.Fields[j].DataType)+' вместо '
                    +ShowTypeField(dbf1.Fields[i].DataType));
        if dbf1.Fields[i].Size<>dbf2.Fields[j].Size  then
          list.Add('Поле '+dbf1.Fields[i].FullName+' имеет неверный размер '
                    +IntToStr(dbf2.Fields[j].Size)+' вместо '
                    +IntToStr(dbf1.Fields[i].Size))
        else
          if  dbf1.DbfFieldDefs.Items[i].Precision<>dbf2.DbfFieldDefs.Items[j].Precision  then
            list.Add('Поле '+dbf1.Fields[i].FullName+' отличается по числу десятичных знаков '
                    +IntToStr(dbf2.DbfFieldDefs.Items[i].Precision)+' вместо '
                    +IntToStr(dbf1.DbfFieldDefs.Items[i].Precision));
        break;
      end;
3)
Цитата:
Я хотел читать структуру, но начальнику не нравится идея
позвольте поинтересоваться - а почему, собственно?! А как может быть иначе? Как можно сравнить структуры таблиц, не читая структуру?!!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сверка данных двух таблиц AdminMars Microsoft Office Excel 9 20.08.2013 10:55
dbf и tqueru, собрать несколько dbf файлов в одном, импорт вобщем betirsolt БД в Delphi 16 10.07.2011 13:52
Сверка со списком (Perl) Nexta_s PHP 1 30.08.2010 11:44
сохранение результата выборки из DBF файла в DBF файл с такой же структурой таблицы GazimagomedovM БД в Delphi 5 06.11.2007 17:58