Обсуждение:Класс TDbf позволяющий создавать DBF-файлы без описания их структуры в словаре

0 (0)
  • Развернуть Обсуждение:Класс TDbf позволяющий создавать DBF-файлы без описания их структуры в словаре ( Обсуждение примера  13.01.2004 10:04 )
    0(0)
    Класс реализует набор возможностей по работе с файлами в формате DBASE III и Visual FoxPro. При помощи данного класса можно создавать DBF файлы из макропрограмм на RSL, не описывая заранее структуру будущего файла в словаре. В отличие от стандартной RSL-ной работы с DBF, понимает файлы формата Visual FoxPro.

    Пример обновлен 27.03.2006
    Посмотреть пример
    >> Ответить
    • Развернуть метод Delete() ( Outcast  13.01.2004 10:08 )
      0(0)
      1) не мешало бы к классу добавить метод удаления записи из DBF
      2) + метод удаления/восстановления всех помеченных записей из DBF
      >> Ответить
    • Развернуть Обсуждение:Класс TDbf позволяющий создавать DBF-файлы без описания их структуры в словаре ( yu  15.01.2004 12:47 )
      0(0)
      Обновил пример. Теперь можно создавать файлы в формате Visual FoxPro, добавлены методы GoToRecord(number), Next(number)
      >> Ответить
    • Развернуть Обсуждение примера ( yu  02.02.2004 13:27 )
      0(0)
      Пример обновлен. Добавлены методы Pack, GetItem, FieldsCount, FileType, CurrentRecord. Изменен метод Next (чтобы поудобнее было с ним работать). Ошибки класса теперь можно отлавливать в OnError.
      >> Ответить
    • Развернуть Пример обновлен ( yu  09.02.2004 12:51 )
      0(0)
      Добавлены методы Rewind, Prev
      >> Ответить
      • Развернуть В процессе работы захотелось ещё... ( dik  22.03.2004 09:48 )
        0(0)
        Замечено - если файл dbf не открыт - а делаешь команду close - выходит ошибка исполнения - конечно не критично - но есть некоторые неудобства :-)
        Как вариант - сделать чтобы close не ругалось - а просто игнорировало или думаю уже назрело - потихонечку вводить свойства объекта, а именно - свойство открыт ли файл, какой файл открыт, в каком режиме и т.д....
        Второе замечание
        когда первый раз открываешь файл - указатель стоит на "нулевой" записе - т.е. если потом делаю цикл
        while (aaa.next) ... end; - всё ок
        но вот появилась ситуация более усложненная - мне надо 2 раза файл прогнать по циклу
        первый раз - всё проходит ок, а вот во второй раз - пытаюсь вернуть запись на начало - есть только команда GoTop - но она указатель ставит на 1 запись - т.е. по тупому next уже второй раз не получится - при заходе в цикл пойдет со второй записи - т.е. предложение сделать что-нибудь вроде rewind

        C уважением

        >> Ответить
      • Развернуть Create.... некоторые замечания ( Outcast  25.05.2004 15:21 )
        0(0)
        1) Не секрет, что во всех DBF с 1-3 байт( три байта ) пишется Дата последнего обновления в формате YYMMDD ( в нулевом байте номер версии 03h), во всех DBF файлах, созданных Create у меня получается 66h 05h 19h, год берется не совсем корректно, т.е. 102 - 2002
        я поменял в часах год на 2007 получил 69h - 105 - 2005

        2) Читем в readme.txt
        Close - Закрывает файл (обязательно использовать при создании нового файла).
        Хотя в примерe 1 после создания DBF, сразу идет очистка буфера, заполнение и вставка записей.
        Но я использую Close после Create
        >> Ответить
        • Развернуть Create.... некоторые замечания ( yu  27.05.2004 02:05 )
          0(0)
          1. Действительно, для версии файлов FoxPro у меня из года вычитается 1900 и еще 2. Почему, сейчас на вскидку уже не скажу, посмотрю попозже. При работе же с версией файлов Visual FoxPro из текущего года вычитается 2000.

          2. Имелось ввиду что Close обязательно использовать если файл создается с нуля (т.е. структуру создаем и т.д.). Необязательно создавать структуру, потом закрывать файл, а потом с ним работать. Можно сразу работать с файлом, главное потом не забыть Close вызвать.
          >> Ответить
          • Развернуть конструктор ( Outcast  27.05.2004 09:46 )
            0(0)
            1. Не которые программы вычитают из текущего года и 1900, и 1990, и 2000. А вот почему еще 2 непонятно...
            2. Сейчас используется пустой конструктор! А почему бы не сделать конструктор, как это сделано например, в TBfile и в нем указываем как открывать/создавать DBF. Можно ведь еще передать в него какую-нибудь структуру, по которой создаются поля и тогда необходимость постоянных вызовов (AddFields) при создании DBF отпадает. Большинство программ так и требуют: сначало создается структура базы, потом в нее добавляются записи. А необходимость добавить еще какое-нибудь поле (AddFields) в уже созданном и заполненнном DBF встречается довольно редко, НО есть!
            3. В противоположность методу AddFields предлагаю и удалять поля(е) - метод DelField!
            >> Ответить
    • Развернуть открытие нескольких файлов ( grave  25.02.2005 14:31 )
      0(0)
      хотел создать столько dbf, сколько клиентов.

      первую dbf создает,
      a.Create(filepath,0); (filepath = ..\\Export\\shina.dbf)
      закрываем ее,
      при попытке создать вторую dbf
      a.Create(filepath,0); (filepath = ..\\Export\\nsktech.dbf)
      onError отлавливает в этой строке такое:
      Error: выполнение метода Id:1
      файл НЕ создается.
      >> Ответить
    • Развернуть Первый раз решил попользоваться TDbf и сразу наступил на грабли :( ( KAIssa  27.10.2005 09:34 )
      0(0)
      Имеем следующий код

      import tdbf;
      
        var a=TDbf();
      
        a.Create("..\\test\\somefile.dbf");
      
        a.AddFields("N","Field0",10,0);
      
        a.ClearRecord();
        a.SetItem(0,1234567890); 		 /* Field0 */
        a.Insert();
      
        a.Close();
      

      В результате в DBF-файл записывается значение 123456789

      Почему?
      >> Ответить
    • Развернуть Обнаружилась такая проблема ( dik  08.02.2007 16:33 )
      0(0)
      При открытии файла с расширением dbf - но не являющимся по настоящему файлом формата DBF (издержки конвертирования юзером из экселя) - программа вылетает по эксепшину


      >> Ответить
    • Развернуть Как изменить запись? ( Wega  06.09.2007 11:55 )
      5(1)
      Что-то я не пойму, уже существующую запись изменить как-нибудь можно или можно только добавить новую?
      >> Ответить
    • Развернуть неверно работает GetItem ( eselev  02.09.2008 16:36 )
      0(0)
      В приведенном ниже примере результат сравнения переменной buf и GetItem - False
      import tdbf;
      var i,buf=77,
      db=TDbf(), fp=TDbf();


      db.Open("..\\MAC\\01.dbf",0);

      fp.Create("..\\MAC\\007.dbf",0);
      // fp.FileType = 1;

      fp.AddFields("N","Field0",10,0);
      fp.AddFields("C","Field1",20,0);
      fp.AddFields("N","Field2",10,3);
      fp.AddFields("D","Field3");

      fp.ClearRecord();
      fp.SetItem(0,buf); /* Field0 */
      fp.SetItem(1,"text text text"); /* Field1 */
      fp.SetItem(2,52.34); /* Field1 */
      fp.SetItem(3,date()); /* Field1 */

      msgbox((buf == fp.GetItem(0));
      fp.Insert();


      fp.Close();

      >> Ответить
    • Развернуть Несколько вопросов ( fplab  31.03.2014 14:46 )
      0(0)
      Давненько не было обсуждения по этому классу. А ведь инструмент полезный. Пользую его время от времени.
      Вопросы:
      1. можно ли как-то проверять помечена запись на удаление или нет?
      2. правильно я понимаю, что обновление текущей записи производится путем установки новых значений методом SetItem?

      И отдельно вопрос автору: планируется ли работа с индексами?
      Спасибо!

      >> Ответить
    • Развернуть вызов метода ClearRecord() перед заполнением записи обязателен ( AsperZ  30.03.2022 09:39 )
      0(0)
      в противном случае есть вероятность что будет сгенерирован файл с невалидными записями
      >> Ответить