Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.13;
Скачать: CL | DM;

Вниз

Как проверить на существование запись ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
15-1197142644
Cerberus
2007-12-08 22:37
2008.01.13
Посоветуйте рок группу и альбом.


15-1196956916
Германн
2007-12-06 19:01
2008.01.13
И что это было?


15-1196971356
shaman
2007-12-06 23:02
2008.01.13
тормоза под Win2003


2-1197552814
Костяшка
2007-12-13 16:33
2008.01.13
работа с с етью в Lazarus


15-1196969820
Бедняжка
2007-12-06 22:37
2008.01.13
Друзья нужна помощь