Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ошибка при выполнении прямого запроса (число прочтений - 5395 )
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 записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать