Удаление записей из dbf с MEMO полями
Модератор: Модераторы
Удаление записей из dbf с MEMO полями
Доброго времени суток.
Есть dbf файл с MEMO полями(.dbt файл), нужно удалять/добавлять записи в этот файл. При удалении/добавлении MEMO поля сдвигаются.
Как реализовать что бы MEMO поля оставались с правильными значениями?
Есть dbf файл с MEMO полями(.dbt файл), нужно удалять/добавлять записи в этот файл. При удалении/добавлении MEMO поля сдвигаются.
Как реализовать что бы MEMO поля оставались с правильными значениями?
Velial писал(а):нужно удалять/добавлять записи в этот файл. При удалении/добавлении MEMO поля сдвигаются.
Т.е. Вы открываете МЕМО-файл в текстовом редакторе и вручную вводите или удаляете туда\оттуда значения???
Не могли бы Вы более подробно объяснить, что именно и как именно Вы делаете и что значит:
Velial писал(а):...MEMO поля сдвигаются.
?
есть dbf файл. при удалении записи(присутствует 2 memo поля) из dbf файла значения memo полей становятся не верными.
Делаю так:
после этого в memo полях неверные данные
Добавлено спустя 6 часов 50 минут 40 секунд:
Сделал по другому:
Копирую .dbf и .dbt файлы с другим именем. Отмечаю на удаление все записи и делаю упаковку. Получаю пустую таблицу. Копирую нужные записи из исходного файла в пустой. В итоге MEMO поля имеют правильные значения, НО .dbt файл раздувается непомерно.
Как сделать что бы .dbt файл не раздувало?
Добавлено спустя 3 часа 30 минут 4 секунды:
Может я не правильно копирую записи? Пришел вот к такому способу копирования записей(здесь пока нет условия выборки, но это потом допишу), но .dbt файл все равно получается больше чем должен.
Делаю так:
Код: Выделить всё
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 писал(а):Может я не правильно копирую записи?
Не, вы выбрали древний, устаревший инструмент.
Только и всего.
Переходите на нормальные и будет вам счастье.
Хотя... может вас воодушевляет бег по полю с завязанными глазами с раскиданными тут и там граблями?
Тогда весёлых приключений и крепкого лба!
sign писал(а):Не, вы выбрали древний, устаревший инструмент.
Только и всего.
Переходите на нормальные и будет вам счастье.
На какие перейти если нужно обрабатывать файлы из проекта который работает и который никто не собирается переписывать? Или это про Lazarus?
Velial
Предлагаю Вам свой пример для тестирования.
http://212.41.1.226/vvc/DBFDeleter.zip
У меня никакие мемо-поля нигде не смещаются после удаления.
Колитесь, какие ещё пакости делаете с таблицей?
Предлагаю Вам свой пример для тестирования.
http://212.41.1.226/vvc/DBFDeleter.zip
У меня никакие мемо-поля нигде не смещаются после удаления.
Колитесь, какие ещё пакости делаете с таблицей?
Проблема похоже в том что таблицу я не создаю в lazarus а беру готовую.
Вот моя программа.
http://narod.ru/disk/41106539001/post_tu.7z.html
По кнопке "Копирование в другую таблицу" копирую исходную таблицу в post_tu1, очищаю pos_tu1, и копирую в post_tu1 нужные записи.
Все данные переносятся правильно, но .dbt файл раздувается(можно сравнить с исходным)
По кнопке "Простое удаление" просто удаляю запись и пакую таблицу. Получаю ошибочные данные в MEMO полях.
Вот моя программа.
http://narod.ru/disk/41106539001/post_tu.7z.html
По кнопке "Копирование в другую таблицу" копирую исходную таблицу в post_tu1, очищаю pos_tu1, и копирую в post_tu1 нужные записи.
Все данные переносятся правильно, но .dbt файл раздувается(можно сравнить с исходным)
По кнопке "Простое удаление" просто удаляю запись и пакую таблицу. Получаю ошибочные данные в MEMO полях.
Velial
У Вас заголовок файла DBT неправильно распознаётся, поэтому компонент TDbf его неправильно обрабатывает. Я такой первый раз вижу. В заголовке есть фирменная метка - sixmemo. Это чей-то фирменный выпендрёж и отступление от стандарта dbase.
Утирайте слёзы, дружище - Вы попали с этим анахронизмом не по детски...
По поводу раздувания размера dbt-файла. У версии dBase III и IV была такая особенность - при удалении записей (даже после упаковки) соответствующая ссылка на блок в dbf-файле уже отсутствует, а вот сам блок в dbt-файле сохраняется. Здесь у Вас нечто аналогичное - происходит перезаписывание оставшихся блоков в конец файла, а те что были остаются на месте. Представьте, у Вас было 5 записей и, соответственно, 5 блоков в мемо-файле. Вы одну запись удаляете, 4 оставшихся блока перезаписываются в конец мемо-файла. И, приходи кума любоваться - после удаления одной записи у Вас в мемо-файле уже не 5, а 9 блоков.
У Вас заголовок файла DBT неправильно распознаётся, поэтому компонент TDbf его неправильно обрабатывает. Я такой первый раз вижу. В заголовке есть фирменная метка - sixmemo. Это чей-то фирменный выпендрёж и отступление от стандарта dbase.
Утирайте слёзы, дружище - Вы попали с этим анахронизмом не по детски...
По поводу раздувания размера dbt-файла. У версии dBase III и IV была такая особенность - при удалении записей (даже после упаковки) соответствующая ссылка на блок в dbf-файле уже отсутствует, а вот сам блок в dbt-файле сохраняется. Здесь у Вас нечто аналогичное - происходит перезаписывание оставшихся блоков в конец файла, а те что были остаются на месте. Представьте, у Вас было 5 записей и, соответственно, 5 блоков в мемо-файле. Вы одну запись удаляете, 4 оставшихся блока перезаписываются в конец мемо-файла. И, приходи кума любоваться - после удаления одной записи у Вас в мемо-файле уже не 5, а 9 блоков.
Значит это не я идиот, а мне не повезло
Добавлено спустя 1 час 54 минуты 36 секунд:
А есть предложение как такую проблему можно решить?
И спасибо за помощь.
Добавлено спустя 1 час 54 минуты 36 секунд:
Vadim писал(а):Velial
У версии dBase III и IV была такая особенность - при удалении записей (даже после упаковки) соответствующая ссылка на блок в dbf-файле уже отсутствует, а вот сам блок в dbt-файле. сохраняется.
А есть предложение как такую проблему можно решить?
И спасибо за помощь.
Velial писал(а):А есть предложение как такую проблему можно решить?
Единственное предложение - не копировать файлы БД, а заново создавать их (например, используя SQLite) со структурой исходников. И потом перенести данные.
такой вариант не подходит, т.к. после обработки файлы нужно обратно закидывать
Тогда попробуйте создать файлы с той же структурой, но только средствами Lazarus и скормить их второй программе. Если будет всё нормально, то просто замените файлы с неправильным заголовком на файлы, которые создал lazarus.
Добавлено спустя 3 минуты 48 секунд:
В крайнем случае попробуйте воспользоваться этим:
http://www.softsoft.ru/development/comp ... /19501.htm
Добавлено спустя 3 минуты 48 секунд:
В крайнем случае попробуйте воспользоваться этим:
http://www.softsoft.ru/development/comp ... /19501.htm
Vadim писал(а):Тогда попробуйте создать файлы с той же структурой, но только средствами Lazarus и скормить их второй программе. Если будет всё нормально, то просто замените файлы с неправильным заголовком на файлы, которые создал lazarus.
Не помогло, dbt файл продолжает пухнуть
http://www.vlad-karpov.narod.ru/Components.html#VK DBF тут под делфю компонент для работы с dbf, попробуй его на делфе, если все будет работать то думаю портировать не составит большого труда его на лазарь.
Очень-очень давно ковырялся в исходниках CodeBase, был такой набор Си-шных библиотек, якобы кроссплатформенный и великолепный. Когда-то на его основе работали все 1С. Так вот, там при удалении memо полей перестраивался индексатор, тёрлись ссылки на .dbt, но само хранилище оставалось в неизменном состоянии.
Я хочу сказать, что _не_ вымарывать "удаленную" информацию из хранилищ memo - это нормальные и ожидаемые действия при работе с .dbf. Причина - необходимость принудительной проверки и пересчета всех полей, ссылающихся на .dbt в случае изменения его содержимого (смещения индексов) - очень энергоёмкая и неприемлемая в условиях работы программы операция. Нужно сделать .dbt минимального размера - база создается заново и по предыдущей базе, последовательным считыванием, в новую переносится вся необходимая информация. И так до следующего "распухания".
