Форум: "Начинающим";
Текущий архив: 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 ... exceptprocedure 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