Topic: Как корректно отсортировать даты из запроса при клике на заголовок?

Таблица заполняется данными с помощью кнопки SQL запросa.
Столбец с датой в запросе выглядит так:
DATE_FORMAT(Tbl_Projects.Project_Date,'%d.%m.%Y') as 'Tbl_Projects.Project_Date' /* Дата проекта из строки преобразована в дату */ ,
Сортировка в таблице по умолчанию задана по id проекта, а не по дате.
Если нужно отсортировать список проектов по дате, то пользователь кликает на заголовок столбца с датой.
Но, сортировка происходит как у текстовых данных, а не как у дат.
Т.е. сначала идут все первые числа всех месяцев, потом вторые числа всех месяцев, затем третьи всех месяцев и т.д.
Как сделать корректную сортировку столбца с датами при клике на заголовок столбца?
....
Сообщение модератору форума: поиск по форуму очень неудобен, т.к. между запросами надо выдерживать 30 секунд.
Получается, что проще задать свой вопрос в форуме, чем попытаться найти ответ среди ранее заданных вопросов.

Re: Как корректно отсортировать даты из запроса при клике на заголовок?

Не делайте форматирование в запросе - именно из-за него данные становятся обычным текстом. Если вам нужно изменить формат отображения даты, сделайте это скриптом на клиенте в обработчике onChange()

Визуальное программирование: блог и телеграм-канал.

Re: Как корректно отсортировать даты из запроса при клике на заголовок?

Форматирование даты из запроса убрал.
Оказалось, что оно там и не нужно было.
Несмотря на то, что в самой базе дата хранится как yyyy-mm-dd, она выводится в таблицу как dd.mm.yyyy даже без скрипта.
Проверил - это определяется региональными настройками Windows.
Если поменять формат даты в настройках Windows, то таблица так и будет отображать.
Но, сортировка то происходит так, как будто в столбце не даты, а текст!
Т.е. сортировка дат происходит неверно.
....
Попробовал в запросе форматировать дату как yyyy-mm-dd.
Она успешно выводится в таблицу именно таким форматом.
А потом повесил на OnChange и AfterSort скрипт TNxDateColumn(Form1.TableGrid_1.Columns[1]).FormatMask := 'dd.mm.yyyy';
Но, он почему-то не срабатывает и дата остается в формате как было в запросе, т.е. yyyy-mm-dd
....
Есть ли у кого-нибудь мысли, как заставить столбец сортироваться как yyyy-mm-dd, а отображаться как dd.mm.yyyy ?

4 (edited by k245 2020-04-02 08:00:14)

Re: Как корректно отсортировать даты из запроса при клике на заголовок?

mikhail_a wrote:

Но, сортировка то происходит так, как будто в столбце не даты, а текст!
Т.е. сортировка дат происходит неверно.

Вы как сортировку задаёте? В запросе? Запрос в студию smile

Кликаете по колонкам? Проверил на последней версии, все работает:
http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=6443&download=0


P.S. Оставьте дату в запросе в покое и всё будет ОК. Я же вам уже писал, что вы своим форматированием делаете результат строкой smile

Post's attachments

Attachment icon 3.png 44.07 kb, 113 downloads since 2020-04-02 

Визуальное программирование: блог и телеграм-канал.

5 (edited by mikhail_a 2020-04-02 12:12:25)

Re: Как корректно отсортировать даты из запроса при клике на заголовок?

Сортировки и форматирования в запросе никаких не делаю.
Дату беру так: Tbl_Projects.Project_Date as 'Tbl_Projects.Project_Date'
форматирование даты сейчас закомментировано.   
Полный текст запроса приведен ниже.
Он большой, т.к. рассчитан еще на фильтрацию по значениям ряда полей на форме

.
.
.


    -- Запрос по кнопке Btn_Do_Project_Search 
   
    SELECT DISTINCT 
   
    CAST(Tbl_Projects.id AS Unsigned),     
                                                                                 
    -- DATE_FORMAT(Tbl_Projects.Project_Date,'%Y-%m-%d') as 'Tbl_Projects.Project_Date' /* Дата проекта из строки преобразована в дату
   
    Tbl_Projects.Project_Date as 'Tbl_Projects.Project_Date' ,                                                     
   
    Tbl_Projects.Project_Num as 'Tbl_Projects.Project_Num' /*Номер КП*/  ,
   
    Tbl_Projects.Project_Sum as 'Tbl_Projects.Project_Sum' /*Сумма КП*/  ,
                                                           
    Tbl_Clients.Client_Nick as 'Tbl_Clients.Client_Nick'  /*Имя заказчика*/  ,   
   
    Tbl_Projects.RFQ_From as 'Tbl_Projects.RFQ_From' /*Запрос от */  ,
   
    Tbl_Projects.RFQ_email as 'Tbl_Projects.RFQ_email' /*email - запроса*/  ,
                                                               
    Tbl_Projects.Project_Nick as 'Tbl_Projects.Project_Nick' /*Имя проекта (Шифр)*/  , 

    Tbl_Projects.Last_Project_Message as 'Tbl_Projects.Last_Project_Message' /*Комментарий к проекту*/  ,
                                                                                             
    Tbl_Project_Statuses.Project_Status_Name as 'Tbl_Project_Statuses.Project_Status_Name' /*Статус проекта, например, Готовим КП*/  , 
                                                                                                 
    CASE WHEN Tbl_Projects.IsClosed = 0 THEN 'ОТКРЫТ' ELSE '-' END as 'Tbl_Projects.IsClosed'    /*Состояние проекта - Открыт/Закрыт*/  ,
                                                                   
    Tbl_Projects.id_Tbl_Clients as 'Tbl_Projects.id_Tbl_Clients'   /*ID заказчика в таблице Проектов*/  ,   
                                                                                       
    Tbl_Projects.id_Tbl_Project_Statuses as 'Tbl_Projects.id_Tbl_Project_Statuses'  /*ID статуса в таблице проектов. Не удалять, т.к. отбор по статусу не будет работать*/ , 
   
    Tbl_Colors.Color_HEX_Code as 'Tbl_Colors.Color_HEX_Code' /* Цветовая метка */,     
   
    Tbl_Colors.Color_Name as 'Tbl_Colors.Color_Name' /* Значение метки */,
                               
    Tbl_Projects.id    /* id должен быть в конце, чтобы работало штатное редактирование/удаление записи*/

    FROM  Tbl_Projects                                                                 
   
    LEFT OUTER JOIN Tbl_Clients ON Tbl_Projects.id_Tbl_Clients=Tbl_Clients.id
    LEFT OUTER JOIN Tbl_Project_Statuses ON Tbl_Projects.id_Tbl_Project_Statuses=Tbl_Project_Statuses.id 
    LEFT OUTER JOIN Tbl_Colors ON Tbl_Projects.id_Tbl_Colors=Tbl_Colors.id 
   
    WHERE                                       
(CASE WHEN ({DateTimePicker_Period_From} IS NULL) THEN 1=1 ELSE ( Date(Tbl_Projects.Project_Date) >= Date({DateTimePicker_Period_From})) END) AND   
(CASE WHEN ({DateTimePicker_Period_To} IS NULL) THEN 1=1 ELSE ( Date(Tbl_Projects.Project_Date) <= Date({DateTimePicker_Period_To})) END) AND
   
    (CASE WHEN ('{Edit_Search_Project_ID}' = '') THEN 1=1 ELSE ( Tbl_Projects.id = '{Edit_Search_Project_ID}') END) AND
   
    (CASE WHEN ('{Edit_Search_Project_Number}' = '') THEN 1=1 ELSE ( Tbl_Projects.Project_Num LIKE '%{Edit_Search_Project_Number}%') END)  AND
   
    (CASE WHEN ('{Edit_Search_Project_Client}' = '') THEN 1=1 ELSE ( (Tbl_Clients.Client_Nick LIKE '%{Edit_Search_Project_Client}%') OR
                                                                        (Tbl_Projects.RFQ_From LIKE '%{Edit_Search_Project_Client}%') OR
                                                                        (Tbl_Projects.RFQ_email LIKE '%{Edit_Search_Project_Client}%') ) END)  AND
   
    (CASE WHEN ('{Edit_Search_Project_Nik}' = '') THEN 1=1 ELSE ( (Tbl_Projects.Project_Nick LIKE '%{Edit_Search_Project_Nik}%') OR
                                                                  (Tbl_Projects.Last_Project_Message LIKE '%{Edit_Search_Project_Nik}%') OR
                                                                        (Tbl_Projects.RFQ_body LIKE '%{Edit_Search_Project_Client}%')) END)  AND

--    (CASE WHEN ({ComboBox_Project_Status} < 0) THEN 1=1 ELSE ( Tbl_Projects.id_Tbl_Project_Statuses = '{Edit_StatusForSQL}' ) END) AND   

    (CASE WHEN ({ComboBox_Project_Status} < 0) THEN 1=1 ELSE ( Tbl_Projects.id_Tbl_Project_Statuses = '{ComboBox_Project_Status}' ) END) AND 

    (CASE WHEN ({CheckBox_IsClosed} = 0) THEN (Tbl_Projects.IsClosed = 0) ELSE ( (Tbl_Projects.IsClosed = 1) OR (Tbl_Projects.IsClosed = 0) ) END)

Re: Как корректно отсортировать даты из запроса при клике на заголовок?

Так а что у вас в этом варианте не работает? В самом запросе сортировки нет, значит записи будут выдаваться как бог на душу положит. При клике по колонкам неправильно сортируются строки таблицы?

Визуальное программирование: блог и телеграм-канал.

Re: Как корректно отсортировать даты из запроса при клике на заголовок?

Этот запрос сортировки не содержит.
Соответственно, при открытии формы все записи выводятся в порядке их id.
При этом, дата проекта выглядит как dd.mm.yyyy.
Но, дата нигде не форматируется к такому виду!
Если кликнуть на заголовок столбца с датами, то сортировка по датам срабатывает неправильно.
Такое ощущение, что таблица не понимает, что в данном столбце даты, а полагает, что это обычный текст.
...
Напоминаю, что данные в таблицу поступают не через настройку свойства Settings у таблицы,
а заносятся нажатием на кнопку, у которой на свойство Action подключен этот SQL запрос.
Может быть поэтому заполненная таблица не знает типа данных в cтолбцах?

8 (edited by derek 2020-04-03 01:24:04)

Re: Как корректно отсортировать даты из запроса при клике на заголовок?

Здравствуйте Mikhail,
Возможно, вы можете сделать это так.
1. В SQLQuery выберите поле даты дважды (один раз отформатированный как dd-mm-yyyy и один раз не отформатированный)
Затем в вашем сценарии
2. Скрыть столбец, содержащий поле неформатированной даты [Column 2]
3. Щелкните по столбцу, который содержит отформатированное поле даты [Column 1], и скрипт фактически сортирует по скрытому столбцу [Column 2].
4. Нажмите один раз, чтобы отсортировать по возрастанию, а затем нажмите еще раз, чтобы отсортировать по убыванию.
Может быть, это помогает.
С Уважением,
Derek.
.
Perhaps you can do it like this.
1.  In your SQLQuery, select your date field twice (once formatted as dd-mm-yyyy and once unformatted)
Then, in your script,
2.  Hide the column that contains the unformatted date field [Column 2]
3.  Click on the column that contains the formatted date field [Column 1] and the script actually sorts on the hidden column [Column 2]
4.  Click once to sort ascending and then click again to sort descending.

Post's attachments

Attachment icon date sort.zip 337.53 kb, 250 downloads since 2020-04-03