|
|
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Я недавно начала пользоваться представлениями и предполагала, что все будет легко и красиво. Но у меня такая ситуация. У меня в форме есть PageFrame, вкладки которого содержат гриды с разными Local View. Хотелось, чтобы пользователь наигрался с гридами, а потом нажал кнопку "Сохранить" на форме и оба представления "зафиксировались" в таблицах (по tableupdate(.t.)). Но мне еще хотелось бы использовать сортировки записей в гридах с помощью индексов. Я поступаю следующим образом: 1. Открываю представления. 2. Создаю индексы (Index on ... ). 3. Устанавливаю 5-ю буферизацию представлений. После редактирования представлений: 1. Сделать TableUpdate(.t.) представлений. 2. Закрыть представления. Я правильно делаю? Что-то у меня не получается. Я на правильном пути? Подскажите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 14:00:54 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Общая стратегия правильная, только есть некоторые тонкости, при индексировании Local View и сбросе изменений в исходные таблицы. Сброс изменений в нескольких записях (табличная буферизация) необходимо окружать транзакцией. Почему? Уже объяснял. Возможно не тебе, но в форуме есть. Внутри транзакции не может быть НЕ структурных индексов. Вызовет отказ открытия транзакции. Если кроме Local View наложена буферизация на таблицы-источники, то после TableUpdate() на сам Local View надо будет сделать TableUpdate() и на таблицы-источники. С индексацией View есть "заморочки", связанные с обновлением View по команде Requery("MyView"). Последний пункт в твоей "программе". Надо не закрывать View, а обновлять его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 14:29:30 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Hi ВладимирМ! Транзакция точно нужна если данные логически связаны - из описания же задачи это не вытекает - так что вполне возможно что именно тут транзакция и не нужна... Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 18:03:38 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Hi, k_sv ! Я поступаю следующим образом: 1. Открываю представления. 2. Создаю индексы (Index on ... ). 3. Устанавливаю 5-ю буферизацию представлений. После редактирования представлений: 1. Сделать TableUpdate(.t.) представлений. 2. Закрыть представления. После редактирования представлений: 1. Сделать TableUpdate(.t.) представлений. 1.1. Я бы сделал здесь REINDEX для LV. Чтобы далее пользователь наигрался с гридами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 18:24:03 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо за советы. Транзакцию я действительно использую. 1. Я думаю, моя ошибка была в том, что я индексы создавала неструктурные: INDEX ON eExpression TAG TagName OF CDXFileName. Переделала на структурные: INDEX ON eExpression TAG TagName. Не судите строго. 2. ВладимирМС индексацией View есть "заморочки", связанные с обновлением View по команде Requery("MyView"). Последний пункт в твоей "программе". Надо не закрывать View, а обновлять его. Это однозначно? Тут мне переделывать много придется. 3. И вообще, в конце концов у меня получилось "приехали": на попытку открытия моих представлений и таблиц - ошибка: Index does not match the table. Delete the index file and re-create the index. (114) Я балдею... Почему это произошло? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 12:44:47 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Так ничего страшного :) Делай, как пишут - удаляй CDX, создавай заново. Где-то видимо были изменения с таблицей без индекса (с индексом без таблицы)... А вообще файлы CDX - имеют такое свойство "пухнуть" при каждом выполнении команды INDEX ON... TAG... - нужно переиодически их "чистить", а проще (если данных - не слишком уж много) - совсем удалять после завершения работы (перед началом), когда еще таблицы, с которыми они связаны, не открыты, и потом создавать заново. На больших таблицах это будет слегка тормозить, но при входе (выходе) это терпимо. Недавно вот с удивлением наткнулся на такую вещь (в чужой программе ;) - 20-30 МБ(!!!) индексы CDX у 2-3-х полупустых DBF-ок размером каждая всего по 200-700 кБ(!!!) - результат такого многолетнего "накопления" А все остальное, что тут выше говорили - это более, чем однозначно! ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 13:15:13 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Нет, меня все-таки не устраивает не закрывать передставление. Допустим, я хочу одно из представлений использовать и в другом месте (другой пункт меню, другая форма). У меня больше 20 таблиц. Если так дело пойдет, мне их что, придется все открытыми держать? Мне как-то дико. Ну, а если при выходе из формы я могу закрыть представление, и открыть его в другой форме, почему бы мне не закрывать его и здесь, после того, как "пользователь наигрался с гридами". :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 13:32:18 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Crispy А вообще файлы CDX - имеют такое свойство "пухнуть" при каждом выполнении команды INDEX ON... TAG... - нужно переиодически их "чистить", а проще (если данных - не слишком уж много) - совсем удалять после завершения работы (перед началом), когда еще таблицы, с которыми они связаны, не открыты, и потом создавать заново. То есть мне надо написать програмку, которая удаляет индексы всех моих таблиц и создает новые? Если не сложно, набросайте, пожалуйста, общую схемку. После сообщения Index does not match the table. Delete the index file and re-create the index. (114) я и удалила cdx файл. Потребовало Validate Database... Жуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 13:47:03 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Hi Crispy! > А вообще файлы CDX - имеют такое свойство "пухнуть" при каждом выполнении команды INDEX ON... TAG... В нормально написанной системе просто НЕТ этих команд и ничего нигде не пухнет. Единственное допустимое для них место - это отдельный административный модуль - где помимо переиндексации может дыть Pack, архивирование данных, восстановление из архивов и т.п. И я бы не советовал делать этот модуль частью основной программы. > а проще (если данных - не слишком уж много) - совсем удалять после завершения работы (перед началом), когда еще таблицы, с которыми они связаны, не открыты, и потом создавать заново Не ну для локальной задачи, написанной в FPD в "классическом" стиле или в каком-нить Clipper это самое то, но для VFP так поступать - это большое свинство :( В общем не стоит... Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2005, 02:38:45 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Hi k_sv! > То есть мне надо написать програмку, которая удаляет индексы всех моих таблиц и создает новые? Не надо - от этого у тебя распухнет dbc до неимоверных размеров. Если в программе нету INDEX ON для основных таблиц (а их в нормальной программе быть не должно по определению!) то cdx не "пухнет" - там достаточно продвинутые алгоритмы распределения... > Если не сложно, набросайте, пожалуйста, общую схемку. DELETE TAG ALL - но это разрушит имеющиеся в dbc relationships (они конечно не очень то и нужны обычно, но тем не менее), и в последующем увеличит размер dbc - т.к. там хранится инфа о индексах, а записи ессно прои DELETE TAG удаляются как и из других dbf - т.е. просто "помечаются" как удалённые... > После сообщения Index does not match the table. Delete the index file and re-create the index. (114) я и удалила cdx файл. Потребовало Validate Database... Жуть. По-моему всё нормально - у тебя возникла рассинхронизация - в cdx написано одно (один перечень тегов), а в dbc написано другое - вот и приходиться "лечить". Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2005, 02:38:47 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Hi, Igor Korolyov ! В общем-то по сути все, конечно, верно :\ Если речь идет о DBC - там с CDX приходится, конечно, обращаться по-другому - более замудрено, слишком строгий там везде контроль... Но, если таблицы свободные, и в результате разных причин (моргание света, случайные, хаотичные нажатия кнопок, пролили чай на клавиатуру - пришлось срочно выключиться :) ...) индексы CDX разрушаются, не будешь же каждый раз создавать их вручную? - для таких случаяев, по-моему, не грех попросту удалять их, и при входе создавать заново. Само собой - речь может идти только о какой-то небольшой задаче. Ведь там же заводить DBC, уж наверно все-таки не имеет смысла? (не настолько в них много пользы - для малых задач! - чтобы компенсировать излишнюю сложность - можно в data environment навставлять и свободных таблиц - сразу все намного упрощается) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2005, 10:10:19 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо за поддержку. Команды типа INDEX ON для основных таблиц я не делаю (религия не позволяет :) ). А в dbc relationships не использую. Это моя первая задача на VFP, решила не рисковать. И так много приколов. Я уже не помню, каким образом мне удалось добиться разрушения индексов, а когда-то и базу данных не удалось открыть вообще (пришлось восстанавливать старую версию). Из всего вышесказанного я решила, что для таких ситуаций мне нужно: 1. Иметь програмку, которая сносит индексы во всех таблицах (DELETE TAG ALL по каждой таблице) и заново делает INDEX ON eExpression TAG TagName OF CDXFileName. 2. Предлагать восстанавливать резервную копию данных. Интересно, как часто будут такие ситуации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2005, 13:14:21 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Для начала, в качестве практики, можно чего-то и поломать - а потом попробовать снова сделать, чтоб заработало. А вообще - интересный способ понять - как сделать лучше, удобнее для работы - сидеть рядом с пользователем и наблюдать, как он работает. Столько потрясающих вещей для себя откроешь! И вдруг поймешь, что то, что может казаться удобным программисту - на самом деле жуть как неудобно пользователю - после чего совсем по-другому будешь строить весь внешний интерфейс программ, уже исходя не из теории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2005, 14:07:03 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Hi Crispy! Хех, если лузер умудриться особо удачно пролить чай/кофе, то вообще не станет никаких проблем - комп сгорит, а юзера током убьёт :) В любом случае создавать cdx при КАЖДОМ входе в программу - совершенно неправильно - если уж так страшно (и юзеры реально тупые) - отслеживай некорректные выходы (скажем создал в начале проги по FCREATE() flag.txt - в конце проги закрыл его и удалил - значит если файлик есть - прогу убили некорректно - НО если он заблокирован - значит просто работает другой экземпляр проги). Решение о использовании DBC принимается уж никак не от размеров задачи и базы. Если тебе нужны её "фишки" - используй даже если таблица всего одна - а прога состоит из одного примитивнейшего prg - не нужны - не используй. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 02:44:31 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovВ любом случае создавать cdx при КАЖДОМ входе в программу - совершенно неправильно - если уж так страшно (и юзеры реально тупые) - отслеживай некорректные выходы (скажем создал в начале проги по FCREATE() flag.txt - в конце проги закрыл его и удалил - значит если файлик есть - прогу убили некорректно - НО если он заблокирован - значит просто работает другой экземпляр проги). Папа, вы будете смеяться, но... (С) Еще в 1992 в однопользовательской зарплате на FP2.0 у меня была табличка USER, в которой отслеживал вход-выход. Можно себе представить, насколько тупые были расчетчицы. При "входе без выхода" принудительно запускал переиндексацию, для чего в INDEX.DBF держал все тэги и ключевые выражения. Естественно, и пункт "Переиндексация" в главном меню. А то по точкам не наездишься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 12:45:30 |
|
||
|
буферизация и индексы
|
|||
|---|---|---|---|
|
#18+
Hi Юрий! Ну я и не претендую на то что открыл Америку :) Вообще если как следует присмотреться, то все современные технологии, фишки и примочки имеют свои аналоги в программах писанных и 20 и 30 лет назад. Конечно актуальность многих приёмов заметно снизилась (многое делает сама среда), но тем не менее :) Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 00:23:40 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33107273&tid=1594085]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
423ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 707ms |

| 0 / 0 |
