Оказывается, что 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)