Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / программа зависает / 3 сообщений из 3, страница 1 из 1
01.03.2010, 10:43
    #36494063
asd456
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программа зависает
Давно работает вот такой (не мой)код:hhh.rar
Но, только сейчас выяснилос что если в последные 2 записи одинаковые дата (tarix="26.02.2010")
тогда программа просто зависает. Как можно делать так что и в этом случае программа не зависла?
...
Рейтинг: 0 / 0
01.03.2010, 11:11
    #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
01.03.2010, 14:42
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / программа зависает / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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