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

Вниз

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

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

Наверх




Память: 0.51 MB
Время: 0.021 c
6-33258
ilya_k
2003-06-02 14:36
2003.08.11
Как запустиь ISAPI.dll сделанную в IntraWeb(Delphi7) HELP?


1-33131
М. Дмитрий
2003-07-27 20:09
2003.08.11
Вопрос по ScaleBy


7-33384
vlv
2003-05-28 17:22
2003.08.11
Событие OnCreate компонента TService.


14-33290
Hollywood
2003-07-23 20:13
2003.08.11
CR9: Почему может не выполняться экспорт?


14-33338
3APA3A
2003-07-17 13:07
2003.08.11
Class Function....