Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите! Какая то странная ошибка [D5, IB6.x]


Smirnoff ©   (2002-12-28 14:58:00) 

База данных работает по сетке.
Оператор на клиентской машине целый день вносит новые записи.
И вот какая лажа:
0-3-5-7 или 10 раз в день при добавлении новой записи почему то добавляется пустая запись
при этом с прогой ничего страшного не происходит, оператор просто редактирует пустую запись и все идет нормально.

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


kaif   (2002-12-29 15:40:00) [1]

Если ввод данных делается в DBGrid, то тогда возможно следующее:
1. Добавляется новая строка стрелкой вниз.
2. Вводится значение в ячейку, но не отменяется с помощью ESC, а зщабивается с помощью BACKSPACE.
3. Затем юзер возвращается на предыдущую строку набора с помощью стрелки вверх.
4. В результате бессознательно на сервер посылается "пустая" запись.
------------
Возможно и иная логика:
1. Имееться кнопка "сохранить"
2. После нажатия "Сохранить" автоматически делается DataSet.Insert для того, чтобы ввести новую запись.
3. Пользователь незаметно для себя нажимает иногда "сохранить" 2 раза.
--------------
Одним словом, не зная устройства интерфейса приходится гадать...

=============ОДНАКО!!!!!!!===============
Никакие причины типа "не та файловая система", "сервер глючит" и т.п. НЕ МОГУТпривести к такой ошибке.
-----------------
Совет (2 совета)
1. [Проверка на стороне клиента] В событие OnBeforePost компонента TDataSet расписать проверку типа:

Flag := False;
with DataSet do
for i := 0 to Fields.Count - 1 do
begin
if Fields[i].AsString <> "" then
Flag = True;
end;
if not Flag then
Abort; {или raise Exception.Create("Пустая запись")}

2. [Проверка на стороне сервера]
Создать триггер ACTIVE BEFORE INSERT
и в нем проверить все поля. Если они все пустые, вызвать EXCEPTION.


Wolf   (2002-12-29 10:23:00) [2]

Если ты видел, при каких условиях происходит ошибка, так почему не попробовать ее воспроизвести с монитором и отладчиком?


pusrg   (2002-12-28 21:05:00) [3]


> Smirnoff © (28.12.02 16:42)
> NOT NULL сказали не использовать, т.к. они не знают точно
> будет ли заполнятся поле в конкретной записи

А о таком понятии как ключевоеполе Вам известно? Данное поле не редактируется пользователем, и по определению не может быть NOT NULL.

Далее смотрите kaif © (28.12.02 16:10)


Smirnoff   (2002-12-28 18:06:00) [4]

to passm ©
при мне он вводдил, происходила ошибка, а потом при мне редактировал - все пользователь делал верно.


to all
А может ли это зависеть от ОС на сервере?


passm   (2002-12-28 17:42:00) [5]

Smirnoff © (28.12.02 16:42)> Тогда все на совести пользователя.


Smirnoff   (2002-12-28 16:42:00) [6]

NOT NULL сказали не использовать, т.к. они не знают точно будет ли заполнятся поле в конкретной записи

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

записи записываю так:
старт транзакции
добавление данных, введенных в поля
конец транзакции


kaif   (2002-12-28 16:10:00) [7]

Как вообще возможно добавление пустой записи? Что понимается под пустой записью? Неужели у Вас нет ключевого поля NOT NULL? Непонятно все это... База должна быть организована так, чтобы это было невозможно априори. Тогда данная ситуация выразилась бы в ошибке, которую легко было бы обнаружить (попытка вставки дубликата или пустого значения).


passm   (2002-12-28 16:06:00) [8]

Smirnoff © (28.12.02 14:58)> Логично было бы поставить ограничение на уровне БД. Поля NOT NULL, либо триггеры.


Wolf   (2002-12-28 15:42:00) [9]

Попроси оператора, когда это произойдет, в точности записать данные которые он пытался ввести и попробуй сам воспроизвести, может что-то на клиенте.

Запусти SQL Monitor ему на машине и установи огромный буфер для записи, а потом поройся логе. А там уже в зависимости от того был послан ли правильный запрос будешь знать, чье вина: клиента или сервера.

Если ты работаешь через BDE то подойдет их SQL Monitor, а если напрямую, то монитор есть где-то на этом сайте в кладовке.





Prooksius   (2002-12-28 15:39:00) [10]

Интербейс тут не при чем.
Ошибка в проге.
Давай подробности. Как вставляешь записи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо