Ошибка в SQL-запросе

Программирование на Visual Basic for Applications
MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Ошибка в SQL-запросе

Сообщение MOV » 12.07.2004 (Пн) 10:25

Вот запрос в Accesse:

Код: Выделить всё
Dim i As Date
DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Data = " + Format( i, "DD.MM.YYYY")


Ругается что: Число содержит синтаксическую ошибку в выражении запроса 'DailySales.Data= 01.07.2004'

Поле Data в таблице и переменная в условии запроса (i) имеют тип дата. Пробовал без форматирования даты и менять формат даты самого поля таблицы (сейчас там краткий формат). Все-таки что-то не то с типами. i форматировал по разному.

Если записать просто Format( i, "DDMMYYYY"), то зарос проходит, но дат в таблице не находит, чтобы обновить, а они есть.

Может кто-то точно знает в чем причина?

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 12.07.2004 (Пн) 10:41

Попробуй Format$(i, "#mm-dd-yyyy#).

:?: Off. Не лучше ли для конкатенации строк использовать & вместо + ?

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.07.2004 (Пн) 11:13

пишу так Format$(i, "#DD.MM.YYYY#") в ошибке вообще косяк выдается:

Ошибка синтаксиса (пропущен оператор) в выражении запроса 'DailySales.Data= 3816DD-MM-YYYY9'

(это дословно). :?

Если пишу без символа "#", а=просто
Format$(i, "DD.MM.YYYY") он съедает, но дат все равно в таблице не находит :?

Off. Не лучше ли для конкатенации строк использовать & вместо + ?


Я часто встречал раньше, что что-то работает быстрее, но все время забываю что именно и проверять пока некогда. Поэтому пишу "+", тоже нормально пашет.

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

Сообщение alibek » 12.07.2004 (Пн) 11:21

Format$(i, "\#mm/dd/yyyy\#")
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 12.07.2004 (Пн) 11:24

:? Я использую такую функцию везде, где нужна форматированная для Access дата:
Код: Выделить всё
Public Function fl_ConvToStrDt(ByVal dtDate As Date) As String
'конв "#12-31-1999#"
    Dim sDate       As String
   
    sDate = Format$(dtDate, "mm-dd-yyyy hh:mm:ss")
    sDate = "#" & sDate & "#"
    fl_ConvToStrDt = sDate
End Function

т.е. не в Format сразу вставляю "#", а во второй строке. Может, в этом дело?

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.07.2004 (Пн) 11:56

Мда :?
Ни один вариант не проходит. Эксперементировал по разному.
А если и проходит, то не ловит даты в таблице. Попробую поле даты сделать строковым или как нибудь по другому, чтобы обойти этот косяк.
Спасибо. Моежет вернусь к вопросу позже.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 12.07.2004 (Пн) 12:08

Должно все быть Ок.
1) Попробуй сначала делать не UPDATE запрос, а SELECT, чтобы проверить правильность условий.
2) Проверь, что дата форматируется как MM-DD-YYYY ("американский" формат даты), а не DD-MM-YYYY.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 12.07.2004 (Пн) 12:11

Поле даты не надо делать строковым, это изврат и гемор.
Лучше покажи код, что не получился и формат таблицы DailySales.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.07.2004 (Пн) 13:04

Поле даты не надо делать строковым, это изврат и гемор


Согласен. Но в данном случае это выход, т.к. таблица вспомогательная и ни на что не завязана это просто отчет, поэтому главное, чтобы он работал.

Лучше покажи код, что не получился и формат таблицы DailySales.


Это код:

Код: Выделить всё
Private Sub Кнопка35_Click()
DoCmd.RunSQL "DELETE * FROM [DailySales]"
Dim dbsTemp As Database, i As Date
Set dbsTemp = CurrentDb
Dim g As String
g = "1"
For i = CDate(Me.fldDateFrom) To CDate(Me.fldDateTo)
   
    ConnectOutput dbsTemp, _
                "dBASETable", _
                "dBase IV;DATABASE=D:\ARCHIV\SALEARCH", _
                "SALE" & Format(Month(i), "00") & Format(Day(i), "00")

DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount ) " & _
    "SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount " & _
    "FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"
   
DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= '" + Format(i, "dd.mm.yyyy") + "'"


dbsTemp.TableDefs.Delete "dBASETable"
g = Str(Val(g) + 1)

' за тот же день предыдущей недели
    ConnectOutput dbsTemp, _
                "dBASETable", _
                "dBase IV;DATABASE=D:\ARCHIV\SALEARCH", _
                "SALE" & Format(Month(i - 7), "00") & Format(Day(i - 7), "00")

DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount ) " & _
    "SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount " & _
    "FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"

DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= '" + Format(i - 7, "dd.mm.yyyy") + "'"

dbsTemp.TableDefs.Delete "dBASETable"
g = Str(Val(g) + 1)
Next

DoCmd.OpenReport "rptПродажи", acViewPreview
End Sub


Все-таки преобразовал поле DailySales.Data к текстовому типу так заработало. Но когда добавил еще одно услове (чтобы он не обновлял, то, что уже обновил по второму разу):
это
Код: Выделить всё
WHERE DailySales.Dn IS NULL
он начал обновлять все поле на нули :? :D . мне уже смешно становится такие косяки...

Тип данных в таблице DailySales:
Поле Data - текстовый;
Поле Dn- числовой. (можно было бы и его в текстовый, чтобы апдейт заработал нормально, но это нельзя - по нему потом упорядочиается все)
Последний раз редактировалось MOV 12.07.2004 (Пн) 13:42, всего редактировалось 1 раз.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 12.07.2004 (Пн) 13:39

Думаю
DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= '" + Format(i - 7, "MM.DD.yyyy") + "'"

Надо изменить на
Код: Выделить всё
Dim sDate     as String
sDate = "#" & Format$(i - 7, "MM/DD/yyyy")  & "#"
DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= " & sDate

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.07.2004 (Пн) 13:58

Легче не становится. Да я решил остановиться на текстовом форамте поля даты. Так что теперь первый вопрос отпал - сейчас мне интересно почему он так криво обновляет (все на нули), когда добавляешь в условие
DailySales.Dn IS NULL

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.07.2004 (Пн) 14:19

Все сделал. Ну их нафиг эти UPDATE :shock:
Засунул сразу все в INSERT и короче, и гимора нет, и быстрее, и поле дата не надо к текстовому преобразовывать.

Получилось так:

Вместо

Код: Выделить всё
DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount ) " & _
    "SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount " & _
    "FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"
   
DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= '" + Format(i, "dd.mm.yyyy") + "'"


можно ведь сразу записать:

Код: Выделить всё
DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount, [b]dn[/b] ) " & _
    "SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount, " [b]+ g + [/b]_
    " FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"


И чего сразу не допер 8) , единственное смущает, что так и не понятно как по дате выбирать (если она не строкового типа а тип даты имеет).
Спасибо всем. Пожалуй, все. Тему можно закрыть.


Вернуться в VBA

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

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

    TopList