Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ошибка при выполнении прямого запроса (число прочтений - 5421 )
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Ошибка при выполнении прямого запроса
18. Января 2011 :: 12:35
Печать  
Хочу с помощью прямого запроса удалить все значения цены кроме последнего пишу следующий запрос:
|delete
from
               1sconst as Const
where
     Const.Objid = :СпрЦены and Const.id = :Реквизит
     and Const.Date <
     (Select
           MAX(tabConst.Date)
     from
           1sconst as tabConst
     where tabConst.Objid = :СпрЦены and tabConst.id = :Реквизит and tabConst.Date < :КонДата)

при выполнении запроса выдает ошибку:
Команда.Выполнить(ТекстЗапроса);
{C:\DOCUMENTS AND SETTINGS\АДМИНИСТРАТОР\РАБОЧИЙ СТОЛ\123.ERT(50)}: FAILED! ICommandText::Execute(): Syntax error.

подскажите пожайлуста в чем может быть проблема.
P.S. База формата DBF/
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #1 - 18. Января 2011 :: 13:12
Печать  
функции есть только при group by
« Последняя редакция: 19. Января 2011 :: 08:04 - Eprst »  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #2 - 18. Января 2011 :: 13:17
Печать  
Это по поводу функции MAX() ???
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #3 - 18. Января 2011 :: 13:23
Печать  
да.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #4 - 18. Января 2011 :: 13:35
Печать  
Туплю...
Если я не ошибаюсь во вложенном запросе и не сгруппировать...
Как же тогда обойтись без функции ...  Нерешительный
возможна ли группировка по LINENO ???
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #5 - 18. Января 2011 :: 13:38
Печать  
а ты бери top 1 + order by desc
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #6 - 18. Января 2011 :: 13:48
Печать  
"
                 |delete
                 |from
                 |      1sconst as Const
                 |where
                 |      Const.Objid = :СпрЦена and Const.id = :Реквизит and Const.Date <
                 |      (Select top 1
                 |            tabConst.Date
                 |      from
                 |            1sconst as tabConst
                 |      where tabConst.Objid = :СпрЦена and tabConst.id = :Реквизит and tabConst.Date < ctod(:КонДата)
                 |      group by tabConst.Date desc)"

тоже не работает!
вот засада.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #7 - 18. Января 2011 :: 13:58
Печать  
Че-то заморочил я тебе голову своей ср@ной энергией..
Вот так делай :

Код
Выбрать все
delete
from
	 1sconst
where
     Objid = :СпрЦены and id = :Реквизит
     and Date <
     (Select
	     MAX(Date)
     from
	     1sconst
     where Objid = :СпрЦены and id = :Реквизит and Date < :КонДата) 


  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #8 - 18. Января 2011 :: 14:16
Печать  
ошибок в запросе нет спасибо...
но вот еще одна беда...

Команда.Выполнить(ТекстЗапроса);
{C:\DOCUMENTS AND SETTINGS\АДМИНИСТРАТОР\РАБОЧИЙ СТОЛ\123.ERT(50)}: FAILED! ICommandText::Execute(): Operator/operand type mismatch.
может это.
к("Цены").реквизит("Цена")));
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #9 - 18. Января 2011 :: 14:24
Печать  
у тебя там явно запятой нету..
Ты текст в отладке покажи.
Команда.УстановитьТекстовыйПараметр("Реквизит",МД.И
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #10 - 18. Января 2011 :: 15:32
Печать  
да там действительно запятая.
Только проблема как я понимаю в передаваемых параметрах.
так как он ругается на неверный тип
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #11 - 18. Января 2011 :: 18:13
Печать  
Спасибо всем! проблему решил.
Вот правильный текст запроса.
"
                 |delete
                 |from
                 |       1sconst
                 |where
                 |     Objid = :СпрЦены and id = $ИсторияРеквизита.Цены.Цена
                 |    and Date <
                 |   (Select
                 |     MAX(Date)
                 |from
                 |   1sconst
                 |where Objid = :СпрЦены and id = $ИсторияРеквизита.Цены.Цена and Date < ctod(:КонДата))"

ид реквизита нужно получать через $ИсторияРеквизита.Цены.Цена
такая конструкция не работает
МД.ИДРеквизитаСправочника("Цены","Цена"); (МД - объект типа MetaDataWork)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #12 - 19. Января 2011 :: 06:21
Печать  
Код
Выбрать все
	id = Прав(_idtostr(МД.ИДРеквизитаСправочника("Цены","Цена")),4);
	ТекстЗапроса = "
	   |delete
	   |--select *
	   |from
	   |     1sconst
	   |where
	   |  Objid = :СпрЦены and id = '"+id+"'
	   |    and Date <
	   |       (select
	   |	  	 max(Date)
	   |         from 1sconst
	   |         where Objid = :СпрЦены and
	   |         id = '"+id+"' and Date < :КонДата~~
	   |	     )";
    Запрос.УстановитьТекстовыйПараметр("КонДата",КонДата);
    Запрос.УстановитьТекстовыйПараметр("СпрЦены ",Спр.ТекущийЭлемент());
    Запрос.Отладка(1);
    Запрос.ВыполнитьИнструкцию(ТекстЗапроса); 


  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #13 - 19. Января 2011 :: 07:44
Печать  
ммм...
Так тоже работает.
Столькнулся с проблемой следующего характера.
Вообще через прямой запрос решил делать потому, что объект периодический работает медленно 4 часа удаляет .
Написав запрос и запустив обработку обнаружил что через запрос медленне 12 часов уже молотит и конца нет. Может как то по другому можно сделать Номенклатуры 25000 цен по 5 на каждую номенклатуру. Печаль
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #14 - 19. Января 2011 :: 07:53
Печать  
Можно попробовать написать условие по индексу IDD
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #15 - 19. Января 2011 :: 08:40
Печать  
Думаю что проблема в том что запрос написан только для одной позиции.
Вот только не знаю как написать запрос который бы отбирал бы данные кучей и удалял бы их одним махом.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #16 - 19. Января 2011 :: 08:47
Печать  
Ты не учитываешь еще типцен.
Если это типовая ТиС/Комплексная.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #17 - 19. Января 2011 :: 08:52
Печать  
тип цен пофигу. по всем типам нужно оставить только последнее значение.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #18 - 19. Января 2011 :: 09:03
Печать  
Вот я и говорю - не учитываешь, при твоём коде в (0) - останется только один тип цен.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #19 - 19. Января 2011 :: 09:20
Печать  
Нет смотри всю процедуру:
Код
Выбрать все
Процедура УдалитьЛишниеЦены(_КонДата,Команда)
	спрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");
	спрЦены = СоздатьОбъект("Справочник.Цены");
	Периодический = СоздатьОбъект("Периодический");
	спрНоменклатура.ВыбратьЭлементы();
	Пока спрНоменклатура.ПолучитьЭлемент() = 1 Цикл
		Если спрНоменклатура.ЭтоГруппа() = 1 Тогда
			Продолжить;
		КонецЕсли;
		спрЦены.ИспользоватьВладельца(спрНоменклатура.ТекущийЭлемент());
		спрЦены.ВыбратьЭлементы();
		Пока спрЦены.ПолучитьЭлемент() = 1 Цикл
			**********
			ТекстЗапроса = "
			|delete
			|from
			|	 1sconst
			|where
			|     Objid = :СпрЦены and id = $ИсторияРеквизита.Цены.Цена
			|    and Date <
			|   (Select
			|     MAX(Date)
			|from
			|   1sconst
			|where Objid = :СпрЦены and id = $ИсторияРеквизита.Цены.Цена and Date < ctod(:КонДата))";
			Команда.УстановитьТекстовыйПараметр("КонДата",_КонДата);
			Команда.УстановитьТекстовыйПараметр("СпрЦены",спрЦены.ТекущийЭлемент());
			Команда.Выполнить(ТекстЗапроса);
			*************
			ТекстЗапроса = "
			|delete
			|from
			|	 1sconst
			|where
			|     Objid = :СпрЦены and id = $ИсторияРеквизита.Цены.Единица
			|    and Date <
			|   (Select
			|     MAX(Date)
			|from
			|   1sconst
			|where Objid = :СпрЦены and id = $ИсторияРеквизита.Цены.Единица and Date < ctod(:КонДата))";
			Команда.УстановитьТекстовыйПараметр("КонДата",_КонДата);
			Команда.УстановитьТекстовыйПараметр("СпрЦены",спрЦены.ТекущийЭлемент());
			Команда.Выполнить(ТекстЗапроса);
		КонецЦикла;
		Состояние("Обработан" + спрНоменклатура.ТекущийЭлемент());
	КонецЦикла;

КонецПроцедуры
 

  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Ошибка при выполнении прямого запроса
Ответ #20 - 19. Января 2011 :: 09:34
Печать  
А чем не удовлетворяют стандартные средства для выполнения операции удаления? Зачем такой огород городить?
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #21 - 19. Января 2011 :: 09:38
Печать  
Leierkastenmann писал(а) 19. Января 2011 :: 09:34:
А чем не удовлетворяют стандартные средства для выполнения операции удаления? Зачем такой огород городить?

Хотелось как быстрее, видимо придется стандартными.
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Ошибка при выполнении прямого запроса
Ответ #22 - 19. Января 2011 :: 09:47
Печать  
Я, конечно, с дбф очень мало работал, но вот про sql версию могу сказать, что далеко не всегда удаление прямым запросом дает желаемое ускорение.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #23 - 19. Января 2011 :: 10:13
Печать  
mozer писал(а) 19. Января 2011 :: 09:20:
Нет смотри всю процедуру:


Как-то ты всё сделал через 1 место..
Улыбка
В особенности перебор всего справочника номенклатуры.. когда надо было всего лишь 1 табличку 1sconst шерстить для этого.
Без выполнения кучи запросов, а выполнив всего лишь один :

тебе достаточно знать id реквизита Цена и всё..

+ ты не учитываешь цену для разных типов цен

Алгоритм такой:

делаешь селект с группировкой по objid +max(date)
далее удаляешь всё, что не в этой выборке.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #24 - 19. Января 2011 :: 10:39
Печать  
Eprst писал(а) 19. Января 2011 :: 10:13:
mozer писал(а) 19. Января 2011 :: 09:20:
Нет смотри всю процедуру:


Как-то ты всё сделал через 1 место..
Улыбка
В особенности перебор всего справочника номенклатуры.. когда надо было всего лишь 1 табличку 1sconst шерстить для этого.
Без выполнения кучи запросов, а выполнив всего лишь один :

тебе достаточно знать id реквизита Цена и всё..

+ ты не учитываешь цену для разных типов цен

Алгоритм такой:

делаешь селект с группировкой по objid +max(date)
далее удаляешь всё, что не в этой выборке.


Я сейчас и пытаюсь сделать это только условие по какому полю делать??
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #25 - 19. Января 2011 :: 11:43
Печать  
Так спробуй:
Код
Выбрать все
id = Прав(_idtostr(МД.ИДРеквизитаСправочника("Цены","Цена")),4);
ТекстЗапроса="

 |delete
 |--select *
 |from 1sconst
 |where not exists
 |    (
 |     select *
 |     from (
 |		 select
 |		    c.Objid as Objid
 |		    ,max(c.date) as date
 |		 from 1sconst c
 |		 where c.id = '"+id+"'
 |		group by c.Objid
 |	    )t
 |    where t.objid=objid and t.date=date
 |	 )and id ='"+id+"'
 |"; 

  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #26 - 19. Января 2011 :: 11:56
Печать  
Код
Выбрать все
"
	|Select
	|	id,
	|	date,
	|	mdate
	|from
	|(select
	|	id,
	|	objid,
	|	date,
	|	Max(date) mdate
	|from
	|	1sconst
	|group by objid,id,date ) b
	|where
	|	objid in (select val from "+ВремТаблица+") and date < mdate and id = $ИсторияРеквизита.цены.цена" 



вот такой код пробую.
ошибка: Команда.Выполнить(ТекстЗапроса);
{E:\ОБРАБОТКИ\123.ERT(61)}: FAILED! ICommandText::Execute(): File '' does not exist.
видимо таблицу не видит...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #27 - 19. Января 2011 :: 11:59
Печать  
Да нет, долбаный фокс не позволяет алияс на delete делать, вот так всё работает:

Код
Выбрать все
ТекстЗапроса="

 |delete
 |from 1sconst
 |where not exists
 |    (
 |     select *
 |     from (
 |		 select
 |		    c.Objid as Obj
 |		    ,max(c.date) as d
 |		 from 1sconst c
 |		 where c.id = $ИсторияРеквизита.цены.цена
 |		group by c.Objid
 |	    )t
 |    where t.obj=objid and t.d=date
 |	 )and id =$ИсторияРеквизита.цены.цена
 |"; 

  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #28 - 19. Января 2011 :: 12:09
Печать  
where not exists
не понимаю вот этого выражения ...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка при выполнении прямого запроса
Ответ #29 - 19. Января 2011 :: 12:22
Печать  
удаляем все строки когда ид = нужному и вложенный подзапрос не вернул ни одной строки.

Во вложенном коррелированом подзапросе сравниваются дата и обжид с вложенным подзапросом, который возвращает максимальную дату для каждого обжид.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Ошибка при выполнении прямого запроса
Ответ #30 - 19. Января 2011 :: 12:48
Печать  
Все работает спасибо и главное моментом удаляет.
Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать