Dbf узнать тип поля

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Dbf узнать тип поля

Сообщение smith7 » 05.08.2013 12:41:22

Как узнать тип поля, в таблице версии dBASE 4, используя компонент (TDbf/Dbf)
Узнать тип нужно обязательно.
Имя поля получаю так MyDbf.Fields[i].FieldName
smith7
новенький
 
Сообщения: 11
Зарегистрирован: 17.07.2013 06:05:33

Re: Dbf узнать тип поля

Сообщение SeZuka » 05.08.2013 14:51:05

smith7 писал(а):Имя поля получаю так MyDbf.Fields[i].FieldName

А так не канает?
Код: Выделить всё
MyDbf.Fields[i].DataType
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Dbf узнать тип поля

Сообщение smith7 » 07.08.2013 05:25:38

Как его использовать в таком контексте?
Код: Выделить всё
if MyDbf.Fields[i].DataType = ftDate then
            begin
              if trim(MyDbf.FieldByName(MyDbf.Fields[i].FieldName).AsString) <> '' then
                str_data := FormatDateTime('YYYY-MM-DD hh:mm:ss',
                  MyDbf.FieldByName(MyDbf.Fields[i].FieldName).AsDateTime)
              else
                str_data := '0000-00-00 00:00:00';
            end
            else
              str_data := cp866toUTF8(MyDbf.FieldByName(
                MyDbf.Fields[i].FieldName).AsString);


При компиляции я получаю ошибку
unit2.pas(176,49) Error: Identifier not found "ftDate"
smith7
новенький
 
Сообщения: 11
Зарегистрирован: 17.07.2013 06:05:33

Re: Dbf узнать тип поля

Сообщение SeZuka » 07.08.2013 07:47:31

smith7 писал(а):При компиляции я получаю ошибку
unit2.pas(176,49) Error: Identifier not found "ftDate"

Должно работать. В uses добавлен модуль db ?
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Dbf узнать тип поля

Сообщение smith7 » 07.08.2013 08:01:20

Нет, его я убрал. Добавил, заработало. Спасибо.
Тогда ещё вопрос, как узнать параметры этого типа, число знаков, знаков после запятой, и т.п.
smith7
новенький
 
Сообщения: 11
Зарегистрирован: 17.07.2013 06:05:33

Re: Dbf узнать тип поля

Сообщение SeZuka » 07.08.2013 09:16:42

MyDbf.Fields[i].DataSize
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Dbf узнать тип поля

Сообщение smith7 » 07.08.2013 10:02:24

DataSize возвращает тип int, как узнать знаки после запятой?
И где скрывается документация?
smith7
новенький
 
Сообщения: 11
Зарегистрирован: 17.07.2013 06:05:33

Re: Dbf узнать тип поля

Сообщение hovadur » 07.08.2013 12:50:07

smith7 писал(а):DataSize возвращает тип int, как узнать знаки после запятой?

MyDbf.FieldDefs[i].Precision
hovadur
постоялец
 
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Re: Dbf узнать тип поля

Сообщение amateur » 07.08.2013 16:33:04

в компоненте есть свое св-во FieldDefs (сами разрабы советуют им пользоваться, и из него тянуть то что надо). какое не скажу (жмот однако :twisted: )

Но в коде оно задеяно, токо поискать нуно :roll: :
Код: Выделить всё
procedure Tfrmmainfind.ErrorFinUrZB(FileFinUrZB : string; fileStr : string; NameZB : string; HelpZB : string; K : string);
var zz, z, kolpZB, razmZB, dodZB, dodZBB : integer;
    NameFinFF, TypeNeed, ErrorType, TipPolja, ErrorTypeR, TipPoljaR, ErrorTypeRR, TipPoljaRR, NamePolia : string;
begin
  if FileExistsUTF8(ExtractFileDir(FileFinUrZB) + DirectorySeparator + 'f' + NameZB + K) then begin
    With DM.DbfOrigin do begin
      Close;
      TableName := dm.winux(ExtractFileDir(FileFinUrZB) + DirectorySeparator + 'f' + NameZB + K);
      Open;
    end;
    With frmfind.RichView1 do begin
      AddBreak;
      AddFromNewLine('Перевірка структури файлу ', 3);
      Add(HelpZB, 3);
      Add(' зобов`язання...', 3);
      AddFromNewLine('', 3);
      Format;
      Refresh;
    end;
    if not FileExistsUTF8('tmp' + DirectorySeparator + 'strfinzb.dbf') then begin
      With frmfind.RichView1 do begin
        AddFromNewLine('Відсутній файл структури ', 1);
        Add(HelpZB, 1);
        Add(' зобов`язання.', 1);
        Add(' Перевірка не можлива.', 2);
        Format;
        Refresh;
      end;
      DM.DbfOrigin.Close;
      dm.Dbf1.close;
      Exit;
    end;
    With dm.Dbf1 do begin
      Close;
      FilePath := 'tmp' + DirectorySeparator;
      TableName := fileStr;
      Open;
      First;
    end;
    if DM.DbfOrigin.FieldCount <> dm.Dbf1.RecordCount then begin
      With frmfind.RichView1 do begin
        AddFromNewLine('Перевірка ', 0);
        Add(HelpZB, 1);
        Add(' зобов`язання не можлива.', 0);
        Add(' Не відповідна кількість полів.', 2);
        Format;
        Refresh;
      end;
      DM.DbfOrigin.Close;
      dm.Dbf1.close;
      Exit;
    end;
    kolpZB := 0;
    for zz := 0 to DM.DbfOrigin.DbfFieldDefs.Count - 1 do begin
      razmZB := 0;
      dodZB := 0;
      dodZBB := 0;
      if dm.Dbf1.Locate('NAZVA', DM.DbfOrigin.DbfFieldDefs.Items[zz].FieldName, []) then begin
          if  DM.DbfOrigin.DbfFieldDefs.Items[zz].Size <> dm.Dbf1.FieldByName('SIZE').AsInteger then begin
            NamePolia := DM.DbfOrigin.DbfFieldDefs.Items[zz].FieldName;
            ErrorTypeR := inttostr(DM.DbfOrigin.DbfFieldDefs.Items[zz].Size);
            TipPoljaR := inttostr(dm.Dbf1.FieldByName('SIZE').AsInteger);
            razmZB := razmZB + 1;
            kolpZB := kolpZB + 1;
          end;
          if  DM.DbfOrigin.DbfFieldDefs.Items[zz].Precision <> dm.Dbf1.FieldByName('PRECISION').AsInteger then begin
            dodZB := dodZB + 1;
            TipPoljaRR := inttostr(dm.Dbf1.FieldByName('PRECISION').AsInteger);
            ErrorTypeRR := inttostr(DM.DbfOrigin.DbfFieldDefs.Items[zz].Precision);
            NamePolia := DM.DbfOrigin.DbfFieldDefs.Items[zz].FieldName;
            kolpZB := kolpZB + 1;
          end;
          ///////////////////////
          case DM.DbfOrigin.DbfFieldDefs.Items[zz].FieldType of
            ftString : TipPolja := 'String';
            ftSmallint : TipPolja := 'Smallint';
            ftInteger : TipPolja := 'Integer';
            ftWord : TipPolja := 'Word';
            ftBoolean : TipPolja := 'Boolean';
            ftFloat : TipPolja := 'Float';
            ftCurrency : TipPolja := 'Currency';
            ftBCD : TipPolja := 'BCD';
            ftDate : TipPolja := 'Date';
            ftTime : TipPolja := 'Time';
            ftDateTime : TipPolja := 'DateTime';
            ftBytes : TipPolja := 'Bytes';
            ftAutoInc : TipPolja := 'AutoInc';
            ftBlob : TipPolja := 'Blob';
            ftMemo : TipPolja := 'Memo';
            ftGraphic : TipPolja := 'Graphic';
            ftFmtMemo : TipPolja := 'FmtMemo';
            ftDBaseOle : TipPolja := 'DBaseOle';
            ftTypedBinary : TipPolja := 'TypedBinary';
          end;
          if AnsiPos(TipPolja, dm.Dbf1.FieldByName('TYPE').AsString) = 0 then begin
            dodZBB := dodZBB +1;
            ErrorType := TipPolja;
            TypeNeed := dm.Dbf1.FieldByName('TYPE').AsString;
            NamePolia := DM.DbfOrigin.DbfFieldDefs.Items[zz].FieldName;
            kolpZB := kolpZB + 1;
          end;
          ///////////////////////
//////////////////////////// При не коректному типі поля добавити в "повідомлення" і далі шукати
          if dodZBB > 0 then begin
            With frmfind.RichView1 do begin
              AddFromNewLine('Не кoрректний ', 0);
              Add('тип ', 2);
              Add('поля ', 0);
              Add(HelpZB, 1);
              Add(' зобов`язання.', 0);
              Add('В полі "',0);
              Add(NamePolia, 1);
              Add('" потрібно - ', 0);
              Add(TypeNeed, 1);
              Add(', а у файлі - ', 0);
              Add(ErrorType, 2);
              Add('.', 0);
              Format;
              Refresh;
            end;
//            dm.Dbf1.close;
//            Exit;
          end;
////////////////////////////  При не коректному розміру поля...
          if razmZB > 0 then begin
            With frmfind.RichView1 do begin
              AddFromNewLine('Не корректний ', 0);
              Add('розмір ', 2);
              Add('поля ', 0);
              Add(HelpZB, 1);
              Add(' зобов`язання.', 0);
              Add('В полі "',0);
              Add(NamePolia, 1);
              Add('" потрібно - ', 0);
              Add(TipPoljaR, 1);
              Add(', а у файлі - ', 0);
              Add(ErrorTypeR, 2);
              Add('.', 0);
              Format;
              Refresh;
            end;
//            dm.Dbf1.close;
//            Exit;
          end;
////////////////////////////
          if dodZB > 0 then begin
            With frmfind.RichView1 do begin
              AddFromNewLine('Не корректний ', 0);
              Add('розмір ', 2);
              Add('поля ', 0);
              Add(HelpZB, 1);
              Add(' зобов`язання.', 0);
              Add('В полі "',0);
              Add(NamePolia, 1);
              Add('" потрібно - ', 0);
              Add(TipPoljaRR, 1);
              Add(', а у файлі - ', 0);
              Add(ErrorTypeRR, 2);
              Add('.', 0);
              Format;
              Refresh;
            end;
          end;
///////////////////////////
          kolpZB := kolpZB + 0;
        end else begin
          kolpZB := kolpZB + 1;
      end;
    end;
//////////////////////////
     if kolpZB > 0 then begin
      With frmfind.RichView1 do begin
        AddFromNewLine('Не корректні поля ', 1);
        Add(HelpZB, 1);
        Add(' зобов`язання.', 1);
        Add(' Файл не робочий...', 2);
        Format;
        Refresh;
      end;
      DM.DbfOrigin.Close;
      dm.Dbf1.close;
      Exit;
    end;
//////////////////////////
    if (kolpZB=0) and (razmZB=0) and (dodZB=0) and (dodZBB=0) then begin
      With frmfind.RichView1 do begin
        AddFromNewLine('Структура файлу ', 0);
        Add(HelpZB, 0);
        Add(' зобов`язання ', 0);
        Add('без помилок...', 3);
        Format;
        Refresh;
      end;
      end else begin
        With frmfind.RichView1 do begin
          AddFromNewLine(' Файл не робочий...', 2);
          Format;
          Refresh;
        end;
    end;
///////////////////////перевірка рахунку на індивідуальність
        NameFinFF := CP866ToUTF8(DM.DbfOrigin.FieldByName('RRAX').AsString);
        DM.DbfOrigin.First;
        for z := 0 to DM.DbfOrigin.RecordCount - 1 do begin
          if AnsiPos(NameFinFF, CP866ToUTF8(DM.DbfOrigin.FieldByName('RRAX').AsString)) = 0 then begin
            With frmfind.RichView1 do begin
              AddFromNewLine('Увага:', 2);
              Add(' різні рахунки в полі "RRAX" ', 1);
              Add(HelpZB, 1);
              Add(' зобов`язання.', 1);
              Add('Перевірка не можлива.',2);
              Format;
              Refresh;
            end;
            DM.DbfOrigin.Close;
            exit;
          end;
          DM.DbfOrigin.Next;
        end;
///////////////////////
  end else begin
    With frmfind.RichView1 do begin
      //AddBreak;
      AddFromNewLine('Файл ', 1);
      Add(HelpZB, 1);
      Add(' зобов`язання відсутній.', 1);
      Format;
      Refresh;
    end;
  end;
  if FileExistsUTF8(ExtractFileDir(FileFinUrZB) + DirectorySeparator + 'f' + NameZB + K) then begin
    z := 0;
    With DM.Dbf1 do begin
      Close;
      TableName := dm.winux(ExtractFileDir(FileFinUrZB) + DirectorySeparator + 'f' + NameZB + K);
      Open;
      EnableControls;
      First;
      for zz := 0 to RecordCount -1 do begin
        if IsDeleted then z := z +1;
        Next;
      end;
      DisableControls;
      if z > 0 then begin
        With frmfind.RichView1 do begin
          AddFromNewLine('Увага:', 2);
          Add(' в данному файлі існують записи до видалення  - ', 1);
          Add(inttostr(z), 2);
          Add(' шт. Перевірка не можлива.',1);
          Format;
          Refresh;
        end;
        DM.DbfOrigin.Close;
        dm.Dbf1.close;
        Exit;
      end else begin
        With frmfind.RichView1 do begin
          AddFromNewLine('В файлі видалених записів ', 1);
          Add('немає', 3);
          Add('.',1);
          Format;
          Refresh;
        end;
      end;
    end;
  end;
end;

Смысл прост: берем инфу о таблице и сверяем с нужным, результат в "красивость" - RichView.

А документация на сайте разработчиков в инглиш варианте....
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 233

Рейтинг@Mail.ru