Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2007, 08:14   #1
Shawn
Пользователь
 
Регистрация: 18.08.2007
Сообщений: 16
Печаль как можно реализовать то же, но по-другому?

Что-то где-то напутал...Не подскажете ли, господа, где? И как можно реализовать то же, но по-другому? Прошу строго не судить - ибо это моя первая программа.

procedure TForm2.Button1Click(Sender: TObject);
begin
if form2.Edit1.Text='' then begin
MessageDlg ('Не задано название темы'+#13#10+'Повторите ввод',mtError,[mbOK],0);
form2.Edit1.SetFocus;
end
else begin
form1.database1.open;
form1.Table1.open;
form1.Table1.first;
while not form1.table1.Eof do begin
if form1.table1.FieldByName('Name_T'). AsString = edit1.Text then
begin
ShowMessage ('Тема с таким названием уже создана!');
form2.Edit1.Clear;
form2.Edit1.SetFocus;
end;
end
else begin
form1.database1.open;
form1.Table1.open;
form1.Table1.Last;
max_ID:=form1.table1.fieldbyname('I D').asinteger;
form1.Table1.Insert;
form1.Table1.FieldByName('Name_t'). AsString:=edit1.Text;
form1.Table1.FieldByName('ID').AsIn teger:=max_ID+1;
form1.Table1.Post;
form2.close;
end;
Вот как-то оно так...
Shawn вне форума Ответить с цитированием
Старый 03.10.2007, 08:46   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Ну,... я бы сделал так...
На второй форме в событии onChange Edita написал
Button1.enabled := Edit1.Text <> '';
Это как-то солиднее.

Для чего form1.database1.open; ???
database1.connected:=true жолжно быть по умолчанию.

Используй sql-запросы.
Вместо этого
Код:
form1.Table1.first;
while not form1.table1.Eof do begin
if form1.table1.FieldByName('Name_T').AsString = edit1.Text then
begin
ShowMessage ('Тема с таким названием уже создана!');
напиши это
Код:
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SELECT Name_t FROM TABLE1  WHERE (Name_t = "'+Edit1.text+'")');
Query.Open;
If Query.recordCount > 0 then
begin
ShowMessage ('Тема с таким названием уже создана!');
exit;
end;
Вместо этого
Код:
form1.Table1.Last;
max_ID:=form1.table1.fieldbyname('ID').asinteger;
напиши это
Код:
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SELECT max(id) FROM TABLE1');
Query.Open;
max_ID:= Query.fields[0].asinteger + 1;
Будет работать гораздо быстрее, чем гонять циклы.
_SERGEYX_ вне форума Ответить с цитированием
Старый 03.10.2007, 08:53   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1) может проще в табличке по полю Name_T уникальный индекс сделать и проверять ниче не надо будет?
2) вместо эдит юзать DBEdit и прописывать руками заполнение таблицы не надо будет
3) поле ID проще сделать автоинкрементным
4) зачем два раза выполнять эти строки:
form1.database1.open;
form1.Table1.open;
pu4koff вне форума Ответить с цитированием
Старый 03.10.2007, 08:54   #4
Shawn
Пользователь
 
Регистрация: 18.08.2007
Сообщений: 16
По умолчанию

Большое спасибо, действительно более солидно выглядит (век живи - век учись)... Но проблема в проверке схожести названий тем - при вводе уже существующей темы паскудно виснет, а планировался вовсе не висяк... ((
Вот как-то оно так...
Shawn вне форума Ответить с цитированием
Старый 03.10.2007, 09:00   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Для чего form1.database1.open; ???
database1.connected:=true жолжно быть по умолчанию.
Это с какого такого перепугу база данных должна быть обязательно подключена?
Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Вместо этого
Код:
form1.Table1.Last;
max_ID:=form1.table1.fieldbyname('ID').asinteger;
напиши это
Код:
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('SELECT max(id) FROM TABLE1');
Query.Open;
max_ID:= Query.fields[0].asinteger + 1;
Будет работать гораздо быстрее, чем гонять циклы.
Что-то я сильно сомневаюсь, что переход к последней записи будет дольше, чем перебор всех записей и поиск максимального значения
pu4koff вне форума Ответить с цитированием
Старый 03.10.2007, 09:09   #6
Shawn
Пользователь
 
Регистрация: 18.08.2007
Сообщений: 16
По умолчанию

На второй форме в событии onChange Edita написал
Button1.enabled := Edit1.Text <> '';
Это как-то солиднее.


К сожалению такой вариант не прошел...
Вот как-то оно так...
Shawn вне форума Ответить с цитированием
Старый 03.10.2007, 09:16   #7
Shawn
Пользователь
 
Регистрация: 18.08.2007
Сообщений: 16
По умолчанию

Все равно что-то не так:

procedure TForm2.Button1Click(Sender: TObject);
begin
bad_point:=false;
form1.database1.open;
form1.Table1.open;
form1.Table1.first;
while not form1.table1.Eof do begin
if form1.table1.FieldByName('Name_T'). AsString = edit1.Text then
bad_point:=true
else begin
form1.Table1.Last;
max_ID:=form1.table1.fieldbyname('I D').asinteger;
form1.Table1.Insert;
form1.Table1.FieldByName('Name_t'). AsString:=edit1.Text;
form1.Table1.FieldByName('ID').AsIn teger:=max_ID+1;
form1.Table1.Post;
form2.close;
end;
end;
if bad_point=true then
begin
ShowMessage ('Тема с таким названием уже создана!');
form2.Edit1.Clear;
form2.Edit1.SetFocus;
end;
end;
Вот как-то оно так...

Последний раз редактировалось Shawn; 03.10.2007 в 09:18.
Shawn вне форума Ответить с цитированием
Старый 03.10.2007, 09:33   #8
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

если ві используете while not table1.eof do, то в конце обязательно ставится Table1.next;
просто в противном случае Ваш код зациклится... Он будет постоянно в первой строке стоять... А Table1.next переводит на следующую строку.... используйте Abort , для віходя из процедурі, если найдется такая же запись....
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 03.10.2007 в 09:35.
Pitbull вне форума Ответить с цитированием
Старый 03.10.2007, 09:55   #9
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Что-то я сильно сомневаюсь, что переход к последней записи будет дольше, чем перебор всех записей и поиск максимального значения
Зря сомневаешься.
Код:
form1.Table1.Last;
max_ID:=form1.table1.fieldbyname('ID').asinteger;
будет справедливым только если таблица отсортирована по полю ID. А, обычно, как я понимаю, таблица сортируется по именам или названия.
Значит нужно создать индекс для поля ID и перед Last написать

Код:
var aIndex: string;
...............
aIndex:= table1.indexname;
table1.indexname:='id';
form1.Table1.Last;
max_ID:=form1.table1.fieldbyname('ID').asinteger;
table1.indexname:=aIndex;
Но записи в Гриде будут "дергаться", это не солидно. Поэтому все это
нужно вставить между
Код:
Table1.DisableControls;
{...........}
Table1.EnableControls;
Короче, некрасивый код получается... А sql-запрос будет работать и на неиндексированной таблице.

Последний раз редактировалось _SERGEYX_; 03.10.2007 в 09:57.
_SERGEYX_ вне форума Ответить с цитированием
Старый 03.10.2007, 09:58   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

тут помоему еще в любом случае перебираются все записи, т.к. добавление идет в цикле, а выхода нету, т.е. получаеца мы добавили тему, но всеравно настырно проверяем, а есть ли такая тема дальше и если нет ее дальше, то опять вставляем. ну и про некст, как уже сказали, было забыто
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли в одном классе реализовать несколько интерфейсов Galinka08 Общие вопросы по Java, Java SE, Kotlin 2 08.03.2008 21:33
Присвоение значения одного поля другому frai БД в Delphi 2 20.09.2007 15:03
Сообщение другому окну Бонарт Win Api 13 15.08.2007 20:23
можно ли такое реализовать Димарик Общие вопросы Delphi 6 22.07.2007 13:18
передать данные другому приложению vasya_pupkin Win Api 1 16.02.2007 20:17