Переключение на Главную Страницу Страницы: 1 ... 6 7 [8] 9 10 ... 51 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 245521 )
Gimalaj
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 7
Зарегистрирован: 15. Февраля 2011
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #105 - 25. Февраля 2011 :: 16:32
Печать  
Собственно, код:
Код
Выбрать все
//
Процедура Сформировать()
	ТЗАвто = СоздатьОбъект("ТаблицаЗначений");
	ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
	ПрямойЗапрос.Текст = " СОЗДАТЬ ТАБЛИЦА #Счет411 (Счет VARCHAR(9) ПОУМОЛЧАНИЮ 41.1)";
	ПрямойЗапрос.Выполнить();

	ПрямойЗапрос.Текст = "ВСТАВИТЬ ВНУТРЬ #Счет411 ПОУМОЛЧАНИЮ ЗНАЧЕНИЯ";
	ПрямойЗапрос.Выполнить();

	ПрямойЗапрос.Текст = "
	|ВЫБРАТЬ
	|	ОстаткиОсновной.Счет КАК [Счет $Счет.Основной],
	|	ОстаткиОсновной.Субконто1 КАК [Субконто1 $Субконто],
	|	ОстаткиОсновной.СуммаОстатокДт КАК ОстатокДт
	|ИЗ
	|	$БИОстатки.Основной(:КонПериода, #Счет411, (Номенклатура), (Сумма)) КАК ОстаткиОсновной
	|";

	ПрямойЗапрос.УстановитьТекстовыйПараметр("КонПериода", КонДата);
	//ПрямойЗапрос.РежимОтладки = 1;
	ТЗАвто = ПрямойЗапрос.Выполнить(ТЗАвто);
	ТЗАвто.Выгрузить(ТЗ);

	ПрямойЗапрос.СброситьТаблицу("#Счет411");

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



Результат:
Код
Выбрать все
ПрямойЗапрос::Выполнить(ТаблицаЗначений ТипОбъекта=, Строка ТекстВыполнения=, Число БезПодготовки=0) : no such column: val
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
{D:\1cbase\Complex_buh\ПрямойЗапрос.ert(13153) }

ТЗАвто = ПрямойЗапрос.Выполнить(ТЗАвто);
{D:\SHISHKIN\COMPLEX_BUH_16-02-2011\EXTFORMS\БИОСТАТКИ.ERT(22)}: ПрямойЗапрос::Выполнить(ТаблицаЗначений ТипОбъекта=, Строка ТекстВыполнения=, Число БезПодготовки=0) : no such column: val
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
{D:\1cbase\Complex_buh\ПрямойЗапрос.ert(13153) } 



Подскажите, что я делаю не так?
  
Наверх
 
IP записан
 
BlueWind
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Местоположение: Тирасполь
Зарегистрирован: 28. Ноября 2010
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #106 - 25. Февраля 2011 :: 17:00
Печать  
Gimalaj писал(а) 25. Февраля 2011 :: 16:32:
Собственно, код:
Код
Выбрать все
//
Процедура Сформировать()
	ТЗАвто = СоздатьОбъект("ТаблицаЗначений");
	ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
	ПрямойЗапрос.Текст = " СОЗДАТЬ ТАБЛИЦА #Счет411 (Счет VARCHAR(9) ПОУМОЛЧАНИЮ 41.1)";
	ПрямойЗапрос.Выполнить();

	ПрямойЗапрос.Текст = "ВСТАВИТЬ ВНУТРЬ #Счет411 ПОУМОЛЧАНИЮ ЗНАЧЕНИЯ";
	ПрямойЗапрос.Выполнить();

	ПрямойЗапрос.Текст = "
	|ВЫБРАТЬ
	|	ОстаткиОсновной.Счет КАК [Счет $Счет.Основной],
	|	ОстаткиОсновной.Субконто1 КАК [Субконто1 $Субконто],
	|	ОстаткиОсновной.СуммаОстатокДт КАК ОстатокДт
	|ИЗ
	|	$БИОстатки.Основной(:КонПериода, #Счет411, (Номенклатура), (Сумма)) КАК ОстаткиОсновной
	|";

	ПрямойЗапрос.УстановитьТекстовыйПараметр("КонПериода", КонДата);
	//ПрямойЗапрос.РежимОтладки = 1;
	ТЗАвто = ПрямойЗапрос.Выполнить(ТЗАвто);
	ТЗАвто.Выгрузить(ТЗ);

	ПрямойЗапрос.СброситьТаблицу("#Счет411");

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



Подскажите, что я делаю не так?


Если манипуляции с таблицей ради отбора остатков по счету, тогда вместо них

Код
Выбрать все
	ПрямойЗапрос.УстановитьТекстовыйПараметр("Счет411", СчетПоКоду("41.1"));
 



Код
Выбрать все
	|...
	|ИЗ
	|	$БИОстатки.Основной(:КонПериода, , (Номенклатура), (Сумма), (Счет = :Счет411), ) КАК ОстаткиОсновной
	|...
 


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


1C++ rocks!

Сообщений: 7
Зарегистрирован: 15. Февраля 2011
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #107 - 25. Февраля 2011 :: 17:39
Печать  
BlueWind писал(а) 25. Февраля 2011 :: 17:00:
Если манипуляции с таблицей ради отбора остатков по счету, тогда вместо них
...

Спасибо, получилось.
  
Наверх
 
IP записан
 
nixstill
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 19. Января 2011
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #108 - 26. Февраля 2011 :: 10:58
Печать  
Подскажите, что не так? Делаю простой по сути запрос:
Код
Выбрать все
		|ВЫБРАТЬ		  
		| ВРасчеты.Докум КАК [Докум $Документ],
		| ВРасчеты.Докум_вид КАК Докум_вид,
		| ВРасчеты.Договор КАК [Договор $Справочник.Договоры],
		| СУММА(ВРасчеты.СумПриход) КАК СумПриход,
		| СУММА(ВРасчеты.СумРасход) КАК СумРасход
		|
		|ИЗ(
		|
		| ВЫБРАТЬ		  
		|  Поставщики.ТекущийДокумент КАК Докум,
		|  Поставщики.ВидДокумента КАК Докум_вид,
		|  Поставщики.Договор КАК Договор,
		|  Поставщики.СуммаУпрПриход КАК СумПриход,
		|  Поставщики.СуммаУпрРасход КАК СумРасход
		|
		| ИЗ
		|  $РегистрОбороты.Поставщики(:ДатаНачала, :ДатаКонца~, Документ, , (Договор), СуммаУпр) Поставщики $nolock
		|
		|ОБЪЕДИНИТЬ
		|
		| ВЫБРАТЬ		  
		|  Покупатели.ТекущийДокумент КАК Докум,
		|  Покупатели.ВидДокумента КАК Докум_вид,
		|  Покупатели.Договор КАК Договор,
		|  Покупатели.СуммаУпрПриход КАК СумПриход,
		|  Покупатели.СуммаУпрРасход КАК СумРасход
		|
		| ИЗ
		|  $РегистрОбороты.Покупатели(:ДатаНачала, :ДатаКонца~, Документ, , (Договор), СуммаУпр) Покупатели $nolock
		|
		|) КАК ВРасчеты
		|
		|СГРУППИРОВАТЬ
		| ВРасчеты.Докум, ВРасчеты.Докум_вид, ВРасчеты.Договор
 



Но вываливается с ошибкой:
Цитата:
Поставщики содержит больше столбцов, чем указано в списке столбцов.


А если сделать запрос по ВТ $РегистрОстаткиОбороты, то все норм.
И еще подскажите как на донном классе сделать запрос с иерархией групп например Контрагентов или Номенклатуры?


Версии класса, 1С++ и т.д. последние.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #109 - 26. Февраля 2011 :: 12:34
Печать  
Получить результат запроса в иерархическом виде не получится. Необходимо потом уже ИТЗ вертеть.
Покажи РежимОтладки = 1 (только в виде прикрепленного тхт чтобы тут не охреневать Улыбка)
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #110 - 28. Февраля 2011 :: 03:37
Печать  
Код
Выбрать все
|  $РегистрОбороты.Поставщики(:ДатаНачала, :ДатаКонца~, Документ, , (Договор), СуммаУпр) Поставщики $nolock 


вот этот nolock как минимум лишний и в одной ВТ и в другой так как ВТ это по сути подзапрос а не конкретная таблица.
  
Наверх
IP записан
 
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #111 - 01. Марта 2011 :: 11:36
Печать  
Подскажите, как выполнить запрос сразу к двум виртуальным таблицам? скажем к регистру Остатки и Продажи, два разных запроса написать получается а одим ну никак...

Вот например запрос к продажам:
SELECT
     Рег.Фирма КАК [Фирма $Справочник.Фирмы],
     Рег.Период КАК [Дата],                                                   
     Рег.Номенклатура КАК [Номенклатура $Справочник.Номенклатура],
     Рег.КоличествоОборот КАК [Продано],
     Рег.КоличествоВОборот КАК [Возвращено],
     Рег.ПродСтоимостьОборот КАК [СтоимПродаж],
     Рег.ПродСтоимостьВОборот КАК [СтоимВозвр]
FROM
     $РегистрОбороты.Продажи(
                                         :НачПериода,
                                         :КонПериода~,
                                         День,
(Фирма В (Выбрать val ИЗ #Фирмы)) AND (Номенклатура   in (SELECT Val FROM #ГруппаНоменклатура))                                                                                  (Номенклатура,Фирма),                            
                                         (Количество,КоличествоВ,ПродСтоимость,ПродСтоимостьВ)
                                         ) КАК Рег

хотелось бы на выходе еще колонку с остатком товара на каждый день
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #112 - 01. Марта 2011 :: 16:41
Печать  
Ну теперь сочини текст запроса остатков а я поправлю Улыбка
  
Наверх
IP записан
 
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #113 - 02. Марта 2011 :: 06:29
Печать  
leshik писал(а) 01. Марта 2011 :: 16:41:
Ну теперь сочини текст запроса остатков а я поправлю Улыбка


хм, вот остатки на каждый день (условие у них одинаковое):
|SELECT
|      РегОст.НачалоПериода КАК [НачПериода],
|      РегОст.Фирма КАК [Фирма $Справочник.Фирмы],
|      РегОст.Номенклатура КАК [Номенклатура $Справочник.Номенклатура],
|      (РегОст.КоличествоКонечныйОстаток) КАК КолОстКон
|FROM
|      $РегистрОстаткиОбороты.ОстаткиТМЦ(
|                                          :НачПериода,
|                                          :КонПериода~,
|                                          День ДОПОЛНЕНИЕ,
|                                          ДвиженияИГраницыПериода,
|";
ТекстЗапроса=ТекстЗапроса+Условие+",
|                                          (Фирма,Номенклатура),
|                                          (Количество)
|                                          ) КАК РегОст  

Заранее спасибо, а то никак мне не удается разобраться с джойнами
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #114 - 02. Марта 2011 :: 07:17
Печать  
Код
Выбрать все
|SELECT
|     Рег.Фирма КАК [Фирма $Справочник.Фирмы],
|     Рег.Период КАК [Дата],
|     Рег.Номенклатура КАК [Номенклатура $Справочник.Номенклатура],
|     Рег.КоличествоОборот КАК [Продано],
|     Рег.КоличествоВОборот КАК [Возвращено],
|     Рег.ПродСтоимостьОборот КАК [СтоимПродаж],
|     Рег.ПродСтоимостьВОборот КАК [СтоимВозвр],
|	 ISNULL(РегОст.КоличествоОстаток,0) КАК КолВоОстатка
|FROM
|     $РегистрОбороты.Продажи(
|						     :НачПериода,
|						     :КонПериода~,
|						     День,
|(Фирма В (Выбрать val ИЗ #Фирмы)) AND (Номенклатура   in (SELECT Val FROM #ГруппаНоменклатура))													    (Номенклатура,Фирма),
|						     (Количество,КоличествоВ,ПродСтоимость,ПродСтоимостьВ)
|						     ) КАК Рег
|ЛЕВОЕ СОЕДИНЕНИЕ
|	$РегистрОстаткиОбороты.ОстаткиТМЦ(
|							:НачПериода,
|							:КонПериода~,
|							День ДОПОЛНЕНИЕ,
|							ДвиженияИГраницыПериода,
|";
ТекстЗапроса=ТекстЗапроса+Условие+",
|							(Фирма,Номенклатура),
|							(Количество)
|							) КАК РегОст
|ПО (Рег.Фирма = РегОст.Фирма) И (Рег.Период = РегОст.Период) и (Рег.Номенклатура = РегОст.Номенклатура) 

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


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #115 - 02. Марта 2011 :: 07:58
Печать  
Вот спасибо огромное, а я дурень, после левого соединения еще СЕЛЕКТ пытался сделать, чуток поправил и вроде на выходе получил что требовалось:

Код
Выбрать все
|SELECT
|     РегОст.Фирма КАК [Фирма $Справочник.Фирмы],
|     РегОст.Номенклатура КАК [Номенклатура $Справочник.Номенклатура],
|     РегОст.НачалоПериода КАК [НачПериода],
|	  РегОст.КоличествоКонечныйОстаток КАК [КолВоОстатка],
|     Рег.Период КАК [Дата],
|     Рег.КоличествоОборот КАК [Продано],
|     Рег.КоличествоВОборот КАК [Возвращено],
|     Рег.ПродСтоимостьОборот КАК [СтоимПродаж],
|     Рег.ПродСтоимостьВОборот КАК [СтоимВозвр]
|FROM
|	$РегистрОстаткиОбороты.ОстаткиТМЦ(
|							:НачПериода,
|							:КонПериода~,
|							День ДОПОЛНЕНИЕ,
|							ДвиженияИГраницыПериода,
|";
ТекстЗапроса=ТекстЗапроса+Условие+",
|							(Фирма,Номенклатура),
|							(Количество)
|							) КАК РегОст
|ЛЕВОЕ СОЕДИНЕНИЕ
|     $РегистрОбороты.Продажи(
|						     :НачПериода,
|						     :КонПериода~,
|						     День,
|";
ТекстЗапроса=ТекстЗапроса+Условие+",
|							(Номенклатура,Фирма),
|						     (Количество,КоличествоВ,ПродСтоимость,ПродСтоимостьВ)
|						     ) КАК Рег
|ПО (Рег.Фирма = РегОст.Фирма) И (Рег.Период = РегОст.НачалоПериода) и (Рег.Номенклатура = РегОст.Номенклатура)
|";
 



только вот результаты разочаровали, средствами 1С аналогисный запрос выполнился за 163125мс, а этот за 306338мс Печаль
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #116 - 02. Марта 2011 :: 09:31
Печать  
Нефик брать ВТ ОстаткиИОбороты, когда нужен только конечный Остаток.
Да и, не верю я, чтоб запрос с группировкой День будет быстрее.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #117 - 02. Марта 2011 :: 10:27
Печать  
Тем более быстрее от использования "ДОПОЛНЕНИЕ" он не станет  Подмигивание
  

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


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #118 - 02. Марта 2011 :: 12:28
Печать  
Так потому и взял ОстаткиОбороты, т.к. там есть ПЕРИОДИЧНОСТЬ и ДОПОЛНЕНИЕ. Нужно на каждый день анализируемого периода увидеть Остаток и Продажу, независимо от того была ли в этот день продажа, или если товар отутствовал на остатке
Пока вижу выход только в периодичности НЕДЕЛЯ

А типовой запрос, вот он:
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНачала по ДатаКонца;
|Номенклатура = Регистр.Продажи.Номенклатура,
|Регистр.ОстаткиТМЦ.Номенклатура;
|УпрАналитика = Регистр.Продажи.Фирма.УпрАналитика,
|Регистр.ОстаткиТМЦ.Фирма.УпрАналитика;
|КолПродано = Регистр.Продажи.Количество;
|КолВозвращено = Регистр.Продажи.КоличествоВ;
|КолОстатки = Регистр.ОстаткиТМЦ.Количество;
|СуммаПрод = Регистр.Продажи.ПродСтоимость;
|СуммаВозвр = Регистр.Продажи.ПродСтоимостьВ;
|Функция Продано = Сумма(КолПродано);
|Функция Возвращено = Сумма(КолВозвращено);
|Функция Остатки = КонОст(КолОстатки);
|Функция СтоимПродаж = Сумма(СуммаПрод);
|Функция СтоимВозвр = Сумма(СуммаВозвр);
|Группировка Номенклатура Без групп;
|Группировка День Все ВошедшиеВЗапрос;      
|Условие(Номенклатура в СпТов);
|Условие(УпрАналитика=Константа.ОсновнаяФирма.УпрАналитика);
|"
  
Наверх
 
IP записан
 
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #119 - 03. Марта 2011 :: 13:11
Печать  
Убрал ДОПОЛНЕНИЕ, скорость запроса выросла до 75410мс, на тех-же данных, теперь в два с лишним раза обгоняет типовой Подмигивание  А пропущенными днями таблицу дополнил уже после запроса, так существенно быстрее.
Эх, вот еще бы получить ту скорость которая в монопольном режиме, вообще бы сказка была
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 6 7 [8] 9 10 ... 51
ОтправитьПечать