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

На форме 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
24.01.2007, 16:14
    #34279377
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
По-моему, вы выбрали ненадежный способ обеспечить уникальность ключа для нода.
Сделайте например так:
Код: 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
24.01.2007, 16:17
    #34279391
sv375
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
попробую, спасибо.
...
Рейтинг: 0 / 0
24.01.2007, 17:37
    #34279824
sv375
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
Все равно "Key is not unique in collection"
...
Рейтинг: 0 / 0
25.01.2007, 10:50
    #34281037
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
не понятен этот запрос

Код: 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
25.01.2007, 12:44
    #34281588
sv375
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
Мне самому этот запрос не нравится.


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

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

Код: 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
25.01.2007, 12:50
    #34281622
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
ну класс и марка не связаны напряму

а запрос примерно такой
Код: 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
25.01.2007, 12:55
    #34281640
sv375
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
Гениально!
Попробую, спасибо.
...
Рейтинг: 0 / 0
25.01.2007, 14:26
    #34282055
sv375
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
Я совсем запутался в этих джойнах

вот это запрос
Код: 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
25.01.2007, 14:36
    #34282112
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
Код: 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
25.01.2007, 14:44
    #34282149
sv375
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
HandKot
внутренний запрос должен выдать только те типы, для которых существуют марки

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


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


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

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

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

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


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

Код: 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
25.01.2007, 16:22
    #34282666
sv375
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tree view "Key is not unique in collection"
Гениально. Все просто, оказывается. Спасибо.


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


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


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

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

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

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


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