Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вопрос по Treeview
 
 автор: Гоблин   (08.03.2011 в 20:53)   личное сообщение
 
 

Количество всех узлов в дереве Me.TreeView0.Nodes.Count
Подскажите синтаксис как узнать сколько узлов на конкретном уровне? Скажем есть уровни a и b

  Ответить  
 
 автор: Lukas   (08.03.2011 в 21:02)   личное сообщение
 
 

Зачем?

Количества надо получать из таблиц(ы), а не из контрола.

  Ответить  
 
 автор: Гоблин   (08.03.2011 в 21:14)   личное сообщение
 
 

Блин! Точно
Спасибо.

  Ответить  
 
 автор: Гоблин   (09.03.2011 в 19:18)   личное сообщение
 
 

Народ, подскажите такую штуку. На нажатие кнопки в форме с деревом делаю так:

CurrentDb.Execute "INSERT INTO [Тип аппаратуры] ( Тип) Values ('" & Me.Поле9 & "');"
Me.Список19.Requery
Me.TreeView0.Nodes.Clear

Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select * from [Тип аппаратуры] order by [Тип]")
With rst
If .RecordCount <> 0 Then
Do While Not .EOF
Call Me.TreeView0.Nodes.Add(, , "a" & ![КодТипа], ![Тип])
.MoveNext
Loop
End If
End With

Ну т.е. ввожу в свободном поле инфу, запросом на добавление в таблицу, и после каждого добавления обнуляю дерево, запускаю по этой табле рекордсет с заполнением первого уровня дерева. Так же будет и со 2 и с 3 уровнем. Это извращение или вполне приемлемо?
Вообще так делается?

  Ответить  
 
 автор: Lukas   (09.03.2011 в 19:34)   личное сообщение
 
 


...и после каждого добавления обнуляю дерево...
...Вообще так делается?


Правильные пацаны так НЕ делают.

ps.
Я делаю, когда деревце с гулькин клюв.
(ну лень пока по-людски сделать).

  Ответить  
 
 автор: Гоблин   (09.03.2011 в 20:50)   личное сообщение
 
 

Блин. Так и знал. Значит тактику менять надо. Ну не доходит пока как сделать правильно. Все по миллиметру. Вот код, который получается при добавлении инфы на 2 уровень. (в подтаблицу). И практически такой код на кнопку добавки первого уровня и при открытии формы. Хоть модуль пиши.

CurrentDb.Execute "INSERT INTO [Тип аппаратуры] ( Тип) Values ('" & Me.Поле9 & "');"
Me.Список19.Requery
Me.TreeView0.Nodes.Clear

Dim rst As dao.Recordset
Set rst = CurrentDb.OpenRecordset("select * from [Тип аппаратуры] order by [Тип]")
With rst
If .RecordCount <> 0 Then
Do While Not .EOF
Call Me.TreeView0.Nodes.Add(, , "a" & ![КодТипа], ![Тип])

.MoveNext
Loop
End If
End With
Set rst = CurrentDb.OpenRecordset("select * from [Модели] order by [Модель]")
With rst
If .RecordCount <> 0 Then
Do While Not .EOF
Call Me.TreeView0.Nodes.Add("a" & ![КодТипа], 4, "b" & ![КодМодели], ![Модель])
.MoveNext
Loop
End If
End With


Me.TreeView0.SetFocus

Me.Form.Refresh

А впереди еще блин 3 уровень. Беда.

а что если отказаться от обнуления дерева каждый раз и от рекорсета, а после добавления инфы в таблицу просто добавлять ее в дерево таким же образом. А рекордсет оставить только при открытии формы??? В этом случае надо знать код последней записи в табле с добавленной инфой. DMax что ли...

  Ответить  
 
 автор: Гоблин   (09.03.2011 в 21:44)   личное сообщение
 
 

Во. Пока обошелся вот таким образом. И вроде работает. Из логики. Добавляем, стало быть счетчик добавит некое число, которое будет максимальным.
Dim a As Integer
CurrentDb.Execute "INSERT INTO [Тип аппаратуры] ( Тип) Values ('" & Me.Поле9 & "');"
Me.Список19.Requery
a = DMax("КодТипа", "[Тип аппаратуры]")
Call Me.TreeView0.Nodes.Add(, , "a" & a, Me.Поле9)
Me.TreeView0.SetFocus
Me.Form.Refresh

  Ответить  
 
 автор: Гоблин   (09.03.2011 в 22:35)   личное сообщение
 
 

Ес! Сделал! Добавка на второй уровень! Пошло! Дошло.
CurrentDb.Execute "INSERT INTO [Модели] (КодТипа, Модель) Values (" & Forms!Форма1!Поле21 & ",'" & Me.Поле9 & "');"
Me.Список19.Requery
Call Me.TreeView0.Nodes.Add("a" & Me.Поле21, 4, "b" & DMax("КодМодели", "Модели"), Me.Поле9)
Me.TreeView0.SetFocus
Me.Form.Refresh
Me.Поле9.SetFocus

  Ответить  
 
 автор: Lukas   (09.03.2011 в 23:08)   личное сообщение
 
 

2 раза дергаешь табличку по одному вопросу.

Добавляй данные через Recordset, в нем же и значение ключевого поля узнаешь для добавления в дерево.

  Ответить  
 
 автор: Гоблин   (10.03.2011 в 17:50)   личное сообщение
 
 

Технологию только осваиваю.

Добавляй данные через Recordset, в нем же и значение ключевого поля узнаешь для добавления в дерево.

Если делать как при открытии формы, с обнулением дерева, то каждый раз дерево полностью закрывается, что естественно и не очень удобно. В коде с DMax дерево не закрывается, но 2 раза обращение к таблице - это запрос и DMax может не правильно опять, но все же работает удобнее.
А можно ли как-то при добавлении запускать рекордсет, определять максимальное значение счетчика для добавления и как оно будет работать по времени? Если данных около 1000 будет, то каждый раз при добавлении будет притормаживать.
В общем тут опыт нужен, а где его взять за день-два.

  Ответить  
 
 автор: Гоблин   (12.03.2011 в 22:32)   личное сообщение
 
 

Народ, подскажите пожалуйста.
Есть свободная форма с подформой. На основной дерево. При заполнении подформы на какое событие ставить какой код (синтаксис блин) что бы при добавлении (изменении) инфы в подформе, все менялось (добавлялось) в дерево.
Есть вариант обнулять дерево и рекорсетами снова заполнять, но хотелось бы что бы без них.
Есть вариант вместо формы список делать как выше уже обсудили.
А вот если заполнение прямо в форму идет, как только ни пытался. Ошибка блин.
Вот один из кодов на событие "После вставки" в подформе


Call Forms.[Основная форма].TreeView1.Nodes.Add("a" & Forms![Основная форма].ПолеОтобрИмяУзла, 4, "b" & DLast("ПолеТаблыПодформы", "ТаблицаПодформы"), Me.ПолеТаблыПодформы)
Forms.[Основная форма].Refresh
Тут понятно, что Call Forms.... не нравится.

Пробовал и так
Call me.TreeView1.Nodes.Add("a" & Forms![Основная форма].ПолеОтобрИмяУзла, 4, "b" & DLast("ПолеТаблыПодформы", "ТаблицаПодформы"), Me.ПолеТаблыПодформы)
Тут ему что только не нравится, но добавляет после выдачи ошибок.

Подскажите ЧД. А то сам не допру

PS На после вставки нельзя. Так даже форму не открыть.

  Ответить  
 
 автор: Гоблин   (12.03.2011 в 22:51)   личное сообщение
 
 

Ес! Вопрос отпал! Сам додул на после обновления формы

With Forms![Основная форма].Form
Call .TreeView1.Nodes.Add("a" & Forms![Основная форма].ПолеКлюч, 4, "b" & DLast("ПолеТаблыПодформы", "ТаблаПодформы"), Me.ПолеПодформы)
End With

Как быть если удаляем или изменяем?

  Ответить  
 
 автор: час   (13.03.2011 в 08:49)   личное сообщение
 
 

Call .TreeView1.Nodes.Add
(кстати - ты не забываешь при этом ещё и в таблицу вносить изменения - запросом на добавление или изменение записи?)

Для удаления узелка
там наверное и Del имеется

  Ответить  
 
 автор: Гоблин   (13.03.2011 в 13:53)   личное сообщение
 
 

В том то и дело. Запросом на добавление в таблицу, после чего в дерево. Изменение и удаление тоже. Из дерева только не Del, а Me.TreeView0.Nodes.Remove (Me.Поле). В поле указывается ключ узла.
Вопрос в том, что если инфа из таблицы отображается в табличной форме, и при удалении строки надо одновременно удалить из дерева. При переходе с одной строки на другую в подформе, как отображать все эти переходы в дереве? Типа от обратного - . Что-то по ключам как-то делать надо, а в дереве все равно курсор не прыгает, наименования узлов не выделяет блин. Может это и не обязательно? В общем освоение новой технологии всегда затыки.
И еще. Лукас дал ссылку где расписано как воевать с деревом. Все понятно до определенного момента. Подскажите, за каким хреном нужны ложные узлы, которые потом удалять, менять и прочее надо. Пока без них обхожусь, но вроде что-то тут чего?

  Ответить  
 
 автор: Lukas   (13.03.2011 в 14:04)   личное сообщение
21 Кб.
 
 

Набросал я тут тебе вариантик по-быстрому. =>
Он "очень не очень", но на некоторые вопросы там есть ответ.

ps. Прицеп заменен в 14:25

  Ответить  
 
 автор: Гоблин   (13.03.2011 в 16:47)   личное сообщение
 
 

Интересный пример. Но при удалении записи в таблице ругается.


Private Sub SF_Current()
SF_ID = SF.Recordset.Fields(0)
If Not SF.NewRecord Then TV.Nodes("b" & SF_ID).Selected = True
End Sub
Выделяет желтым SF_ID = SF.Recordset.Fields(0), ошибку пишет.

Может при выборе в форме записи, учитывать ее ID и на событие в форме "После подтверждения Del" удалять соотетствующий узел в дереве. Точно так же и менять на что-то другое, по событию ..... после обновления. Наверно.

  Ответить  
 
 автор: Lukas   (13.03.2011 в 16:54)   личное сообщение
33 Кб.
 
 

Шорт! Похоже опять старый прицеп прицепил.
Тут новее =>

  Ответить  
 
 автор: Гоблин   (13.03.2011 в 21:23)   личное сообщение
 
 

Спасибо. Все предельно просто, доступно, но одновременно сложно (пока)


Проблему с удалением решил просто. Запретил удалять с формы, и только по выбору в дереве нужного ключа, можно удалять нажатием кнопки с запуском запроса на удаление.
И все потому, что если вдруг удалить более 1 записи, дерево не отрабатывает. Разве что обнулить и заново заполнить.
Ну еще дополнительно ключи выделенных записей перечислить.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList