Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1197398005
Евгений Р.
2007-12-11 21:33
2008.01.13
Раскрытое окно в TDateTimePicker


15-1196978522
TusRoorse
2007-12-07 01:02
2008.01.13
Нужен срочно ремонт!


3-1188911245
pasha_golub
2007-09-04 17:07
2008.01.13
Master-Detail связка: чтобы мастер-запись из комбобокса


2-1197395228
@!!ex
2007-12-11 20:47
2008.01.13
Окно в котором нажа пункт меню. Как узнать?


2-1197553561
Крот
2007-12-13 16:46
2008.01.13
Проблем при подключении модуля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский