for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
   :: Помощь сайту :: 

Re: APPEND FROM или APPEND BLANK
of63

Сообщений: 10598
Откуда: Н.Новгород
Дата: 21.12.17 21:32:03ОтветитьЦитировать
> ***.ftp растет по геометрической прогрессии
Чудесным образом пробла решилась, походу чтоли? )
Ratings: 0 negative/0 positive

Re: APPEND FROM или APPEND BLANK
Dron2003
Автор

Сообщений: 76
Дата: 21.12.17 21:36:55ОтветитьЦитировать
of63
> ***.ftp растет по геометрической прогрессии
Чудесным образом пробла решилась, походу чтоли? )

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

Re: APPEND FROM или APPEND BLANK
PaulWist

Сообщений: 12881
Дата: 21.12.17 21:39:23ОтветитьЦитировать
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 привести к явному типу, что бы не нарваться на особенности нулевого прогона.


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




Исправлено: PaulWist, 21.12.17 21:41
Ratings: 0 negative/1 positive

Re: APPEND FROM или APPEND BLANK
Dron2003
Автор

Сообщений: 76
Дата: 21.12.17 21:47:13ОтветитьЦитировать
Ура!Всё заработало!Ребята, спасибо!
Ratings: 0 negative/0 positive

Re: APPEND FROM или APPEND BLANK
of63

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

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

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

Re: APPEND FROM или APPEND BLANK
Crispy

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

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


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

Re: APPEND FROM или APPEND BLANK
Igor Korolyov

Сообщений: 31087
Дата: 22.12.17 11:52:25ОтветитьЦитировать
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: 27 comsel Mitjay  and Guests: 25


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