Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сортировка записей по дате (по месяцу и году) / 25 сообщений из 56, страница 1 из 3
13.07.2010, 10:06
    #36737395
Mazai-XZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Доброго времени суток!
Если кратко, то: Нужен алгоритм сортировки записей по дате (по месяцу и году).
Есть БД на акцессе, есть форма на VB. На форме 2 комбобокса 1- выбор месяца, 2-выбор года и кнопка "Сортировка".


Подробное описание вопроса:
Есть БД на акцессе, в ней поле "дата", ну тоесть во время работы проги создаётся запись в бд и в поле "дата" проставляется дата создания записи в формате ХХ.ХХ.ХХХХ. После запуска проги в работу для сортировки этих записей по датам использовал корявую, но всё-таки рабочую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 Dim M
M = Combo5.ListIndex +  1 
If M <  10  Then M = "0" & M
apbase.Adodc3.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath & ";Mode=ReadWrite|Share Deny None;Persist Security Info=False"
apbase.Adodc3.RecordSource = "SELECT * FROM dkp Where data like '" & "%." & M & ".%' order by data"
Set apbase.DataGrid3.DataSource = apbase.Adodc3
apbase.Adodc3.CommandType = adCmdText
apbase.Adodc3.CursorType = adOpenDynamic
apbase.Adodc3.Refresh 
М - это индекс поля со списком, тоесть если выбираю в списке Январь месяц, то это соответсвует индексу 0, тоесть М будет ровняться 1, далее приписываю к нему нолик, ибо даты в формате хх.хх.хххх, и далее уже ищу в базе. Но так как прога работает уже не первый год и в базе скопилось куча записей, то возникла проблема сортировки: при выборе, например, января месяца прога благополучно выдаёт все записи сделанные в январе ... 2008, 2009 и 2010 годов. Подскажите, как ограничить поиск конкретным годом?



Заранее благодарен!!! )))
...
Рейтинг: 0 / 0
13.07.2010, 10:41
    #36737467
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
1) Кажется вы путаете сортировку с фильтром, будьте внимательнее в терминах
2) Прежде, чем рассматривать ваше [censored] решение, cкажите на милость, почему нельзя в базе сделать поле типа "дата" и отбирать записи как положено. К тому же сделать на этом поле индекс и ускорить работу на несколько порядков
...
Рейтинг: 0 / 0
13.07.2010, 15:34
    #36738657
Mazai-XZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.Pro1) Кажется вы путаете сортировку с фильтром, будьте внимательнее в терминах
2) Прежде, чем рассматривать ваше [censored] решение, cкажите на милость, почему нельзя в базе сделать поле типа "дата" и отбирать записи как положено. К тому же сделать на этом поле индекс и ускорить работу на несколько порядков
мм, возможно и перепутал термины, строго не судите! )))
В общем таблица акцесовская (журнал учёта документов в комиссионном магазине), в ней поля:
Номер договора, продавец, покупатель, Транспортное средство, дата оформления. Раз в месяц отчёт делаю об оформленных договорах за месяц, ну так вот прога выбирает договора в нужный мне месяц, но за ВСЕ годы работы, за прошлый и так далее, естественно не удобно, нужно чтоб выбирались договора только нужного месяца нужного года (например за январь 2010, март 2008 и т.д и т.п.) Вот так. Поле "Дата оформление" в формате дата. Причём краткий отчёт (по конкретному числу) выводиться коректно, тоесть выводятся все записи, относящиеся только к выбранной дате, а вот с месячной сортировкой (фильтром) нифига ((((
...
Рейтинг: 0 / 0
13.07.2010, 17:17
    #36739020
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Mazai-XZПоле "Дата оформление" в формате дата.
Так как вы даете противоречивую информацию, я дополнительно хочу уточнить
тип поля "Дата оформление" - ДАТА
А не текст, правильно?
Потому что тогда утверждение "проставляется дата создания записи в формате ХХ.ХХ.ХХХХ." является бредом, так данные типа "дата" хранятся не в виде текста, а в виде 8-мибайтного числа и с ней нельзя работать так, как вы работаете.

Если подтверждаете, что это дата - напишу, как должен выглядеть ваш запрос.
...
Рейтинг: 0 / 0
13.07.2010, 18:02
    #36739143
Mazai-XZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Да, сейчас проверил в самой бд формат этого поля, там стоит Дата/время. Как я писал выше вормат xx.xx.xxxx, этоя имел в виду дд.мм.гггг в смысле например если текущее число 1 января 2010 года, то в базу заностится 01.01.2010, а не 01.1.10 ну или как-либо иначе, точнее если число до 10го, то записывается 2 символами 01, 02 и так дклее, также месяц до 10 записывается 01, 02 и т.д. вот. При фильтрации в ДатаГриде остаются только нужные (найденые) записи, которые можно либо на форме просмотреть, либо вывести на печать. Вот. Благодарю за внимание )
p.s. Может это и полнейшее программерское невежество, но форматы полей я изначально создал в акцессе
...
Рейтинг: 0 / 0
13.07.2010, 18:10
    #36739169
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Mazai-XZp.s. Может это и полнейшее программерское невежество, но форматы полей я изначально создал в акцессе
Совершенно верно. Вы не только не отличаете сортировку от фильтра, но и формат данных от типа поля. Отсюда не можете написать правильный запрос. Конечно, стоит почитать хоть какую-нить книжку по аксессу.

Еще раз обращаю ваше внимание - в поле ТИПА ДАТА хранится ЧИСЛО ДНЕЙ, а как вы его видите, в виде дд-мм-гггг или гггг-мм зависит исключительно от той программы, через которую вы смотрите на это поле.

ща освобожусь, напишу запрос....
...
Рейтинг: 0 / 0
13.07.2010, 18:40
    #36739224
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
В общем, самым простым решением в вашем случае будет такое:

Код: plaintext
apbase.Adodc3.RecordSource = "SELECT * FROM dkp Where data Between DateSerial("+CStr(Y)+","+CStr(M)+",1) And DateSerial("+CStr(Y)+","+CStr(M+ 1 )+",0) order by data"

Где Y - числовая переменная, содержащая год, M - числовая переменная, содержащая месяц
...
Рейтинг: 0 / 0
13.07.2010, 18:43
    #36739230
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.ProВ общем, самым простым решением в вашем случае будет такое:
При таком запросе будет использоваться индекс по полю Data (а я надеюсь, что он есть), запрос будет выполняться сильно быстрее.
...
Рейтинг: 0 / 0
13.07.2010, 20:32
    #36739335
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.Pro
При таком запросе будет использоваться индекс по полю Data (а я надеюсь, что он есть), запрос будет выполняться сильно быстрее.

Вообще-то чтобы использовался индекс - уберите функции из условия!
...
Рейтинг: 0 / 0
13.07.2010, 20:35
    #36739338
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
AndrFВообще-то чтобы использовался индекс - уберите функции из условия!
Функции в условии нет!
Точнее так: само поле не участвует в функции, поэтому индекс может быть использован, а значение функции будет вычислена ДО выборки. Так что все ок.
...
Рейтинг: 0 / 0
13.07.2010, 20:44
    #36739350
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.ProAndrFВообще-то чтобы использовался индекс - уберите функции из условия!
Функции в условии нет!
Точнее так: само поле не участвует в функции, поэтому индекс может быть использован, а значение функции будет вычислена ДО выборки. Так что все ок.

Рассчитывать на сильную разумность Access-a я бы не стал. Тем более в тех случаях когда функция прекрасно выкидывается из условия.
...
Рейтинг: 0 / 0
13.07.2010, 20:48
    #36739352
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
AndrFРассчитывать на сильную разумность Access-a я бы не стал.
А как правильно представить дату для аксесса, чтобы ИЗБЕЖАТЬ явного или неявного преобразования (что опять же будет ничем не лучше DateSerial)? Так?

#mm/dd/yyyy#
...
Рейтинг: 0 / 0
13.07.2010, 21:19
    #36739385
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
AndrFРассчитывать на сильную разумность Access-a я бы не стал.
Ню-ню...


- Сэр, Вы эстет?
- Нет, я гомосексуалист, но зато какие краски!
...
Рейтинг: 0 / 0
13.07.2010, 21:19
    #36739386
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
mds_world, как спец рассуди нас!
...
Рейтинг: 0 / 0
13.07.2010, 21:34
    #36739398
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.Pro,

то, что ты предложил, это так называемый "динамический" запрос, или динамическая сборка запроса. Все переменные/функции подставляются на этапе сборки и компиляции строки. Запрос выполняется с уже подставленными строковыми/числовыми/датными константами. Разумется, все индексы работают.

Могу еще добавить, что эта операция настолько часта, тривиальна и эффективна одновременно, что попала в ФАК акцесса.
...
Рейтинг: 0 / 0
13.07.2010, 22:05
    #36739414
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
mds_world,

AndrF, насколько я понимаю, смутило именно то, что я выполнил DateSerial на стороне сервера, а не на стороне клиента. Я бы выполнил ее на стороне клиента, то вдруг осознал, что не знаю, как правильно передавать дату аксессу, чтобы избежать неявного преобразования. Когда-то давно, когда работал еще с аксессом, передавал, как указал выше, в решетках, но, честно говоря, не знаю, правильно ли это. Просвети тогда уж...
...
Рейтинг: 0 / 0
13.07.2010, 22:45
    #36739452
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.Pro,
да, не обратил внимания на Dateserial. Действитено, нужно вытащить все приваивания из строки и серверу передавать готовые даты.
...
Рейтинг: 0 / 0
13.07.2010, 22:49
    #36739456
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
mds_worldShocker.Pro,
да, не обратил внимания на Dateserial. Действитено, нужно вытащить все приваивания из строки и серверу передавать готовые даты.
И в третий раз спрошу.
Так как передавать дату серверу, чтобы избежать неявного преобразования? В формате #mm/dd/yyyy#?
...
Рейтинг: 0 / 0
13.07.2010, 23:10
    #36739488
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Черт, отвлекают бесконечно

Сервер Jet аксовский? Если формировать строку, то надо в американском формате #mm/dd/yyyy#. Иначе могут быть ошибки при вхождении данных, подготовленных в другой локализации.
Но DateSerial даст правильный результат в любом случае. Дата ведь число типа Double. И DateSerial готовит дату однозначно, вне зависимости от локализации. Другой способ подать дату в строку (когда нет готового разбиения на элементы даты) это сформировать дату с помощью функции Format и придать ей решетки для указания типа данных.
...
Рейтинг: 0 / 0
13.07.2010, 23:13
    #36739494
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Другими словами, твой вариант вполне рабочий
...
Рейтинг: 0 / 0
14.07.2010, 00:08
    #36739574
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
mds_worldДругими словами, твой вариант вполне рабочий
Ну слеплю тогда еще и клиентский вариант, чтобы снять вопросы

Код: plaintext
1.
apbase.Adodc3.RecordSource = "SELECT * FROM dkp Where data Between #" + _
  Format$(DateSerial(Y,M, 1 ),"mm\/dd\/yyyy") + "# And #" + Format$(DateSerial(Y,M+ 1 , 0 ),"mm\/dd\/yyyy") + "# order by data"
...
Рейтинг: 0 / 0
14.07.2010, 00:24
    #36739586
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Наноупрощение (чтоб не лепить решетки отдельно)
Код: plaintext
"\#mm\/dd\/yyyy\#" 
...
Рейтинг: 0 / 0
14.07.2010, 00:32
    #36739599
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
mds_worldНаноупрощение (чтоб не лепить решетки отдельно)
Код: plaintext
"\#mm\/dd\/yyyy\#" 

Пикоупрощение:
Код: plaintext
1.
2.
Public Function SQLDate(Dat As Date) As String
  SQLDate=Format$(Dat,"\#mm\/dd\/yyyy hh:mm:ss\#")
End Function
...
Рейтинг: 0 / 0
14.07.2010, 00:33
    #36739605
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.Pro
Код: plaintext
1.
2.
Public Function SQLDate(Dat As Date) As String
  SQLDate=Format$(Dat,"\#mm\/dd\/yyyy hh:mm:ss\#")
End Function


виноват: hh:nn:ss
...
Рейтинг: 0 / 0
14.07.2010, 00:47
    #36739614
aduka05adm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка записей по дате (по месяцу и году)
Shocker.Pro,
проще поле дата сделать как текстовое , мне так кажется.
вы сами его как делаете?
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сортировка записей по дате (по месяцу и году) / 25 сообщений из 56, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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