"Неправильное" отображение даты в MSHFlexGrid

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

"Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 18.01.2013 (Пт) 19:02

Здравствуйте.
Имеем на форме MSHFlexGrid, который отображает дату из БД Access 2007. Формат поля в самой БД, естественно, "Дата/время". Сначала отображал "11/11/2011". Я не люблю такой разделитель: "/". Хочу точку. Сделал так:

Код: Выделить всё
With hflPat     
    For i = 1 To .Rows - 1
        .TextMatrix(i, 5) = Format(.TextMatrix(i, 5), "dd.mm.yyyy") 'дата рождения
        .TextMatrix(i, 6) = Format(.TextMatrix(i, 6), "dd.mm.yyyy") 'дата регистрации
    Next
End With


Теперь недружащий с головой MSHFlexGrid отображает дату с глюком: дата регистрации 07 января 2013 года. Т.е., он должен отображать "07.01.2013". А он отображает "01.07.2103". Вот тут уже у меня дружба с головой заканчиваться начала. Причем он так отображает все даты, где "дд"<=12.
Как это понять? И как это исправить?

ЗЫ Не могу найти, как приаттачить к теме *.ipg, я там скриншот грида с глюком сделал... :(

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

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение ger_kar » 18.01.2013 (Пт) 19:21

Osteon писал(а):ЗЫ Не могу найти, как приаттачить к теме *.ipg, я там скриншот грида с глюком сделал...
Элементарно. Сначала нужно кликнуть по кнопке "Полная версия" внизу ответа, далее открыть вкладку "Добавить вложения", ну и далее...
Бороться и искать, найти и перепрятать

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 19.01.2013 (Сб) 18:05

Дякую... :D
Вот там, где "01.07.2013", "01.08.2013","01.09.2013" - эти все записи были 7-го, 8-го и 9-го января 2013-го... А вот 18.01.2013 - это уже корректно отображается, т.к. 18>12... :evil:
Как-то вот так... :roll:
А вот за 12-й год - это я уже и сам не знаю, недосуг выискивать было... И так, и так подходит... :x
Кстати, так же и в предыдущем поле, там, где "Дата рожд."
Вложения
Date.jpg
Date.jpg (54.99 Кб) Просмотров: 6933

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

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение ger_kar » 19.01.2013 (Сб) 18:16

А что если вместо
.TextMatrix(i, 5) = Format(.TextMatrix(i, 5), "dd.mm.yyyy")
Сделать
.TextMatrix(i, 5) = Replace(.TextMatrix(i, 5), "/", ".")
Т.е. тупо заменить слеш на точку.
Можно было бы конечно экспериментировать, но создавать базу, наполнять ее данными, писать небольшое приложение для проверки лениво. Если не получится с заменой слеша на точку то выкладывай тестовый вариант.
Бороться и искать, найти и перепрятать

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 21.01.2013 (Пн) 10:43

С заменой слэша вариант "проканал", но - теперь он выдает формат даты в виде "mm.dd.yyyy", причем цифру до 10 он пишет одной цифрой (не 01.01.2001, а 1.1.2001), т.е. получается разная длина записи даты, что опять же коряво смотрится на экране... (см. рисунок)
Вложения
Date.jpg
Date.jpg (59.25 Кб) Просмотров: 6919

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 24.01.2013 (Чт) 14:17

Заглохла тема? :( Ребята, ведь вопрос открытый остается... :cry:

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение FireFenix » 24.01.2013 (Чт) 14:57

Написать свою функцию форматирования, в чём проблема?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 25.01.2013 (Пт) 8:01

Я думал, для этого глюка микрософт уже что-то предусмотрел... :( Возюкаться теперь... :evil:

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

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение ger_kar » 25.01.2013 (Пт) 9:12

Может это подойдет?
Можно еще FormatDateTime(Date[,NamedFormat]) попробовать
Date Обязательный. Форматируемое выражение для даты и времени
NamedFormat Необязательный. Числовое выражение, указывающее используемый формат для даты и времени. Если параметр опущен, применяется формат, задаваемый константой vbGeneralDate

Для параметра NamedFormat используются следующие установки
vbGeneralDate = 0 - Отображаются дата и/или время. При наличии области даты она отображается в коротком формате для даты. Если присутствует часть, относящаяся к времени, то время отображается в длинном формате для времени. При наличии обеих частей – производится их отображение.
vbLongDate = 1 - Отображается дата с использованием длинного формата для даты, заданного национальными установками компьютера
vbShortDate = 2 Отображается дата с использованием короткого формата для даты, заданного национальными установками компьютера
vbLongTime = 3 Отображается время с использованием формата для времени, заданного национальными установками компьютера
vbShortTime = 4 Отображается время с использованием 24-часового формата (hh:mm)

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

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

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение alibek » 30.01.2013 (Ср) 10:20

Osteon писал(а):.TextMatrix(i, 5) = Format(.TextMatrix(i, 5), "dd.mm.yyyy") 'дата рождения

За такое надо линейкой по рукам.
Во-первых Format$, а не Format.
Во-вторых, дату бери из поля БД, а не из текста ячейки.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Qwertiy » 30.01.2013 (Ср) 21:54

alibek писал(а):Во-вторых, дату бери из поля БД, а не из текста ячейки.

Это как раз "во-первых", т. к. теперь я понял, почему форматирование неверное. Дата считывается с уже отформатированной строки и в неверном порядке.

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 11:54

alibek писал(а):За такое надо линейкой по рукам.
Во-первых Format$, а не Format.
Во-вторых, дату бери из поля БД, а не из текста ячейки.


Глубокоуважаемый alibek! Готов отдать и руки, и голову для твоей линейки!!! Теперь я тоже это понял. Вот только одна закавыка...

Я делаю так:

Код: Выделить всё
Dim rsMove As ADODB.Recordset

dbName = App.Path & "\Base\Sborka.mdb"

Set cnDB = New ADODB.Connection
cnDB.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbName
cnDB.Open

Set rsMove = New ADODB.Recordset
sSQL = "SELECT * FROM Pasp"
rsMove.Open sSQL, cnDB, adOpenStatic, adLockPessimistic

Set flxMove.DataSource = rsMove 'flxMove - MSHFlexGrid


Теперь, судя по твоему справедливому замечанию, мне нужно снова заряжать цикл, перебирать все рекордсеты, считывать дату из поля БД, потом впихивать его в отформатированном формате в грид? Я попробовал в SQL-запрос запихать "Format(ПолеБД, "dd.mm.yyyy")", что-то типа sSQL = "SELECT Format(DaReg, "dd.mm.yyyy") FROM Pasp"
VB6 естественно, меня послал... (см. вложение) :cry: Чую, что с запросом мудрю, только не знаю как через SQL и .DataSource вывести отформатированную дату в грид.

Подскажите, как практически применить ""Format(ПолеБД, "dd.mm.yyyy")""?
Вложения
Scr.jpg
Scr.jpg (80.34 Кб) Просмотров: 6832

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Хакер » 04.02.2013 (Пн) 11:57

Кавычки в кавычках. Ты сам понимаешь смысл написанного? Похоже, что нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 12:21

Похоже, что нет... :oops: Тогда как задавать формат для Format? Выводить через chr()? Как-то коряво...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Хакер » 04.02.2013 (Пн) 12:23

А БД, к которой адресуется запрос, располагает встроенной фукнцией Format?

Кавычка в строке оформляется так: MsgBox "Слово в ""кавычках"" — это прекрасно"
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 12:25

Хакер писал(а):А БД, к которой адресуется запрос, располагает встроенной фукнцией Format?

БД - Access 2007

Хакер писал(а):Кавычка в строке оформляется так: MsgBox "Слово в ""кавычках"" — это прекрасно"

Спасибо! Щас спробую... :D

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 12:37

Сделал так:
Код: Выделить всё
sSQL = "SELECT Format(DaReg, ""dd.mm.yyyy"") FROM Pasp"


а потом так:
Код: Выделить всё
sSQL = "SELECT Format(DaReg, 'dd.mm.yyyy') FROM Pasp"


Работают оба варианта (см. вложение)

Большое всем спасибо-преспасибо!!! :D :D :D
Вложения
Scr.jpg
Scr.jpg (71.11 Кб) Просмотров: 6823

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 12:40

Хакер, будешь в 20-м мкр-не - поклонись дому на Шухова,10 - я там жил в конце 80-х... :wink: :)

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 12:49

alibek писал(а):Во-первых Format$, а не Format.

У меня работает... и с $, и без него... Format$ - это принципиально, если у меня переменная sSQL для создания SQL-запроса создана As String? Не сочтите за назойливость... :oops:

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

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение ger_kar » 04.02.2013 (Пн) 14:32

Да принципиально! Format$ возвращает строку, т.е. работает со строковым типом, Format возвращает значения с типом Variant и субтипом строки. Это же касается и любых других строковых функций таких Mid (Mid$), Left (Left$), Right (Right$) и т.п. Работать конечно будет и с Format, и ошибку "Type mismatch" ("Неверный тип") это не вызовет, потому, что Variant может содержать строки. Но это сильно скажется на потреблении ресурсов и быстродействии, тем более, что функция будет вызываться при формировании рекордсета.
Бороться и искать, найти и перепрятать

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

/offtop

Сообщение Qwertiy » 04.02.2013 (Пн) 15:02

ger_kar писал(а):Format$ возвращает строку, т.е. работает со строковым типом, Format возвращает значения с типом Variant и субтипом строки.

А зачем вообще надо было делать функцию, возвращающую Variant? Ведь Variant из строки всегда можно сделать.

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

Re: /Offtop

Сообщение ger_kar » 04.02.2013 (Пн) 16:43

Qwertiy писал(а):А зачем вообще надо было делать функцию, возвращающую Variant?
Тогда скорее не функцию, а семейство функций которые существуют парами и возвращают String/Variant. Их достаточно много, но что интересно новые функции, которые появились только в VB6 (если верить справке :) ), такие как Filter, InstrRev, Join, Split, StrReverse существуют только в стринговом варианте. Видимо была какая то особая задумка, по поводу Variant'а, которая впоследствии стала не актуальной и от неё отказались. Я думаю так. Но это никак не проверить :roll: , тут можно только гадать. Я например никогда вариантные варианты функций не использовал.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Хакер » 04.02.2013 (Пн) 16:46

Qwertiy писал(а):А зачем вообще надо было делать функцию, возвращающую Variant? Ведь Variant из строки всегда можно сделать.

А теперь представь, что было бы двухпараметрическое свойство не TextMatrix, а просто Matrix, типа не String, а Variant. Тогда по рукам надо было бы бить при использовании именно Format$ вместо Format.

И таких случаев достаточно много: когда аргумент ожидает получить Variant, а вы ему скармливаете Left$ вместо Left, вы только увеличиваете число никому не нужных антисимметричных конвертаций.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Qwertiy » 04.02.2013 (Пн) 17:58

Хакер писал(а):А теперь представь, что было бы двухпараметрическое свойство не TextMatrix, а просто Matrix, типа не String, а Variant. Тогда по рукам надо было бы бить при использовании именно Format$ вместо Format.

Ну при наличии двух функций это понятно.

Хакер писал(а):И таких случаев достаточно много: когда аргумент ожидает получить Variant, а вы ему скармливаете Left$ вместо Left, вы только увеличиваете число никому не нужных антисимметричных конвертаций.

Видимо я чего-то не понимаю. Вот мои рассуждения. Есть строка. Для неё вызвали функцию, которая с ней что-то сделала. Логично предположить, что получилась строка. Зачем нужен ещё один вариант функции, который конвертирует её в Variant, если VB способен сделать это сам?

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 19:12

ger_kar писал(а):Да принципиально! ... Но это сильно скажется на потреблении ресурсов и быстродействии, тем более, что функция будет вызываться при формировании рекордсета.


Ясненько!!! Спасибо за учебу! :!: :!: :!:
А вообще, даже не ожидал, что уважаемые гуру будут так активны в этой, казалось бы, незначительной темке... :roll:

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение Osteon » 04.02.2013 (Пн) 19:13

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение iGrok » 04.02.2013 (Пн) 21:04

Qwertiy писал(а):Зачем нужен ещё один вариант функции, который конвертирует её в Variant, если VB способен сделать это сам?

При форматировании создаётся новая строка. При конвертации Variant<->String - тоже.
Если ты сначала создаёшь строку, а потом конвертируешь, ты тратишь больше времени и памяти (сначала на создание одной строки при форматировании, потом на создании второй, при конвертации в Variant).

А так ты можешь СРАЗУ выбрать, в каком виде получить результат - в Variant, если тебе требуется работать с Variant, и в String, если тебе нужен именно String.
При этом новая форматированная строка будет сразу создаваться в нужном виде.
label:
cli
jmp label

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

Сообщение Qwertiy » 04.02.2013 (Пн) 23:33

Понятно. А почему нельзя обернуть строку в Variant без копирования?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: "Неправильное" отображение даты в MSHFlexGrid

Сообщение iGrok » 05.02.2013 (Вт) 11:23

Грязным хаком, по идее, можно (хотя я и не уверен, полностью ли совпадают форматы хранения, но вроде бы и там и там BSTR).
label:
cli
jmp label


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

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

Сейчас этот форум просматривают: Google-бот и гости: 65

    TopList