DataCombo можно подсунуть отфильтрованный рекордсет?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

DataCombo можно подсунуть отфильтрованный рекордсет?

Сообщение shady » 30.08.2006 (Ср) 20:47

Код: Выделить всё
Private Sub dcRegTown_MouseUp(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
Select Case Index
    Case 0
        On Error Resume Next
        rstTowns.Filter = "IDReg=" & dcRegTown(0).BoundText
       
        Set dcRegTown(1).RowSource = rstTowns
            dcRegTown(1).ListField = "Name"
            dcRegTown(1).BoundColumn = "ID"
            dcRegTown(1).Enabled = True
End Select
End Sub

в тестовой гриде по соседству прекрасно отражает отфильтрованное..
или же придется запросом рекордсет создавать?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.08.2006 (Чт) 8:22

После Filter сделай Requery.
Lasciate ogni speranza, voi ch'entrate.

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 31.08.2006 (Чт) 19:06

После Filter сделай Requery

сделал. тоже самое. весь рекордсет не отфильтрован и вываливается в комбо.
в таблице городов 176 000 записей, решил отказаться от этой идеи, по причине некоторой задержки при загрузки формы, сделал так:
Код: Выделить всё
Set rstTowns = New ADODB.Recordset
            rstTowns.Open "SELECT ID, IDReg, Name FROM Towns WHERE IDReg=" & dcRegTown(0).BoundText & "ORDER BY Name", conn

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 31.08.2006 (Чт) 21:14

Отфильтруй и сделай копию. Сам пользуюсь таким способом.
Код: Выделить всё
Public Function CreateRSCopy(rsSource As ADODB.Recordset, Optional StructOnly As Boolean = False, Optional CurRecord As Boolean = False) As ADODB.Recordset
Dim rsCopy As ADODB.Recordset
Dim f As ADODB.Field
Dim i As Long
    Set rsCopy = New ADODB.Recordset
    For Each f In rsSource.Fields
        With f
            rsCopy.Fields.Append .Name, .Type, .DefinedSize, .Attributes And adFldIsNullable
            If .Type = adNumeric Then
                rsCopy.Fields(.Name).Precision = .Precision
                rsCopy.Fields(.Name).NumericScale = .NumericScale
            End If
        End With
    Next f
    rsCopy.open
    If StructOnly Then GoTo finish
    If rsSource.RecordCount > 0 Then
        If Not CurRecord Then rsSource.MoveFirst
        Do While Not rsSource.EOF
            rsCopy.AddNew
            For i = 0 To rsSource.Fields.Count - 1
                rsCopy.Fields(i).Value = rsSource.Fields(i).Value
            Next i
            If CurRecord Then GoTo finish
            rsSource.MoveNext
        Loop
        rsSource.MoveFirst
        rsCopy.MoveFirst
    End If
finish:
    Set CreateRSCopy = rsCopy
    Set rsCopy = Nothing
End Function
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.09.2006 (Пт) 8:12

Antonariy, зачем такие сложности?
Если уж Requery не подошел (уж не знаю, почему, может используется DAO), то можно выставить фильтр и сделать Set rs = rs.OpenRecordset.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 01.09.2006 (Пт) 9:03

А как должно подойти Requery? Я попробовал не отключая соединения сделать Requery отфильтрованному рекордсету - ноль внимания, фунт презрения.
Да и MSDN писал(а):Updates the data in a Recordset object by re-executing the query on which the object is based.
...
Calling this method is equivalent to calling the Close and Open methods in succession.
Каким боком тут фильтр?

И что за OpenRecordset? ADO Recordset не имеет такого метода.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.09.2006 (Пт) 9:15

OpenRecordset к DAO относился. Там мало было фильтр или сортировку назначить, нужно было запрос обновить.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 01.09.2006 (Пт) 9:19

Везде понаписано ADODB.Recordset, а ты DAO проталкиваешь? :wink:
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.09.2006 (Пт) 9:23

Ну проглядел, проглядел :)
В ADO Requery не нужен. Но там и фильтр должен работать сразу, без обновления рекордсета. Поэтому Requery я для эксперимента предложил.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 124

    TopList