Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 организация удаления  [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]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
Dima T
Member

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

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


Это я тоже не использую, но примари индексы есть, на автоинкрементных полях.

Замени на обычный, ничего не изменится.
12 мар 21, 13:02    [22293473]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

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

Очень аккуратно попробую ))
12 мар 21, 16:16    [22293628]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
Primary - это признак не самого индекса, а свойство контейнера базы данных. Физически - это обычный индекс Candidat, но дополнительно, в контейнере базы данных прописывается информация о том, что вот этот индекс надо считать Primary

Если Вы работаете с контейнером базы данных (DBC), то пересоздание индексов - плохая идея. Слишком много информации прописывается именно в контейнере базы данных. Если так уж хочется получить "чистые" индексы без возможного "мусора", то я поступал так

1. Создается резервная копия структуры базы данных и таблиц. Это все те же самые таблицы и индексы, но без данных. Пустые

2. Когда возникает необходимость переиндексации, то из этой резервной копии достаются файлы CDX, которые заменяют файлы CDX с данными. Таблицы корректно откроются, поскольку структура индексного файла будет корректна. И вот по этому пустому индексу выполнить штатный Reindex
12 мар 21, 16:26    [22293647]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

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

Например, просто создаю еще одну папку в директории проекта, скажем, DATA2, и копирую туда таблицы. В них удаляю все записи, РАСК, и в последствии оттуда копирую файлы cdx в первоначальную папку DATA с замещением, правильно ли я понял?
13 мар 21, 12:46    [22293932]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
Почти. После копирования надо еще Reindex сделать. А так, правильно. "Образец" с пустыми данными. Только структура

PS: Если стоит задача удалить вообще все записи таблицы, то для этого есть команда ZAP. Это аналог Delete All + PACK
15 мар 21, 15:20    [22294810]     Ответить | Цитировать Сообщить модератору
 Re: организация удаления  [new]
DmitryKn
Member

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

Спасибо, применю.
15 мар 21, 16:30    [22294872]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / FoxPro, Visual FoxPro Ответить