Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > обновление TreeView


Автор: alf138 21.10.2011, 14:47
Возникла необходимость добавления данных в бд, но при этом TreeView не обновляется, пытался как
TreeView.Refresh
TreeView.Update
Заполнял TreeView
Код


TreeView1.Items.BeginUpdate;
TreeView1.SortType:=stNone;
TreeView1.Items.Clear;
DataModule1.SQL_QUERY.Close;
DataModule1.SQL_QUERY.SQL.Clear;
DataModule1.SQL_QUERY.SQL.Text:='SELECT DISTINCT date  from tel';  
DataModule1.SQL_QUERY.Open;
while not DataModule1.SQL_QUERY.Eof do
begin
n1:=TreeView1.Items.Add(nil, DataModule1.SQL_QUERY.FieldByName('date').AsString);
f1:=DataModule1.SQL_QUERY.FieldByName('date').AsString;   
DataModule1.SQL_QUERY.Next;
//****************************************************************************//
  DataModule1.plan.Close;
DataModule1.plan.SQL.Clear;                      
DataModule1.plan.SQL.Add('select DISTINCT Postav.name, postav from tel  '
                        +' inner join postav on tel.postav=postav.Id'
                        +' where Дата=:date');
DataModule1.plan.Parameters.ParamByName('date').Value:=f1;
DataModule1.plan.Open;
if DataModule1.plan.RecordCount>0 then 
 begin
   DataModule1.plan.First;
   while not DataModule1.plan.Eof do
   begin                                   
     n2:=TreeView1.Items.AddChild(n1,DataModule1.plan.Fields[0].AsString);
     f2:=DataModule1.plan.FieldByName('postav').AsString;  
     DataModule1.plan.Next;
//****************************************************************************//
   DataModule1.plan_ot4et_Query.Close;           
   DataModule1.plan_ot4et_Query.SQL.Clear;
   DataModule1.plan_ot4et_Query.SQL.Text:='select*'
                                          +' from tel'
                                          +' inner join name_tel'
                                          +' on tel.name=name_tel.id'
                                          +' where postav=:pos and date=:date';
   DataModule1.plan_ot4et_Query.Parameters.ParamByName('pos').Value:=f2;
   DataModule1.plan_ot4et_Query.Parameters.ParamByName('date').Value:=f1;
   DataModule1.plan_ot4et_Query.Open;
    if DataModule1.plan_ot4et_Query.RecordCount>0 then
    begin
      DataModule1.plan_ot4et_Query.First;
      while not DataModule1.plan_ot4et_Query.Eof do
      begin
      n3:=TreeView1.Items.AddChild(n2,DataModule1.plan_ot4et_Query.Fields[8].AsString);
      f3:=DataModule1.plan_ot4et_Query.FieldByName('tel.Id').AsString;
      DataModule1.plan_ot4et_Query.Next;
//****************************************************************************//
    DataModule1.zayavka.Close;           
    DataModule1.zayavka.SQL.Clear;
    DataModule1.zayavka.SQL.Text:='select* from naem_tel'
                                  +' where id_блока=:id';
    DataModule1.zayavka.Parameters.ParamByName('id').Value:=f3;
    DataModule1.zayavka.Open;
    if DataModule1.zayavka.RecordCount>0 then
    begin
      DataModule1.zayavka.First;
      while not DataModule1.zayavka.Eof do
      begin
        n4:=TreeView1.Items.AddChild(n3, DataModule1.zayavka.Fields[3].AsString);
        f4:=DataModule1.zayavka.FieldByName('id').AsString;
        DataModule1.zayavka.Next;
//****************************************************************************//
     DataModule1.SQL_QUERY2.Close;
      DataModule1.SQL_QUERY2.SQL.Clear;
      DataModule1.SQL_QUERY2.SQL.Text:='select*'
                                      +' from name_tel'
                                      +' inner join sostoya on name_tel.sostoya=sostoya.id'
                                      +' where name_tel.id=:ids';
      DataModule1.SQL_QUERY2.Parameters.ParamByName('ids').Value:=f4;
      DataModule1.SQL_QUERY2.Open;
      if DataModule1.SQL_QUERY2.RecordCount>0 then
      begin
        DataModule1.SQL_QUERY2.First;
        while not DataModule1.SQL_QUERY2.Eof do
        begin
          n5:=TreeView1.Items.AddChild(n4,DataModule1.SQL_QUERY2.Fields[5].AsString);
          DataModule1.SQL_QUERY2.Next;
        end;
      end;
      end;
       end;
      end;
    end;
   end;
 end;
 end;
TreeView1.Items.EndUpdate;
end;

Автор: AndreyIQ 21.10.2011, 14:57
Первое что бросается в глаза, есть BeginUpdate, но нет EndUpdate

Автор: alf138 21.10.2011, 15:14
Цитата(AndreyIQ @  21.10.2011,  14:57 Найти цитируемый пост)
Первое что бросается в глаза, есть BeginUpdate, но нет EndUpdate 

извините, не до конца скопировал ...

Автор: chip_and_dayl 21.10.2011, 15:18
alf138
Когда добавляется новая запись, то сразу идет перестройка дерева? и новая запись в это дерево не попадает?

Автор: alf138 21.10.2011, 15:21
Сразу должна идти в дерево, изменятся "Неисправно" на "исправно"

Автор: AndreyIQ 21.10.2011, 15:21
Цитата

Возникла необходимость добавления данных в бд, но при этом TreeView не обновляется

Проблем с транзакциями нет? Данные во всех квери появляются?

Автор: chip_and_dayl 21.10.2011, 15:26
Цитата(alf138 @  21.10.2011,  15:21 Найти цитируемый пост)
Сразу должна идти в дерево, изменятся "Неисправно" на "исправно"

Тут уже идет противоречивость. Должно добавится в дерево или измениться в дереве?

Можете еще кинуть кусок который добавляет запись в базу?

Автор: alf138 21.10.2011, 15:32
Изменяться в бд
Код

DataModule1.SQL_QUERY.Close;
DataModule1.SQL_QUERY.SQL.Clear;
DataModule1.SQL_QUERY.SQL.Text:='UPDATE name_tel SET sosoyan =1 WHERE name_tel=:nam';
DataModule1.SQL_QUERY.Parameters.ParamByName('nam').Value:=ComboBox2.Text;

Автор: chip_and_dayl 21.10.2011, 15:37
alf138
А когда закрываете приложение и заново заходите, то запись в дереве изменена?

Автор: alf138 21.10.2011, 15:41
Цитата(chip_and_dayl @  21.10.2011,  15:37 Найти цитируемый пост)
А когда закрываете приложение и заново заходите, то запись в дереве изменена? 

да, но не вариант заново пересобирать дерево и так ощущается загрузка...

Автор: chip_and_dayl 21.10.2011, 15:47
Если смотреть на ваш код, то там идет пересборка дерева. Хотя я не вижу перед сборкой очистки дерева

Добавлено через 3 минуты и 41 секунду
Как у вас работает программа? Вы грузите дерево, потом юзер выбирает какой-то элемент в дереве, после чего что-то заполняет и жмет сохранить/обновить и вам нужно обновить запись в базе и в дереве?

Если да, то когда мы жмем сохранить, нужный элемент в дереве должен быть выделен и чтобы его обновить достаточно выполнить TreeView1.Selected.Text:='fbf';

Автор: alf138 21.10.2011, 16:05
дерево имеет информативный характер, т.е юзер смотрит что в дереве видит что что то не так, открывает другую форму в ней меняет все что нужно, из закрывает ее, после закрытия второй формы и изменения данные должны изменится. Но они не меняются...
чистка дерева TreeView1.Items.Clear;, нет ?

Автор: chip_and_dayl 21.10.2011, 16:07
Цитата

чистка дерева TreeView1.Items.Clear;, нет ?

Да. Очистка дерева

Добавлено через 57 секунд
можно хотябы скриншот вашего приложения с деревом!?!

Автор: AndreyIQ 21.10.2011, 16:09
Цитата(AndreyIQ @ 21.10.2011,  15:21)
Цитата

Возникла необходимость добавления данных в бд, но при этом TreeView не обновляется

Проблем с транзакциями нет? Данные во всех квери появляются?


Автор: alf138 21.10.2011, 16:19
Данные появляются, точно изменяются, но изменение происходит только после перезапуска программы. Т.е пытался обновить после добавление что то типа такого 
Код

DataModule1.SQL_QUERY.Close;
DataModule1.SQL_QUERY.SQL.Clear;
DataModule1.SQL_QUERY.SQL.Text:='UPDATE name_tel SET sosoyan =1 WHERE name_tel=:nam';
DataModule1.SQL_QUERY.Parameters.ParamByName('nam').Value:=ComboBox2.Text;
DataModule1.SQL_QUERY.ExecSQL;
glavnaya.Form1.TreeView1.Update;

Автор: chip_and_dayl 21.10.2011, 16:33
Цитата

glavnaya.Form1.TreeView1.Update;


Это ставить бессмысленно. Так как дерево само не реагирует на обновление в базе. поэтому обновлять нужно ручками. А я этого не вижу. я только видел какуето попытку пересоздать. Но я так понимаю она просто не работает


Автор: alf138 22.10.2011, 20:22
Т.е хотите сказать нужно полностью пересобирать дерево пополной ?

Автор: Vas 23.10.2011, 19:25
Цитата(alf138 @  22.10.2011,  20:22 Найти цитируемый пост)
Т.е хотите сказать нужно полностью пересобирать дерево пополной ? 

Форма редактирования открывается для выбранного узла? Если да, то обновляй узел в TreeView (надеюсь в дереве хранится id записи). Если нет, то переделать логику программы.

Автор: chip_and_dayl 23.10.2011, 21:31
Есть два или даже три вариант:
1. Перестроить заново
2. Если при редактирование нужная запись выделена, то отредактировать ее с помощью TreeView1.Selected.Text
3. После сохранения данных, искать нужную запись в дереве для редактирования

Добавлено через 29 секунд
Но сейчас проблема в том, что вы не до конца понимаете , что вы делаете и зачем

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)