:: Visual Foxpro, Foxpro for DOS
Re: APPEND FROM или APPEND BLANK
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> ***.ftp растет по геометрической прогрессии
Чудесным образом пробла решилась, походу чтоли? )
Ratings: 0 negative/0 positive
Re: APPEND FROM или APPEND BLANK
Dron2003
Автор

Сообщений: 81
Дата регистрации: 14.11.2008
of63
> ***.ftp растет по геометрической прогрессии
Чудесным образом пробла решилась, походу чтоли? )

Да, через INSERT ... select... *.ftp не раздувается. Но я не соображу как мне теперь перенести только те записи, которые удовлетворяют запросу.
Ratings: 0 negative/0 positive
Re: APPEND FROM или APPEND BLANK
PaulWist

Сообщений: 14621
Дата регистрации: 01.04.2004
Dron2003

INSERT INTO exzamen select * from bilet

Попробовал, всё сработало на ура! Но как мне перенести только те записи, которые удовлетворяют моему запрос, типа "FOR n_bil=tmp_bilet4 .and. n_vopr=n " ?

INSERT INTO exzamen select * from bilet where n_bil=tmp_bilet4 .and. n_vopr=n

PS звёздочку использовать не хорошо, лучше перечислить поля явным образом и для полной уверенности поля в select привести к явному типу, что бы не нарваться на особенности нулевого прогона.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 21.12.17 22:41
Ratings: 0 negative/1 positive
Re: APPEND FROM или APPEND BLANK
Dron2003
Автор

Сообщений: 81
Дата регистрации: 14.11.2008
Ура!Всё заработало!Ребята, спасибо!
Ratings: 0 negative/0 positive
Re: APPEND FROM или APPEND BLANK
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Dron2003
of63
> ***.ftp растет по геометрической прогрессии
Чудесным образом пробла решилась, походу чтоли? )

Да, через INSERT ... select... *.ftp не раздувается. Но я не соображу как мне теперь перенести только те записи, которые удовлетворяют запросу.

Удовлетворяют запросу те записи, которые удовлетворяют запросу, мое )
Ratings: 0 negative/0 positive
Re: APPEND FROM или APPEND BLANK
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Dron2003
Нет. В исходной таблице всего 800 записей. Дело в том, что временный файл *.DBF по размерам нормальный не распухший, а только *.FTP в несколько раз больше становится.

В подобных ситуациях специально для мемо-полей есть дополнительный параметр команды паковки.
Т.е. в таких случаях надо паковать таблицу не командой PACK, подчищающей файл dbf от удаленных записей, а командой с параметром: PACK MEMO, которая как раз и удаляет все неиспользованное пространство из fpt-файла.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: APPEND FROM или APPEND BLANK
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Dron2003
PaulWist
Используй одну команду insert ... select ...
Ой! как давно я этой командой не пользовался, по моему еще со времен клиппера.
Крайне маловероятно что в клиппере была такая команда, т.к. в самом фоксе она появилась лишь в VFP8...
Dron2003
REPLACE мемо-поля работает правильно не раздувает ftp.
На самом деле это зависит от режима открытия таблицы, и размера "старого" и "нового" содержимого мемо-поля. В shared режиме любое изменение мемо поля приводит к созданию нового блока в fpt файле. Он "распухает". Конечно же не "удваивается", просто старое содержимое этого поля остаётся на месте, а новое добавляется. В exclusive режиме некоторые изменения мемо поля производятся "поверх", т.е. записываются физически на то же самое место в fpt файле. Это произойдёт если размер "нового" содержимого укладывается в размер блока с текущим содержимым (грубо говоря, длина строки будет той же или меньшей, хотя на самом деле она может быть и чуть больше - размер блока fpt файла зависит от SET BLOCKSIZE на момент создания таблицы, по умолчанию это 64 байта, так что отняв 8 байт "заголовка" получим что, к примеру, замена строки из 10 символов на строку из 20 символов пройдёт "поверх", без увеличения размера fpt. Но вот уже строка размером 57 символов превысит размер блока, и фокс выделит под это поле новое место, а старое останется как "мусор"). Ещё фокс "перепишет" старый блок (при необходимости увеличив его размер, но таки не породив "мусора"), если он последний "физически" в fpt поле.

Это одна из причин почему в старые времена для особо "нагруженных" систем сооружали всякие хитрые структуры данных но НЕ использовали мемо поля (нагруженные - значит что невозможно производить периодическую упаковку - как dbf+fpt, так и "только fpt файла"). С удалёнными записями то в принципе работать можно - RECALL и заменил содержимое полей - вместо INSERT. Стратегия "повторного использования записей". К сожалению с fpt такой трюк не проходит...

Crispy
в таких случаях надо паковать таблицу не командой PACK, подчищающей файл dbf от удаленных записей, а командой с параметром: PACK MEMO
PACK очищает И dbf И fpt файлы. В dbf он убирает удалённые записи, в fpt убирает "мусор" - старые "версии" мемо полей.
PACK MEMO оставляет в dbf удалённые записи, только убирая "мусор" из fpt. При этом он, естественно, оставляет там мемо поля связанные с "удалёнными" записями в dbf - убирает только "старые версии". Ну и да, он конечно же вносит изменения в dbf файл (т.к. там хранятся адерса блоков из fpt файла, а при "сжатии" эти адреса имзеняются) и как и "просто PACK" требует монопольного открытия таблицы.
Я бы сказал что у PACK MEMO по сравнению с просто PACK очень специфическая область применения - его следует использовать только тогда, когда НЕОБХОДИМО чтобы в dbf файле остались удалённые записи - т.е. когда "удаление" используется не по назначению. Не для того чтобы навсегда избавиться от информации, а только как своего рода "пометка" записей. Но это IMHO плохая идея - для любого рода пометки записей стоит использовать явно описанные поля (логическое поле в частности), а не служебный "признак удаления".


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 FaustGreen  (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика