Переключение на Главную Страницу Страницы: 1 ... 28 29 [30] 31 32 ... 51 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 258684 )
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #435 - 18. Октября 2012 :: 11:28
Печать  
Все, ясно!) где-то так и думал. В рабочем коде я все взял из регистра (без ВТ), этот - просто чтобы прояснить себе.
Саша, спасибо!
  
Наверх
ICQ  
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #436 - 21. Октября 2012 :: 23:55
Печать  
Вот такой код:
Код
Выбрать все
	лПЗЦен.Текст="
	|Select $ПоследнееЗначение.Цены.Цена($СпрЦены.ТекущийЭлемент,:лГраницаРасчета~) as Цена
	|from
	|	Справочник.Цены as СпрЦены $nolock
	|where $СпрЦены.Владелец = @лТекНоменклатура И $СпрЦены.ТипЦен=:лТипЦен И $СпрЦены.ПометкаУдаления = 0";
	лПЗЦен.УстановитьТекстовыйПараметр("лТипЦен", ТипЦен);
	лПЗЦен.УстановитьТекстовыйПараметр("лГраницаРасчета", ГраницаРасчетаОстатков);
	лПЗЦен.ОписаниеПараметра("лТекНоменклатура","Справочник.Номенклатура");
	лПЗЦен.ПодготовитьПараметризованныйЗапрос();
 



на dbf все Ок, на sql - ошибка:

спЦен=лПЗЦен.ВыполнитьПараметризованныйЗапрос("СписокЗначений");
{Справочник.Номенклатура.ФормаСписка.Основная.Модуль(179)}: ПрямойЗапрос::ВыполнитьПараметризованныйЗапрос(Строка ТипОбъекта=СписокЗначений) : Meta name parser error: не указан параметр ":лТипЦен"
ЗапросODBC.ВыполнитьИнструкцию(,ПолучательЗапроса);
{C:\BASES\TotalCNT\CLASSES\ПрямыеЗапросы\ПрямойЗапрос.ert(13578) }

Из описания: "ПоследнееЗначение      Все параметры должны быть установлены до подготовки запроса.
.... В совокупности с параметризированным запросом разрешается использование только методов «ОписаниеПараметра», «ПодставлятьПараметры» и «ВыполнитьПараметризированныйЗапрос»."

т.е. в ПараметризованномЗапросе НЕЛЬЗЯ использовать текстовые параметры? Тогда фраза "Все параметры должны быть установлены до подготовки запроса" к чему относится?

В итоге извратился так:
Код
Выбрать все
	ТекстЗапросаЦен="
	|Select $ПоследнееЗначение.Цены.Цена($СпрЦены.ТекущийЭлемент,:лГраницаРасчета~) as Цена
	|From
	|	Справочник.Цены as СпрЦены $nolock
	|Where $СпрЦены.Владелец = @лТекНоменклатура И $СпрЦены.ТипЦен=:лТипЦен И $СпрЦены.ПометкаУдаления = 0";

	лТипЦен=глМетаДата.ЗначениеВСтрокуБД(ТипЦен);
	ТекстЗапросаЦен=СтрЗаменить(ТекстЗапросаЦен,":лТипЦен","'"+лТипЦен+"'");
	цаРасчетаОстатков,"ДГГГГММДД")+"'");
	лПЗЦен.Текст=ТекстЗапросаЦен;
	лПЗЦен.ОписаниеПараметра("лТекНоменклатура","Справочник.Номенклатура");
	лПЗЦен.ПодготовитьПараметризованныйЗапрос();
 



Ну еще вдогонку:
Код
Выбрать все
		|ВЫБРАТЬ
		|	СпрАлк.ВидПродукции КАК [ВидАП $Справочник.алкВидыПродукции]
		|	,$РегАлк.Склад КАК [Склад $Справочник.МестаХранения]
		|	,$РегАлк.Номенклатура КАК [Номенклатура $Справочник.Номенклатура]
		|	,МАКСИМУМ(СпрАлк.ПроизвИмп) КАК [ПроизвИмп $Справочник.Контрагенты]
		|	,СУММА(ВЫБОР КОГДА $РегАлк.ВидДвижения=0 ТОГДА $РегАлк.Количество*СпрАлк.Емкость/10 ИНАЧЕ 0 КОНЕЦ) КАК [П13 $Число.15.5]
		|	,СУММА(ВЫБОР КОГДА $РегАлк.ВидДвижения=1 ТОГДА $РегАлк.Количество*СпрАлк.Емкость/10 ИНАЧЕ 0 КОНЕЦ) КАК [П21 $Число.15.5]
		|ИЗ
		|	Регистр.ДвиженияАлкоголя КАК РегАлк $nolock
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|	(ВЫБРАТЬ
		|		$СправАлк.ВидПродукции КАК ВидПродукции
		|		,$СправАлк.Товар КАК Товар
		|		,МАКСИМУМ(ВЫБОР КОГДА($СправАлк.Производитель<>:ПустойИД) ТОГДА $СправАлк.Производитель ИНАЧЕ $СправАлк.Импортер КОНЕЦ) КАК ПроизвИмп
		|		,МАКСИМУМ($СправАлк.Емкость) КАК Емкость
		|		ИЗ
		|			Справочник.АлкНоменклатура КАК СправАлк $nolock
		|	СГРУППИРОВАТЬ
		|		$СправАлк.ВидПродукции,$СправАлк.Товар) КАК СпрАлк
		|ПО
		|	$РегАлк.Номенклатура=СпрАлк.Товар И ($РегАлк.Дата МЕЖДУ :лНачДата И :лКонДата)
		|ГДЕ
		|	($РегАлк.Фирма=:лФирма И 1=1 И 4=4 И $РегАлк.ВидДокумента=:ВидДокумента.ПеремещениеТоваров И 2=2 И 5=5)
		|СГРУППИРОВАТЬ
		|	СпрАлк.ВидПродукции,$РегАлк.Склад,$РегАлк.Номенклатура
		|УПОРЯДОЧИТЬ
		|	СпрАлк.ВидПродукции,$РегАлк.Склад,$РегАлк.Номенклатура";
 


Почему такая конструкция на SQL моментально отрабатывает, а на SQLite - жутко тормозит? игрался с условиями всяко-разно, результат нулевой Озадачен (РегАлк - "Быстрый отбор движений" стоит)
в файле: Запрос.РежимОтладки = 1
« Последняя редакция: 22. Октября 2012 :: 03:56 - Dolly_EV »  

________003.txt ( 1 KB | Загрузки )
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #437 - 22. Октября 2012 :: 09:21
Печать  
Счас уже мало что помню, что я там наделал. Улыбка на первой то вроде все нормально кажется.
А вот по поводу запроса, попробуй убрать из запроса вложенный запрос в соединении. Сделай из него временную таблицу. В общем справочник - вот узкое место. Смотри его. Может быть отбор (признак) поставь на реквизитах которые группируются.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kalen
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 185
Зарегистрирован: 29. Марта 2010
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #438 - 22. Октября 2012 :: 11:40
Печать  
Dolly_EV писал(а) 21. Октября 2012 :: 23:55:
Код
Выбрать все
ПО ... И ($РегАлк.Дата МЕЖДУ :лНачДата И :лКонДата)
 

Имхо, проблема в неоптимальном соединении. Попробуй вынести это условие из точки соединения в ГДЕ. 1sqlite бывает ошибается в подборе индекса в этом месте.
Судя по
Цитата:
Подбор индекса для таблицы SC48386:
     Ограничения:
     Упорядочить: SP48440[ВидПродукции], SP48437[Товар],
     Найдено в кэше
     Индекс не выбран.
     Стоимость: 9984
Подбор индекса для таблицы RA48458:
     Ограничения: SP48459[Фирма]=; IDDOCDEF=; DATE>=; DATE<=;
     Найдено в кэше
     Выбран индекс DATETIME: DTOS(DATE)+TIME+IDDOC+STR(LINENO,4)+STR(ACTNO,6)
     Стоимость: 100
..не удивительно, что Цитата:
время выполнения запроса: 12895 мс.
конечно, что тут должно быть на самом деле сказать трудно без знания конфы. Возможно, что для регистра есть индекс по "Номенклатура", и sql соединяет по ней.
Вообще, неэффективность 1sqlite в групповых операциях общеизвестна, т.ч. он по-любому скуль не догонит.
К слову, на всякий случай добавлю к Сашиным словам, что он имел в виду, конечно, временную таблицу с индексом.
А еще с $ ты, мне кажется, несколько перестарался Улыбка
  
Наверх
GTalkICQ  
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #439 - 22. Октября 2012 :: 12:33
Печать  
Kalen писал(а) 22. Октября 2012 :: 11:40:
Попробуй вынести это условие из точки соединения в ГДЕ.

Не, это пробовал, не помогает. Да, действительно проблема в справочнике - если его не группировать - все Ок.
При этом весь огород на самом деле городился для наложения условия в верхнем запросе "ПроизвИмп<>:ПустойИД", т.к. в любых других вариантах при исполнении на СКЛь ругается, что "Column 'ПроизИмп' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.  Злой (SQLite при этом пропускает!)

Т.е. остается отдельный запрос для СпрАлк и инсерт в тз с индексом  Печаль

Цитата:
А еще с $ ты, мне кажется, несколько перестарался Улыбка

Где? )) вроде всё по Доке...
Зае...л меня этот $, честно говоря, но в последние дни вроде прояснение наступило, где надо-где не надо))
  
Наверх
ICQ  
IP записан
 
Kalen
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 185
Зарегистрирован: 29. Марта 2010
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #440 - 22. Октября 2012 :: 14:33
Печать  
Dolly_EV писал(а) 22. Октября 2012 :: 12:33:
Да, действительно проблема в справочнике - если его не группировать - все Ок.

Любопытно все-таки - что больше тормозит джоин или групбай. Сколько в отдельности выполняется сам подзапрос?
  
Наверх
GTalkICQ  
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #441 - 23. Октября 2012 :: 01:31
Печать  
Kalen писал(а) 22. Октября 2012 :: 14:33:
Сколько в отдельности выполняется сам подзапрос?

Сам подзапрос к справочнику - быстро (и с груп и без груп), как только джойн с регистром - все колом(именно когда СпрАлк Групбай). При этом джойн с ВТОбороты регистра - все летает... проверил - по всем группируемым реквизитам - стоит "Отбор" (и в т.ч. на реквизитах СпрАлк)... короче запишем в "непонятое" пока Улыбка
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #442 - 24. Октября 2012 :: 11:18
Печать  
А если Запрос без Группировки оформить подзапросом, к которому потом применить группировку?
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #443 - 24. Октября 2012 :: 11:37
Печать  
Весьма забавный подзапрос..
Точнее бредовая структура хранения данных:

У вас в алкашном справочнике может быть несколько элементов с одним товаром, но с разным производителем/импортером и , что о ужас! - с разным видом алкогольной продукции?!

Если да, то даже гроупбай там не поможет - вы однозначно по связке в соединении "ссылка на Товар" поимеете грабли в виде удвоении/затроении..  (=количеству элементов с одинаковым товаром но с разным кодом продукции).

Если даже код один для каждого товара, но производитель/импортеры разные - то при функции максимум имеете кота в мешке - т.е первого попавшегося (у кого ид побольше,т.е более позднего созданного елемента справочника клиентосов) - что не верно с точки зрения учета в разрезе производители/импортеры.


Так что, тут структуру данных нужно менять, а не запрос, который радугу показывает оптимизировать

ЗЫ: ежели в этом справочнике однозначное соответствие
товар - вид продукции - импортер/производитель, то он вовсе не нужен , все эти реквизиты можно хранить в номенклатуре, если уж сделали так, то выкинуть гроупбай тогда.

Ежели всё же там могут быть одинаковые товары но с разными производителями/импортерами, то это нужно учитывать хотя бы в Партии товаров, чтоб потом с регистра тащить производителя/импортера, которого выбрали в документе и в приходе организовать выбор их же.


  
Наверх
 
IP записан
 
dontcrypls
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 24. Октября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #444 - 24. Октября 2012 :: 12:11
Печать  
Код
Выбрать все
	  списокСчетов = СоздатьОбъект("СписокЗначений");
	списокСчетов.ДобавитьЗначение(СчетПоКоду("41.1"));

        ТекстЗапроса = "ВЫБРАТЬ
					|	БухИтоги.КоличествоНачальныйОстаток КАК НачОст41,
					|	БухИтоги.СуммаОборотДт КАК ОборотыДт41,
					|	БухИтоги.Субконто1 КАК [Автомобиль $Субконто],
					|	БухИтоги.Субконто1_вид КАК Автомобиль_вид
					|ИЗ
					|	, Сумма),(Субконто1  В (ВЫБРАТЬ Val ИЗ #спАвто))) КАК БухИтоги
					|";
	Запрос.УложитьСписокЗначений(списокСчетов, "#спСчетов");                  
	Запрос.УложитьСписокЗначений(спАвто, "#спАвто");
	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);              
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата); 



Уже все перепробовал  не знаю в чем беда. спАвто - список с элементами из справочника "Номенклатура", в результате запроса получается только 1 строка. 2 Странности:
1.Не попадают остальные строки(хотя я формировал осв по счету 41.1 для элементов и она не пустая)
2. Остается пустое поле оборотов(для элемента по которому запрос сработал), хотя обороты в данном периоде были.
Скажите, пожалуйста, что не так Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #445 - 24. Октября 2012 :: 12:21
Печать  
Модификаторы на дату не нужно втыкать ?
(ЗЫ: реализацию этого класса не видел)
  
Наверх
 
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #446 - 24. Октября 2012 :: 12:28
Печать  
Salimbek писал(а) 24. Октября 2012 :: 11:18:
А если Запрос без Группировки оформить подзапросом, к которому потом применить группировку?

Это как? у меня Группировка одна по верхнему запросу, этот (к справочнику) и так подзапрос...
Ладно, это уже не важно, тут много всяких факторов: и регистр не оптимизирован (отбора нет по нужным полям + измерения в неправильном порядке), и логика построения реквизитов "не правильная"... просто этот регистр - далекое наследство от конфиги КТ-2000, но был всегда как-бы вспомогательным, а тут потребовался... вобщем все переделывать надо )))

Выводы, которы для себя сделал:
1. SQL дюже умный всмысле построения запросов, и даже при неправильной структуре и связях таблиц очень хорошо изворачивается Подмигивание но при этом очень строг к синтаксису когда имеются агрегатные функции, Груп бай и условия в ГДЕ
2. SQLite туповат при выборе индексов, но можно вольнее себя чувствовать в плане синтаксиса (уловия и ордер бай)
Поправьте, если неправильные выводы сделал?
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #447 - 24. Октября 2012 :: 12:37
Печать  
Там вообще не нужен этот регистр, если что.
Всё и так есть в ПартииНаличие: и даллы тоже можно вычислить и не
алкоголь отсеить.
  
Наверх
 
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #448 - 24. Октября 2012 :: 12:42
Печать  
Eprst писал(а) 24. Октября 2012 :: 11:37:
Весьма забавный подзапрос..
Точнее бредовая структура хранения данных:

Это да))) читай выше ответ - давнее наследие КТ-200
Цитата:
У вас в алкашном справочнике может быть несколько элементов с одним товаром, но с разным производителем/импортером и , что о ужас! - с разным видом алкогольной продукции?!

Неее, Номенклатура.Алкоголь <=> АлкНоменклатура.Товар один-к-одному, т.е. косяки конечно случаются, но все отлавливается и при формировании деклы имеем "один-к-одному". Измерение в АлкРегистре - Номенклатура (не алкоголь)
Цитата:
Если даже код один для каждого товара, но производитель/импортеры разные - то при функции максимум имеете кота в мешке - т.е первого попавшегося (у кого ид побольше,т.е более позднего созданного елемента справочника клиентосов) - что не верно с точки зрения учета в разрезе производители/импортеры.

Группирую все по "Номенлатура" в том числе, так что МАКСИМУМ однозначно выдаст или одно значение или Пусто
Цитата:
Так что, тут структуру данных нужно менять, а не запрос, который радугу показывает оптимизировать

Однозначно согласен, но я же только еще подошел к этому))) Так сказать с полным пониманием теперь смотрю)))
Цитата:
ЗЫ: ежели в этом справочнике однозначное соответствие
товар - вид продукции - импортер/производитель, то он вовсе не нужен , все эти реквизиты можно хранить в номенклатуре, если уж сделали так, то выкинуть гроупбай тогда.

Далее Производителя/Импортера буду выносить в свойства партии и организовывать парт учет.... это как со складскими площадями на след. год полегче станет, чтобы стоповать было возможно, ну а так АлкНоменклатура - нужен только как "контейнер" для алк реквизитов, т.к. конфига используется не только на алкоголе, чтобы не "засорять" Спр.Номенклатура, и хрен его знает, что там дальше придумается))) может опять акциз платить станем

Eprst, у тебя кстати эта конфига есть, если не выкинул))..когда разбирались с классом "Аля Восьмерка"
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #449 - 24. Октября 2012 :: 12:46
Печать  
У меня много таких конф от кт-ников есть.
Там всё через ж.. сделано было изначально - они так и тянут это всё из релиза в релиз - "жертва" универсальности с типовыми конфигами.

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

Если несколько - то твой запрос априори неверен.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 28 29 [30] 31 32 ... 51
ОтправитьПечать