Конференция "Начинающим" » Работа с dbf файлом напрямую [XP]
 
  • dis12345 © (14.04.18 21:25) [0]
    Подскажите пожалуйста, можно ли в Лазарусе 1.8.2 только через компонент Tdbf работать с дбф файлом ?
    Считывание выполняется:
    dbf.First;
       while not dbf.EOF do begin
           i:= dbf.PhysicalRecNo;
           StringGrid1.Cells[1,i] :=  dbf.FieldByName('SK').AsString;
           dbf.Next;
       end;

    А вот попытка записи
       dbf.PhysicalRecNo:=4;
       dbf.FieldByName('EDIZM').value:=Edit1.Text;
       dbf.Post;
    вызывает ран-тайм ошибку dbf is not in an edit or insert state
    DataSource не предлагать :)
  • dis12345 © (14.04.18 21:44) [1]
    append добавляет строку, а как спозиционироваться и i-ю изменить ?
    Edit  insert не получается...
  • kilkennycat © (14.04.18 22:54) [2]
    Что такое TDBF?
    TDBF - это бесплатный компонент для доступа к данным для Borland Delphi, C ++ Builder и Kylix, а также для FreePascal . Это позволяет создавать очень компактные программы баз данных, которые не требуют специальных программ-установщиков. Фактически код для доступа к вашей базе данных компилируется в исполняемый файл проекта. Он занимает всего несколько килобайт в вашем исполняемом файле и не требует каких-либо других внешних файлов для запуска.

    Ключевая особенность

    Работает без Borland Database Engine
    Разрешить использование всего собственного типа dBASE (символьный, цифровой, логический, дата и памятка).
    Файлы Memo поддерживаются, вы можете использовать поля без ограничения размера.
    Формат файла 100% совместим с dBASE III +, dBase IV и dBase 2k.
    Поддержка специальных полей Clipper и Visual FoxPro.
    Поддержка индексирования для быстрой сортировки больших таблиц и поиска (файлы NDX и MDX). Пока нет поддержки индексов Clipper и FoxPro.
    --------
    переведено гуглом. с сайта компонента. если выше перечисленное устраивает, ответ - можно. если не устраивает - неможно.
  • kilkennycat © (14.04.18 22:56) [3]

    > как спозиционироваться и i-ю изменить ?

    http://wiki.freepascal.org/Lazarus_Tdbf_Tutorial
  • Плохиш © (16.04.18 10:41) [4]

    > Edit  insert не получается...

    Тут сложно помочь.
    Жди желающих полечить без фотографии.
  • dis12345 © (17.04.18 13:40) [5]
    Вот скрин  https://yadi.sk/i/yTFaXvOX3UV597
    и исходник:

    unit Unit1;

    {$mode objfpc}{$H+}

    interface

    uses
     Classes, SysUtils, DB {dbf.FieldDefs.Add need}, dbf, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
     StdCtrls, ComCtrls;

    type

     { TForm1 }

     TForm1 = class(TForm)
       ButtonNomer: TButton;
       ButtonEdit: TButton;
       ButtonAdd: TButton;
       ButtonOpen: TButton;
       ButtonSave: TButton;
       ButtonCreate: TButton;
       Dbf: TDbf;
       Edit1: TEdit;
       Edit2: TEdit;
       EditNo: TEdit;
       Memo: TMemo;
       StringGrid: TStringGrid;
       UpDown1: TUpDown;
       procedure ButtonAddClick(Sender: TObject);
       procedure ButtonCreateClick(Sender: TObject);
       procedure ButtonEditClick(Sender: TObject);
       procedure ButtonNomerClick(Sender: TObject);
       procedure ButtonOpenClick(Sender: TObject);
       procedure FormCreate(Sender: TObject);
     private

     public

     end;

    var
     Form1: TForm1;

    implementation

    {$R *.lfm}

    { TForm1 }

    procedure TForm1.FormCreate(Sender: TObject);
    begin
       dbf.Exclusive:= True;            //необходимо для изменения установок
       dbf.FilePath:='E:\dbfEdit\';
       dbf.TableName:='simple.dbf';     //имя файла таблицы
    end;

    procedure TForm1.ButtonCreateClick(Sender: TObject);
    begin
     Memo.Lines.Add(dbf.FilePath+dbf.TableName);

     IF not FileExists(dbf.FilePath+dbf.TableName) THEN BEGIN
       dbf.TableLevel:= 7;

       dbf.FieldDefs.Add('No',ftAutoInc,0, true);
       dbf.FieldDefs.Add('Const',ftString, 50, true);
       dbf.FieldDefs.Add('Value',ftFloat, 0, false);
       dbf.FieldDefs[dbf.FieldDefs.Count-1].Precision := 2;   //точность

       dbf.CreateTable;
       dbf.Open;
     END
     ELSE BEGIN //если таблица есть, просто открываем её
       dbf.Open;
     END;
    end;

    procedure TForm1.ButtonOpenClick(Sender: TObject);
    var       i: integer;
    begin

       dbf.Open;
       Memo.Lines.Add('DBF.FieldCount '+IntToStr( Dbf.FieldCount));
       Memo.Lines.Add('DBF.RecordCount '+IntToStr( Dbf.RecordCount));
       StringGrid.RowCount:= Dbf.RecordCount+1;
       Memo.Lines.Add(' ');
       FOR i:=0 TO Dbf.FieldCount-1 DO BEGIN
           Memo.Lines.Add(Dbf.Fields.Fields[i].FieldName); ;
       END;

       dbf.First;
       while not dbf.EOF do begin
           i:= dbf.PhysicalRecNo;
           Memo.Lines.Add('Rec No  '+IntToStr(i)+'  '+
                           dbf.FieldByName('Const').AsString +'   '+
                           FormatFloat(  '0.00', dbf.FieldByName('Value').AsFloat));

           StringGrid.Cells[0,i] :=  dbf.FieldByName('No').AsString;
           StringGrid.Cells[1,i] :=  dbf.FieldByName('Const').AsString;
           StringGrid.Cells[2,i] :=  FormatFloat(  '0.00', dbf.FieldByName('Value').AsFloat);
           dbf.Next;
       end;
       dbf.Close;
    end;

    procedure TForm1.ButtonAddClick(Sender: TObject);
    var     RealValue        : real;
           code             : integer;
    begin
        dbf.Open;
        dbf.Append;
        dbf.FieldByName('Const').Text:=Edit1.Text;

        Val(Edit2.Text,RealValue,code);
        dbf.FieldByName('Value').Value:=RealValue;
        dbf.Post;
        dbf.Close;
    end;

    procedure TForm1.ButtonEditClick(Sender: TObject);     //в текущую строку грида
    var     RealValue        : real;
           code             : integer;
    begin
       dbf.Open;
       dbf.PhysicalRecNo :=   StringGrid.Row;      // в текущую строку грида
       Memo.Lines.Add('CurrentRow = ' +  IntToStr(dbf.PhysicalRecNo));
       dbf.FieldByName('Const').Text:=Edit1.Text;

       Val(Edit2.Text,RealValue,code);
       dbf.FieldByName('Value').Value:=RealValue;
       dbf.Post;                                   // НЕ УДАЕТСЯ ЗАПИСАТЬ !!!!!!!
       dbf.Close;
    end;

    procedure TForm1.ButtonNomerClick(Sender: TObject);    //в выбранный спином номер
    var     RealValue        : real;
           code             : integer;
    begin
       dbf.Open;
       dbf.PhysicalRecNo :=   StrToInt(EditNo.Text);      // в указанную номером строку dbf
       Memo.Lines.Add('CurrentRow = ' +  IntToStr(dbf.PhysicalRecNo));
       dbf.FieldByName('Const').Text:=Edit1.Text;

       Val(Edit2.Text,RealValue,code);
       dbf.FieldByName('Value').Value:=RealValue;
       dbf.Post;                                   // НЕ УДАЕТСЯ ЗАПИСАТЬ !!!!!!!
       dbf.Close;

    end;

    end.  

    В последнюю строку дбф-а добавляет значения из Edit-oв = OK
    Хочу редактировать текущую (предпоследняя процедура)
    и добавлять в указанную spin-ом строку, смещая остальные существующие строки вниз  (последняя процедура)

    В описании подобного нет ..... а очень надо НЕ через DBgrid с навигатором
  • SergP © (17.04.18 15:21) [6]
    Хм. Никогда не пользовался TDBF, но думаю что работа с ним не должна отличаться от стандартных дельфийских компонентов, где для переключения в режим редактирования используется метод Edit.
  • Плохиш © (17.04.18 15:37) [7]
    Ответ в вопросеЪ

    > вызывает ран-тайм ошибку dbf is not in an edit or insert state
  • dis12345 © (19.04.18 13:28) [8]
    Я остался на D7, в нем есть прекрасно работающий и замечательно задокументированный TDBF Брусникина, но перенести его на Lazarus не смог,  (UTF_8), а встроенный с "обглоданной" справкой и совершенно не интуитивно понятный....
  • Styx © (19.04.18 17:06) [9]

    > Я остался на D7, в нем есть прекрасно работающий и замечательно
    > задокументированный TDBF Брусникина

    А в нём не надо делать
    dbf.Edit
    ?
  • SergP © (19.04.18 17:49) [10]
    Так не пробовал делать?

    ...
    procedure TForm1.ButtonEditClick(Sender: TObject);     //в текущую строку грида
    var     RealValue        : real;
          code             : integer;
    begin
      dbf.Open;
      dbf.PhysicalRecNo :=   StringGrid.Row;      // в текущую строку грида
      Memo.Lines.Add('CurrentRow = ' +  IntToStr(dbf.PhysicalRecNo));

      dbf.Edit; // переключаем в режим редактирования

      dbf.FieldByName('Const').Text:=Edit1.Text;

      Val(Edit2.Text,RealValue,code);
      dbf.FieldByName('Value').Value:=RealValue;
      dbf.Post;                                   // НЕ УДАЕТСЯ ЗАПИСАТЬ !!!!!!!
      dbf.Close;
    end;
    ...
  • KilkennyCat © (19.04.18 19:33) [11]

    > замечательно задокументированный TDBF Брусникина

    похоже, что замечательность лишь в примерах кода.
 
Конференция "Начинающим" » Работа с dbf файлом напрямую [XP]
Есть новые Нет новых   [134427   +34][b:0][p:0.001]