powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DataCombo
16 сообщений из 16, страница 1 из 1
DataCombo
    #34931717
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

Проблема такая. Имеется форма, где расположены десяток textbox и несколько Data Combo.

В событии Form_Load для всех контролов в свойства DataSource присваивается уже открытый «public» recordset

Выгляди это примерно так
Код: plaintext
1.
2.
3.
4.
5.
Private Sub Form_Load()
rsRecordset.Open "................."
Set txtName.dataSource=rsRecordset  ‘   элемент Textbox 
Set dcCity.dataSource=rsRecordset    ‘ Элемент DataCombo сохраняем значение код города 
End sub

Также уже в конструкторе форм для всех элементов установлено свойство DataField.
txtName.DataField= «Имя»
dcCity.DataField= «Код_города»

Но это все я сделал в конструкторе не в коде.

Также элементу Data Combo также при Form_Load устанавливается в свойство RowSource другой рекодрсет и соответственно свойства
dcCity.FieldList= «город»
dcCity.BoundColumn= «Код_города»


вроде ничего не напутал

все работает, но при изменении одновременно занчений в textbox и DataCombo и потом при вызове процедуры rsRecordset.Update возникает ошибка

-2147217888
Обработчик событий потребителя вызвал метод поставщика, который не допускает повторные входы


Это возникает еще при разных ситуациях но связанно походу именно с DataCombo
Ребят мож кто знает что за косяк…
...
Рейтинг: 0 / 0
DataCombo
    #34931853
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблицах есть первичный ключ?
...
Рейтинг: 0 / 0
DataCombo
    #34931869
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут заметил в откладке что при изменении значения в TextBox как это и должно быть, меняется значения этого поля в Recordset т.е получитеся изменив значения в txtname="Вася"
в rsRecordset!Имя тоже станет "вася" а в dataCombo такое не происходит!
т.е rsRecordset!Код_города равен Null также хотя в dataCombo и выбранно значение
...
Рейтинг: 0 / 0
DataCombo
    #34931884
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите код. Нужно видеть SQL для рекордсетов.
...
Рейтинг: 0 / 0
DataCombo
    #34931924
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffВ таблицах есть первичный ключ?

Да есть и рекорсет грузится с "Select *"
Это происходит и просто при изменении

Причина в том что действительно что DataCombo не записывает в рекордсет значения как это делает textBox, а код_города это допустим обязательный атрибут,
может какое свойство в DataCombo надо указать хотя какое....
...
Рейтинг: 0 / 0
DataCombo
    #34931932
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в SQL нет джойнов?
...
Рейтинг: 0 / 0
DataCombo
    #34931985
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну где то так. Код=100 это к примеру

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Option Explicit

Private rsRecordset As New ADODB.Recordset
Private rsTemp As New ADODB.Recordset

Private Sub Form_Load()

      rsRecordset.Open "Select * FROM Все_Сотрудники WHERE Код=100",cnnMain, adOpenStatic, dLockOptimistic
      rsTemp.Open "SELECT Код, Город FROM СправончикГорода",cnnMain, adOpenStatic, adLockReadOnly

        Dim MyControl As Control
          For Each MyControl In Me.Controls
            If TypeName(MyControl)= "TextBox" or TypeName(MyControl)= "DataCombo"
               Set MyControl.DataSource = rsRecordset 
            End If
        Next

           dcCity.RowSource=rsTemp
           dcCity.FieldList= «Город» 
           dcCity.BoundColumn= «Код»
           '''''''''' (dcCity.dataField уже ранво значению "код_Города" )
 
End Sub

Пробывал уже разные курсоры и блокировку в рекодрсете, одни хрен...
...
Рейтинг: 0 / 0
DataCombo
    #34932017
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На одной записи открываем рекордсет?
Надо сделать rsRecordset.MoveFirst
(есть такой глючок).

И маленький совет на будущее: как время появится, изучите BindingCollection.
...
Рейтинг: 0 / 0
DataCombo
    #34932426
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да запись всегда одна!

rsRecordset.MoveFirst
Попробую но кажется это ничего не даст
в textbox -работает то все!

Мне сейчас прихоидится в ручную при сохранении записывать все значения из DataCombo в рекодсет и обратно т.к значения полей не запоминются в рекорсете хотя вроде как и привязаны
к DataCombo (dataField)
...
Рейтинг: 0 / 0
DataCombo
    #34932686
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так будет работать.
Код: 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.
Option Explicit

Dim cn As ADODB.Connection
Dim rsProducts As ADODB.Recordset
Dim rsCategories As ADODB.Recordset
Dim bndProducts As BindingCollection

Private Sub Command1_Click()
   rsProducts.Update
   rsProducts.Resync
End Sub

Private Sub Command2_Click()
   Debug.Print "CategoryID="; rsProducts("CategoryID")
End Sub

Private Sub Form_Load()
   Set cn = New ADODB.Connection
   cn.CursorLocation = adUseClient
   cn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=(local)"
      
   Set rsProducts = New ADODB.Recordset
   rsProducts.Open "SELECT * FROM Products WHERE ProductID = 2" _
         , cn, adOpenStatic, adLockOptimistic, adCmdText
   rsProducts.MoveFirst
   Set bndProducts = New BindingCollection
   Set bndProducts.DataSource = rsProducts
   
   Set rsCategories = New ADODB.Recordset
   rsCategories.Open "SELECT * FROM Categories" _
         , cn, adOpenStatic, adLockReadOnly, adCmdText
   With DataCombo1
      .ListField = "CategoryName"
      .BoundColumn = "CategoryID"
      Set .RowSource = rsCategories
   End With
   
   With bndProducts
      .Clear
      .Add DataCombo1, "BoundText", "CategoryID"
      .Add Text1, "Text", "ProductName"
   End With
End Sub
Давно не возился с DataCombo, тем более без BindingCollection
...
Рейтинг: 0 / 0
DataCombo
    #34932758
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гы.. работате!!!
Worobjoff
Большущее спасибо!!! Сильно облегчил задачу!!!
...
Рейтинг: 0 / 0
DataCombo
    #34932836
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай совет:
DataCombo не воспринимает свойство Filter в рекордсете. Т.е. делать SELECT ... WHERE - нормально, rs.Filter = "..." - бесполезно.
Из всех привязываемых комбобоксов только True DBList правильно отрабатывает и Filter и Sort рекордсета.
...
Рейтинг: 0 / 0
DataCombo
    #34933720
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попутно возник еще один вопросик!

А как правильно добавить в коллекцию BindingCollection элемент CheckBox


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  
 With bndProducts
      .Clear
      .Add DataCombo1, "BoundText", "CategoryID"   
      .Add Text1, "Text", "ProductName"
      .Add CheckBrak, "Value", "В_Браке"    '  Это к примеру 

   End With

Код:
.Add CheckBrak, "Value", "В_Браке"
Проходит без ошибок но если В_Браке=True галочка на CheckBrak что то не ставится

Если же присвоить рекордсет отдельно то работает:

Код: plaintext
Set CheckBrak.DataSource = rsRecordset
...
Рейтинг: 0 / 0
DataCombo
    #34933749
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проходит без ошибок но если В_Браке=True галочка на CheckBrak что то не ставится
А не вру возникает ошибка!!

Invalid field name supplied
...
Рейтинг: 0 / 0
DataCombo
    #34933817
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если стараться сделать это по классике, то, когда имеется несоответствие типа свойства контрола с типом поля рекордсета, придется юзер-контрол или класс создать
Код юзер-контрола примерно такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub Check1_Click()
   PropertyChanged "Discontinued"
End Sub

Public Property Get Discontinued() As Variant
   Discontinued = Check1.Value And  1 
End Property
Public Property Let Discontinued(ByVal RHS As Variant)
   If IsNull(RHS) Then
      Check1.Value =  0 
   Else
      Check1.Value = RHS And  1  'Îãðàíè÷èòü ìàêñèìóì îäíåðêîé
   End If
End Property

И в форме:
Код: plaintext
1.
2.
3.
4.
5.
   With bndProducts
      .Clear
      .Add DataCombo1, "BoundText", "CategoryID"
      .Add Text1, "Text", "ProductName"
      .Add UserControl11, "Discontinued", "Discontinued"
   End With
...
Рейтинг: 0 / 0
DataCombo
    #34934607
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Круто)))
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DataCombo
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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