Удаление записей из dbf с MEMO полями

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

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

Удаление записей из dbf с MEMO полями

Сообщение Velial » 17.02.2012 12:44:03

Доброго времени суток.
Есть dbf файл с MEMO полями(.dbt файл), нужно удалять/добавлять записи в этот файл. При удалении/добавлении MEMO поля сдвигаются.
Как реализовать что бы MEMO поля оставались с правильными значениями?
Velial
новенький
 
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Re: Удаление записей из dbf с MEMO полями

Сообщение Vadim » 17.02.2012 15:20:27

Velial писал(а):нужно удалять/добавлять записи в этот файл. При удалении/добавлении MEMO поля сдвигаются.

Т.е. Вы открываете МЕМО-файл в текстовом редакторе и вручную вводите или удаляете туда\оттуда значения???
Не могли бы Вы более подробно объяснить, что именно и как именно Вы делаете и что значит:
Velial писал(а):...MEMO поля сдвигаются.

?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Удаление записей из dbf с MEMO полями

Сообщение Velial » 17.02.2012 15:26:57

есть dbf файл. при удалении записи(присутствует 2 memo поля) из dbf файла значения memo полей становятся не верными.
Делаю так:
Код: Выделить всё
  dbf1.TableName:='Post_tu.dbf';
  dbf1.Open;
  dbf1.First;
  dbf1.Delete;
  dbf1.Close;
  dbf1.Exclusive:=true;
  dbf1.Open;
  dbf1.PackTable;
  dbf1.Close;

после этого в memo полях неверные данные

Добавлено спустя 6 часов 50 минут 40 секунд:
Сделал по другому:
Копирую .dbf и .dbt файлы с другим именем. Отмечаю на удаление все записи и делаю упаковку. Получаю пустую таблицу. Копирую нужные записи из исходного файла в пустой. В итоге MEMO поля имеют правильные значения, НО .dbt файл раздувается непомерно.
Как сделать что бы .dbt файл не раздувало?

Добавлено спустя 3 часа 30 минут 4 секунды:
Может я не правильно копирую записи? Пришел вот к такому способу копирования записей(здесь пока нет условия выборки, но это потом допишу), но .dbt файл все равно получается больше чем должен.
Код: Выделить всё
  while not dbf2.EOF do
  begin
    dbf1.Edit;
    dbf1.Append;
    for i:=0 to dbf2.FieldCount-1 do
    begin
      If (i=7) or (i=9) then
      begin
        bs1:=tstream.Create;
        bs1:=DBF1.CreateBlobStream(dbf1.Fields.Fields[i],bmwrite);
        bs2:=tstream.Create;
        bs2:=DBF2.CreateBlobStream(dbf2.Fields.Fields[i],bmread);
        tmps:='';
        try
          spisok:=TStringList.Create;
          spisok.LoadFromStream(bs2);
          spisok.SaveToStream(bs1);
        finally
          spisok.Free;
          bs1.Free;
          bs2.Free;
        end
      end
      else
        dbf1.Fields.Fields[i].AsVariant:=dbf2.Fields.Fields[i].AsVariant;
    end;
    dbf1.Post;
    dbf2.Next;
  end;
Velial
новенький
 
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Re: Удаление записей из dbf с MEMO полями

Сообщение sign » 18.02.2012 07:11:57

Velial писал(а):Может я не правильно копирую записи?

Не, вы выбрали древний, устаревший инструмент.
Только и всего.
Переходите на нормальные и будет вам счастье.

Хотя... может вас воодушевляет бег по полю с завязанными глазами с раскиданными тут и там граблями?
Тогда весёлых приключений и крепкого лба!
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Удаление записей из dbf с MEMO полями

Сообщение Velial » 18.02.2012 09:09:09

sign писал(а):Не, вы выбрали древний, устаревший инструмент.
Только и всего.
Переходите на нормальные и будет вам счастье.

На какие перейти если нужно обрабатывать файлы из проекта который работает и который никто не собирается переписывать? Или это про Lazarus?
Velial
новенький
 
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Re: Удаление записей из dbf с MEMO полями

Сообщение Vadim » 18.02.2012 13:40:34

Velial
Предлагаю Вам свой пример для тестирования.
http://212.41.1.226/vvc/DBFDeleter.zip

У меня никакие мемо-поля нигде не смещаются после удаления.
Колитесь, какие ещё пакости делаете с таблицей? ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Удаление записей из dbf с MEMO полями

Сообщение Velial » 18.02.2012 14:40:38

Проблема похоже в том что таблицу я не создаю в lazarus а беру готовую.
Вот моя программа.
http://narod.ru/disk/41106539001/post_tu.7z.html
По кнопке "Копирование в другую таблицу" копирую исходную таблицу в post_tu1, очищаю pos_tu1, и копирую в post_tu1 нужные записи.
Все данные переносятся правильно, но .dbt файл раздувается(можно сравнить с исходным)

По кнопке "Простое удаление" просто удаляю запись и пакую таблицу. Получаю ошибочные данные в MEMO полях.
Velial
новенький
 
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Re: Удаление записей из dbf с MEMO полями

Сообщение Vadim » 18.02.2012 19:11:24

Velial
У Вас заголовок файла DBT неправильно распознаётся, поэтому компонент TDbf его неправильно обрабатывает. Я такой первый раз вижу. В заголовке есть фирменная метка - sixmemo. Это чей-то фирменный выпендрёж и отступление от стандарта dbase.
Утирайте слёзы, дружище - Вы попали с этим анахронизмом не по детски... :)
По поводу раздувания размера dbt-файла. У версии dBase III и IV была такая особенность - при удалении записей (даже после упаковки) соответствующая ссылка на блок в dbf-файле уже отсутствует, а вот сам блок в dbt-файле сохраняется. Здесь у Вас нечто аналогичное - происходит перезаписывание оставшихся блоков в конец файла, а те что были остаются на месте. Представьте, у Вас было 5 записей и, соответственно, 5 блоков в мемо-файле. Вы одну запись удаляете, 4 оставшихся блока перезаписываются в конец мемо-файла. И, приходи кума любоваться - после удаления одной записи у Вас в мемо-файле уже не 5, а 9 блоков. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Удаление записей из dbf с MEMO полями

Сообщение Velial » 18.02.2012 22:01:03

Значит это не я идиот, а мне не повезло

Добавлено спустя 1 час 54 минуты 36 секунд:
Vadim писал(а):Velial
У версии dBase III и IV была такая особенность - при удалении записей (даже после упаковки) соответствующая ссылка на блок в dbf-файле уже отсутствует, а вот сам блок в dbt-файле. сохраняется.

А есть предложение как такую проблему можно решить?
И спасибо за помощь.
Velial
новенький
 
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Re: Удаление записей из dbf с MEMO полями

Сообщение Vadim » 19.02.2012 05:30:28

Velial писал(а):А есть предложение как такую проблему можно решить?

Единственное предложение - не копировать файлы БД, а заново создавать их (например, используя SQLite) со структурой исходников. И потом перенести данные.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Удаление записей из dbf с MEMO полями

Сообщение Velial » 19.02.2012 13:35:39

такой вариант не подходит, т.к. после обработки файлы нужно обратно закидывать
Velial
новенький
 
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Re: Удаление записей из dbf с MEMO полями

Сообщение Vadim » 19.02.2012 16:37:22

Тогда попробуйте создать файлы с той же структурой, но только средствами Lazarus и скормить их второй программе. Если будет всё нормально, то просто замените файлы с неправильным заголовком на файлы, которые создал lazarus.

Добавлено спустя 3 минуты 48 секунд:
В крайнем случае попробуйте воспользоваться этим:
http://www.softsoft.ru/development/comp ... /19501.htm
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Удаление записей из dbf с MEMO полями

Сообщение Velial » 21.02.2012 08:47:30

Vadim писал(а):Тогда попробуйте создать файлы с той же структурой, но только средствами Lazarus и скормить их второй программе. Если будет всё нормально, то просто замените файлы с неправильным заголовком на файлы, которые создал lazarus.


Не помогло, dbt файл продолжает пухнуть
Velial
новенький
 
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Re: Удаление записей из dbf с MEMO полями

Сообщение haword » 21.02.2012 17:27:47

http://www.vlad-karpov.narod.ru/Components.html#VK DBF тут под делфю компонент для работы с dbf, попробуй его на делфе, если все будет работать то думаю портировать не составит большого труда его на лазарь.
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Удаление записей из dbf с MEMO полями

Сообщение SSerge » 22.02.2012 05:24:01

Очень-очень давно ковырялся в исходниках CodeBase, был такой набор Си-шных библиотек, якобы кроссплатформенный и великолепный. Когда-то на его основе работали все 1С. Так вот, там при удалении memо полей перестраивался индексатор, тёрлись ссылки на .dbt, но само хранилище оставалось в неизменном состоянии. :D Я хочу сказать, что _не_ вымарывать "удаленную" информацию из хранилищ memo - это нормальные и ожидаемые действия при работе с .dbf. Причина - необходимость принудительной проверки и пересчета всех полей, ссылающихся на .dbt в случае изменения его содержимого (смещения индексов) - очень энергоёмкая и неприемлемая в условиях работы программы операция. Нужно сделать .dbt минимального размера - база создается заново и по предыдущей базе, последовательным считыванием, в новую переносится вся необходимая информация. И так до следующего "распухания".
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru