Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
3-1247748056
_REA
2009-07-16 16:40
2010.11.14
Выборка Master и Detail


11-1226388197
Максим
2008-11-11 10:23
2010.11.14
Ошибка в последнем дистрибутиве KOL MCK!


15-1280736014
ocean
2010-08-02 12:00
2010.11.14
Выбрать ОС


11-1226395089
Dy1
2008-11-11 12:18
2010.11.14
сжатие


15-1280438963
Германн
2010-07-30 01:29
2010.11.14
W7 90-days trial version





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский