Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.14;
Скачать: CL | DM;

Вниз

Как избежать повторного ввода данных в базу?   Найти похожие ветки 

 
unknow   (2010-08-11 14:10) [0]

Здравствуйте Мaстера Delphi! Помогите решить такую проблему.
Имеется база подшипников. Ввод данных выполняется через DBGrid.
При добавлении записи необходимо делать проверку - не введен ли уже такой подшипник, если в базе (Interbase) уже имеется такой подшипник, то должно выдаваться соответствующее сообщение. Я представляю процесс так: берем только что введенное в DBGrid значение и проводим поиск по базе, если такое значение есть - выдается сообщение, если нет - происходит запись в базу. вопрос в том, где взять то значение, которое будем искать, в каком свойстве DBGrid оно находится.


 
Сергей М. ©   (2010-08-11 14:22) [1]

> берем только что введенное в DBGrid значение и проводим поиск по базе

И не находим. А оно на самом деле есть. А почему бы ему там не быть ?
И при коммите пишущей транзакции получаем граблями.
Как тебе такая перспектива ?


 
Ega23 ©   (2010-08-11 14:47) [2]

В DBGrid нет никаких данных.


 
Jeer ©   (2010-08-11 14:56) [3]


> Ega23 ©   (11.08.10 14:47) [2]
>
> В DBGrid нет никаких данных.


Ты покусился на "святое" - юзеры их там видят ? Видят. Значит они там есть !
Все остальное - происки недоразвитых программистов :)


 
Sergey13 ©   (2010-08-11 15:07) [4]

> [0] unknow   (11.08.10 14:10)

Поставь уникальный индекс на поле (или группу полей), по которому считается, что "уже имеется такой подшипник".


 
Юрий Зотов ©   (2010-08-11 18:07) [5]


> unknow   (11.08.10 14:10)  

См. [4]. И ничего искать не надо, сервер БД сам все проверит и сам все найдет, автоматически. Если такая запись уже имеется, выдаст ошибку, а дубль не вставит.


 
unknow   (2010-08-16 14:26) [6]


> И ничего искать не надо, сервер БД сам все проверит и сам
> все найдет, автоматически. Если такая запись уже имеется,
>  выдаст ошибку, а дубль не вставит.

Спасибо за ответы. Сделал - ошибку выдает. А как теперь эту ошибку обработать, чтобы выдавалось сообщение на русском.


 
Anatoly Podgoretsky ©   (2010-08-16 14:41) [7]

> unknow  (16.08.2010 14:26:06)  [6]

try except


 
unknow   (2010-08-16 15:01) [8]

Что try except я знаю, только не соображу никак где именно это применить


 
Anatoly Podgoretsky ©   (2010-08-16 15:08) [9]

В том месте где производится запись с базу


 
unknow   (2010-08-16 15:23) [10]

У меня на форме DBGrid, Navigator и Button1.
Ввожу данные в DBGrid, нажимаю в навигаторе сохранить данные (Button1 - закрывает форму)
Как такового кода для записи в базу нет. Или он сгенерирован, но я не знаю где.


 
sniknik ©   (2010-08-16 15:36) [11]

> чтобы выдавалось сообщение на русском.
а вот этого не надо... сам себе проблем наделаешь. сопровождать программы с "самопереведенными ексептами" практически невозможно (ну, вернее если бы это делали грамотно, и заменяли бы сообщение только одного, а то меняют у всего класса, а то и вообще всего отловленного).


 
12 ©   (2010-08-16 16:02) [12]


> А как теперь эту ошибку обработать, чтобы выдавалось сообщение
> на русском

не надо менять - добавь свое. см sniknik ©   (16.08.10 15:36) [11]

 try
   бла-бла
 except
   on E:Exception do
   begin
     E.Message := E.Message + #13#10 + "я думаю, что ошибка такая-то, для исправления надо сделать то-то";
     Raise;
   end;
 end;


> Ввожу данные в DBGrid, нажимаю в навигаторе сохранить данные
> (Button1 - закрывает форму)

данные в DBGrid отсутствуют см Ega23 ©   (11.08.10 14:47) [2]

с DBGrid связан dataset - вот на его события (onUpdate|insert и т.п.)и вешать


 
Anatoly Podgoretsky ©   (2010-08-16 19:32) [13]

> unknow  (16.08.2010 15:23:10)  [10]

Вводи данные через форму ввода.


 
unknow   (2010-08-17 16:51) [14]

У меня есть такая процедура, находится в модуле :

procedure TDataModule2.IBQStanki1BeforePost(DataSet: TDataSet);
begin
if IBQStanki1.State in [dsInsert] then
   begin
   
     IBSProcStanki.ExecProc;
     IBQStanki1.FieldByName("NPP").AsInteger:=IBSProcStanki.Params[0].AsInteger;
   
   end;{if}
end;


Пытаюсь добавить try ... except

procedure TDataModule2.IBQStanki1BeforePost(DataSet: TDataSet);
begin
if IBQStanki1.State in [dsInsert] then
   begin
   try
     IBSProcStanki.ExecProc;
     IBQStanki1.FieldByName("NPP").AsInteger:=IBSProcStanki.Params[0].AsInteger;
   except
    on Exception do ShowMessage ("Такой есть!");
   end;
   end;{if}
end;


Ругается на ShowMessage - говорит:
[Error] Module2.pas(102): Undeclared identifier: "ShowMessage"

Что я делаю не правильно? Messages в uses я добавил.


 
12 ©   (2010-08-17 17:20) [15]


> Что я делаю не правильно? Messages в uses я добавил.
>

dialogs в uses


 
unknow   (2010-08-18 08:49) [16]

Добрый день всем. dialogs в uses я добавил - Delphi теперь не "ругается",  но и сообщение мое выдавать не желает. Выдает только свое: violation of primary or UNIQUE KEY constraint "UNQ1_STANKI" on table "STANKI"


 
Anatoly Podgoretsky ©   (2010-08-18 10:55) [17]

У тебя наверно на колонку наложено ограничение по уникальности.


 
engine ©   (2010-08-18 11:15) [18]

Так на BeforePost и не должна ошибка вываливаться, она позже возникает.


 
12 ©   (2010-08-18 11:18) [19]

значит, не дохожит до сюда
см. FIBErrorHandler


 
12 ©   (2010-08-18 11:28) [20]


> на BeforePost и не должна ошибка вываливаться, она позже
> возникает.

хотя, да


 
unknow   (2010-08-18 14:06) [21]

У меня именно и установлено ограничение на колонку, чтобы нельзя было ввести одинаковое значение (модель станка).
> Так на BeforePost и не должна ошибка вываливаться, она позже
> возникает.

Но если выдается сообщение: violation of primary or UNIQUE KEY constraint "UNQ1_STANKI" on table "STANKI", значит ошибка уже возникла?
А что позже BeforePost? Post? Но это уже слишком поздно сообщать об ошибке!
Или есть еще какое-то событие до Post?
Что такое FIBErrorHandler и где его посмотреть?


 
unknow   (2010-08-18 14:10) [22]

Удалено модератором


 
12 ©   (2010-08-18 14:31) [23]


> то такое FIBErrorHandler и где его посмотреть?

в гугле пробовал?


 
Виталий Панасенко(дом)   (2010-08-18 19:00) [24]


> 12 ©   (18.08.10 14:31) [23]
>
>

а при чем фибы к IBX? Судя по названию компонент как раз последнее автор и использует.
Автору - см. событие OnPostError(кажись)


 
12 ©   (2010-08-19 08:30) [25]


> а при чем фибы к IBX?

да, автор, сори, вообще невснимателен стал


 
Anatoly Podgoretsky ©   (2010-08-19 10:05) [26]

> unknow  (18.08.2010 14:06:21)  [21]

Ошибку выдает сервер.


 
Kolan ©   (2010-08-19 11:34) [27]

«если в базе (Interbase) уже имеется такой подшипник, то должно выдаваться соответствующее сообщение.»
Хреновое решение, надо без сообщения. Можно искать дубликат по мере ввода и тут же сообщать о нём, не прерывая работу пользователя.


 
Игорь Шевченко ©   (2010-08-19 11:42) [28]


> Можно искать дубликат по мере ввода и тут же сообщать о
> нём, не прерывая работу пользователя


Хреновое решение


 
Anatoly Podgoretsky ©   (2010-08-19 12:28) [29]

> Kolan  (19.08.2010 11:34:27)  [27]

Без сообщения
и тут же сообщать о нём

Логика не нарушена?


 
Kolan ©   (2010-08-19 12:30) [30]

Вот без таких штук как у unknow"а.
on Exception do ShowMessage ("Такой есть!");


 
Юрий Зотов ©   (2010-08-19 12:58) [31]


> Kolan ©   (19.08.10 12:30) [30]

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


> unknow   (18.08.10 14:06) [21]
> Но если выдается сообщение: violation of primary or UNIQUE KEY
> constraint "UNQ1_STANKI" on table "STANKI", значит ошибка уже возникла?

Конечно возникла. Но записи в БД не произошло, правильность данных не нарушена. Вы выдаете юзеру сообщение "такой уже есть", юзер закрывает его и после этого может либо изменить вводимые данные, либо отказаться от ввода. И все тип-топ.


 
Игорь Шевченко ©   (2010-08-19 13:38) [32]

Kolan ©   (19.08.10 12:30) [30]

Ты почитай, как СУБД работают, о транзакциях, уровнях изоляции, целостности данных, и т.п. Сразу просветление наступит и дурацких советов не будешь давать.



Страницы: 1 вся ветка

Текущий архив: 2010.11.14;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.01 c
2-1282423057
Rembo
2010-08-22 00:37
2010.11.14
Наследование: вызов метода потомка через родителя


15-1280924062
oxffff
2010-08-04 16:14
2010.11.14
Yar.net для Rouse


4-1241257034
AHTOLLlKA
2009-05-02 13:37
2010.11.14
как сохранить ветку реестра???


3-1247717206
_drug_
2009-07-16 08:06
2010.11.14
Параметры в InsertSQL дочернего TIBDataset


2-1279196387
PinDOS
2010-07-15 16:19
2010.11.14
Динамический список