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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2011, 18:00   #1
WhiteDemon
 
Аватар для WhiteDemon
 
Регистрация: 07.02.2011
Сообщений: 9
По умолчанию Выборка в DBGrid по выбору узла в TreeView

Здравствуйте!
У меня на форме есть TreeView и DBGrid. В TreeView загружаются данные из двух таблиц MS SQL: отделы (id_o, otdel_name) и сотрудники (id_s,fio,id_o). В DBGrid отображены данные таблицы оборудование (id_o, name, id_o).
Мне бы хотелось сделать следующее: при выборе в TreeView отдела в DBGrid отображалось оборудование, которое в данном отделе.(задачка-то вроде простая,но...)
Если кто знает как это реализовать, плиз подскажите.
WhiteDemon вне форума Ответить с цитированием
Старый 07.02.2011, 21:14   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Привяжите к каждой ноде объект (свойство Data у TTreeNode), а в нем укажите ссылку на таблицу оборудования. В хэлпе есть подробный пример, как это делается.
Тогда "при выборе в TreeView отдела" будете делать Locate() на нужную запись таблицы оборудования.
asmodey1 вне форума Ответить с цитированием
Старый 10.02.2011, 18:09   #3
WhiteDemon
 
Аватар для WhiteDemon
 
Регистрация: 07.02.2011
Сообщений: 9
По умолчанию

Спасибо за идею как-нибудь разберусь, а сейчас пока делаю уже другое
WhiteDemon вне форума Ответить с цитированием
Старый 15.02.2011, 20:09   #4
WhiteDemon
 
Аватар для WhiteDemon
 
Регистрация: 07.02.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от asmodey1 Посмотреть сообщение
Привяжите к каждой ноде объект (свойство Data у TTreeNode), а в нем укажите ссылку на таблицу оборудования. В хэлпе есть подробный пример, как это делается.
Я честно попыталась понять пример из хелпа, но увы видимо моих знаний пока не достаточно для этого Если Вам не трудно, объясните пожалуйста как же сделать енто.
WhiteDemon вне форума Ответить с цитированием
Старый 15.02.2011, 23:11   #5
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Чего ж там непонятного-то ?
Берем и один в один перерисовываем оттуда кусок для вашей процедуры загрузки базы в дерево. Примерно так :
Код:
procedure TFmain.GetTree;
var nnod,nnor: TTreeNode;//nnor - для подузлов
     MyRecPtr: PMyRec;//описывается точно так, как в примере
begin
TreeView.Items.BeginUpdate;
TreeView.SortType:=stNone;
TreeView.Items.Clear;
TOtdTable.First;
if TOtdTable.RecordCount>0 then
begin
while not TOtdTable.Eof do
begin
New(MyRecPtr);//создаем новый экземпляр объекта
MyRecPtr^.OtdId:=TOtdTable.FieldByName('Id_otd').Value;//задаем параметр OtdId объекта
nnod:=TreeView.Items.AddObject(nil, TOtdTable.FieldByName('Otdel_name').Text, MyRecPtr);//добавляем ноду с объектом
...
//и так далее
Потом, при выборе отдела в TreeView, будете делать :
Код:
TOborTable.Filter:='Id_otd='+QuotedStr(PMyRec(TreeView.Selected.Data)^.OtdId);//это таблица оборудования, привязанная к DBGrid
Ну, а объявляем точь-в-точь, как в примере:
Код:
type
PMyRec = ^TMyRec;
TMyRec = record
  OtdId: longint;
end;

var
  Fmain: TFmain;
...

Последний раз редактировалось asmodey1; 15.02.2011 в 23:33.
asmodey1 вне форума Ответить с цитированием
Старый 16.02.2011, 13:08   #6
WhiteDemon
 
Аватар для WhiteDemon
 
Регистрация: 07.02.2011
Сообщений: 9
По умолчанию

Сделала как посоветовали,но
Код:
ADOQueryMain.Filter:='otdel='+QuotedStr(PMyRec(TVOtdelSotrud.Selected.Data)^.OtdId);//это таблица оборудования, привязанная к DBGrid
не работает, ругается "Incompatible types: 'string' and 'Integer' ", ошибка поятна (ADOQueryMain.Filter должно быть string, а QuotedStr(PMyRec(TVOtdelSotrud.Sele cted.Data)^.OtdId) у меня integer) initostr не помогает.

Сделала вот так
Код:
 ADOQueryMain.Locate('otdel',(PMyRec(TVOtdelSotrud.Selected.Data)^.OtdId),[]);
но в таком случае при выборе отдела просто переходит к первой записи с таким отделом, а хотелось бы все же получить в DBGrid выборку всех устройств в отделе.
WhiteDemon вне форума Ответить с цитированием
Старый 16.02.2011, 16:01   #7
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от WhiteDemon Посмотреть сообщение
initostr не помогает
Враки. Не верю.
Код:
ADOQueryMain.Filter:='otdel='+IntToStr(PMyRec(TVOtdelSotrud.Selected.Data)^.OtdId);
работает.
asmodey1 вне форума Ответить с цитированием
Старый 16.02.2011, 17:07   #8
WhiteDemon
 
Аватар для WhiteDemon
 
Регистрация: 07.02.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от WhiteDemon Посмотреть сообщение
initostr не помогает.
пардон, это я не правильно выразилась. IntToStr действительно помогает исправить эту ошибку, но при этом выборка не происходит, вообще ничего не происходит
WhiteDemon вне форума Ответить с цитированием
Старый 16.02.2011, 21:35   #9
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

А заменить названия полей на те, которые у вас в таблицах, в голову не приходило ?
Или вы так и оперируете теми именами, которые я привел условно ?
Тогда естественно, что выборки не будет...
asmodey1 вне форума Ответить с цитированием
Старый 17.02.2011, 14:12   #10
WhiteDemon
 
Аватар для WhiteDemon
 
Регистрация: 07.02.2011
Сообщений: 9
По умолчанию

Да не, названия полей из моих таблиц. (я думаю что при попытке выделить узел delphi бы ругнулся, если бы были не те поля)

Вот мой код заполнения TreeView
Код:
procedure TFormMain.FormActivate(Sender: TObject);
var otdel_node, sotrudnik_node:TTreeNode;
    field:string;
    MyRecPtr: PMyRec;
begin
with FormMain do
  begin
  TVOtdelSotrud.Items.BeginUpdate;
  TVOtdelSotrud.SortType:=stNone;
  TVOtdelSotrud.Items.Clear;
  ADOQueryOtdel.First;

  if ADOQueryOtdel.RecordCount>0 then
    begin
      while not ADOQueryOtdel.Eof do
      begin
      New(MyRecPtr);
        MyRecPtr^.id_o:=ADOQueryOtdel.FieldByName('id_o').Value;
        otdel_node:=TVOtdelSotrud.Items.AddObject(nil,ADOQueryOtdel.FieldByName('otdel_name').Text,MyRecPtr);
        field:= FormMain.ADOQueryOtdelID_O.AsString;
        ADOQuerySotrudniki.Close;
        ADOQuerySotrudniki.SQL.Text:='select id_sot,fio,otdel from sotrudniki where otdel='+chr(39)+field+chr(39);
        ADOQuerySotrudniki.ExecSQL;
        ADOQuerySotrudniki.open;
          if ADOQuerySotrudniki.RecordCount > 0 then
          begin
          ADOQuerySotrudniki.First;
            while not ADOQuerySotrudniki.Eof do
              begin
              New(MyRecPtr);
              MYRecPtr^.id_sot:=ADOQuerySotrudniki.FieldByName('id_sot').Value;
                sotrudnik_node:= TVOtdelSotrud.Items.AddChildObject(otdel_node,ADOQuerySotrudniki.FieldByName('fio').Text,MyRecPtr);
                ADOQuerySotrudniki.Next;
              end;
           end;
      ADOQueryOtdel.Next;
      end;
    end;
ADOQueryOtdel.Filter:='';
ADOQuerySotrudniki.Filter:='';
TVOtdelSotrud.Items.EndUpdate;
TVOtdelSotrud.FullExpand;
end;
WhiteDemon вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка на объект у узла TreeView Sanprof Общие вопросы C/C++ 0 25.11.2010 13:42
TreeView - картинка только у определенного узла Sanprof Общие вопросы Delphi 1 16.08.2010 14:09
Выборка выборка с таблицы с отношением многие-ко-многим 8alig8 БД в Delphi 2 24.06.2010 12:21
Вделение узла в TTreeView nikmay Общие вопросы Delphi 2 11.08.2009 17:02
Выборка значений ячеек DBGrid Македонский БД в Delphi 3 05.12.2007 07:10