powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / программа зависает
3 сообщений из 3, страница 1 из 1
программа зависает
    #36494063
asd456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давно работает вот такой (не мой)код:hhh.rar
Но, только сейчас выяснилос что если в последные 2 записи одинаковые дата (tarix="26.02.2010")
тогда программа просто зависает. Как можно делать так что и в этом случае программа не зависла?
...
Рейтинг: 0 / 0
программа зависает
    #36494142
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант
удалит последующие дубли

Код: plaintext
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.
26.
27.
28.
29.
Select min(tt) as tt, TARIX ;
from ( Select TARIX ;
     , Recno() as tt;
	from hhh ;
	where TARIX in (Select TARIX ;
						  from hhh ;
						  group by TARIX ;
						  having Count(*)> 1 ) ) pp ;
group by TARIX ;
into cursor result NOFILTER

If _tally> 0 
	Local lnTARIX ,lnMinRecn
	Scan
		lnTARIX = TARIX
		lnMinRecn = tt
		Delete From hhh ;
			where TARIX = lnTARIX and Recno()<>lnMinRecn
	EndScan
	Use in Select("result")
	Use in Select("hhh")
	Try
		Use hhh Exclusive 
		Pack 
	Catch
	EndTry
Else
	Use in Select("result")
EndIf 	
...
Рейтинг: 0 / 0
программа зависает
    #36494885
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что приведенный код опирается на некоторые фичи (особенности) поведения FoxPro при использовании команды PACK, если нет записей помеченных как удаленные.

1) Команда DELETE FOR ... - перемещает указатель записи в положение EOF() = .T.

2) Последующая команда PACK выполняет переоткрытие таблицы. Факт переоткрытия таблицы сопровождается перемещением указателя записи на первую не удаленную запись.

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

А вот если есть записи, помеченные как удаленные, то после команды PACK указатель записи встает на первую запись таблицы. Физически первую. Recno() = 1. Т.е. получается ситуация, когда фильтр хотя и есть, но еще не вступил в силу и необходимо "передернуть" указатель записи.

Другими словами, чтобы быстро починить данный алгоритм достаточно после команды PACK дать команду GO TOP

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
DELETE ...
PACK
GO TOP    && Вот это надо добавить
SET FILTER TO
GO TOP
...

Однако сам способ удаления дублей не очень корректный.

Во-первых, он требует соблюдения некоторых ограничений (например, не должно быть активного индекса, чтобы физический порядок следования записей совпал с логическим. Т.е. с наращиванием счетчика I).

Во-вторых, использование команды PACK, если уж не удается исключить совсем, следует применять как можно реже. Как минимум, вынести во вне цикла. Сначала пометить все дубли, а потом одной командой их удалить.

Если предполагаемое количество дублей относительно не велико, то можно поступить так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
* Курсор, содержащий те значения поля TARIX, которые встречаются более одного раза
Select TARIX ;
into cursor curDoble ;
from hhh ;
group by TARIX ;
having Count(*)> 1 

* Установка пометки на удаление для дублей
select curDouble
scan
	select hhh 
	locate for TARIX = curDoble.TARIX
	I = Recno()
	delete for TARIX = curDoble.TARIX AND Recno() <> I
endscan

* Физическое удаление ранее помеченных записей
select hhh 
PACK

Можно еще использовать для удаление дублей индекс типа UNIQUE.

Если у Вас VFP9, то можно использовать способ предложенный прошелмимо . А если бы был еще и уникальный идентификатор записей, то можно было бы удалить одной командой Delete
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / программа зависает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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