Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание Locate, Paradox+BDE 
:(
    Опции темы
SergXPI
Дата 25.9.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.9.2005
Где: г.Харьков

Репутация: нет
Всего: нет



Привет всем.
Подскажите пожалуйста в чем проблема.
На этапе поиска данных в таблице с помощью Locate происходит зависание программы.
У меня есть подозрения, что проблема в самой таблице. 
Как проверить целая таблица(ее индексы) или нет?
PM MAIL   Вверх
ALeXandrK
Дата 25.9.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



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

Может у тебя база большая... база локальная или удаленная?


Это сообщение отредактировал(а) ALeXandrK - 25.9.2007, 16:07


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
SergXPI
Дата 25.9.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.9.2005
Где: г.Харьков

Репутация: нет
Всего: нет



База локальная.

Зависание происходит где то на 1000 шаге цикла.

В цикле происходит 
 - добавление данных в таблицу
 - поиск (Locate) необходимых данных и удаление

PM MAIL   Вверх
ALeXandrK
Дата 25.9.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



Вообще в таком случае лучше все запросами SQL делать. 
Он и быстрее и качественнее сделает, а если засунишь процедуру в
Thread, то и пользователя заставлять ждать не придется smile 

Твой подход просто варварский.

Это сообщение отредактировал(а) ALeXandrK - 25.9.2007, 19:23


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
SergXPI
Дата 25.9.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.9.2005
Где: г.Харьков

Репутация: нет
Всего: нет



Цитата(ALeXandrK @ 25.9.2007,  19:21)
Твой подход просто варварский.

Что именно? использование Locate?

Если таблица запорчено, то я не думаю что SQL запрос будет работать
PM MAIL   Вверх
ALeXandrK
Дата 25.9.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



Может я и зря так написал. Все зависи от того, что ты делаешь Locatом.
Обычно, если Locate есть в цикле, то его можно без проблем заменить
на запрос.

Если бы таблица была запорчена, она, вероятнее всего, и не открылась бы.

Приведи часть кода с циклом.

Это сообщение отредактировал(а) ALeXandrK - 25.9.2007, 23:28


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
SergXPI
Дата 26.9.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.9.2005
Где: г.Харьков

Репутация: нет
Всего: нет



Код

 IF Not(Tabl_Post.Locate(Locate_Str,Locate_Array,[loCaseInsensitive]))
                Then Begin // не найден товар у поставщика
                          Tabl_Post.Append;
                         End
                Else Begin //товар найден
                         Tabl_Post.Edit;
                        End;  
 ....
 Tabl_Post.Post;                         


Фрагмент года (приход товара по накладным). 
В накладной может быть 1..10000 наименований.
Когда проводится одна накладная я работаю с  переиндексированной копией таблицы. 
Это конечно замедляет, но при этом есть всегда возможность сделать откат при возникновении ошибки.
Но существует также необходимость провести сразу порядка 200 накладных и тогда этот метод очень тормозит. 
А без переиндексации начинает виснуть и виснит на Locate
В таблице есть Autoinc поле может проблема в нем?

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

Это сообщение отредактировал(а) SergXPI - 26.9.2007, 12:50
PM MAIL   Вверх
ALeXandrK
Дата 26.9.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



Раз этот не работает я бы поступил бы так...
  • 1. Проверял существование такой записи с помощью LookUp - она быстрее Locate, т.к. курсор не двигает;
  • 2. Обновлял бы, если такая запись существует, запросом;
  • 3. Добалял бы запросом, если не существует;

Цитата

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


Ну и правильно, ведь в коде ошибки нет, а вот сервер БД может дать сбой...
Может драйвер БД плохой. Поищи в инете более новую версию.

Это сообщение отредактировал(а) ALeXandrK - 26.9.2007, 19:23


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
SergeBS
Дата 27.9.2007, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



SergXPI, 
1. Использовать вместо линейного locate индексный seek религия не позволяет? Выигрыш тем больше, чем больше база.
2. Что мешает при поиске в отдельном потоке (например) выводить № записи в label (например) с периодом в 1-2 сек., дабы убедиться, что не висит, а ищет? Или строку поиска выводить?
PM MAIL   Вверх
Akella
Дата 27.9.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



мало того, на сколько мне известно, то locate неправльно работает со своими параметрами: loCaseInsensitive и loPartialKey

не раз с этим сталкивался
PM MAIL   Вверх
SergXPI
Дата 27.9.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.9.2005
Где: г.Харьков

Репутация: нет
Всего: нет



Цитата(SergeBS @ 27.9.2007,  10:12)
1. Использовать вместо линейного locate индексный seek религия не позволяет? 

Религия позволяет. Знания не позволяют.
У обекта TTable я такой функции не нашел.
SergBS, Если не сложно напиши пример.

Это сообщение отредактировал(а) SergXPI - 27.9.2007, 17:11
PM MAIL   Вверх
Akella
Дата 28.9.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



клавиша F1 наверное выламана?

Цитата

Searches for a record using the current index.

Pascal
function Seek(const KeyValues: Variant; SeekOption: TSeekOption = soFirstEQ): Boolean;

примеры
SuccessVar := ADODataSet1.Seek('Jones', soFirstEQ);
ADODataSet1.Seek(VarArrayOf([90030, 90020]), soFirstEQ);

Seek Option  Meaning  
soFirstEQ   Record pointer positioned at the first matching record, if one is found, or at the end of the dataset if one is not found.   
soLastEQ   Record pointer positioned at the last matching record, if one is found, or at the end of the dataset if one is not found.   
soAfterEQ   Record pointer positioned at matching record, if found, or just after where that matching record would have been found.   
soAfter   Record pointer positioned just after where a matching record would have been found.   
soBeforeEQ   Record pointer positioned at matching record, if found, or just before where that matching record would have been found.   
soBefore   Record pointer positioned just before where a matching record would have been found.   


Using the Seek method depends on the settings of a few properties. IndexName must be set to activate the index to use, CommandType must be cmdTableDirect (for TADODataSet, set TableDirect to true for a TADOTable), CursorLocation must be clUseServer, and CursorType must be ctKeySet. 


PM MAIL   Вверх
SergeBS
Дата 28.9.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



SergXPI, 
Не могу: я BDE не применяю (и тебе не советую). Сразу не обратил внимания :(. Так что:
1. Попробуй найти легкий компонент вместо BDE. Скорее всего будет сам по себе работать быстрее.
2. Посмотри как насчет ADO-SQL.
Т.е. прочитай Доступ к БД-1. Локальные БД
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.