|
программа зависает
|
|||
---|---|---|---|
#18+
Давно работает вот такой (не мой)код:hhh.rar Но, только сейчас выяснилос что если в последные 2 записи одинаковые дата (tarix="26.02.2010") тогда программа просто зависает. Как можно делать так что и в этом случае программа не зависла? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2010, 10:43 |
|
программа зависает
|
|||
---|---|---|---|
#18+
как вариант удалит последующие дубли Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2010, 11:11 |
|
программа зависает
|
|||
---|---|---|---|
#18+
Проблема в том, что приведенный код опирается на некоторые фичи (особенности) поведения FoxPro при использовании команды PACK, если нет записей помеченных как удаленные. 1) Команда DELETE FOR ... - перемещает указатель записи в положение EOF() = .T. 2) Последующая команда PACK выполняет переоткрытие таблицы. Факт переоткрытия таблицы сопровождается перемещением указателя записи на первую не удаленную запись. Фича заключается в том, что если нет записей, помеченных как удаленные, то после команды PACK наложенный фильтр остается активным и первая не удаленная запись оказывается равна условию фильтра. Т.е. указатель записи встает на ту запись, дубли по которой и ищутся. А вот если есть записи, помеченные как удаленные, то после команды PACK указатель записи встает на первую запись таблицы. Физически первую. Recno() = 1. Т.е. получается ситуация, когда фильтр хотя и есть, но еще не вступил в силу и необходимо "передернуть" указатель записи. Другими словами, чтобы быстро починить данный алгоритм достаточно после команды PACK дать команду GO TOP Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Однако сам способ удаления дублей не очень корректный. Во-первых, он требует соблюдения некоторых ограничений (например, не должно быть активного индекса, чтобы физический порядок следования записей совпал с логическим. Т.е. с наращиванием счетчика I). Во-вторых, использование команды PACK, если уж не удается исключить совсем, следует применять как можно реже. Как минимум, вынести во вне цикла. Сначала пометить все дубли, а потом одной командой их удалить. Если предполагаемое количество дублей относительно не велико, то можно поступить так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Можно еще использовать для удаление дублей индекс типа UNIQUE. Если у Вас VFP9, то можно использовать способ предложенный прошелмимо . А если бы был еще и уникальный идентификатор записей, то можно было бы удалить одной командой Delete ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2010, 14:42 |
|
|
start [/forum/topic.php?fid=41&msg=36494885&tid=1585551]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 19ms |
total: | 171ms |
0 / 0 |