И снова сортировка в DataGrid

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

И снова сортировка в DataGrid

Сообщение Dummiel » 06.01.2007 (Сб) 5:00

Други мои, приветствую вас!

Надеюсь, встреча Нового года прошла безболезненно :)

По всеобщему совету начал переходить с DAO на ADO, начались головные боли.

Подскажите вот о чем:

Если на форме имеем Adodc & DataGrid, тогда сортировка по щелчку на заголовке столбца проблем не вызывает:

Код: Выделить всё
Private Sub DataGrid1_HeadClick(ByVal ColIndex As Integer)

    Adodc1.Recordset.Sort = DataGrid1.Columns(ColIndex).DataField

End Sub


А если не кидать на форму Adodc? Без него только через Select Case с последующим SQL "... ORDER BY [соответствующее поле]" с последующим DataGrid1.Refresh'ем, или есть что-то более красиво-краткое, типа вышеприведенного кода?

Админы, не ворчите, не нашел я в поиске конкретного ответа :(

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 06.01.2007 (Сб) 12:56

Как вариант:
Код: Выделить всё
Dim WithEvents rsEvents As ADODB.Recordset  'Рекордсет

Private Sub DataGrid1_HeadClick(ByVal ColIndex As Integer)
    rsEvents.Sort = rsEvents.Fields(ColIndex).Name
End Sub
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 07.01.2007 (Вс) 8:27

Спасибо, конечно, только VB мне в ответ на клик выдает ошибку №91 - Object variable or With block variable not set (Переменная объекта или переменная блока With не задана) :(

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 07.01.2007 (Вс) 21:19

Ну, наверное, потому что у тебя рекордсет называется не rsEvents, а как-то по-другому.

Ты же открываешь свой рекордсет?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 10.01.2007 (Ср) 5:05

Во-о-о-о-он чо!!!

Отсутствие мозгов не компенсируется (это я про себя) :)

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 13.01.2007 (Сб) 8:19

А без Data и с DBGrid такое прокатывает?

Сейчас делаю так:

Код: Выделить всё
Private Sub grdPat_HeadClick(ByVal ColIndex As Integer)
    dbRS.Sort = dbRS.Fields(ColIndex).Name
End Sub


grdPat = это DBGrid.

При клике на заголовке ваще ничего не происходит. Отслеживаю по точке останова - значение dbRS.Fields(ColIndex).Name = [Заголовок столбца DBGrid'а]

SQL-запрос составляю по принципу "SELECT Pasp.Fam AS [Фамилия], Pasp.Name AS [Имя], Pasp.Otch AS [Отчество] FROM Pasp".

Может, потому что название столбцов не соответствует названию поля в БД?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 13.01.2007 (Сб) 10:58

C ADO используется не DbGrid, а DataGrid.
dbRS.Fields(ColIndex).Name показывает название поля в рекордсете, а не заголовок столбца в гриде. Все должно работать:
Код: Выделить всё
Option Explicit

Dim cn As ADODB.Connection
Dim dbRs As ADODB.Recordset

Private Sub Form_Load()
    Dim SQL As String
    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=С:\db1.mdb;User Id=admin;Password=;"
   
    SQL = "SELECT Pasp.Fam AS [Фамилия], Pasp.Name AS [Имя], Pasp.Otch AS [Отчество] FROM Pasp"
    Set dbRs = New ADODB.Recordset
    dbRs.Open SQL, cn, adOpenStatic, adLockReadOnly
   
    Set grdPat.DataSource = dbRs
End Sub

Private Sub grdPat_HeadClick(ByVal ColIndex As Integer)
    dbRs.Sort = dbRs.Fields(ColIndex).Name
End Sub

Private Sub Form_Unload(Cancel As Integer)
    dbRs.Close
    Set dbRs = Nothing
    cn.Close
    Set cn = Nothing
End Sub
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 15.01.2007 (Пн) 13:45

Спасибо!

Я не сказал в последнем своем сообщении - что-то ADO мне показался слишком навороченным, в общем, снова я с DAO работаю. Приложение у меня малое, для одной локалки, и БД только *.mdb.

А с ADO все работает безотбойно. Приношу свои извинения.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 12.03.2008 (Ср) 20:45

Близкий по содержанию вопрос.
Private Sub DataGrid1_HeadClick(ByVal ColIndex As Integer) ' сортировка по столбцам
Adodc1.Recordset.Sort = DataGrid1.Columns(ColIndex).DataField
End Sub

Все работате, если тип поля не MEMO

Если тип поля MEMO, то выдает "Не удается применить порядок сортировки". Ошибка - Run-time error '-2147217824 (80040e60)'

Это можно преодолеть? Если можно, то как?
Спасибо!


Вернуться в Базы данных

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

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

    TopList