Проблемы сортировки в рекордсете

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Проблемы сортировки в рекордсете

Сообщение ger_kar » 15.04.2014 (Вт) 15:32

База Access (MS JET 4.0) Клиент VB6, доступ к данным через ADODB.
Суть проблемы с следующем:
Данные выбранные в рекордсет отображаются в связанном гриде, грид методами сортировки не обладает, поэтому сортировка ощуществляется методами рекордсета. Сортировка может быть по разным колонкам грида и фактически, после клика на соответсвующем заголовке столбца, просто перевешивается на другое поле рекордсета. Все работает хорошо и замечательно, пока не начать редактирование записей в той колонке, на которой висит сортировка. После редактирования и перемещения курсора к другой записи рекордсет начинает перестраивать записи так, что-бы только что отредактированная запись соответствовала порядку сортировки. В результате запись перемещается в другое место, может и очень далеко перескочить, а в той строке, куда был клик появляется совершенно другая запись, а не та, на которую пользователь собирался перейти. Такие кульбиты, особенно, когда в таблице много записей достаточно сильно напрягают и приводят к ошибкам, ибо, пользователь выбрал запись кликнул и начал редактирование, но получается, что уже не то :).
Я придумал решение этой проблемы, может оно и кривое, но по идее должно было работать, если бы не одно но!
Суть решения следуещее: Добавить в рекордсет дополнительное поле (я у себя назвал его 'N') и после того, как грид отсортировал свои данные и записи стали располагаться в нужном порядке, просто пробежаться по всем записям рекордсета и в это поле ('N') проставить последовательные значения (1, 2, 3,...,n), по количеству строк рекордсета, или наоборот (n, n-1, n-2,..., 1) в зависимости от направления сортировки и далее перевесить сортировку на это поле.
Так я мыслил пока не обломался на том, что дополнительному полю, котрое я добавляю в рекордсет, просто указав его в запросе
SELECT ..., 0 AS N FROM...
никакое новое значение присвоить нельзя. Т.е. поле является не обновляемым, что и понятно, и не редактируемым. Как я не пытался его сделать редактируемым, так ничего и не получилось. Можно конечно добавить такое поле по все таблицы базы данных, а заодно и в хранимые запросы и вьюхи, но таковых очень много, да и не хотелось бы изменять структуру базы для этого. Т.е. такой вариант не идет. И как по другому решить проблему тоже не знаю, поэтому обращаюсь за помощью и идеями. Может кто-то подобное уже даже делал :) . Или же нужно решить вопрос с полем, не привязанном к данным, в котором можно было бы менять значения, либо решить первоначальную проблему сортировки другим методом. Надеюсь, что общество поможет :)
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проблемы сортировки в рекордсете

Сообщение ger_kar » 15.04.2014 (Вт) 22:04

Ради эксперимента попробовал в одной из таблиц сделать нужное мне поле 'N' и эксперимент показал, что такой способ точно не подходит.
Сама сортировка выполняется как надо, но вот даже при 200 записях появляются заметные тормоза, вызванные обновлениями рекордсета с занесением значений этого поля в таблицу, в которую были добавлено экспериментальное поле 'N'.
Бороться и искать, найти и перепрятать

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

Re: Проблемы сортировки в рекордсете

Сообщение alibek » 16.04.2014 (Ср) 7:11

Как делается сортировка?
Lasciate ogni speranza, voi ch'entrate.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проблемы сортировки в рекордсете

Сообщение ger_kar » 16.04.2014 (Ср) 7:28

Через метод Sort объекта рекордсет.

Sort = sName & " ASC" или RS.Sort = sName & " DESC" В зависимости от направления сортировки, sName - поле рекордсета.

Вот весь код класса, который занимается этим вопросом :)

Код: Выделить всё
'--------------------------------------------------------------------------------------------------------
' Module    : CSortingGrid
' Date      : 21.11.2013
' Purpose   : Класс для сортировки в таблице грида
'--------------------------------------------------------------------------------------------------------

Option Explicit

'{CSortingGrid}
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'|Производит обработку кликов на заголовке грида и задает критерии сортировки в связанном с гридом
'|рекордсете. Для работы необходимо установить свойства ссылки на таблицу грида и связанный с ней
'|рекордсет
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


'[ПЕРЕМЕННЫЕ МОДУЛЯ]
    '
    Dim WithEvents m_Grid   As TDBGrid                  'Таблица грида
    '
    Dim WithEvents m_RS     As ADODB.Recordset          'Связанный с гридом рекорсдсет
    '
    Private m_lSort         As Long                     'Счетчик сортировки 0-Нет|1-Возрастание|2-Убывание
    Private m_lIndex        As Long                     'Индекс колонки грида
    Private m_oCol          As TrueOleDBGrid80.Column   'Колонка грида
    Private m_PicPos        As ForegroundPicturePositionConstants 'Положение указателя сортировки
    Private m_oFieldN       As ADODB.Field              'Поле рекордсета с именем 'N'
    Private m_flN           As Boolean                  'Флаг наличия поля 'N'
    Private m_flInitN       As Boolean                  'Флаг инициализации поля 'N'при первом обращении
    '

'////////////////////////////////////////////////////////////////////////////////////////////////////////
'                                    + С В О Й С Т В А   К Л А С С А +
'////////////////////////////////////////////////////////////////////////////////////////////////////////

'Property [Grid]            - Ссылка на экземпляр Грида, которым управляет класс
'********************************************************************************************* Read/Write
    Public Property Get Grid() As TDBGrid
        Set Grid = m_Grid
    End Property
   
    Public Property Set Grid(ByRef oGrid As TDBGrid)
        Set m_Grid = oGrid
        If Not m_Grid Is Nothing Then
            'При установке ссылки на грид устаналивается позиция стрелки указывающей сортировку
            m_Grid.HeadingStyle.ForegroundPicturePosition = m_PicPos
        End If
    End Property
'*********************************************************************************************

'Property [Recordset]       - Ссылка на рекордсет, связанный с гридом
'********************************************************************************************* Read/Write
    Public Property Get Recordset() As ADODB.Recordset
        Set Recordset = m_RS
    End Property
   
    Public Property Set Recordset(ByRef oRecordset As ADODB.Recordset)
        Set m_RS = oRecordset
        m_flInitN = False
        Call InitFieldN
        If m_flN Then m_flInitN = True
    End Property
'*********************************************************************************************

'Property [PicturePosition] - Позиция указателя сортировки
'********************************************************************************************* Read/Write
    Public Property Get PicturePosition() As ForegroundPicturePositionConstants
        PicturePosition = m_PicPos
    End Property
   
    Public Property Let PicturePosition(ByVal Position As ForegroundPicturePositionConstants)
        m_PicPos = Position
        If Not m_Grid Is Nothing Then
            m_Grid.HeadingStyle.ForegroundPicturePosition = Position
        End If
    End Property
'*********************************************************************************************


'////////////////////////////////////////////////////////////////////////////////////////////////////////
'                                      + М Е Т О Д Ы   К Л А С С А +
'////////////////////////////////////////////////////////////////////////////////////////////////////////

'Method [SortColumn]    - Активация сортировки в колонке по индексу
'**********************************************************************************************
    Public Sub SortColumn(ByVal ColIndex As Integer)
        Call m_Grid_HeadClick(ColIndex)
    End Sub
   
'Method [ResetSort]     - Сброс сортировки
'**********************************************************************************************
    Public Sub ResetSort()
        'Очистка грид от указателей сортировки
        If Not m_oCol Is Nothing Then m_oCol.HeadingStyle.ForegroundPicture = 0
        m_lIndex = 0: m_lSort = 0
        m_RS.Sort = vbNullString
    End Sub



'////////////////////////////////////////////////////////////////////////////////////////////////////////
'                                 + О Б Р А Б О Т Ч К И   С О Б Ы Т И Й +
'////////////////////////////////////////////////////////////////////////////////////////////////////////

'[m_Grid_HeadClick]
'********************************************************************************************************
    Private Sub m_Grid_HeadClick(ByVal ColIndex As Integer)
       
        Dim lLeftCol    As Long                     'Левая колонка грида
        Dim sName       As String                   'Имя колонки грида
'BeginPerformance
       
        If Not m_flInitN Then
            m_flInitN = True
            Call InitFieldN
        End If
       
        On Error Resume Next
       
        '//
        '// Положение стрелки указывающей сортировку определяется свойством грида
        '// [Grig].HeadingStyle.ForegroundPicturePosition
        '//
       
        'Если рекордсет в процессе добавления записи, то выход без обработки
        If m_RS.EditMode = adEditAdd Then Exit Sub
       
        'Предварительно очищаем грид от указателей сортировки
        If Not m_oCol Is Nothing Then m_oCol.HeadingStyle.ForegroundPicture = 0
       
        If m_lIndex <> ColIndex Then
            m_lIndex = ColIndex: m_lSort = 0
        End If
       
        Set m_oCol = m_Grid.Columns(ColIndex)
       
        If m_oCol.ButtonHeader Then
           
            m_lSort = m_lSort + 1: If m_lSort = 3 Then m_lSort = 0
           
            sName = m_oCol.DataField: If Len(sName) = 0 Then Exit Sub
           
            lLeftCol = m_Grid.LeftCol
           
                Select Case m_lSort
                   
                    Case 0      'Без сортировки
                        m_RS.Sort = vbNullString
                   
                    Case 1      'По возрастанию
                        m_RS.Sort = sName & " ASC"
                        m_oCol.HeadingStyle.ForegroundPicture = LoadResPicture(RES_UP, vbResBitmap)
'                        If m_flN Then Call SortingASC
                       
                    Case 2      'По убыванию
                        m_RS.Sort = sName & " DESC"
                        m_oCol.HeadingStyle.ForegroundPicture = LoadResPicture(RES_DOWN, vbResBitmap)
'                        If m_flN Then Call SortingDESC
                       
                End Select
           
            m_Grid.LeftCol = lLeftCol
           
        End If
'EndPerformance "Сортировка - "
    End Sub

'[Class_Initialize]
'********************************************************************************************************
    Private Sub Class_Initialize()
        m_PicPos = dbgFPRightOfText
    End Sub

'[Class_Terminate]
'********************************************************************************************************
    Private Sub Class_Terminate()
        Set m_oCol = Nothing
        Set m_Grid = Nothing
        Set m_RS = Nothing
        Debug.Print "CSortingGrid_Terminate"
    End Sub



'********************************************************************************************************
'********************************************************************************************************


'////////////////////////////////////////////////////////////////////////////////////////////////////////
'                                      ПРИВАТНЫЕ  ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
'////////////////////////////////////////////////////////////////////////////////////////////////////////


'[InitFieldN]
'========================================================================================================
'ПРОЦЕДУРА НАЧАЛЬНОЙ ИНИЦИАЛИЗАЦИИ СВЯЗАННОЙ С ПРОВЕРКОЙ НАЛИЧИЯ ПОЛЯ 'N'
'========================================================================================================
Private Sub InitFieldN()
    On Error GoTo ErrHandler
        Set m_oFieldN = m_RS.Fields.Item("N")
        m_flN = True
    On Error GoTo 0
    Exit Sub
ErrHandler:
    m_flN = False
End Sub


'[SortingASC]
'========================================================================================================
'ПРОЦЕДУРА УСТАНОВКИ СОРТИРОВКИ ПО ВОЗРАСТАНИЮ (ПРЯМОЙ)
'========================================================================================================
Private Sub SortingASC()
   
    Dim oRS     As ADODB.Recordset
    Dim I       As Long

    Set oRS = m_RS.Clone
        oRS.Filter = m_RS.Filter
        oRS.Sort = m_RS.Sort
        'Цикл по всем записям рекордсета
        I = 1
        oRS.MoveFirst
        Do Until oRS.EOF
            oRS("N").Value = I
            I = I + 1
            oRS.MoveNext
        Loop
        m_RS.Sort = "N ASC"
    Set oRS = Nothing

End Sub


'[SortingDESC]
'========================================================================================================
'ПРОЦЕДУРА УСТАНОВКИ СОРТИРОВКИ ПО УБЫВАНИЮ (ОБРАТНОЙ)
'========================================================================================================
Private Sub SortingDESC()

    Dim oRS     As ADODB.Recordset
    Dim I       As Long

    Set oRS = m_RS.Clone
        oRS.Filter = m_RS.Filter
        oRS.Sort = m_RS.Sort
        'Цикл по всем записям рекордсета
        I = oRS.RecordCount
        oRS.MoveFirst
        Do Until oRS.EOF
            oRS("N").Value = I
            I = I - 1
            oRS.MoveNext
        Loop
        m_RS.Sort = "N DESC"
    Set oRS = Nothing

End Sub

Бороться и искать, найти и перепрятать

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

Re: Проблемы сортировки в рекордсете

Сообщение alibek » 16.04.2014 (Ср) 9:26

TDBGrid — это TrueDB Grid? Не может быть, чтобы у него не было сортировки.
И смысл процедур SortingASC/SortingDESC я не уловил.

После того, как рекордсет был отсортирован, возможно нужно обновить или перепривязать грид.
Есть ли у него методы типа .Refresh или .Requery?
Чтобы записи не скакали после обновления сортируемого поля, попробовать поэкспериментировать с настройками, возможно в гриде можно определить условия, при которых он будет обновляться.
Lasciate ogni speranza, voi ch'entrate.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проблемы сортировки в рекордсете

Сообщение ger_kar » 16.04.2014 (Ср) 11:09

alibek писал(а):TDBGrid — это TrueDB Grid?
Он самый
alibek писал(а):Не может быть, чтобы у него не было сортировки.
В версии для платформы .Net сортировка есть, в версиях ActiveX сортировки нет.
alibek писал(а):После того, как рекордсет был отсортирован, возможно нужно обновить или перепривязать грид. Есть ли у него методы типа .Refresh или .Requery?
Да такие методы есть и сам грид обновляется без проблем, после обновления самого рекордсета. Т.е. применение сортировки к рекордсету благополучно срабатывает и порядок записей изменяется в соответствии с новым порядком сортировки. И вполне естественно, что в самом гриде, после его обновления, записи тоже расположены в этом порядке. Если редактируются записи в полях, к которым сортировка не применялась, то все ОК и записи стоят на месте никуда не двигаясь. Но стоит изменить поле, по которому отсортирован рекордсет, то он сразу же определяет место для измененной записи в соответствии с порядком сортировки. Например был первый символ у записи 'А' и запись была в середине списка, изменили 'А' на 'T', и после перемещения на соседнюю запись (например нижестоящую), например на 'Б', рекордсет пересортировав строки, отправит измененную строку ближе к концу списка, туда где и положено быть символу 'T', грид тоже обновится, запись в нем визуально перепрыгнет и указатель установится не на запись с символом 'Б', как планировалось, а на запись с символом 'У' идущую после записи с 'T'.
alibek писал(а):Чтобы записи не скакали после обновления сортируемого поля, попробовать поэкспериментировать с настройками, возможно в гриде можно определить условия, при которых он будет обновляться.
Ну изначально то обновляется сам рекордсет, а грид просто следует за ним, заставить его не обновляться не проблема, но тогда получается полная задница, ибо сами записи перестают соответствовать строкам грида.
alibek писал(а):И смысл процедур SortingASC/SortingDESC я не уловил.
Смысл, точнее замысел был такой. После применения соответствующей сортировки, например в порядке возрастания
Код: Выделить всё
Case 1      'По возрастанию
                        m_RS.Sort = sName & " ASC"
                        m_oCol.HeadingStyle.ForegroundPicture = LoadResPicture(RES_UP, vbResBitmap)
'                        If m_flN Then Call SortingASC
Указатель сортировки рисуется в нужной колонке грида, и далее вызывается Call SortingASC, (которая находится в закомментированном виде). Задача этой процедуры такова, в дополнительном поле рекордсета 'N' с первой, до самой последней записи проставить возрастающие значения от 1 до номера последней записи. И после этого перевесить сортировку на это поле рекордсета. При этом в гриде визуально ничего не поменяется, так как сам порядок сортировки не изменяется и можно редактировать записи как угодно, ничего скакать не будет, так как порядок сортировки определяется полем 'N', а оно не отображается и по сему не изменяется.
Но проблема в том, что если поле не существует реально в таблице, а просто задано в запросе, то присвоить ему значение не получается, вот в этом весь затык.
Последний раз редактировалось ger_kar 16.04.2014 (Ср) 15:56, всего редактировалось 1 раз.
Бороться и искать, найти и перепрятать

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

Re: Проблемы сортировки в рекордсете

Сообщение alibek » 16.04.2014 (Ср) 14:51

Если уж применять костыль, то другим способом:
1. В событии BeforeUpdate (такое наверняка существует, это для гридов чуть ли не стандарт) запомнить ID записи, на которую пользователь планирует переместиться.
2. В событии AfterUpdate перейти на ту запись, которая была запомнена ранее.
Lasciate ogni speranza, voi ch'entrate.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проблемы сортировки в рекордсете

Сообщение ger_kar » 16.04.2014 (Ср) 21:21

Ну можно конечно и так сделать, но все равно такой костыль на мой взгляд костыльнее, чем мой вариант (если бы его удалось реализовать), так как сортировка достаточно ресурсоёмкий процесс и при редактировании, раз за разом будет совершаться большое количество не нужных действий, сопровождаемые неприятным визуальным эффектом подергивания записей. Кроме этого, если бы удалось решить проблему добавления дополнительного редактируемого поля, в которое можно было бы записывать данные, то это могло пригодится и при решении других задач, так как потребность в таком поле периодически возникает. Это конечно можно обойти и пока такие проблемы решаемы обходными путями, но с редактируемым полем решения были бы более эффективными. Я применяю термин именно, редактируемое, а не обновляемое, так как обновляемое поле способно вносить обновления в источник данных, а для редактируемого поля, это не нужно.
Что касается проблемы сортировки, то конечно идеальным решением была бы блокировка обновления сортировки, после каждой правки. У рекордсета очень много динамических свойств, может какое нибудь и отвечает за этот момент поведения рекордсета, но пока поиск ни к чему не привел.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проблемы сортировки в рекордсете

Сообщение ger_kar » 21.04.2014 (Пн) 17:35

alibek писал(а):Если уж применять костыль, то другим способом:1. В событии BeforeUpdate (такое наверняка существует, это для гридов чуть ли не стандарт) запомнить ID записи, на которую пользователь планирует переместиться.2. В событии AfterUpdate перейти на ту запись, которая была запомнена ранее.
Попробовал такой способ, конечно лучше, чем просто голая сортировка, но совсем не то, что хотелось бы.
Как не пробовал, проблему с редактируемым полем так пока и не решил. Пока думал над решением этого вопроса, пришла такая мысль. Может попробовать узнать структуру и принцип хранения данных рекордсета в памяти, научится вычислять нужные адреса и писать прямо в память в обход интерфейса. Конечно это очень черный кодинг получится, но раз по другому не выходит... Да и к тому же ADODB наверное уже не будет обновляться. Со времен последнего обновления времени прошло уже не мало. Видимо мелкомягкие забросили эту технологию окончательно.
Бороться и искать, найти и перепрятать

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

Re: Проблемы сортировки в рекордсете

Сообщение alibek » 22.04.2014 (Вт) 17:02

Лучше используй другой грид, раз в этом нельзя управлять режимом обновления.
Если грид поддерживает работу в виртуальном режиме, попробуй использовать его.
Lasciate ogni speranza, voi ch'entrate.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проблемы сортировки в рекордсете

Сообщение ger_kar » 22.04.2014 (Вт) 20:11

Вот ведь как бывает в жизни - ищешь одно, а находишь совершенно другое.
Нашел я таки способ добавлять при открытии нужные дополнительные редактируемые поля. Пока бороздил просторы интернета в поисках ответа на очередную проблему, попалось вот это http://msdn.microsoft.com/en-us/library/windows/desktop/ms681565(v=vs.85).aspx.
Тесты показали, что сия конструкция вполне пригодна для использования для обозначенной мною в этой теме задачи.
Правда сначала тоже пришлось слегонца помучатся часок - другой. Проблема была в том, что переделав свой запрос я оставил в конце по привычке символ ';' как знак окончания запроса, но как оказалось провайдер MSDataShape этого не понимает. Зато после стольких мучений все работает в лучшем виде :) Поле оказалось именно редактируемым, проблем с обновлением рекордсета не привносит, так как в базе ничего не обновляется, то и работает все очень быстро. Время сортировки конечно немного увеличилось, но не визуально этого не заметно вообще. Зато самая идея воплотилась именно так, как и была изначально задумана. Может еще будут грабли, но пока таковых не наблюдается.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.04.2014 (Ср) 9:44

Неужели только мне кажется, что запись должна перемещаться, и фиксить надо только выбор неправильной при клике?

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

Re:

Сообщение alibek » 23.04.2014 (Ср) 16:11

Qwertiy писал(а):Неужели только мне кажется, что запись должна перемещаться, и фиксить надо только выбор неправильной при клике?

Проблема не в перемещении записи, а в том, что при покидании записи выбирается не та запись, на которую осуществлялся переход до сортировки.
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.04.2014 (Ср) 16:31

alibek писал(а):
Qwertiy писал(а):Неужели только мне кажется, что запись должна перемещаться, и фиксить надо только выбор неправильной при клике?

Проблема не в перемещении записи, а в том, что при покидании записи выбирается не та запись, на которую осуществлялся переход до сортировки.

Так я ж именно это и написал ;)

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Проблемы сортировки в рекордсете

Сообщение ger_kar » 23.04.2014 (Ср) 17:56

Qwertiy писал(а):Неужели только мне кажется, что запись должна перемещаться, и фиксить надо только выбор неправильной при клике?
В каких то случаях должна и это будет нормальным и удобным, но в большинстве случаев перемещение, во первых, абсолютно не нужно, а во вторых, приводит к разным казусам и неудобствам. Про лишнюю трату ресурсов я вообще помолчу. Если например взять большой список файлов из любой папки (например System32, как пример папки с большим количеством файлов), отсортированный по имени, и начать в нем учинять массовые правки, то при изменении имен после редактирования, файлы никуда прыгать сразу не будут, а будут спокойненько оставаться на своем месте, а порядок сортировки изменится только при обновлении, когда того пожелает сам юзер. И такой подход в большинстве случаев самый удобный и оптимальный.
alibek писал(а):Проблема не в перемещении записи, а в том, что при покидании записи выбирается не та запись, на которую осуществлялся переход до сортировки.
Да эта проблема была, той самой, которая напрягала больше всего и которая приводила к куче ошибок, но так, как она разрешилась в моем случае, с применением редактируемого поля, она решила и кучу других недостатков связанных с поведением рекордсета при сортировке и привела к поведению, аналогичному с поведением файловой сортировки о которой я написал выше.
Кроме этого я уже давно искал возможность добавления таких поле в рекордсет, так как это открывает массу дополнительных возможностей при программировании бизнес объектов в приложениях, работающими с реляционными базами данных. Причем существование провайдера MSDataShape было для меня далеко не новостью, и использование этого провайдера предусмотрено в моем приложении изначально, но вот именно о таком применении я почему то даже не догадывался.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.02.2015 (Пт) 9:23

А если заменой по регулярке? Хотя не в курсе, есть ли это в MySQL.

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

Re: Проблемы сортировки в рекордсете

Сообщение alibek » 27.02.2015 (Пт) 9:24

Встроенного способа в MySQL нет, но есть куча велосипедов по поисковому запросу «mysql strip html tags».
Впрочем, сама идея некорректная, ее невозможно однозначно понять и реализовать.
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList