Форум: "Базы";
Текущий архив: 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