Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ошибка в INSERT (не понимает формат даты) / 22 сообщений из 22, страница 1 из 1
22.10.2014, 14:54
    #38784150
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Код: plsql
1.
2.
3.
4.
5.
6.
INSERT INTO jurnal (datetime, pc_name, subject)
VALUES(  
Format("22.10.2014", "dd.mm.yyyy")
, 1
, 1
), 1, 1)



Привет всем! Пишет ошибку при запуске данного запроса. Указывает на дату. ЧЯДНТАК?
...
Рейтинг: 0 / 0
22.10.2014, 14:54
    #38784151
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
INSERT INTO jurnal (datetime, pc_name, subject)
VALUES(
Format("22.10.2014", "dd.mm.yyyy")
, 1
, 1
)

уточняю
...
Рейтинг: 0 / 0
22.10.2014, 15:04
    #38784167
П-Л
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
В ФАК.
...
Рейтинг: 0 / 0
22.10.2014, 15:10
    #38784176
enakenenaken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
П-Л,

а это не из ФАКа?
...
Рейтинг: 0 / 0
22.10.2014, 15:20
    #38784197
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
авторне понимает формат датыКто не понимает?
Тот, кто принимает, или тот, кто передает?
...
Рейтинг: 0 / 0
22.10.2014, 15:28
    #38784217
Ошибка в INSERT (не понимает формат даты)
Ну, во-первых, Format("22.10.2014", "\#mm\/dd\/yyyy\#")
А во-вторых, не устаю повторять, что INSERT INTO ... VALUES - гнилой запрос! Это вы на дату наступили, а еще есть дробные числа, Null, строки с кавычками внутри...
Проще, надежнее и нагляднее:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
With CurrentDB.OpenRecordset("SELECT * FROM jurnal WHERE 0=1")
  .AddNew
  ![datetime]="22.10.2014"
  ![pc_name]=1
  ![subject]=1
  .Update
End With
...
Рейтинг: 0 / 0
22.10.2014, 17:24
    #38784443
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Анатолий ( Киев ) ![datetime]="22.10.2014"

Только не так. Так будет преобразовано к дате случайным образом.
...
Рейтинг: 0 / 0
22.10.2014, 17:32
    #38784451
Ошибка в INSERT (не понимает формат даты)
Владимир СанычАнатолий ( Киев ) ![datetime]="22.10.2014"

Только не так. Так будет преобразовано к дате случайным образом.
Если представление даты соответствует системному, то все будет правильно.
Код: vbnet
1.
2.
?CDate("22.10.2014")
22.10.14 

Хотя, конечно, я с Вами согласен. Надежнее - DateSerial и т.п.
...
Рейтинг: 0 / 0
22.10.2014, 18:31
    #38784519
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
enakenenaken
Код: plsql
1.
Format("22.10.2014", "dd.mm.yyyy")

а в FAQ написано "mm\/dd\/yy"
Код: vbnet
1.
2.
?Format("22.10.2014", "dd.mm.yyyy")
22.10.2014
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.02.2018, 10:56
    #39602788
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Анатолий ( Киев )Ну, во-первых, Format("22.10.2014", "\#mm\/dd\/yyyy\#")
А во-вторых, не устаю повторять, что INSERT INTO ... VALUES - гнилой запрос! Это вы на дату наступили, а еще есть дробные числа, Null, строки с кавычками внутри...
Проще, надежнее и нагляднее:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
With CurrentDB.OpenRecordset("SELECT * FROM jurnal WHERE 0=1")
  .AddNew
  ![datetime]="22.10.2014"
  ![pc_name]=1
  ![subject]=1
  .Update
End With



Анатолий, а можете подсказать, таким образом запрос на обновление можно сделать?
...
Рейтинг: 0 / 0
16.02.2018, 11:07
    #39602796
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Вместо
Код: vbnet
1.
  .AddNew

поставь
Код: vbnet
1.
  .Edit

и будет тебе счастье.
...
Рейтинг: 0 / 0
16.02.2018, 11:12
    #39602799
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
MokeevP, что же Вы приводите рекордсет, а спрашиваете про запрос?
В запросе надо вместо INSERT поставить UPDATE.
И не путайте. Запросы для рекордсетов всегда формируются через SELECT.
...
Рейтинг: 0 / 0
16.02.2018, 11:48
    #39602846
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
JossMokeevP, что же Вы приводите рекордсет, а спрашиваете про запрос?
В запросе надо вместо INSERT поставить UPDATE.
И не путайте. Запросы для рекордсетов всегда формируются через SELECT.

Спасибо!
Честно скажу, с терминами я дружу очень плохо пока что...
то есть, если говорить предметно, то рекордсет на изменение будет иметь вид
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
With CurrentDB.OpenRecordset("SELECT * FROM jurnal WHERE pc_name=1")    'то есть, теоретически запрос на 1 запись
  .edit
  ![datetime]="22.10.2014"
  ![pc_name]=4
  ![subject]=1
  .Update                         'вот этот апдейт что значит?
End With
...
Рейтинг: 0 / 0
16.02.2018, 12:15
    #39602868
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Код: vbnet
1.
  .Update


Это значит "записать все произведённые изменения в таблицу" Все вот эти действия
Код: vbnet
1.
2.
3.
  ![datetime]="22.10.2014"
  ![pc_name]=1
  ![subject]=1

Это только подготовка к записи.
...
Рейтинг: 0 / 0
16.02.2018, 12:18
    #39602871
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Эти действия
Код: vbnet
1.
2.
3.
  ![datetime]="22.10.2014"
  ![pc_name]=1
  ![subject]=1

только показывают, каким полям какие значения Вы хотите присвоить. А само присвоение выполняется по команде Update
...
Рейтинг: 0 / 0
16.02.2018, 13:15
    #39602916
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
MokeevP
Код: vbnet
1.
  ![datetime]="22.10.2014"


Вот так делать нельзя. Здесь в поле типа дата-время заносится значение типа текст. Преобразование будет выполнено автоматически, и не всегда так, как мы хотели. В данном примере еще ничего, а вот какое-нибудь "01.02.03" может быть преобразовано в дату 6 разными способами. На самом деле надо писать вот так:

Код: vbnet
1.
  ![datetime]=#10/22/2014#
...
Рейтинг: 0 / 0
16.02.2018, 14:02
    #39602970
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Владимир СанычMokeevP
Код: vbnet
1.
  ![datetime]="22.10.2014"


Вот так делать нельзя. Здесь в поле типа дата-время заносится значение типа текст. Преобразование будет выполнено автоматически, и не всегда так, как мы хотели. В данном примере еще ничего, а вот какое-нибудь "01.02.03" может быть преобразовано в дату 6 разными способами. На самом деле надо писать вот так:

Код: vbnet
1.
  ![datetime]=#10/22/2014#



К счастью, мне совершенно не нужно в программу писать конкретную дату
К сожалению, мне нужно тащить даты из Excel, там они хранятся соответственно + бонусом может быть время (т.е. в ячейке записано что-то вроде 49123,123982675... Подробнее про мою проблему

И ещё по теме рекордсетов - а как мне с их помощью можно быстренько значения вытащить и переменной присвоить?
И снова - куда читать про рекордсеты чтобы понять? справку не понял
...
Рейтинг: 0 / 0
16.02.2018, 14:49
    #39603013
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
MokeevPИ снова - куда читать про рекордсеты чтобы понять? справку не понялТак я же тебе приводил конкретную книгу! Тоже не понял? Там очень квалифицированно написано.
...
Рейтинг: 0 / 0
28.02.2018, 15:40
    #39608554
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
ПанургMokeevPИ снова - куда читать про рекордсеты чтобы понять? справку не понялТак я же тебе приводил конкретную книгу! Тоже не понял? Там очень квалифицированно написано.
Я её читаю, но очень медленно... если не затруднит, подскажите, можно ли всё таки таким же подходом с With сделать такой запрос на извлечение данных?

И, по теме, уважаемые знатоки и знающие, как правильно с датами разобраться? Из фака подчерпнул вышенаписанную информацию и родит такой фрагмент:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
    sql = "select ID, IDobj, tp_wrk, tp_stg, "                                  'выбираем столбцы ID записи, ID объекта, тип работы, тип этапа
    sql = sql + "pln_date from pln_main "                                       'выбираем столбцы с датой из таблицы pln_main
    sql = sql + "where ("                                                       'где
    sql = sql + "((IDobj) = " + CStr(tn.Cells(nLne, nCln1)) + ") and "          'ID объекта равен из ячейки
    sql = sql + "((tp_wrk) = 1) and "                                           'тип работы равен 1,
    sql = sql + "((tp_stg) = 1) and "                                           'тип этапа работ 1
    sql = sql + "((pln_date) = #"                                               'дата равна ...
    sql = sql + CStr(Format(tn.Cells(nLne, nCln5), "mm\/dd\/yy"))               'значению из ячейки приведённому к формату ММ.ДД.ГГГГ
    sql = sql + "#))"                                                           'конец строки запроса
    Set SQL_RS = CurrentDb.OpenRecordset(sql)
    m = SQL_RS.EOF                                                              'присваиваем переменной значение да/нет в отношении найдена такая запись или нет
        SQL_RS.Close
    Set SQL_RS = Nothing
    q = CStr(tn.Cells(nLne, nCln2))                                         'на всякий случай преобразовываем код объекта в текст
    q = Replace(q, " ", "")                                                 'и убираем из него пробелы
                                                                                'далее проверяем соответственно
                                                                                    'код соответствует маске кода ##-##/##-##/##-##
                                                                                    'в столбце "Нитка" таблицы источника стоит 1
                                                                                    'ID соответствует маске ######
On Error GoTo lblErr5

        If m = True _
        And q Like "##-##/##-##/##-##" _
        And tn.Cells(nLne, nCln3) = 1 _
        And tn.Cells(nLne, nCln6) Like "обсл*" _
        And (tn.Cells(nLne, nCln1) Like "######" _
        Or Not IsEmpty(tn.Cells(nLne, nCln1))) Then                             'если всё верно то
        
        With CurrentDb.OpenRecordset("SELECT * FROM Pln_main")                  'запускаем запрос на выборку
            .AddNew                                                             'прикручиваем новую запись с параметрами:
            ![Type_obj] = 1                                                     'тип объекта 1
            ![IDobj] = CStr(tn.Cells(nLne, nCln1))                              'ID объекта из ячейки
            ![Tp_wrk] = 1                                                       'тип работы 1
            ![Tp_stg] = 1                                                       'тип этапа работ 1
            ![pln_date] = CStr(Format(tn.Cells(nLne, nCln5), "mm\/dd\/yy"))     'плановая дата из таблицы источника в формате ММ.ДД.ГГГГ
            ![auth] = 1                                                         'Организация ответственная за производство работ
            ![indx] = CStr(tn.Cells(nLne, 1))                                   
            ![insrt_by] = 1                                                     
            ![insrt_date] = CStr(Now())                                         
            .Update                                                            
        End With



Смысл программы: прочесать таблицу Excel, если есть такие позиции в БД - игнорировать, иначе - добавить
Иииии... оно так не работает! Даты наипроизвольнейшим образом конвертируются и потом не ищутся первым запросом! А при добавлении случается дубликат
...
Рейтинг: 0 / 0
28.02.2018, 16:35
    #39608602
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Эмпирическим путём выяснил, что когда ищу нужно делать мм.дд.гггг:
MokeevP
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    sql = "select ID, IDobj, tp_wrk, tp_stg, "                                  'выбираем столбцы ID записи, ID объекта, тип работы, тип этапа
    sql = sql + "pln_date from pln_main "                                       'выбираем столбцы с датой из таблицы pln_main
    sql = sql + "where ("                                                       'где
    sql = sql + "((IDobj) = " + CStr(tn.Cells(nLne, nCln1)) + ") and "          'ID объекта равен из ячейки
    sql = sql + "((tp_wrk) = 1) and "                                           'тип работы равен 1,
    sql = sql + "((tp_stg) = 1) and "                                           'тип этапа работ 1
    sql = sql + "((pln_date) = #"                                               'дата равна ...
    sql = sql + CStr(Format(tn.Cells(nLne, nCln5), "mm\/dd\/yy"))               'значению из ячейки приведённому к формату ММ.ДД.ГГГГ
    sql = sql + "#))"                                                           'конец строки запроса



а когда уже вношу - дд.мм.гггг:
MokeevP
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
           If m = True _
        And q Like "##-##/##-##/##-##" _
        And tn.Cells(nLne, nCln3) = 1 _
        And tn.Cells(nLne, nCln6) Like "обсл*" _
        And (tn.Cells(nLne, nCln1) Like "######" _
        Or Not IsEmpty(tn.Cells(nLne, nCln1))) Then                             'если всё верно то
        
        With CurrentDb.OpenRecordset("SELECT * FROM Pln_main")                  'запускаем запрос на выборку
            .AddNew                                                             'прикручиваем новую запись с параметрами:
            ![Type_obj] = 1                                                     'тип объекта 1
            ![IDobj] = CStr(tn.Cells(nLne, nCln1))                              'ID объекта из ячейки
            ![Tp_wrk] = 1                                                       'тип работы 1
            ![Tp_stg] = 1                                                       'тип этапа работ 1
            ![pln_date] = CStr(Format(tn.Cells(nLne, nCln5), "dd\/mm\/yy"))     'плановая дата из таблицы источника в формате ММ.ДД.ГГГГ
            ![auth] = 1                                                         'Организация ответственная за производство работ
            ![indx] = CStr(tn.Cells(nLne, 1))                                   
            ![insrt_by] = 1                                                     
            ![insrt_date] = CStr(Now())                                         
            .Update                                                            
        End With



Почему так происходит понимаю всё равно с трудом
в экселе даты хранятся дд.мм.гггг
...
Рейтинг: 0 / 0
28.02.2018, 16:46
    #39608612
Ошибка в INSERT (не понимает формат даты)
MokeevP
Код: vbnet
1.
2.
3.
...
![pln_date] = CStr(Format(tn.Cells(nLne, nCln5), "mm\/dd\/yy"))     'плановая дата из таблицы источника в формате ММ.ДД.ГГГГ
...



Даты наипроизвольнейшим образом конвертируются и потом не ищутся первым запросом! А при добавлении случается дубликат В этой строке собака порылась. Не нужно никаких преобразований. Просто присваивайте полю значение ячейки, т.е.:
![pln_date] = tn.Cells(nLne, nCln5)
Числовой эквивалент даты/времени в ячейке Excel, таблице Access и в VBA одинаковый.
Если вам не нужна составляющая времени, то:
![pln_date] = DateValue(tn.Cells(nLne, nCln5))

А вообще, есть несколько замечаний к коду.
1. Не надо закрывать и снова открывать Recordset, ведь он лежит на одной таблице.
Если эта процедура выполняется в цикле по строкам, то его со всеми записями нужно открыть перед циклом и закрыть после. А для каждой стоки выполнять метод FindFirst со строкой поиска, что после where в вашем примере и при св-ве NoMatch = True (не найдена) и других проверках добавлять запись.
2. При конкатенации строки вместо "+" используйте "&", тогда и CStr не нужна. Символ "+" используется в других специальных случаях.
...
Рейтинг: 0 / 0
28.02.2018, 17:26
    #39608627
MokeevP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в INSERT (не понимает формат даты)
Анатолий ( Киев ) В этой строке собака порылась. Не нужно никаких преобразований. Просто присваивайте полю значение ячейки, т.е.:
![pln_date] = tn.Cells(nLne, nCln5)
Числовой эквивалент даты/времени в ячейке Excel, таблице Access и в VBA одинаковый.
Небольшое уточнение - то есть даты в Access тоже по-денно посчитаны с 1 января 1900 года как в excel?
Анатолий ( Киев )Если вам не нужна составляющая времени, то:
![pln_date] = DateValue(tn.Cells(nLne, nCln5))
cstr(tn.cells(nLne, nCln5)) в помойку и забыть как страшный сон? Меня этот вариант вроде-бы устраивает. Или это криминал?

Анатолий ( Киев )1. Не надо закрывать и снова открывать Recordset, ведь он лежит на одной таблице.
Если эта процедура выполняется в цикле по строкам, то его со всеми записями нужно открыть перед циклом и закрыть после. А для каждой стоки выполнять метод FindFirst со строкой поиска, что после where в вашем примере и при св-ве NoMatch = True (не найдена) и других проверках добавлять запись.
Огромное спасибо за замечания! С конкатенацией учту обязательно (хотя понимания почему нужно делать именно так, а не эдак нет, ну да и хрен с ним!). А вот с recordset`ами беда - я категорически плохо понимаю как это сделать, как с ними работать. Можно ли Вас попросить изобразить принципиальный пример такой конструкции с рекордсетом и условием? Прошу

Аще, мне бы, в идеале, ещё и обратную проверку сделать - просмотреть таблицу в Access, сравнить с Excel, чего нет - поставить галочку и название файла, иначе next. Можете помочь?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ошибка в INSERT (не понимает формат даты) / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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