Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Вниз

Проверка ввода   Найти похожие ветки 

 
Nick   (2003-07-18 13:08) [0]

Еще вопрос, если можно!
Имеем DBEdit, вводим запись и необходимо проверить есть ли такая запись в таблицу. Если есть вывести сообщение, и соответственно не добавлять её, если нет то добавлять.
Пишу следующее:
procedure TFSprav.SP_PostavOKClick(Sender: TObject);
begin
temp:=DBEdit1.EditText;
DataModule2.Sp_Postav.First;
While DataModule2.Sp_Postav.Eof do
If DataModule2.Sp_Postav.fieldByName("Postav").Asstring=temp then begin
ShowMessage("Уже есть!");
DataModule2.Sp_Postav.last;
end
else DataModule2.Sp_Postav.next;


 
ЮЮ   (2003-07-18 13:19) [1]

А.
1) Достаточно иметь обычный Edit
2) Вместо сканирования всей таблице выполнить один запрос
3) Если запрос не вернул записей - добавить, если нашёл - показать пользователю эту запись, ничего не добавляя, а только грязно ругаясь
Б. Создать уникальный индекс по полю (полям)
при побытке вставить такую запись, заругается Delphi, поддержать её и наброситься на пользователя


 
ZrenBy   (2003-07-18 13:21) [2]

или в Б. сделать FindKey и посмотреть, что он вернул


 
Nick   (2003-07-18 13:25) [3]

Как считать запись с Edita в БД?
Вообще с запросами у меня туговато.


 
Lord Warlock   (2003-07-18 13:26) [4]

При сравнении строк приводи их хотя бы к нижнему (верхнему) регистру, пользователь может написать и с маленькой и с большой буквы.
А если еще и с ошибкой напишет...


 
ЮЮ   (2003-07-18 13:43) [5]

>Как считать запись с Edita в БД?
DataModule2.Sp_Postav.Insert;
DataModule2.Sp_Postav.FieldByName(<имя поля>).asString := Edit1.Text;
DataModule2.Sp_Postav.Post;

>Вообще с запросами у меня туговато.
Query1.SQL.Text := "SELECT * FROM Postav WHERE UPPER(NAME) = :Name";
Query1.Params[0].asString := AnsiUpperCaqse(Edit1.Text);
Query1.Open;



 
Lord Warlock   (2003-07-18 13:46) [6]


> Как считать запись с Edita в БД?


очень желательно иметь первичный ключ в этой таблице.
тогда:

//Клик кнопкой добавления записи
procedure TFSprav.SP_PostavOKClick(Sender: TObject);
begin

TestQuery.ParamByName("Postav").AsString:=LowerCase(Edit1.Text);
TestQuery.Open;
if TestQuery.RecordCount>0 then
begin
ShowMessage("Уже есть!");
DataModule2.Sp_Postav.Locate("id_postav",TestQuery.FieldByName("id_postav").AsInteger,[]);//Перешли на первую запись из тех, которые есть
Edit1.Text:=DataModule2.Sp_Postav.FieldByName("Postav").AsString;
end
else
begin
DataModule2.Sp_Postav.Append;
DataModule2.Sp_Postav.FieldByName("Postav").AsString:=Edit1.Text;
...//Заполняются еще поля
DataModule2.Sp_Postav.Post
end;
...
end;

Текст в TestQuery, БД настраивается как в Table.

TestQuery.Sql:="select id_postav, postav from (название таблицы как в свойстве TableName компонента Sp_Postav, без скобок естественно)
where LOWER(postav)=:postav"

id_postav - первичный ключ

ЗЫ Это более чем черновой набросок, тем более пока писал, ЮЮ меня опередил. Ну погоди, коварный живой йогурт! :))


 
Nick   (2003-07-18 14:18) [7]


> Lord Warlock © (18.07.03 13:46)

Что с запросом не то!
TestQuery.Sql:="select nomer, postav
from Sp_Postav.db
where LOWER(postav)=:postav"


 
Lord Warlock   (2003-07-18 14:23) [8]

1 .db не нужно писать
2 Надеюсь ты вызывал редактор св-ва SQL из инспектора объектов, а не код в программе написал...


 
KDS   (2003-07-18 14:25) [9]

одновременно одним компонентом DataModule2.Sp_Postav и вставлять и проверять не рекомендую при использовании ДБЭдит!
Популярно:
У тебя проверка начинается в тот момент, когда таблица находится в состоянии DataModule2.Sp_Postav.State=dsInsert, а при скролинге (в проверке при выполнении переходов DataModule2.Sp_Postav.next)
таблица переходит в состояние просмотра (DataModule2.Sp_Postav.State=dsBrowse) в результате чего DBEdit1 содержит уже другое значение поля.
Желательно использовать отдельный(ые) Эдит для вставки
temp:=AnsiUpperCase(Edit1.Text); //чтобы ср. без учета регистра
DataModule2.Sp_Postav.First;
While DataModule2.Sp_Postav.Eof do begin
If AnsiUpperCase(DataModule2.Sp_Postav.fieldByName("Postav").Asstring)=temp
then begin
ShowMessage("Уже есть!");
exit; //и выход из процедуры
end
else DataModule2.Sp_Postav.next;
//вставляю если нет такого
DataModule2.Sp_Postav.Insert;
DataModule2.Sp_Postav.fieldByName("Postav").Asstring:=temp;
// другие поля
DataModule2.Sp_Postav.Post;
end;



 
Nick   (2003-07-18 14:35) [10]


> KDS © (18.07.03 14:25)

Не работает не добавляет и не проверяет!!!


 
Nick   (2003-07-18 14:38) [11]


> Lord Warlock © (18.07.03 14:23)

Да в инспекторе, но все равно не работает даже без .db


 
Lord Warlock   (2003-07-18 14:40) [12]

Поточнее пиши, что не работает, я ж не телепат, а на воспроизведение твоей ситуации нужно мин. 20, времени нет.


 
KDS   (2003-07-18 14:42) [13]

Допиши после вставки Рефреш!
// другие поля
DataModule2.Sp_Postav.Post;
DataModule2.Sp_Postav.Refresh;
end;


 
Nick   (2003-07-18 14:46) [14]


> KDS © (18.07.03 14:42)

Все равно тоже самое!


 
Nick   (2003-07-18 14:52) [15]


> Lord Warlock © (18.07.03 14:40)

Пишу запрос как говоришь. Активизирую TestQuery, а в ответ:
Error
Token not found.
Token:Token TestQuery.sql?
Line Namber: 1.


 
KDS   (2003-07-18 14:53) [16]

вариант с SQL
TestQuery.Sql.Close;
TestQuery.Sql.Clear;
TestQuery.Sql.add("select nomer, postav ");
TestQuery.Sql.add("from Sp_Postav ");
TestQuery.Sql.add("where LOWER(postav)=:postav");
TestQuery.ParamByName("postav").AsString:=AnsiUpperCase(test);
TestQuery.Open;
if TestQuery.IsEmpty then (вставить)
else (гавкнуть)
TestQuery.Close;

Разницу видишь?
Уже и так и сяк написали подробно...
Блин ну совсем думать самому лень?


 
KDS   (2003-07-18 14:56) [17]

сорри
TestQuery.ParamByName("postav").AsString:=Ansi LowerCase(test);


 
Nick   (2003-07-18 15:14) [18]


> KDS © (18.07.03 14:56)

При отсутствии, пишет field "Поставщик" must have a value.
Если существут, то все OK.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
14-33363
ilka
2003-07-25 14:41
2003.08.11
проблема с отправкой на e-mail


4-33408
Школьник
2003-06-09 12:11
2003.08.11
Как корректно разместится в чужом адресном пространстве???


14-33346
fofa
2003-07-25 13:16
2003.08.11
Где взять лицензию на InterBase 6.0.1хххх (-)


3-33076
TankMan
2003-07-13 02:34
2003.08.11
Проблема хранения....


1-33178
Новачок
2003-07-28 17:48
2003.08.11
DragDrop





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский