powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Функция Month(Date) возвращает разные значения.
24 сообщений из 49, страница 2 из 2
Функция Month(Date) возвращает разные значения.
    #38607062
Даты начальная и конечная берутся из полей формы и присваиваются переменным DateStart и DateEnd
Далее запросом к базе (в диапазоне номеров месяцев этих переменных), к таблице, где хранятся плановые показатели я получаю набор этих самых плановых показателей (dao recordset) и далее в цикле умножаю i-й показатель на i-е значение этой самой функции. По окончанию цикла имею сумму как план на указанный диапазон
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607124
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть есть три передачи дат:
1) из поля формы в DateStart и DateEnd
2) из DateStart и DateEnd в запрос к БД
3) из DateStart и DateEnd в функцию


поля формы - просто текст или используется календарь? переменные DateStart и DateEnd какого типа? Каким образом выполняется запрос к БД - типизированные параметры или простой текст запроса? какая СУБД? какого типа параметры функции?
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607182
мда .... :)

интерфейс и сама база реализованы на акцессе, потом морду буду переделывать на winform

1. "просто" текстовые поля с маской, формат поля - Краткий формат даты, маска - 00.00.0000;0;_ без календаря;
2. обе переменные DateStart и DateEnd типа Date;
3. Запрос к БД (mdb) для "вытаскивания" планового задания по каждому месяцу:

Примерно так:

strSQL = "SELECT KoDnPlan FROM tPrikaz WHERE NomMonth Between " & Month(Format(DateStart,""MM\/dd\/yyyy"")) & " AND " & Month(Format(DateEND,""MM\/dd\/yyyy""))

где KoDnPlan - тот самый плановый показатель (хитрость или не хитрость заключается в том, что его можно вообще не хранить в базе, т.к. можно просто рассчитать, т.к. дается план на не месяц, а на год, допустим, за год нужно пролечить 8250 больных, следовательно, месячный план равен Round(ГодовойПлан/12) .... но тут набегает ошибка округления .... поэтому пока, чтобы не мудрить, решил хранить в простецкой табличке)

NomMonth - номер месяца
и далее:
set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

4. функция собственно:
Public Function fnProcZap(dtStart As Date, dtEnd As Date, iMonth As Integer) As Double
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607211
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По пунктам (по моей нумерации):

1) как происходит преобразование из текста в дату? (из поля формы в DateStart и DateEnd)

2) зачем тут лишние преобразования???
сначала преобразовываете из даты в строку (функцией format), а потом неявно обратно в дату, при использовании функции Month
Код: vbnet
1.
strSQL = "SELECT KoDnPlan FROM tPrikaz WHERE NomMonth Between " & CStr(Month(DateStart)) & " AND " & CStr(Month(DateEnd))


3) При вызове функций никаких преобразований не надо
Код: vbnet
1.
i = fnProcZap(DateStart, DateEnd, mymonth)
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607464
Инициализация переменных происходит при вызове функции (показал не полностью), которая в свою очередь вызывается при нажатии кнопки на форме; эта функция проверяет содержимое полей и если они "правильные", возвращает истину:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
' 04-03-2014
' Функция проверяет входные данные и возвращает истину, если они соответствуют
' Значения полей заносятся в общие переменные, описанные в модуле util
'
Function fnCheckData() As Boolean

    On Error GoTo err
    
    If Not IsDate(txtDateStart) Or Not IsDate(txtDateEnd) Then
        MsgBox "Укажите дату начала и окончания формирования отчета!", vbCritical, "Ошибка"
        txtDateStart.SetFocus
        Exit Function
    Else
        dtDateReportStart = txtDateStart
        dtDateReportEnd = txtDateEnd
    End If
    
    If IsNumeric(cboNomPrikaz.Value) Then
        intNomPrikaz = cboNomPrikaz
    Else
        cboNomPrikaz.SetFocus
        MsgBox "Выберите номер приказа!", vbCritical, "Ошибка"
        Exit Function
    End If


Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607614
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где происходит конвертация текста в дату?
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607620
Shocker.ProА где происходит конвертация текста в дату?
Хм ... хороший вопрос ...
получается, что нет никакой конвертации ... сами переменные описаны в модуле:

'************************************************ 01-02-2014 **************************************************
' Глобальные переменные для работы с отчетами
'
Public dtDateReportStart As Date
Public dtDateReportEnd As Date

ну а присвоение в уже показанной функции:

If Not IsDate(txtDateStart) Or Not IsDate(txtDateEnd) Then
MsgBox "Укажите дату начала и окончания формирования отчета!", vbCritical, "Ошибка"
txtDateStart.SetFocus
Exit Function
Else
dtDateReportStart = txtDateStart
dtDateReportEnd = txtDateEnd
End If
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607624
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, кажется, попросил использовать тэги оформления кода....

стало быть конвертация просиходит здесь.... неявная
Код: vbnet
1.
2.
dtDateReportStart = txtDateStart
dtDateReportEnd = txtDateEnd


это, в принципе запись аналогична такой
Код: vbnet
1.
2.
dtDateReportStart = CDate(txtDateStart)
dtDateReportEnd = CDate(txtDateEnd)



у нее есть недостаток, если на компьютере установлены региональные стандарты "Английский (США)" (или многие другие), то дата типа "10.05.2014" распознана не будет
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607632
про тэги учту, не обратил внимания ...
так стало быть нужно было бы явно преобразовывать?

Код: vbnet
1.
2.
dtDateReportStart = CDate(txtDateStart)
dtDateReportEnd = CDate(txtDateEnd)
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607646
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
желательно всегда преобразовывать явно, это лучше с точки зрения понимания того, что вы делаете, взять к примеру ваш код:
Код: vbnet
1.
"Between " & Month(Format(DateStart,"MM\/dd\/yyyy")) 

- тут одно явное и два неявных преобразования, а нужно было лишь одно - желательно явное

ну и, как я уже сказал выше, если вы хотите, чтобы код работал на компьютере с любыми региональными настройками, то этот код не подойдет. Так как у вас фиксированный шаблон ввода даты, нужно вычленить оттуда по отдельности все компоненты с помощью Mid$ и собрать в дату с помощью DateValue
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607794
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro...почему у них время не показывается как ММ:ЧЧ:СС - логичнее для них было бы)


Грегорианский календарь и часы были изобретены в Европе. Календарь был тесно связан с религией, если не для религиозных же целей и изобретен. В то время, для указания даты, применялся приблизительно вот такой формат:
25-ый день декабря года Господа нашего 1750
Время не указывалось вовсе. Во-первых, до появления первых паровозов, понятия стандартного времени не существовало, т.е. в двух соседних городах время могло отличаться на час или два. А во-вторых, время узнать было зачастую не так просто как сегодня.
К моменту, когда датироваться стали такие печатные издания как газеты, в целях экономии, дату стали существенно сокращать, но в дань традиции порядок не изменился, т.е. выглядело это примерно так:
25 декабря 1750 года, а в последствие перешли к еще более короткой версии:
25/12/1750
Поначалу, аналогичный формат был и в США, точнее тогда еще английской колонии. Однако после получения независимости "религиозный" формат даты утратил свою обязательность. А газеты того времени в заголовках печатали наиболее важные элементы даты, т.е. примерно так:
Среда, июнь 12, 1901 или июнь 12, 1901.
Год не играл большой роли, т.к. газеты за прошлый год никто не читал, а вот знать месяц было даже важнее дня. Все дело в том, что большинство газет того времени не печатались ежедневно, а раз в месяц, но для порядка день также указывался. Когда газеты стали печатать чаще, то день недели оказался на первом месте, вполне логично предположить, что в то время, знать, что сегодня понедельник важнее, чем знать, что сегодня 7 апреля. Некоторые утверждают, что такой порядок невольно заставлял задуматься о дате и человек ее проще запоминал, но это лишь утверждения. Со временем, формат сократился:
июнь/12/1901, а потом еще сократился
6/12/1901.
Время приобрело свою техническую и научную важность в эру индустриализации и не имело ничего общего с религией, соответственно, и стандарт был принят исходя из научных логических соображений.
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607850
Shocker.Proжелательно всегда преобразовывать явно, это лучше с точки зрения понимания того, что вы делаете, взять к примеру ваш код:
Код: vbnet
1.
"Between " & Month(Format(DateStart,"MM\/dd\/yyyy")) 

- тут одно явное и два неявных преобразования, а нужно было лишь одно - желательно явное

А вот тут поподробнее ... явное - это:
Код: vbnet
1.
Format(DateStart,"MM\/dd\/yyyy")

? А неявные где?

Давно ничего не писал на vba, имею дело только с сишарп, который понятно, таких вещей не прощает
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607853
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ считаю, что тот стандарт стандартнее, где единицы того же смысла переводятся друг в друга путем умножения на степень 10, а не какое-то произвольное число, и даты записываются в порядке увеличения или уменьшения детализации (интересно, а почему у них время не показывается как ММ:ЧЧ:СС - логичнее для них было бы)

Число 10 не менее произвольно любого другого. Все остальное дело традиции и привычки.
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607859
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр КоротковShocker.Proжелательно всегда преобразовывать явно, это лучше с точки зрения понимания того, что вы делаете, взять к примеру ваш код:
Код: vbnet
1.
"Between " & Month(Format(DateStart,"MM\/dd\/yyyy")) 

- тут одно явное и два неявных преобразования, а нужно было лишь одно - желательно явное

А вот тут поподробнее ... явное - это:
Код: vbnet
1.
Format(DateStart,"MM\/dd\/yyyy")

? А неявные где?


Month должна брать Date, a берет-то строку. Возвращает она число, которое конкатенируется как будто оно уже строка. Вот Вам два неявных преобразования.
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607883
Ладно, спасибо всем :)
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607959
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
i45Число 10 не менее произвольно любого другого.отнюдь, полагаю, тебе известно происхождение десятичной системы. А, коль скоро, мы считаем именно в десятичной системе, операции с умножением и делением на ее основание необычайно просты.
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38607962
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Коротковимею дело только с сишарп, который понятно, таких вещей не прощаеттогда тем более удивительно отсутствие дисциплинированности в обращении с типами ))
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38608117
Shocker.Proтогда тем более удивительно отсутствие дисциплинированности в обращении с типами ))
согласен, есть о чем задуматься :)
все равно я буду потом переделывать на шарпе, мне плохо становится от внешнего вида кода vba
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38609204
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proi45Число 10 не менее произвольно любого другого.отнюдь, полагаю, тебе известно происхождение десятичной системы. А, коль скоро, мы считаем именно в десятичной системе, операции с умножением и делением на ее основание необычайно просты.

Тем не менее его выбор изначально произволен.
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38609318
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
i45произволен.хотя удивительным образом согласуется с количеством пальцев на руке )
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38609540
Shocker.Proхотя удивительным образом согласуется с количеством пальцев на руке )
это называется антропный принцип :)
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38610958
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэтому произволен. Было бы пальцев восемь, считали бы по основанию восемь. Могли бы считать по основанию пять, и т.д. Математически это не имеет никакого значения, а практически - дело навыка и привычки, приобретаемых в школе.
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38611028
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
i45Поэтому произволен. Было бы пальцев восемь, считали бы по основанию восемь.видимо, мы разный смысл вкладываем в понятие "произвольный". В итоге мы оба имеем ввиду "причинно-следственный". ))
...
Рейтинг: 0 / 0
Функция Month(Date) возвращает разные значения.
    #38611057
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proi45Поэтому произволен. Было бы пальцев восемь, считали бы по основанию восемь.видимо, мы разный смысл вкладываем в понятие "произвольный". В итоге мы оба имеем ввиду "причинно-следственный". ))

Я вообще забыл, из-за чего все началось.

:0)
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Функция Month(Date) возвращает разные значения.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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