Может ли несвязанное текстовое поле, содержащее строку, быть программно равным полю даты (времени)? - PullRequest
0 голосов
/ 03 апреля 2020

Хорошо. Цель состоит в том, чтобы программно получить строку чисел из несвязанного элемента управления в форме. Почему? У меня есть форма, которая содержит два элемента управления для времени начала и времени окончания sh. Формат этих элементов управления: дд / мм / гггг чч: дд. Конечные пользователи жалуются, что они ненавидят необходимость тратить время на ввод даты и времени в одном поле, особенно учитывая старую форму (ужасная электронная таблица Excel, где пользователи могут печатать все, что им нравится), позволяя им просто печатать 4-е git время. Я пытаюсь повторить этот опыт, но, как мы знаем, дата и время обернуты в одно поле в Access.

Идея состоит в том, чтобы снабдить поле даты / времени значениями из строки, используя отдельный несвязанный элемент управления. Например, один элемент управления будет помечен как «Время начала» и будет принимать 4 числа с маской ввода 99:99. Перед обновлением формы я хотел бы передать строку из элемента управления. К сожалению, у меня нет кода, но я попытаюсь создать здесь код psuedo:

Модуль уровня класса

Private Sub Form_BeforeUpdate(Cancel As Integer)

strStartTime as String
strFinishTime as String
strDate as String
rstDailyLog as recordset

Set rstDailylog = CurrentDb.OpenRecordset ("Daily Log" dbOpenDynaset)

'assign variables to unbound controls on form
strStartTime = Me![Start Time]
strFinishTime = Me![Finish Time]

'Here, I assume I begin parsing my string to the date/time field

'function to edit send the string to the actual date/time field
'Basically, copied from Microsoft Docs
Sub EditName(rstCovertString As Recordset, strStart As String, strFinish As String)

With rstConvertString
.Edit
![Start Time] = strStart
![Finish Time] = strFinish
.Update
.Bookmark = .LastModified
End With

Каковы последствия этого? Например, если связанная форма отображает запись с несвязанным значением, как эта запись отобразит нужные данные? Когда я создавал этот код, я только что понял, что поле, содержащее дату / время, является типом данных даты / времени? Теперь я действительно запутался. Если это разные типы данных, могу ли я отправлять переменные start / fini sh в этот элемент управления в виде строки?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Оказывается, что Access выполняет TRUCKLOAD преобразований типов данных для вас.

Когда элементы управления текстового поля привязаны к базовой таблице, тогда это текстовое поле возвратит тип данных datetime. Даже если вы добавляете строку - она ​​преобразуется в тип данных datetime за кулисами.

И то же самое относится и к тексту, или если элемент управления привязан к числу. (опять же, здесь действительно происходит форсирование типов данных. Однако VBA довольно простителен в этом отношении.

Таким образом, большую часть времени вы не замечаете эту проблему.

ОДНАКО, КОГДА текстовое поле НЕ привязано к базовой таблице, тогда тип данных этого текстового поля более неопределенный.

Итак, установите формат свободного текстового поля в формат даты. Если вы это сделаете тогда даже присвоение строкового значения текстовому полю вызовет доступ к преобразованию строки в дату. Фактически, ваш код должен ПОСТОЯННО извлекать данные из этой таблицы, и если вы непосредственно не назначаете столбцу даты текст box?

Ну, тогда отформатируйте строку в формате США, например:

me.MyStartDate = format(dtValue, "MM/DD/YYYY")

или

me.MyStartDate = format(dtValue, "YYYY-MM-DD")

Вы найдете этот ДАЖЕ, если ваш формат даты отличается затем выше (скажем, исходя из региональных настроек вашего компьютера), затем Access преобразует вышеприведенное значение в формат даты в формате Interal, а затем отобразит значения ваших региональных настроек НЕЗАВИСИМО от вышеуказанного.

* 10 20 * Таким образом, ваш дисплей может быть: ДД / ММ / ГГГГ (день первый)

Но при этом:

me.MyStartDate = dtvalue

или

me.MyStartDate = format(dtValue,"YYYY-MM-DD")

будет работать .

Итак, НЕ конвертируйте значение datetime из таблицы в строку ЕСЛИ ВОЗМОЖНО, чтобы избежать этого. Таким образом, вы просто присваиваете это фактическое значение даты и времени непосредственно в текстовое поле. Пока Access видит и знает, что текстовое поле имеет формат даты, он будет работать с этим текстовым полем в качестве типа данных даты и времени.

Вышеуказанное ТОЛЬКО работает, если вы установили необязательный текст коробка, чтобы иметь какое-то форматирование даты. После того, как вы сказали доступу, что текстовое поле является текстовым полем типа даты, вам лучше всего присваивать значения даты из таблицы (без преобразования в строку).

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

И тот же трюк выше также применим к числовым форматам. И, таким образом, установка числового формата для текстового поля приведет к тому, что текстовое поле будет НЕ строкой / типом текста, а фактическим числом.

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

Другими словами, правильно ли вы это сделали? Тогда вам все равно или даже нужно знать настройки формата даты на любом компьютере, и ваш код всегда будет работать.

Из всех предложенных мной предложений?

Если возможно присвойте фактическое значение даты текстовому полю и НЕ форматируйте строку. Это позволит вам установить любой тип даты / времени для текстового поля. После того, как вы определили / задали текстовое поле в качестве формата даты, тогда это элемент даты и времени и тип данных. В результате вы не должны требовать какого-либо преобразования данных таблицы, чтобы установить / заполнить текстовое поле.

Редактировать

У вас есть:

'assign variables to unbound controls on form
strStartTime = Me![Start Time]
strFinishTime = Me![Finish Time]

Нет! - объявите две вышеуказанные переменные как дату, а не как строку.

dim dtStartTime     as date
dim dtFinishTime    as date

сейчас:

dtStartTime = Me![Start Time]
dtFinishTime = Me![Finish Time]

'Здесь, я полагаю, я начинаю синтаксический анализ моей строки в поле даты / времени

Нет, не анализировать. У вас есть данные как внутренняя дата-время. Как вы отображаете эти данные, зависит от вас или от региональных настроек пользователей. Как разработчик, это тип даты и дата "вещь". Не конвертируйте в строку !!!

'function to edit send the string to the actual date/time field
'Basically, copied from Microsoft Docs

Sub EditName(rstCovertString As Dao.Recordset, dtStart As Date, _
    dtFinish As date)
0 голосов
/ 03 апреля 2020

Access часто распознает строку со структурой даты / времени в качестве значения даты / времени. Можно использовать функцию CDate (), чтобы быть уверенным, или использовать # разделители.

Выполните эти тесты в окне редактора VBA.

? IsDate ("1/1/2020 14:50")

? IsDate (CDate ("1/1/2020 14:50"))

? IsDate (# 1/1/2020 14:50 #)

? IsDate ("1/1/2020" & "" & "14:50")

Все возвращают значение True.

Если вы хотите отобразить сохраненную дату / время, привяжите текстовое поле к поле. Заблокируйте элемент управления, если вы не хотите, чтобы пользователи редактировали его. Затем используйте VBA, чтобы сохранить любые изменения, сделанные в несвязанных текстовых полях. Я рекомендую событие AfterUpdate для сохранения кода. Используйте событие BeforeUpate для проверки ввода пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...