powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / организация удаления
25 сообщений из 33, страница 1 из 2
организация удаления
    #39953598
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый всем праздничный первомайский вечер!

Подскажите, как правильно организовать удаление записей в приложении.

Есть форма с гридом, источник локалвью. Пользователь работает с данными, в частности удаляет строки, в таблице строки помечаются и накапливаются.

Можно использовать служебную форму, не доступную пользователю, и находить время и возможность почистить таблицу командой PACK, но это не кажется изящным решением.

Может как-то можно задействовать удаленные строки, что бы туда записывать данные в дальнейшем? Так, что бы накопления помеченных записей в товарных количествах просто не происходила, а при создании новых записей они задействовались.

Кто-то же решал такую проблему наверное, может поделитесь советом.
...
Рейтинг: 0 / 0
организация удаления
    #39953617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понял.
Если надо повторно использовать помеченную на удаление запись то RECALL
Но сам факт такой необходимости говорит о том что есть проблемы в архитектуре БД.
...
Рейтинг: 0 / 0
организация удаления
    #39953620
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Это не связано с архитектурой. Записи помечаются на удаление в ходе работы пользователя - например, отменили часть ранее сделанного заказа и вместо 10-ти записей осталось 7, три остались в таблице помеченными на удаление. Со временем таких набегает, не то, что бы много, но есть.
Вот и подумал, может как-то организовать, что бы их задействовать. Так, что бы в принципе не возникал вопрос физического удаления когда-либо.

Пока думаю так, в процедуре сохранения для удаленных записей делать blank for deleted() , при создании нового заказа их по пустому полю находить и recall и переписывать. Но еще не воплотил.
...
Рейтинг: 0 / 0
организация удаления
    #39953660
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn

Пока думаю так, в процедуре сохранения для удаленных записей делать blank for deleted() , при создании нового заказа их по пустому полю находить и recall и переписывать. Но еще не воплотил.


1. Судя по предложенному алгоритму в БД отсутствует FK/RI.

2. Не надо придумывать велосипед, "чистка" удаленных записей обычно делается в административной процедуре, да и в большинстве случаев это не требуется.
...
Рейтинг: 0 / 0
организация удаления
    #39953665
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist,

добрый день, что такое FK/RI ?
...
Рейтинг: 0 / 0
организация удаления
    #39953670
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist,

1. Прошу извинить, если не прав, но может имеется в виду Foreign Key и Referential Integrity ?
От Relation между таблицами отказался, внешние ключи используются.

2. Может вы и правы, но разве это не будет улучшением - усовершенствованием приложения, если требующих "чистки" помеченных на удаление записей накапливаться в принципе не будет никогда и административная процедура не понадобится тоже никогда?

Это не критично все, конечно, просто хотел услышать мнение, надо оно такое, не надо, я ведь только учусь, опытом не обладаю, профильным образованием тоже, пилю себе один свой собственный проект и постигаю мудрость, в том числе с вашей помощью.
...
Рейтинг: 0 / 0
организация удаления
    #39953671
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
и административная процедура не понадобится тоже никогда?

Понадобится по другим причинам. При интенсивном изменении индексы вырождаются и поиск начинает работать медленнее, не говоря о том что некорректное завершение (выключение света, снятие задачи, сбой сети и т.д.) может разрушить индекс, поэтому требуется регулярно удалять индексы и создавать заново, а добавление сюда PACK не особо помешает.

Да и производительность сильно просядет если сначала искать помеченную на удаление запись, а если нет - добавлять. Просто добавлять - быстрее.
...
Рейтинг: 0 / 0
организация удаления
    #39953699
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Основная идея понятна, спасибо )

На счет индексов хотя бы кратко - каков алгоритм переиндексации ?
И в моем случае: есть поле id I (autoincrement), он же primary key, и есть ключи внешние, regular.
Составных нет, просто не умею ими пользоваться, а потому и не вижу куда и как применить.
Relation нет.
Записей до 200 000 . Надо ли тут переиндексацию затевать, да и как это возможно?
...
Рейтинг: 0 / 0
организация удаления
    #39953721
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
На счет индексов хотя бы кратко - каков алгоритм переиндексации ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
use MyTable excl
delete tag all
pack
index on ... tag ...
index on ... tag ...
...
use MyTable2 excl
...
use


DmitryKn
И в моем случае: есть поле id I (autoincrement), он же primary key, и есть ключи внешние, regular.
Составных нет, просто не умею ими пользоваться, а потому и не вижу куда и как применить.
Relation нет.
Записей до 200 000 . Надо ли тут переиндексацию затевать, да и как это возможно?

Индексы для другого нужны, они ускоряют поиск нужных записей, гугли rushmore и про sys(3054) почитай
...
Рейтинг: 0 / 0
организация удаления
    #39953724
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

посмотрю, спасибо
...
Рейтинг: 0 / 0
организация удаления
    #39954352
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае, использование Recall - не желательно. Это, скорее, инструмент разработки и отладки. А вот в готовом приложении использовать не стоит. Возникает ряд проблем

Удаление записей в таблице
...
Рейтинг: 0 / 0
организация удаления
    #39955081
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

большое спасибо за ссылку.
Уже иду правильным путем )
...
Рейтинг: 0 / 0
организация удаления
    #39956632
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn,

Как вариант использовать индекс, например
INDEX ON IIF(DELETED() OR EMPTY(sk_id),"F","T")+STR(sk_id,7) TAG sk_id ADDITIVE
далее при просмотре таблицы
SET KEY TO "T"
будут отображаться только не удалённые записи..
...
Рейтинг: 0 / 0
организация удаления
    #40051561
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени!

Удаляю помеченные записи:
Код: sql
1.
2.
3.
CLOSE DATABASES all && если без all - база не закрывается, видимо, потому что папка data лежит в другом каталоге, отличном от pathwork
OPEN DATABASE 'myBase' EXCLUSIVE && путь в названии прописан, isexlusive проверен
PACK DATABASE



И ничего не происходит, все помеченные записи на месте. Что-то еще надо PACKy ?
...
Рейтинг: 0 / 0
организация удаления
    #40051571
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
из командного окна тоже не работает (
...
Рейтинг: 0 / 0
организация удаления
    #40051620
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помеченные не в базе, а в конкретной таблице надо удалять
Код: sql
1.
2.
use MyTable excl
pack
...
Рейтинг: 0 / 0
организация удаления
    #40051643
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Спасибо за ответ, да еще и в праздник.

Да, по таблицам пакует, я просто думал pack database сразу все помеченные записи во всех таблицах базы уберет, что бы не перебирать таблицы. Не прошла халтурка ))
...
Рейтинг: 0 / 0
организация удаления
    #40051661
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Получилось такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
TRY 
	CLOSE DATABASES all
	OPEN DATABASE 'myBase' EXCLUSIVE
		IF DBUSED('myBase') AND ISEXCLUSIVE('myBase',2)
			lldbexl = .t.
		ENDIF 
CATCH 
	MESSAGEBOX('Нельзя открыть монопольно, есть еще сессии',48)
ENDTRY

IF lldbexl
	USE mytable1 IN 0 EXCLUSIVE
	SELECT mytable1
	PACK
	REINDEX
	USE IN mytable1

        ...
	
	CLOSE DATABASES all
	SET EXCLUSIVE OFF 
	OPEN DATABASE 'myBase'
	
ENDIF 



Насколько здесь уместен будет reindex и вообще, может методологические ошибки есть? Так-то вроде работает
...
Рейтинг: 0 / 0
организация удаления
    #40051671
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
Dima T,

Спасибо за ответ, да еще и в праздник.

Да, по таблицам пакует, я просто думал pack database сразу все помеченные записи во всех таблицах базы уберет, что бы не перебирать таблицы. Не прошла халтурка ))

pack database пакует контейнер БД, который тоже таблица.
DmitryKn
Dima T,

Получилось такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
local lldbexl && без этого при исключении ошибка будет на IF lldbexl
TRY 
	CLOSE DATABASES all
	OPEN DATABASE 'myBase' EXCLUSIVE
		IF DBUSED('myBase') AND ISEXCLUSIVE('myBase',2) && оно уже USED и EXCLUSIVE
			lldbexl = .t.
		ENDIF 
CATCH 
	MESSAGEBOX('Нельзя открыть монопольно, есть еще сессии',48)
ENDTRY

IF lldbexl
	USE mytable1 IN 0 EXCLUSIVE
	SELECT mytable1
	PACK
	REINDEX
	USE IN mytable1

        ...
	
	CLOSE DATABASES all
	SET EXCLUSIVE OFF 
	OPEN DATABASE 'myBase'
	
ENDIF 



Насколько здесь уместен будет reindex и вообще, может методологические ошибки есть? Так-то вроде работает

Желтым лишнее выделил. Можно выкинуть.
При наличии помеченных на удаление внутри PACK выполняется REINDEX, но
REINDEX не всегда спасает, надежнее удалять индексы и заново создавать, выше писал 22126645
...
Рейтинг: 0 / 0
организация удаления
    #40051680
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Огромное спасибо
...
Рейтинг: 0 / 0
организация удаления
    #40052716
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
use MyTable excl
delete tag all
pack
index on ... tag ...
index on ... tag ...
...
use MyTable2 excl
...
use




Доброго времени,
это индексы те же самые индексы, что указываются в конструкторе таблиц при создании таблицы?
...
Рейтинг: 0 / 0
организация удаления
    #40052730
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, те самые
...
Рейтинг: 0 / 0
организация удаления
    #40052847
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

а с теми, которые primary, не будет ли каких осложнений? В хэлпе сказано, что мы примари не можем задать:
"Вы не можете создать первичный (primary) индекс командой INDEX..."
Мы ведь delete tag all , значит и примари тоже?
...
Рейтинг: 0 / 0
организация удаления
    #40052860
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, хэлп надо смотреть. Я использую только обычные индексы.

PS Всякие связи, средства контроля целостности и т.п. тоже не использую.
...
Рейтинг: 0 / 0
организация удаления
    #40052871
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Не знаю, хэлп надо смотреть. Я использую только обычные индексы.

PS Всякие связи, средства контроля целостности и т.п. тоже не использую.


Это я тоже не использую, но примари индексы есть, на автоинкрементных полях.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / организация удаления
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (4), Yandex Bot, Bing Bot, Google Bot 2 мин., Панург 8 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]