powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Tree view "Key is not unique in collection"
25 сообщений из 25, страница 1 из 1
Tree view "Key is not unique in collection"
    #34279091
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

На форме TreeView- tv1 и ListView
База Аксес
В базе следующая иерархия материалов:
классы, типы, марки, позиции.

Классы, типы, марки отображаются в tv1, позиции в ListView
Мне нужно, чтобы в дереве отображались только элементы с непустыми значениями типов и марок,
иначе возникает ошибка при раскрытии типа с пустой маркой.
При загрузке формы возникает ошибка, никак не могу ее исправить:

"Ошибка во время выполнения программы '35602' : Key is not unique in collection"



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Private Sub Form_Load()

'очищаем дерево
tv1.Nodes.Clear
'задаем корень дерева
Set objNode = tv1.Nodes.Add(, , "R", "Материалы")

'создаем объекты- рекордсет для классов, типов, марок и позиций
Set rsClass = New ADODB.Recordset
Set rsType = New ADODB.Recordset
Set rsMarka = New ADODB.Recordset
Set rsPoz = New ADODB.Recordset

'формируем строку запроса для классов:
'ClasSql = "Select * FROM mclass" 'Этот запрос работает нормально, но мне нужно исключить пустые значения  
ClasSql = "SELECT [mclass].[id_class] AS mclass_id_class, [mclass].[mclass] AS mclass_mclass, [mtype].[id_type] AS mtype_id_type, [mtype].[mtype], [mtype].[id_class] AS mtype_id_class, [mmarka].[id_marka], [mmarka].[mmarka], [mmarka].[id_type] AS mmarka_id_type FROM (mclass INNER JOIN mtype ON [mclass].[id_class] = [mtype].[id_class]) INNER JOIN mmarka ON [mtype].[id_type] = [mmarka].[id_type] WHERE NOT ([mmarka].[id_marka] IS NULL);"

Debug.Print ClasSql
'получаем набор записей по всем классам
rsClass.Open ClasSql, cn, adOpenKeyset, adLockOptimistic
    'цикл по всему рекордсету
    If rsClass.RecordCount >  0  Then
        rsClass.MoveFirst
    End If
    While Not rsClass.EOF
        'добавляем узел - класс
        keyClass = "R" & rsClass!mclass_id_class
Вот здесь на втором круге цикла по классам возникает ошибка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
        Set objNode = tv1.Nodes.Add("R", tvwChild, keyClass, rsClass!mclass_mclass)
        'теперь для этого класса нужно заполнить все имеющиеся типы
        'нужен набор записей rsType
        'формируем строку запроса для типов
        TypeSql = "SELECT * FROM mtype WHERE [mtype].[id_class] = " & rsClass!mclass_id_class
        'получаем набор записей по типам
        rsType.Open TypeSql, cn, adOpenKeyset, adLockOptimistic
            ' цикл по типам
            While Not rsType.EOF
                keyType = keyClass & "R" & rsType!id_type
                'добавляем узел - тип
                Set objNode = tv1.Nodes.Add(keyClass, tvwChild, keyType, rsType!mtype)
                'теперь для этого типа нужно заполнить все марки, нужен набор записей rsMarka
                'формируем строку запроса для марок
                MarkaSql = "SELECT * FROM mmarka WHERE [mmarka].[id_type] = " & rsType!id_type
                'получаем набор записей марок для данного типа
                rsMarka.Open MarkaSql, cn, adOpenKeyset, adLockOptimistic
                    ' цикл по маркам
                    While Not rsMarka.EOF
                        keymarka = keyType & "R" & rsMarka!id_marka
                        'добавляем узел - марка
                        Set objNode = tv1.Nodes.Add(keyType, tvwChild, keymarka, rsMarka!mmarka)
                        rsMarka.MoveNext
                    Wend
                    rsMarka.Close
                rsType.MoveNext
            Wend
            rsType.Close
            rsClass.MoveNext
    Wend
    rsClass.Close
'Set rsPoz = Nothing
Set rsMarka = Nothing
Set rsType = Nothing
Set rsClass = Nothing
End Sub
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34279377
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, вы выбрали ненадежный способ обеспечить уникальность ключа для нода.
Сделайте например так:
Код: plaintext
1.
2.
3.
4.
tv1.Nodes.Add "A" & rs("id")
' ...
   tv1.Nodes.Add "B" & rs2("id")
   ' ... 
      tv1.Nodes.Add "C" & rs3("id")
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34279391
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробую, спасибо.
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34279824
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно "Key is not unique in collection"
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34281037
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понятен этот запрос

Код: plaintext
ClasSql = "SELECT [mclass].[id_class] AS mclass_id_class, [mclass].[mclass] AS mclass_mclass, [mtype].[id_type] AS mtype_id_type, [mtype].[mtype], [mtype].[id_class] AS mtype_id_class, [mmarka].[id_marka], [mmarka].[mmarka], [mmarka].[id_type] AS mmarka_id_type FROM (mclass INNER JOIN mtype ON [mclass].[id_class] = [mtype].[id_class]) INNER JOIN mmarka ON [mtype].[id_type] = [mmarka].[id_type] WHERE NOT ([mmarka].[id_marka] IS NULL);"

зачем вы цепляете сюда и типы и марки, если для внесения их в дерево, потом жедаете отдельные запросы?

ЗЫЖ а ошибка в том что для каждого "типа" у вас будет по 1 записи из "класса", а ID у них одинаков
вот и нарушение уникальности

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34281588
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне самому этот запрос не нравится.


В общем мне нужно выбрать все классы, у которых не пустые типы и не пустые марки

Изначально было вот этот запрос:

Код: plaintext
ClasSql = "Select * FROM mclass"

+ Вышеприведенный код+

Остальное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Private Sub tv1_NodeClick(ByVal Node As MSComctlLib.Node)
'Процедура выводит в ListView lv1 позиции для выбранной  в дереве tv1 марки 
lv1.ListItems.Clear
Dim selkey As String
'определяем указатель (key) выбранного узла
selkey = tv1.SelectedItem.Key
'с помощью спец. функции получаем id_marka
selkey = IdMarka(selkey)
'теперь нужен набор записей для выбранной марки
'формируем строку запроса позиций
PozSql = "SELECT * FROM mpoz WHERE [mpoz].[id_marka] = " & selkey
'получаем набор записей позиций
rsPoz.Open PozSql, cn, adOpenKeyset, adLockOptimistic
'добавляем позиции набора в listview
    While Not rsPoz.EOF
        keyPoz = "P" & rsPoz!id_poz
        Set itmx = lv1.ListItems.Add(, keyPoz, rsPoz!mpoz)
        itmx.SubItems( 1 ) = rsPoz!price
     
        rsPoz.MoveNext
    Wend
    rsPoz.Close
End Sub



Public Function IdMarka(keymarka As String) As Long
'функция получения кода марки материала из ключа элемента в дереве
'keymarka имеет вид "C" & id_class & "T" & Id_type & "M" & Id_marka
'нужно получить номер позиции  символа "M", следующий за ним номер 'используем для ф-ии Mid()
Dim nM As Long 'счетчик символов M
Dim i As Integer 'счетчик цикла
Dim sym As String 'переменная для хранения очередного символа
Dim m As Long 'позиция последнего символа "M" в слове
nM =  0 
m =  0 
For i =  1  To CInt(Len(keymarka))
'цикл по всему слову
    
    sym = Mid(keymarka, i,  1 )
        If sym = "M" Then
            nM = nM +  1 
                If nM =  1  Then
                    m = i
                    Exit For
                End If
        End If
Next i

'получаем IdMarka
IdMarka = CLng(Mid(keymarka, m +  1 )) 'Вот здесь ошибка "несоответствие типов", если кликаешь в дереве на типе, который не содержит марок
                    
            
End Function

Пути решения, которые я вижу:
1. Делать Select не всех классов, а только с тех, что с не пустыми марками
2. Делать общую выборку, а сортировать уже в процедурах

Пока я пошел по первому пути.


Может подскажете пример правильного запроса или другое возможное решение?
Буду очень Вам признателен.
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34281622
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну класс и марка не связаны напряму

а запрос примерно такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT 
  что надо из таблицы классов
FROM mclass WHERE id_class IN (
  select [mtype].[id_class]
  from mtype
  inner join marka on ...
)


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34281640
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гениально!
Попробую, спасибо.
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282055
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я совсем запутался в этих джойнах

вот это запрос
Код: plaintext
1.
2.
3.
ClasSql = "SELECT * FROM mclass 
WHERE [mclass].[id_class] IN 
(SELECT [mtype].[id_class] FROM mtype INNER JOIN mmarka ON
 ([mtype].[id_type] = [mmarka].[id_type] AND NOT [mmarka].[mmarka] IS NULL));"

и вот этот:
Код: plaintext
1.
2.
3.
4.
ClasSql = "SELECT * FROM mclass 
WHERE [mclass].[id_class] IN 
(SELECT [mtype].[id_class] FROM 
mtype INNER JOIN mmarka ON 
[mtype].[id_type] = [mmarka].[id_type] WHERE NOT [mmarka].[mmarka] IS NULL);"

Фильтруют классы, а типы без марок остаются.
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282112
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ClasSql = "SELECT * FROM mclass 
WHERE [mclass].[id_class] IN 
(SELECT 
    [mtype].[id_class] 
FROM 
    mtype 
INNER JOIN mmarka ON [mmarka].[id_type]  = [mtype].[id_type]"

внутренний запрос должен выдать только те типы, для которых существуют марки

PS: условия никакие не нужны INNER JOIN все сделает сам

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282149
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
внутренний запрос должен выдать только те типы, для которых существуют марки

PS: условия никакие не нужны INNER JOIN все сделает сам


Все подряд включает. :-(
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282222
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой-то у вас странный INNER JOIN


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282312
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно его вылечить от странностей?

Может как-то по-другому заполнять tv-lv?
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282362
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если база неюольшая, выложите сюда, посомтрим

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282501
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы уточнить:
1) Вы хотите в дереве отобразить три таблицы, которые нормально связаны главный-дочерний.
2) Крайнюю таблицу всегда отображаете в листе.
3) Выборка записей для отображения их в листе зависит от выделенного нода в дереве.
4) Если выбран узел выше по иерархии чем крайний, то надо отобразить в листе все что принадлежит всем дочерним узлам.
Правильно?
(Прошу прощения что не стараюсь вникнуть во все что написано в топике)
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282550
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почистил лишнее. Выкладываю.
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282584
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffХотелось бы уточнить:
1) Вы хотите в дереве отобразить три таблицы, которые нормально связаны главный-дочерний.
2) Крайнюю таблицу всегда отображаете в листе.
3) Выборка записей для отображения их в листе зависит от выделенного нода в дереве.
4) Если выбран узел выше по иерархии чем крайний, то надо отобразить в листе все что принадлежит всем дочерним узлам.
Правильно?
(Прошу прощения что не стараюсь вникнуть во все что написано в топике)

1- да
2- да
3 -да
4- только самую нижнюю
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282608
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Worobjoff
4) Если выбран узел выше по иерархии чем крайний, то надо отобразить в листе все что принадлежит всем дочерним узлам.


Хотя можно и так.
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282622
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо еще это запрос поправить

Код: plaintext
1.
2.
TypeSql = "SELECT * FROM mtype WHERE [mtype].[id_type] in (select [id_type] from mmarka) and [mtype].[id_class] = " & rsClass!id_class


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282666
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гениально. Все просто, оказывается. Спасибо.


P.S.
Все-таки непонятно, почему предыдущие запросы не работали как надо...
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282773
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sv375 Все-таки непонятно, почему предыдущие запросы не работали как надо...
они работали правильно, в соответствии с тем, что вы написали


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34282944
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взял ваш пример и переписал.
Без оптимизации некоторых вещей. Лишь бы работал.
Там еще DE лежит. Пришлось конструкторами запросов попользоваться т.к. похоже есть смешение латинских символов и кириллицы в именах полей (или где-то еще).
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34283636
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffВзял ваш пример и переписал.
Без оптимизации некоторых вещей. Лишь бы работал.


Просто класс. Это именно то, что нужно. Спасибо.

WorobjoffТам еще DE лежит. Пришлось конструкторами запросов попользоваться т.к. похоже есть смешение латинских символов и кириллицы в именах полей (или где-то еще).

DE для меня- темный лес.
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34283647
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему:
Код: plaintext
1.
2.
Do Until 
      ...
Loop

вместо:
Код: plaintext
1.
2.
3.
while
...
wend
?
...
Рейтинг: 0 / 0
Tree view "Key is not unique in collection"
    #34284482
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DE - это одно из средств быстрого создания приложения "одной лишь мышкой". Здесь - запросы. Можно пользоваться, но подсаживаться на него не надо.
А циклы Do While и Do Until - более мощные. И с предусловием и с постусловием. И конечно полностью заменяют while -whend.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Tree view "Key is not unique in collection"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]