Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как проверить на существование запись ? [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]

Такие вещи, вообще-то, в ХП надо делать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо