Форум: "Базы";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];
ВнизКак проверить на существование запись ? Найти похожие ветки
← →
Ulugbek (2007-09-04 09:21) [0]Привет всем!
Помогите в одном деле как мне проверить на существование запись?
Делаю так, перед сохранением
procedure TImExOperForm.ActRasExecute(Sender: TObject);
begin
pole1:=clientdataset1.fieldbyName("DATE_ENTER").AsString;
pole2:= clientdataset1.fieldbyName("GTD_NUM").AsString;
pole3:= clientdataset1.fieldbyName("GTD_DATE").AsString;
pole4:= clientdataset1.fieldbyName("CURRENCY").AsString;
pole5:= clientdataset1.fieldbyName("SUMMA_SHIPPED_GOODS").AsString;
pole6:= clientdataset1.fieldbyName("SHIPPER").AsString;
pole7:= clientdataset1.fieldbyName("TYPE_OPER").AsString;
cSql:="select * from table1 "+
"where DATE_ENTER = to_date("""+Pole1+""",""dd.mm.yyyy"") "+
"and GTD_NUM="""+Pole2 +""" "+
"and GTD_DATE=to_date("""+Pole3+""",""dd.mm.yyyy"") "+
"and CURRENCY="""+Pole4+""" "+
"and SUMMA_SHIPPED_GOODS="""+Pole5+""" "+
"and TYPE_OPER="""+Pole7+"""";
LoadData(clientdatasetMusor,cSql);
if clientdatasetMusor.RecordCount>0 then
begin
if Application.MessageBox(PChar("Существует аналогичная информация введенная ранее.Продолжить ввод?"), PChar(Caption), MB_YESNO or
MB_ICONQUESTION)=idNo then
actRefresh.Execute;
Exit;
end;
Этот пример работает, но иногда не корректно, а существует ли другой способ проверки?
Заранее благодарен
← →
Сергей М. © (2007-09-04 09:39) [1]
> существует ли другой способ проверки?
Наверняка существует.
СУБД какая ?
← →
Ega23 © (2007-09-04 09:39) [2]Такие вещи, вообще-то, в ХП надо делать.
← →
Sergey13 © (2007-09-04 09:42) [3]> [0] Ulugbek (04.09.07 09:21)
> Этот пример работает, но иногда не корректно, а существует ли другой способ проверки?
Способ этот нормальный. Метод его применения не очень.
1. Используй параметры вместо литералов.
2. Проще запрашивать не * а count(*). Гарантировано вернется 1 запись с количеством. Использование RecordCount - тоже потенциальный источник глюков. Уж тогда лучше проверять isEmpty датасета.
← →
Johnmen © (2007-09-04 09:44) [4]Существует стандартный способ:
На таблицу - уникальный индекс. При попытке вставить/изменить - ошибка. Ошибку обрабатываем...
← →
Сергей М. © (2007-09-04 09:49) [5]
> Johnmen © (04.09.07 09:44) [4]
У него ж в таблице поля сплошь и рядом строковые и длина их пока неизвестна.
Далеко не всякая СУБД, как понимаешь, будет способна построить уникальный комбин.индекс по куче строковых полей неизвестной нам пока длины.
← →
Sergey13 © (2007-09-04 09:53) [6]> [5] Сергей М. © (04.09.07 09:49)
С чего ты взял про сплошные строковые поля? Автор просто строку запроса формирует.
← →
Сергей М. © (2007-09-04 09:53) [7]А нет, вру.
Поле даты не строковое. Но от этого не легче.
← →
Сергей М. © (2007-09-04 09:57) [8]
> С чего ты взял про сплошные строковые поля?
Да, это я прогнал)
С толку сбили переменные строкового типа.
← →
Ulugbek (2007-09-04 10:12) [9]To Sergey
Kak vot tak?
select count(*) from v_exim_ship where DATE_ENTER = to_date("21.07.2007","dd.mm.yyyy") and GTD_NUM="4" and GTD_DATE=to_date("22.07.2007","dd.mm.yyyy") and CURRENCY="978" and SUMMA_SHIPPED_GOODS="20000" and TYPE_OPER="1"
---------------------------------------------------------------
count(1)
1
Если count 1 то есть такая запись да а если ноль нет правда
if not clientdatasetMusor.isempty then
begin
if Application.MessageBox(PChar("Существует аналогичная информация введенная ранее.Продолжить ввод?"), PChar(Caption), MB_YESNO or
MB_ICONQUESTION)=idNo then
actRefresh.Execute;
Exit;
end;
← →
Anatoly Podgoretsky © (2007-09-04 10:18) [10]
> Существует стандартный способ:
> На таблицу - уникальный индекс. При попытке вставить/изменить
> - ошибка. Ошибку обрабатываем...
Не только стандартный, но еще и рабочий в отличии от проверок.
← →
Sergey13 © (2007-09-04 10:23) [11]> [9] Ulugbek (04.09.07 10:12)
Оракл?
Так тоже хреново. Я ж первым пунктом написал про параметры.
select count(*) from v_exim_ship where DATE_ENTER = :DATE_ENTER .....
Кроме того, обрати внимание на
> [4] Johnmen © (04.09.07 09:44)
и
> [10] Anatoly Podgoretsky © (04.09.07 10:18)
Если цель - недопущение дубликатов - это единственный способ. Если же цель просто напомнить юзеру и дубликаты возможны - можно искать самому.
← →
Ulugbek (2007-09-04 10:39) [12]Да база Оракл
Если же цель просто напомнить юзеру и дубликаты возможны - можно искать самому.
Не понял
← →
Sergey13 © (2007-09-04 10:52) [13]> [12] Ulugbek (04.09.07 10:39)
Предпроверка не спасет от дубликата. В момент после проверки и до вставки может вставить кто-то еще. Гарантировано спасет только уникальный индекс. Если же тебе нужно просто сказать юзеру, что по этим полям уже есть подобная запись - делай как делаешь, с моими поправками.
← →
Anatoly Podgoretsky © (2007-09-04 12:14) [14]
> Не понял
Дубликаты допустимы или нет?
← →
Ulugbek (2007-09-04 12:30) [15]Да допустимы
← →
Сергей М. © (2007-09-04 12:41) [16]
> Ulugbek (04.09.07 12:30) [15]
Даже если допустимы, комбинированный неуникальный индекс по этим полям не только не помешает, но и в даст в отдельных случаях ощутимый прирост производительности запроса.
← →
evvcom © (2007-09-04 12:45) [17]Ну а смысл твоей проверки? Телепатирую, чтобы предупредить пользователя, что аналогичные данные уже имеются, но как сказано в [13] между предпроверкой и до вставки может произойти вставка другим пользователем, о чем программа твоя умолчит. И опять получишь граблями. В Оракле имеются способы полностью исключить такую ситуацию, но пока ты, я смотрю, довольно слабо въезжаешь в то, о чем тебе толкуют.
← →
Anatoly Podgoretsky © (2007-09-04 13:11) [18]clientdatasetMusor.isempty но только не к Count
А с Count проверка на больше 0
Про грабли уже сказали.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c