Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Добрый всем праздничный первомайский вечер!

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

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

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

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

Кто-то же решал такую проблему наверное, может поделитесь советом.
1 май 20, 19:57    [22126358]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

Откуда:
Сообщений: 16063
Ничего не понял.
Если надо повторно использовать помеченную на удаление запись то RECALL
Но сам факт такой необходимости говорит о том что есть проблемы в архитектуре БД.
1 май 20, 21:13    [22126390]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T,

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

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

Сообщение было отредактировано: 1 май 20, 21:21
1 май 20, 21:21    [22126394]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
PaulWist
Member

Откуда:
Сообщений: 2300
DmitryKn

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


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

2. Не надо придумывать велосипед, "чистка" удаленных записей обычно делается в административной процедуре, да и в большинстве случаев это не требуется.
2 май 20, 07:25    [22126485]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
PaulWist,

добрый день, что такое FK/RI ?
2 май 20, 08:50    [22126504]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
PaulWist,

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

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

Это не критично все, конечно, просто хотел услышать мнение, надо оно такое, не надо, я ведь только учусь, опытом не обладаю, профильным образованием тоже, пилю себе один свой собственный проект и постигаю мудрость, в том числе с вашей помощью.
2 май 20, 09:40    [22126524]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

Откуда:
Сообщений: 16063
DmitryKn
и административная процедура не понадобится тоже никогда?

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

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

Сообщение было отредактировано: 2 май 20, 10:17
2 май 20, 10:17    [22126529]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T,

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

На счет индексов хотя бы кратко - каков алгоритм переиндексации ?
И в моем случае: есть поле id I (autoincrement), он же primary key, и есть ключи внешние, regular.
Составных нет, просто не умею ими пользоваться, а потому и не вижу куда и как применить.
Relation нет.
Записей до 200 000 . Надо ли тут переиндексацию затевать, да и как это возможно?
2 май 20, 13:29    [22126604]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

Откуда:
Сообщений: 16063
DmitryKn
На счет индексов хотя бы кратко - каков алгоритм переиндексации ?

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) почитай
2 май 20, 14:28    [22126645]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T,

посмотрю, спасибо
2 май 20, 15:06    [22126659]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
В общем случае, использование Recall - не желательно. Это, скорее, инструмент разработки и отладки. А вот в готовом приложении использовать не стоит. Возникает ряд проблем

Удаление записей в таблице
5 май 20, 16:35    [22127722]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
ВладимирМ,

большое спасибо за ссылку.
Уже иду правильным путем )
7 май 20, 20:00    [22128987]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
q1w1e1
Member

Откуда: Кы-рск
Сообщений: 1048
DmitryKn,

Как вариант использовать индекс, например
INDEX ON IIF(DELETED() OR EMPTY(sk_id),"F","T")+STR(sk_id,7) TAG sk_id ADDITIVE
далее при просмотре таблицы
SET KEY TO "T"
будут отображаться только не удалённые записи..
13 май 20, 07:01    [22131759]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Доброго всем времени!

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


И ничего не происходит, все помеченные записи на месте. Что-то еще надо PACKy ?

Сообщение было отредактировано: 8 мар 21, 12:38
8 мар 21, 12:44    [22291106]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
из командного окна тоже не работает (
8 мар 21, 13:06    [22291117]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

Откуда:
Сообщений: 16063
Помеченные не в базе, а в конкретной таблице надо удалять
use MyTable excl
pack
8 мар 21, 14:58    [22291176]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T,

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

Да, по таблицам пакует, я просто думал pack database сразу все помеченные записи во всех таблицах базы уберет, что бы не перебирать таблицы. Не прошла халтурка ))
8 мар 21, 16:03    [22291202]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T,

Получилось такое:
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 и вообще, может методологические ошибки есть? Так-то вроде работает
8 мар 21, 17:41    [22291226]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

Откуда:
Сообщений: 16063
DmitryKn
Dima T,

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

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

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

Получилось такое:
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
8 мар 21, 18:45    [22291241]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T,

Огромное спасибо
8 мар 21, 19:24    [22291255]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T

use MyTable excl
delete tag all
pack
index on ... tag ...
index on ... tag ...
...
use MyTable2 excl
...
use



Доброго времени,
это индексы те же самые индексы, что указываются в конструкторе таблиц при создании таблицы?
11 мар 21, 20:49    [22293202]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

Откуда:
Сообщений: 16063
Да, те самые
11 мар 21, 21:56    [22293224]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T,

а с теми, которые primary, не будет ли каких осложнений? В хэлпе сказано, что мы примари не можем задать:
"Вы не можете создать первичный (primary) индекс командой INDEX..."
Мы ведь delete tag all , значит и примари тоже?
12 мар 21, 11:47    [22293409]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

Откуда:
Сообщений: 16063
Не знаю, хэлп надо смотреть. Я использую только обычные индексы.

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

Сообщение было отредактировано: 12 мар 21, 12:29
12 мар 21, 12:35    [22293443]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

Откуда:
Сообщений: 308
Dima T
Не знаю, хэлп надо смотреть. Я использую только обычные индексы.

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


Это я тоже не использую, но примари индексы есть, на автоинкрементных полях.
12 мар 21, 13:01    [22293472]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить