![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проверить на существование запись ? [D6]
Ulugbek © (2007-09-04 09:21:00)Привет всем!
Помогите в одном деле как мне проверить на существование запись?
Делаю так, перед сохранением
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;
Этот пример работает, но иногда не корректно, а существует ли другой способ проверки?
Заранее благодарен
Anatoly Podgoretsky (2007-09-04 13:11:00) [1]clientdatasetMusor.isempty но только не к Count
А с Count проверка на больше 0
Про грабли уже сказали.
evvcom (2007-09-04 12:45:00) [2]Ну а смысл твоей проверки? Телепатирую, чтобы предупредить пользователя, что аналогичные данные уже имеются, но как сказано в [13] между предпроверкой и до вставки может произойти вставка другим пользователем, о чем программа твоя умолчит. И опять получишь граблями. В Оракле имеются способы полностью исключить такую ситуацию, но пока ты, я смотрю, довольно слабо въезжаешь в то, о чем тебе толкуют.
Сергей М. (2007-09-04 12:41:00) [3]
> Ulugbek (04.09.07 12:30) [15]
Даже если допустимы, комбинированный неуникальный индекс по этим полям не только не помешает, но и в даст в отдельных случаях ощутимый прирост производительности запроса.
Ulugbek (2007-09-04 12:30:00) [4]Да допустимы
Anatoly Podgoretsky (2007-09-04 12:14:00) [5]
> Не понял
Дубликаты допустимы или нет?
Sergey13 (2007-09-04 10:52:00) [6]> [12] Ulugbek (04.09.07 10:39)
Предпроверка не спасет от дубликата. В момент после проверки и до вставки может вставить кто-то еще. Гарантировано спасет только уникальный индекс. Если же тебе нужно просто сказать юзеру, что по этим полям уже есть подобная запись - делай как делаешь, с моими поправками.
Ulugbek (2007-09-04 10:39:00) [7]Да база Оракл
Если же цель просто напомнить юзеру и дубликаты возможны - можно искать самому.
Не понял
Sergey13 (2007-09-04 10:23:00) [8]> [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)
Если цель - недопущение дубликатов - это единственный способ. Если же цель просто напомнить юзеру и дубликаты возможны - можно искать самому.
Anatoly Podgoretsky (2007-09-04 10:18:00) [9]
> Существует стандартный способ:
> На таблицу - уникальный индекс. При попытке вставить/изменить
> - ошибка. Ошибку обрабатываем...
Не только стандартный, но еще и рабочий в отличии от проверок.
Ulugbek (2007-09-04 10:12:00) [10]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;
Сергей М. (2007-09-04 09:57:00) [11]
> С чего ты взял про сплошные строковые поля?
Да, это я прогнал)
С толку сбили переменные строкового типа.
Сергей М. (2007-09-04 09:53:00) [12]А нет, вру.
Поле даты не строковое. Но от этого не легче.
Sergey13 (2007-09-04 09:53:00) [13]> [5] Сергей М. © (04.09.07 09:49)
С чего ты взял про сплошные строковые поля? Автор просто строку запроса формирует.
Сергей М. (2007-09-04 09:49:00) [14]
> Johnmen © (04.09.07 09:44) [4]
У него ж в таблице поля сплошь и рядом строковые и длина их пока неизвестна.
Далеко не всякая СУБД, как понимаешь, будет способна построить уникальный комбин.индекс по куче строковых полей неизвестной нам пока длины.
Johnmen (2007-09-04 09:44:00) [15]Существует стандартный способ:
На таблицу - уникальный индекс. При попытке вставить/изменить - ошибка. Ошибку обрабатываем...
Sergey13 (2007-09-04 09:42:00) [16]> [0] Ulugbek (04.09.07 09:21)
> Этот пример работает, но иногда не корректно, а существует ли другой способ проверки?
Способ этот нормальный. Метод его применения не очень.
1. Используй параметры вместо литералов.
2. Проще запрашивать не * а count(*). Гарантировано вернется 1 запись с количеством. Использование RecordCount - тоже потенциальный источник глюков. Уж тогда лучше проверять isEmpty датасета.
Сергей М. (2007-09-04 09:39:00) [17]
> существует ли другой способ проверки?
Наверняка существует.
СУБД какая ?
Ega23 (2007-09-04 09:39:00) [18]Такие вещи, вообще-то, в ХП надо делать.