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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 20:01   #1
Evil_Net
Пользователь
 
Регистрация: 04.08.2015
Сообщений: 48
Восклицание База + ComboBox, присваивание переменной

Есть база Access название таблицы adres поля names и email
На форму закинул ADOConnection1, ADOTable1, ADOQuery1
В ComboBox считываю сразу при создании формы.

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
with  ADOTable1 do
begin
DisableControls;
ComboBox1.Items.BeginUpdate;
First;
   while not Eof do
      begin
       ComboBox1.Items.Add(FieldByName('names').AsString + '   ' + FieldByName('email').AsString);
       Next;
      end;
ComboBox1.Items.EndUpdate;
EnableControls;
end;
end;
Результат получается примерно таким:
Петя petya@mail.ru
Иван ivan@mail.ru
и т.д.

Вопрос заключается вот в чем:
Как при выборе в ComboBox например Петя присвоить переменной S значение email именно Пети. В работе с базами новичок, пробовал так, не получается!

Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
var S,T : String;
begin
  T := ComboBox1.Items[ComboBox1.ItemIndex]; //получаю выбранное значение, например Петя
  ADOQuery1.Sql.Clear;
  ADOQuery1.Sql.Add('SELECT * from adres where names = T');
  ADOQuery1.Open;
  S := ADOQuery1.FieldByName('email').AsString;
end;

Последний раз редактировалось Evil_Net; 04.08.2015 в 20:15.
Evil_Net вне форума Ответить с цитированием
Старый 04.08.2015, 20:39   #2
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Как при выборе в ComboBox например Петя присвоить переменной S значение email именно Пети.
можно боле подробно что требуется . ?
Цитата:
Есть база Access название таблицы adres поля names и email
Если names и email одном таблице .! что вы хотите присвоить select е ?

Цитата:
Как при выборе в ComboBox например Петя присвоить переменной S значение email
Вы уже его заранее выбирайте ComboBox1.Items.Add(FieldByName('na mes').AsString + ' ' + FieldByName('email').AsString);

Последний раз редактировалось xxbesoxx; 04.08.2015 в 20:42.
xxbesoxx вне форума Ответить с цитированием
Старый 04.08.2015, 20:43   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В таблице есть ключевое поле? Если нет - заведи.
Тогда получится такое:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
with  ADOTable1 do
begin
DisableControls;
ComboBox1.Items.BeginUpdate;
First;
   while not Eof do
      begin
       ComboBox1.AddItem(
             FieldByName('names').AsString + '   ' + FieldByName('email').AsString
            ,TObject(FieldByName('ID').AsInteger)
       );
       Next;
      end;
ComboBox1.Items.EndUpdate;
EnableControls;
end;
end;
Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
var EMail : String;
begin
 with ADOTable1,TComboBox(Sender) do begin
   First;
   Locate('ID',integer(objects[itemIndex]));
   EMail:=FieldByName('email').AsString;
 end;
end;
А ADOQuery1 в твоем случае ИМХО лишний.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2015, 20:58   #4
Evil_Net
Пользователь
 
Регистрация: 04.08.2015
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
В таблице есть ключевое поле? Если нет - заведи.
Ключевое есть, забыл про него: название id числовое

Код:
   Locate('ID',integer(objects[itemIndex]));
программа ругается на objects что то(

А так мысль уловил, но как ее довести до рабочего кода пока не знаю

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
можно боле подробно что требуется . ?

Если names и email одном таблице .! что вы хотите присвоить select е ?

Вы уже его заранее выбирайте ComboBox1.Items.Add(FieldByName('na mes').AsString + ' ' + FieldByName('email').AsString);
в селекте будет Имя человека + Почта его
и при выборе нужного человека в переменную присваивалась бы его почта
переменная потом используется для отправки письма на указанную почту в ней

Последний раз редактировалось Stilet; 04.08.2015 в 21:17.
Evil_Net вне форума Ответить с цитированием
Старый 04.08.2015, 21:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что то
Запомни: Зупынивки "тута" и "тама" нема!
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2015, 21:28   #6
Evil_Net
Пользователь
 
Регистрация: 04.08.2015
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Запомни: Зупынивки "тута" и "тама" нема!
от этого не легче, не получается же ни чего(((
Evil_Net вне форума Ответить с цитированием
Старый 04.08.2015, 21:37   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Сам виноват потому что:
Цитата:
программа ругается на objects что то(
Думай студент, думай.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2015, 22:12   #8
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
в селекте будет Имя человека + Почта его
и при выборе нужного человека в переменную присваивалась бы его почта
переменная потом используется для отправки письма на указанную почту в ней
E_Mail получаем в Edit и потом отправь
1)
Код:
procedure TForm1.FormShow(Sender: TObject);
begin  // Выбираю все посажир
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT *  FROM Tab1 ');
    Open;
    // ---------- и заполняю Combo из поля Names
    cbbName.Items.Clear;
    While not ADOQuery1.Eof do
    begin
      cbbName.Items.Add(ADOQuery1.Fields[1].AsString);
      ADOQuery1.Next;
    end;
  end;
end;

end.
2)
Код:
procedure TForm1.cbbNameChange(Sender: TObject);
var
  a: string;
begin   //  Делаю простой фильтр из Combo в полей  names
 if (Trim(cbbName.Text)<>'') then
  begin
    a := 'names =';
    ADOQuery1.Filter := a + '''' + Trim(cbbName.Text) + '''';
    ADOQuery1.Filtered := True;
  end
  else
    ADOQuery1.Filtered := False;
end;
3)
Код:
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin   // Получаю  E_mail в Edit-е и  осталось отправить из него письмо
 if cbbName.Text<>'' then
  edtEmail.Text := ADOQuery1.FieldByName('E_mail').AsString
  else
  edtEmail.Text := '';
end;
https://yadi.sk/d/qwKGDSXbiGhaS

Последний раз редактировалось xxbesoxx; 04.08.2015 в 22:34.
xxbesoxx вне форума Ответить с цитированием
Старый 04.08.2015, 23:02   #9
Evil_Net
Пользователь
 
Регистрация: 04.08.2015
Сообщений: 48
По умолчанию

огромное спасибо за пример)

только не понятно зачем процедура ADOQuery1AfterScroll кроме записи значения в едит и зачем вынесена отдельно?

вроде понял фильтрацию, ищет название из cbbName.Text, в данном случае там только имя, а я бы хотел чтобы в селекте было "Имя пробел почта", загрузить в комбобокс так без проблем получается, но тогда фильтрация перестает работать(
Evil_Net вне форума Ответить с цитированием
Старый 04.08.2015, 23:36   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
а я бы хотел чтобы в селекте было "Имя пробел почта", загрузить в комбобокс так без проблем получается, но тогда фильтрация перестает работать(
Создаю запрос Access и сохраняю таким имени MyQuery
Код:
SELECT Код , Names, E_mail, Names+ '  ' +E_mail as FullName
FROM Tab1
и это запрос буду select е вызвать как таблица фильтрую полей FullName и DBGride выбрасываю это поля получается так
Код:
{$R *.dfm}

procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin   // Получаю     E_mail в Edit е
 if cbbName.Text<>'' then
  edtEmail.Text := ADOQuery1.FieldByName('E_mail').AsString
  else
  edtEmail.Text := '';
end;

procedure TForm1.cbbNameChange(Sender: TObject);
var
  a: string;
begin   //  Делаю простой фильтр из Combo в полей FullName
 if (Trim(cbbName.Text)<>'') then
  begin
    a := 'FullName LIKE '; // Здесь LIKE не надо замените на  =
    ADOQuery1.Filter := a + '''' + Trim(cbbName.Text) + '%'''; // и потом здесь знак процента удалите не нужно 
    ADOQuery1.Filtered := True;
  end
  else
    ADOQuery1.Filtered := False;
end;

procedure TForm1.FormShow(Sender: TObject);
begin  // Выбираю все посажир
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT *  FROM MyQuery ');
    Open;
    // ---------- и заполняю Combo из поля Names
    cbbName.Items.Clear;
    While not ADOQuery1.Eof do
    begin
      cbbName.Items.Add(ADOQuery1.FieldByName('FullName').AsString );
      ADOQuery1.Next;
    end;
  end;
end;

end.
Возьмите пожалуйста https://yadi.sk/d/iUcgUFb-iGnVn

Последний раз редактировалось xxbesoxx; 04.08.2015 в 23:54.
xxbesoxx вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите плиз Лузерина Фриланс 5 04.03.2008 23:47
Помогите плиз! Moel БД в Delphi 1 11.08.2007 23:29