Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 08.01.2012, 01:51   #1
Seva2011
Пользователь
 
Регистрация: 07.12.2011
Сообщений: 31
По умолчанию как составить поздапрос к access?

есть combobox в него из бд загружаются фамилии работников, работающих на работе работниками))).
при выборе фамилии в эдиты должны выводится остальные данные о человеке.
там 5 фамилий 3 из них одинаковые но это разные люди, никак не могу правильно создать запрос, пытался так
Код:
       
if comboBox3.ItemIndex>=0 then
 begin
ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Klients WHERE ФИО = '
+'"'+ComboBox3.text+'"'+'and id ='+inttostr(comboBox3.ItemIndex));
  ADOQuery1.Open;
Edit15.Text:=ADOQuery1.FieldByName('Адрес').AsString;
Edit16.Text:=ADOQuery1.FieldByName('Телефон').AsString;
Edit17.Text:=ADOQuery1.FieldByName('П_Серия').AsString;
почему то срабатывает только третья фамилия , при ее выборе даннные вставляются в эдиты, добавил четвертую для проверки все равно работает только третья теперь уже из 6 фамилий.
в чем проблема?


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 08.01.2012 в 11:54.
Seva2011 вне форума Ответить с цитированием
Старый 08.01.2012, 11:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

Цитата:
Код:
'and id ='+inttostr(comboBox3.ItemIndex));
а мне не нравится то, что Вы считаете, что ID нумеруются в базе от нуля, причём ID в базе совпадает с порядковым номером клиента в комбобоксе..
Это реально так?!
Если да, тогда покажите код, как Вы загружаете фамилии из базы в комбобокс ComboBox3 ...


p.s. и вообще, если у Вас есть ID записи (ну и это первичный ключ, разумеется) - то уже никаких дополнительных условий для поиска нужной записи в виде фио= задавать нет необходимости! У Вас же есть уникальный КЛЮЧ!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.01.2012, 13:36   #3
Seva2011
Пользователь
 
Регистрация: 07.12.2011
Сообщений: 31
По умолчанию

Код:
  AdoQuery1.Open;
  while not AdoQuery1.Eof do
  begin
    ComboBox3.Items.Add(AdoQuery1.FieldByName('ФИО').AsString);
    AdoQuery1.Next;
  end;
 ComboBox3.ItemIndex := 0;
  AdoQuery1.Close;
Цитата:
p.s. и вообще, если у Вас есть ID записи (ну и это первичный ключ, разумеется) - то уже никаких дополнительных условий для поиска нужной записи в виде фио= задавать нет необходимости! У Вас же есть уникальный КЛЮЧ!
я пробовал без дополнительных условий если там сейчас 4 фамилии при выборе любой из них в едиты выводится инфа о человеке который находится первый в списке.
Seva2011 вне форума Ответить с цитированием
Старый 08.01.2012, 13:40   #4
Seva2011
Пользователь
 
Регистрация: 07.12.2011
Сообщений: 31
По умолчанию

Код:
if comboBox3.ItemIndex>=0 then
 begin
ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Klients WHERE ФИО = '
+'"'+ComboBox3.text'"');
  ADOQuery1.Open;
Edit15.Text:=ADOQuery1.FieldByName('Адрес').AsString;
Edit16.Text:=ADOQuery1.FieldByName('Телефон').AsString;
Edit17.Text:=ADOQuery1.FieldByName('П_Серия').AsString;
я думаю что это из-за ComboBox3.text в запросе. может быть есть какой нибудь другой способ?
прога понимает что нужна эта фамилия а которая из 4х незнает вот и выводит первую в базе.

Последний раз редактировалось Seva2011; 08.01.2012 в 13:43.
Seva2011 вне форума Ответить с цитированием
Старый 08.01.2012, 16:34   #5
Seva2011
Пользователь
 
Регистрация: 07.12.2011
Сообщений: 31
По умолчанию

Код:
if comboBox3.ItemIndex>=0 then
 begin
ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Klients WHERE ФИО = '
+'"'+ComboBox3.text'"');
  ADOQuery1.Open;
ComboBox3.ItemIndex:=ADOQuery1.FieldByName('id').VALUE;
Edit15.Text:=ADOQuery1.FieldByName('Адрес').AsString;
Edit16.Text:=ADOQuery1.FieldByName('Телефон').AsString;
Edit17.Text:=ADOQuery1.FieldByName('П_Серия').AsString;
пришла в голову идейка- добавить строчку, но все равно не работает.
Уважаемые ГУРУ направьте на путь истинный!
Seva2011 вне форума Ответить с цитированием
Старый 08.01.2012, 18:40   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

Вы не хотите понять одну ОЧЕНЬ простую вещь - каким образом связан порядковый номер фамилии в комбобоксе с её ID?
(и есть ли вообще эта связь!!!!)
Как только Вы ответите на этот вопрос (в первую очередь - себе), то и поймёте, почему у Вас не работает ваш запрос..

p.s. на самом деле, я не уверен, что
1) в том запросе, который заполняет Combox3
(AdoQuery1.Open;
while not AdoQuery1.Eof do ....)
в ADOQuery в тексте запроса присутствует строчка ... ORDER BY ID....

2) я не уверен, что фамилии имеют ID строго по порядку, без пропусков, причём начиная с того, что первый работник имеет ID равный нулю, второй - ID = 1, третий ID= 2 и т.д.

3) я даже не уверен (хотя на 99% думаю, что это всё таки так!), что ID является уникальным первичным ключом в таблице KLIENTS ...

Резюмируя.
1) Почему бы Вам не воспользоваться DBComboBox'ом ?!
2) если уж так Вам комбобокс нравится, то я бы его либо к исходному Query1 привязывал (выделил отдельный ADOQuery исключительно под работу с ComboBox3), либо, если уж по другому никак - то я бы ID записей отдельно сохранял, ну, например, в динамический массив:
Код:
var FIO_ID_Array : array of integer;
  i : integer;
....

  AdoQuery1.Open;
  ComboBox3.Items.Clear;
  SetLength( FIO_ID_Array,  AdoQuery1.RecordCount);
  for i:=0 to AdoQuery1.RecordCount-1 do  begin
    FIO_ID_Array[ i ] := AdoQuery1.FieldByName('ID').AsInteger; 
    ComboBox3.Items.Add(AdoQuery1.FieldByName('ФИО').AsString);
    AdoQuery1.Next;
  end;
  ComboBox3.ItemIndex := 0;
  AdoQuery1.Close;

p.s. а ещё можно посмотреть, вполне возможно, что у Items в компбоксе уже есть метод, когда к значению можно числовое значение привязывать. .AddObject() какой-нибудь...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.01.2012, 20:18   #7
Seva2011
Пользователь
 
Регистрация: 07.12.2011
Сообщений: 31
По умолчанию

Цитата:
p.s. на самом деле, я не уверен, что
1) в том запросе, который заполняет Combox3
(AdoQuery1.Open;
while not AdoQuery1.Eof do ....)
в ADOQuery в тексте запроса присутствует строчка ... ORDER BY ID....
я новичек в программировании, я сделал таблицу и поле id поставил первичный ключ
теперь в accessе это поле заполняется автоматически от 1 до ... все нумеруется по порядку. никакой строчки ORDER BY ID в sql запросе нет, простой запрос
Код:
SELECT * FROM Klients
.
мне нужно просто чтоб при выборе фамилии из combobox в эдиты выводились данные о человеке, но я никак не могу создать этот запрос , при выборе одинаковых фамилий выводятся одни и те же данные это не правильно.
спасибо за код но он тоже не работает. видимо это не возможно сделать. буду пробовать dbcombobox.
Seva2011 вне форума Ответить с цитированием
Старый 08.01.2012, 22:06   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

Цитата:
спасибо за код но он тоже не работает.
как именно не работает?
Цитата:
видимо это не возможно сделать.
возможно. всё возможно.
Вы не забыли изменить запрос, чтобы данные выбирались по ID, взятому из массива FIO_ID_Array ?!
типа так:
Код:
if comboBox3.ItemIndex>=0 then
begin
  ADOQuery1.Close;
  ADOQuery1.sql.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM Klients WHERE ID = '+
   IntToStr( FIO_ID_Array[comboBox3.ItemIndex] ) );
  ADOQuery1.Open;
  if  ADOQuery1.RecordCount>0 then begin
    Edit15.Text:=ADOQuery1.FieldByName('Адрес').AsString;
    Edit16.Text:=ADOQuery1.FieldByName('Телефон').AsString;
    Edit17.Text:=ADOQuery1.FieldByName('П_Серия').AsString;
  end;
end;

Цитата:
буду пробовать dbcombobox.
Можно и так.
Успехов.

p.s. если не получится - запакуйте тестовую БД + исходники проекта в архив и архив выкладывайте сюда, на форум.
Посмотрим, что Вы там творите
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.01.2012, 22:55   #9
Seva2011
Пользователь
 
Регистрация: 07.12.2011
Сообщений: 31
По умолчанию

вот программка. помогите сам не разберусь.

personnels.rar
Seva2011 вне форума Ответить с цитированием
Старый 09.01.2012, 23:18   #10
Seva2011
Пользователь
 
Регистрация: 07.12.2011
Сообщений: 31
По умолчанию

нащупал одну штучку если код изменить вот так
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AdoQuery1.Open;
  while not AdoQuery1.Eof do
  begin
    ComboBox3.Items.Add(AdoQuery1.FieldByName('фио').AsString);
    ComboBox3.ItemIndex:=AdoQuery1.FieldByName('id').Value;
    AdoQuery1.Next;
  end;
 ComboBox3.ItemIndex := 1;
 AdoQuery1.Close;
end;

procedure TForm1.ComboBox3Select(Sender: TObject);
begin
       if comboBox3.ItemIndex>=1 then
 begin
ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Klients WHERE фио = '
+'"'+ComboBox3.text+'"'+'and id='+inttostr(ComboBox3.ItemIndex));
  ADOQuery1.Open;
    Edit2.Text:=ADOQuery1.FieldByName(Адрес').AsString;
    Edit3.Text:=ADOQuery1.FieldByName('Телефон').AsString;
    Edit1.Text:=ADOQuery1.FieldByName('П_серия').AsString;
end;
end;
и в items комбобокса добавить одну пустую строку то все работает правильно,но теперь появляется пустая строка.
14.JPG
от нее как то можно избавиться скрыть как то?
Seva2011 вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
составить схему базы данных на access filip Помощь студентам 3 05.05.2011 23:43
Как подключить бд MS Access 2003 без установки MS Access 2003. ShaevMV БД в Delphi 1 15.09.2010 14:19
как составить функцию Sdeeee Microsoft Office Excel 3 03.02.2010 18:07
Как составить запрос? jeka5555 SQL, базы данных 3 09.09.2009 10:12
Помогите пожалуйста решить две задачи по паскалю и составить и составить блок схему! ...Оленька... Паскаль, Turbo Pascal, PascalABC.NET 2 20.01.2009 10:37