Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как правильно написать запрос по UPDATE? (число прочтений - 3989 )
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Как правильно написать запрос по UPDATE?
20. Февраля 2008 :: 07:01
Печать  
База: DBF
Соединение = "Provider = VFPOLEDB.1;Deleted = Yes;Data Source = " + КаталогИБ()+ ";Mode = ReadWrite;Extended Properties = "";User ID = "";Password = "";Mask Password = False;Collating Sequence = RUSSIAN;DSN = """;

Запрос:
Код
Выбрать все
глЗапрос.УстановитьТекстовыйПараметр("ТекДата",ТекДата);
глТекст = "
|UPDATE
|     $Справочник.Ассортименты
|SET
|     $Справочник.Ассортименты.Включена = 1
|WHERE
|     ISMARK = 0 AND $Справочник.Ассортименты.Включена = 0 AND :ТекДата BETWEEN $Справочник.Ассортименты.ДатаНачала AND $Справочник.Ассортименты.ДатаКонца
|";
 



Отладка:

UPDATE
    sc4630
SET
    sp5092 = 1
WHERE
    ISMARK = 0 AND sp5092 = 0 AND '20080220' BETWEEN sp5101 AND sp5102

ТЗ = глЗапрос.ВыполнитьИнструкцию(глТекст);
{Глобальный модуль(338)}: FAILED! ICommandText::Execute(): Operator/operand type mismatch.

Что я пропустил?
  
Наверх
 
IP записан
 
leonvlas
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 47
Зарегистрирован: 03. Августа 2007
Re: Как правильно написать запрос по UPDATE?
Ответ #1 - 20. Февраля 2008 :: 07:16
Печать  
мне кажется нехватает from
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #2 - 20. Февраля 2008 :: 07:24
Печать  
Для dbf поле ismark - текстовое т.е. условие должно быть как минимум
Код
Выбрать все
IsMark = ""   // элемент не помечен на удаление  


Остальное подробно не смотрел.
Совет
сделай копию бд на копии делай update сначала без условий затем добавляешь по одному условию так быстро найдешь остальные синтаксические ошибки
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #3 - 20. Февраля 2008 :: 07:36
Печать  
Z1 писал(а) 20. Февраля 2008 :: 07:24:
Для dbf поле ismark - текстовое
Вот это я ступил  Смех
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #4 - 20. Февраля 2008 :: 08:51
Печать  
Какой ужас - эти прямые запросы! Я сегодня сойду с ума.    Ужас
В общем полный запрос состоит из двух отдельных:
Код
Выбрать все
глЗапрос.УстановитьТекстовыйПараметр("ТекДата",ТекДата);
глТекст = "
|UPDATE
|		$Справочник.Ассортименты
|SET
|		$Справочник.Ассортименты.Включена = 1
|WHERE
|		IsMark = '' AND $Справочник.Ассортименты.Включена = 0 AND :ТекДата BETWEEN $Справочник.Ассортименты.ДатаНачала AND $Справочник.Ассортименты.ДатаКонца
|";

глЗапрос.Отладка(1);
ТЗ = глЗапрос.ВыполнитьИнструкцию(глТекст);

глЗапрос.УстановитьТекстовыйПараметр("ТекДата",ТекДата);
глТекст = "
|UPDATE
|		$Справочник.Ассортименты
|SET
|		$Справочник.Ассортименты.Включена = 0
|WHERE
|		$Справочник.Ассортименты.Включена = 1
|AND ($Справочник.Ассортименты.ДатаНачала > :ТекДата OR $Справочник.Ассортименты.ДатаКонца < :ТекДата)
|";

глЗапрос.Отладка(1);
ТЗ = глЗапрос.ВыполнитьИнструкцию(глТекст);
 


В результате ошибка:
Код
Выбрать все
ТЗ = глЗапрос.ВыполнитьИнструкцию(глТекст);
{Глобальный модуль(352)}: FAILED! ICommandText::Execute(): Operator/operand type mismatch. 


Мои действия:
1) Комментирую один из запросов для отладки другого
2) Все условия в отлаживаемом запросе переношу на разные строки
3) Начинаю снимать по одному комментарии и проверять работу запроса, пока запрос не станет полностью рабочий (работу запроса проверяю несколько раз)
4) Потом комментирую рабочий запрос и начинаю отлаживать второй запрос по той же схеме.
5) Снимаю комментарии с обоих запросов и выполняю их. Выходит ошибка.  Ужас
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #5 - 20. Февраля 2008 :: 09:05
Печать  
А может правильнее будет:
Код
Выбрать все
:ТекДата~~ 

?
И, по-моему, в ДБФ надо явно задавать псевдонимы таблицам и далее обращатся к её реквизитам через этот псевдоним
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #6 - 20. Февраля 2008 :: 09:06
Печать  
В первом запросе надо писать сравнение дат через AND потому,
что between применяется к полю таблицы, а у тебя он применяется к какой-то константе
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #7 - 20. Февраля 2008 :: 09:16
Печать  
JohnyDeath писал(а) 20. Февраля 2008 :: 09:05:
А может правильнее будет:
Код
Выбрать все
:ТекДата~~ 

?

Спасибо за ~~ - сработало.
JohnyDeath писал(а) 20. Февраля 2008 :: 09:05:
И, по-моему, в ДБФ надо явно задавать псевдонимы таблицам и далее обращатся к её реквизитам через этот псевдоним

В моем случае псевдонимы не нужны, да и они здесь не сработают (выходит ошибка).
Псевдонимы,  кажется, используются, если в запросе задействованы более одной таблицы.
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #8 - 20. Февраля 2008 :: 09:20
Печать  
Z1 писал(а) 20. Февраля 2008 :: 09:06:
В первом запросе надо писать сравнение дат через AND потому,
что between применяется к полю таблицы, а у тебя он применяется к какой-то константе

BETWEEN тоже работает. Хотя по логике ересь какая-то звучит: текущая дата между значениями двух полей таблицы  Подмигивание
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #9 - 20. Февраля 2008 :: 09:48
Печать  
ReLock писал(а) 20. Февраля 2008 :: 09:20:
Z1 писал(а) 20. Февраля 2008 :: 09:06:
В первом запросе надо писать сравнение дат через AND потому,
что between применяется к полю таблицы, а у тебя он применяется к какой-то константе

BETWEEN тоже работает. Хотя по логике ересь какая-то звучит: текущая дата между значениями двух полей таблицы  Подмигивание

Да потом я тоже понял что это тоже выражение sql и будет правильно работать,
просто "некрасиво" как-то.
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Как правильно написать запрос по UPDATE?
Ответ #10 - 20. Февраля 2008 :: 14:44
Печать  
ЭЭЭ
Дружище дбф штука совсем отвратительная
тута давеча запросом что на SQL писал на дбф такое натворил.
так что поищи здесь тама было по этому поводу ветка если fez ее не убрал.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #11 - 20. Февраля 2008 :: 14:51
Печать  
varelchik писал(а) 20. Февраля 2008 :: 14:44:
ЭЭЭ
Дружище дбф штука совсем отвратительная
тута давеча запросом что на SQL писал на дбф такое натворил.
так что поищи здесь тама было по этому поводу ветка если fez ее не убрал.

Что вы все так DBF ругаете? То что вы не умеете её готовить не значит что там всё плохо
просто несколько другой синтаксис. Выб ещё писали  код на с++ и ругались что это он в 1с не работает Улыбка
  
Наверх
ICQ  
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Как правильно написать запрос по UPDATE?
Ответ #12 - 20. Февраля 2008 :: 15:07
Печать  
Хватит ругаться и спорить. Я уже разобрался. У меня все работает. Тема  закрыта! Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать