Переключение на Главную Страницу Страницы: 1 ... 48 49 [50]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 190351 )
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 564
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #735 - 18. Ноября 2016 :: 10:12
Печать  
Да понятно, иначе то никак не выкрутится...
Детальной трассировки не хватает, а так все хорошо.

2ALL так как файлы не вкладываются замените сами в коде ПрямогоЗапроса (в 2х местах).
Код
Выбрать все
		ТекстЗапроса_Триггер = "create trigger tr_oborot before update of " + СтрКолонкаИзменений + " on " + ИмяВременнойТаблицы + "
		|begin
		|	update " + ИмяВременнойТаблицы + " set
		|		" + СтрТриггерНачОстаток + "
		|	where " + ИмяВременнойТаблицы + ".rowid = old.rowid;
		|
		|	update t_ob set
		|		" + СтрТриггерОборот + "
		|	where " + СтрЗаменить(СтрЗаменить(СтрУсловияСравненияТабИтогов,ИмяВременнойТаблицы + ".",""),"t_ob","old") + ";
		|
		|	update " + ИмяВременнойТаблицы + " set
		|		" + СтрТриггерКонОстаток + "
		|	where " + ИмяВременнойТаблицы + ".rowid = old.rowid;
		|
		|	select raise(ignore); -- вот эту строку надо добавить!
		|end";
 



Это несколько ускорит запросы использующие Период в $РегистрОбороты и $РегистрОстаткиОбороты. Если используется Дополнение периода и объем данных большой - раза в полтора-два быстрее, если там месяц без дополнения - ускорение почти не заметно.
  
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Зарегистрирован: 25. Октября 2010
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #736 - 09. Октября 2018 :: 02:41
Печать  
В классе ошибка получения значения константы для DBF версии, виртуальное значение $Константа.ИмяКонстаны.
Ошибка в функции:
Функция ПарсингРеквизитаКонстанта(ПерваяЧасть,ВтораяЧасть)

     ТекстПодстановки = "(SELECT "+Значение+"
     |FROM "+?(ЭтоSQL = 1,"_1sconst","__1s_const")+" as const_vt"+ПараметрБлокировкиВТ+"
     |WHERE const_vt.OBJID = '     0   '
     |AND const_vt.ID = "+МетаДата.ИДКонстанты(ВтораяЧасть)+")";
     ТекстПодстановки = ПарсингВнутреннихИдентификаторов(ТекстПодстановки,0);

т.е. и для SQL и для DBF ID константы определяется как число.
Исправление:

     идКонстанты = МетаДата.ИДКонстанты(ВтораяЧасть);
     Если ЭтоSQL = 0 Тогда
           идКонстанты = "'" + Прав(_IdToStr(идКонстанты), 4) + "'";
     КонецЕсли;
     
     ТекстПодстановки = "(SELECT "+Значение+"
     |FROM "+?(ЭтоSQL = 1,"_1sconst","__1s_const")+" as const_vt"+ПараметрБлокировкиВТ+"
     |WHERE const_vt.OBJID = '     0   '
     |AND const_vt.ID = "+идКонстанты+")";
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 805
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #737 - 09. Октября 2018 :: 08:05
Печать  
Спасибо!
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 805
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #738 - 25. Октября 2018 :: 10:56
Печать  
Поправил в классе ПоставщикДанных.ИндексированнаяТаблица метод Выбрать(), т.к. была ошибка. Плюс добавил выгрузку с учетом текущего индекса, чтобы возвращались данные, отображаемые в текущий момент табличным полем.

Код (C++)
Выбрать все
Функция Выбрать(Знач ВекторКолонок = "") Экспорт
	Перем Идентификатор,Выборка,КоличествоРеквизитов,СтрКолонкиВыгрузки,ИмяКолонки;
	Выборка = СоздатьОбъект("ИндексированнаяТаблица");

	Если ПустоеЗначение(ВекторКолонок) = 1 Тогда
		ВекторКолонок = СоздатьОбъект("АссоциативныйВектор");
		КоличествоРеквизитов = СтруктураДанных.Количество();
		Для НомерРеквизита = 0 По КоличествоРеквизитов-1 Цикл
			Идентификатор = СтруктураДанных.ПолучитьКлюч(НомерРеквизита); 	//+Al 2018-10-25 09:36:22 БЫЛО: ВложеннаяСтруктура = СтруктураДанных.Получить(НомерРеквизита);
			ВекторКолонок.Добавить(Идентификатор,Идентификатор); 			//+Al 2018-10-25 09:54:29 БЫЛО: ВложеннаяСтруктура.Идентификатор
		КонецЦикла;
	ИначеЕсли ТипЗначенияСтр(ВекторКолонок) = "Строка" Тогда
		ВекторКолонок = Сервис.ПреобразоватьСтрокуВАссоциативныйВектор(ВекторКолонок);
	ИначеЕсли ТипЗначенияСтр(ВекторКолонок) <> "АссоциативныйВектор" Тогда
		ВекторКолонок = СоздатьОбъект("АссоциативныйВектор");
		КоличествоРеквизитов = СтруктураДанных.Количество();
		Для НомерРеквизита = 0 По КоличествоРеквизитов-1 Цикл
			Идентификатор = СтруктураДанных.ПолучитьКлюч(НомерРеквизита);
			ВекторКолонок.Добавить(Идентификатор,Идентификатор);
		КонецЦикла;
	ИначеЕсли ВекторКолонок.Количество() = 0 Тогда
		Возврат Выборка;
	КонецЕсли;

	СтрКолонкиВыгрузки = "";
	Для НомерКолонки = 0 По ВекторКолонок.Количество() - 1 Цикл
		ИмяКолонки = ВекторКолонок.Получить(НомерКолонки);
		СтрКолонкиВыгрузки = СтрКолонкиВыгрузки + ?(НомерКолонки = 0,"",",") + ИмяКолонки;
	КонецЦикла;

	ИндексированнаяТаблица.Выгрузить(Выборка,ПоставщикДанныхИТ.Индекс,СтрКолонкиВыгрузки); //+Al 2018-10-25 09:56:06 Добавил текущий индекс: ПоставщикДанныхИТ.Индекс
	Возврат Выборка;
КонецФункции
 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
artamir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #739 - 28. Февраля 2019 :: 16:00
Печать  
Научите, пожалуйста пользоваться вложенными запросами.
Код (SQL)
Выбрать все
SELECT
ж.IDDOC AS [ТекДокумент $Документ.РасхНалоговаяНакладная],
дс.ТекДокументСтроки,
дс.Кол
FROM [Журнал] AS ж
	LEFT JOIN
		(SELECT
			дс1.IDDOC AS ТекДокументСтроки,
			SUM(дс1.Себестоимость) AS [Себестоимость $Число],
			SUM(дс1.Количество) AS [Кол $Число],
			SUM(дс1.Количество * дс1.Себестоимость) AS [СуммаСебестоимости $Число],
			SUM(дс1.СумЛей) AS [СумЛей $Число],
			SUM(дс1.НДС) AS [НДС $Число]
		FROM [ДокументСтроки.РасхНалоговаяНакладная] AS дс1
		WHERE (дс1.Себестоимость <> 0)
		GROUP BY дс1.IDDOC
		) AS дс
		ON (дс.ТекДокументСтроки = ж.IDDOC)
WHERE
ж.IDDOC = '  3APETOP'
GROUP BY ж.IDDO 



Выдает ошибку: ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : no such column: дс.Кол
  
Наверх
 
IP записан
 
artamir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #740 - 28. Февраля 2019 :: 16:07
Печать  
Попытка1С писал(а) 30. Октября 2015 :: 14:37:
Это я прогнал, у тебя будет так ЖурналРеализации.Документ

Спасибо, помогло сообщение
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 564
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #741 - 01. Марта 2019 :: 05:26
Печать  
artamir писал(а) 28. Февраля 2019 :: 16:00:
Научите, пожалуйста пользоваться вложенными запросами.

Вложенные запросы типизировать нельзя.
  
Наверх
 
IP записан
 
artamir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #742 - 08. Мая 2019 :: 13:40
Печать  
Код (SQL)
Выбрать все
CREATE TEMPORARY TABLE #ДвиженияКлиентов AS
	|(ВЫБРАТЬ
	|*
	|ИЗ
	|$БИОбороты.Основной(:НачалоДатаОтчета, :КонецДатаОтчета~, ДЕНЬ, , #Счет221, (Контрагенты), (Сумма), ,))
 



На сколько я понимаю, то нельзя использовать такую конструкцию для создания таблицы? Или я неправильно его готовлю  Озадачен
  
Наверх
 
IP записан
 
artamir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #743 - 08. Мая 2019 :: 17:07
Печать  
artamir писал(а) 08. Мая 2019 :: 13:40:
Код (SQL)
Выбрать все
CREATE TEMPORARY TABLE #ДвиженияКлиентов AS
	|(ВЫБРАТЬ
	|*
	|ИЗ
	|$БИОбороты.Основной(:НачалоДатаОтчета, :КонецДатаОтчета~, ДЕНЬ, , #Счет221, (Контрагенты), (Сумма), ,))
 



На сколько я понимаю, то нельзя использовать такую конструкцию для создания таблицы? Или я неправильно его готовлю  Озадачен


Готовил неправильно Улыбка
Получилось
Код (C++)
Выбрать все
Функция ПолучитьТекстЗапросаСозданияТаблицыКлиентов()

	Текст = "create table if not exists "+ТаблицаДвиженияКлиентов+" as
	|select
	| *
	|from
	| $БИОстаткиОбороты.Основной(:НачалоДатаОтчета, :КонецДатаОтчета~, День, , #Счет221, (Контрагенты), (Сумма), ,)";

	Возврат Текст;

КонецФункции // ПолучитьТекстЗапросаСозданияТаблицыКлиентов
//======================================================================
Процедура СформироватьТаблицуДвиженийКлиентов()

	пз.СброситьТаблицу(ТаблицаДвиженияКлиентов);

	пз.УстановитьТекстовыйПараметр("НачалоДатаОтчета",НачДата);
	пз.УстановитьТекстовыйПараметр("КонецДатаОтчета",КонДата);
	пз.УложитьСписокЗначений(СчетПоКоду("221.1",ПланыСчетов.Основной), "#Счет221");
	ТекстЗапроса = ПолучитьТекстЗапросаСозданияТаблицыКлиентов();
	ЗапросСозданияТаблицы = пз.ПодготовитьТекстЗапроса(ТекстЗапроса);
	пз.ВыполнитьЗапрос(ЗапросСозданияТаблицы, 1);

КонецПроцедуры // СформироватьТаблицуДвиженийКлиентов
 

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


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #744 - 28. Мая 2019 :: 10:58
Печать  
Можно ли в ВТ БИОстаткиОбороты отключить группировку по полю Валюта?

С группировкой по полю Валюта имею не верный результат. И с обороткой не сходится.
РазделительУчета      Валюта      Счет      АП      Субконто1      Субконто1_вид      СуммаНачальныйОстаток      СуммаНачальныйОстатокДт      СуммаНачальныйОстатокКт
РУ           1             1U         3         BRL011         518      -400000.040      0.000      400000.040
РУ           1             1U         3         FBT013         518      2689.920      2689.920      0.000
РУ           1             1U         3         JEJ021         518      -43005.720      0.000      43005.720
РУ           1             1U         3         KD5001         518      0.000      0.000      0.000      0.000
РУ           1             1U         3         OLB013         518      49000.000      49000.000      0.000
РУ           1             1U         3         OVW013         518      17263.500      17263.500      0.000
РУ           1             1U         3         P77013         518      0.000      0.000      0.000      0.000
РУ           2             1U         3         JEJ021         518      43005.720      43005.720      0.000

Убираю группировку по полю Валюта все получается как надо
РазделительУчета      Счет      АП      Субконто1      Субконто1_вид      СуммаНачальныйОстаток      СуммаНачальныйОстатокДт      СуммаНачальныйОстатокКт
РУ          1U         3         BRL011         518      -400000.040      0.000      400000.040
РУ          1U         3         FBT013         518      2689.920      2689.920      0.000
РУ          1U         3         KD5001         518      0.000      0.000      0.000      0.000
РУ          1U         3         OLB013         518      49000.000      49000.000      0.000
РУ          1U         3         OVW013         518      17263.500      17263.500      0.000
РУ          1U         3         P77013         518      0.000      0.000      0.000      0.000

Понимаю что это косяк бухгалтерии, но оборотка 1С это игнорит.
  
Наверх
 
IP записан
 
artamir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #745 - 29. Мая 2019 :: 11:38
Печать  
leov-001 писал(а) 28. Мая 2019 :: 10:58:
Можно ли в ВТ БИОстаткиОбороты отключить группировку по полю Валюта?

С группировкой по полю Валюта имею не верный результат. И с обороткой не сходится.
РазделительУчета      Валюта      Счет      АП      Субконто1      Субконто1_вид      СуммаНачальныйОстаток      СуммаНачальныйОстатокДт      СуммаНачальныйОстатокКт
РУ           1             1U         3         BRL011         518      -400000.040      0.000      400000.040
РУ           1             1U         3         FBT013         518      2689.920      2689.920      0.000
РУ           1             1U         3         JEJ021         518      -43005.720      0.000      43005.720
РУ           1             1U         3         KD5001         518      0.000      0.000      0.000      0.000
РУ           1             1U         3         OLB013         518      49000.000      49000.000      0.000
РУ           1             1U         3         OVW013         518      17263.500      17263.500      0.000
РУ           1             1U         3         P77013         518      0.000      0.000      0.000      0.000
РУ           2             1U         3         JEJ021         518      43005.720      43005.720      0.000

Убираю группировку по полю Валюта все получается как надо
РазделительУчета      Счет      АП      Субконто1      Субконто1_вид      СуммаНачальныйОстаток      СуммаНачальныйОстатокДт      СуммаНачальныйОстатокКт
РУ          1U         3         BRL011         518      -400000.040      0.000      400000.040
РУ          1U         3         FBT013         518      2689.920      2689.920      0.000
РУ          1U         3         KD5001         518      0.000      0.000      0.000      0.000
РУ          1U         3         OLB013         518      49000.000      49000.000      0.000
РУ          1U         3         OVW013         518      17263.500      17263.500      0.000
РУ          1U         3         P77013         518      0.000      0.000      0.000      0.000

Понимаю что это косяк бухгалтерии, но оборотка 1С это игнорит.


Так вроде бы у тебя две различные валюты использованы?

Если нужно получить суммы без учета валют, то вот пример настроек вирт. таблицы БИОстаткиОбороты без учета валюты:
Код (C++)
Выбрать все
ИЗ $БИОстаткиОбороты.Управленческий(:НачПериода, :КонПериода~, Период, , #СчетТКС, (Субконто1, Субконто2), (Сумма), ,) КАК БИОстаткиОбороты
 



Или Используй предложение ИТОГИ оно должно быть после СГРУППИРОВАТЬ
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #746 - 30. Мая 2019 :: 06:30
Печать  
artamir писал(а) 29. Мая 2019 :: 11:38:
[quote author=353C362F74696968590 link=1285352210/744#744 date=1559041139]

Так вроде бы у тебя две различные валюты использованы?

Если нужно получить суммы без учета валют, то вот пример настроек вирт. таблицы БИОстаткиОбороты без учета валюты:
Код (C++)
Выбрать все
ИЗ $БИОстаткиОбороты.Управленческий(:НачПериода, :КонПериода~, Период, , #СчетТКС, (Субконто1, Субконто2), (Сумма), ,) КАК БИОстаткиОбороты
 



Или Используй предложение ИТОГИ оно должно быть после СГРУППИРОВАТЬ


Да, спасибо так и сделал
  
Наверх
 
IP записан
 
artamir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #747 - 21. Марта 2020 :: 09:55
Печать  
как в запрос передать пустое перечисление заданного вида?
Например Перечисление.ВидБСО
  
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Зарегистрирован: 25. Октября 2010
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #748 - 21. Марта 2020 :: 23:56
Печать  
artamir писал(а) 21. Марта 2020 :: 09:55:
как в запрос передать пустое перечисление заданного вида?
Например Перечисление.ВидБСО


Ну вообще пустое значение перечисления точно такое еж как и справочника, т.е. $ПустойИД.
Но если в базе у поля тип просто "Перечисление" то как вариант:
пустоеПеречисление = ПолучитьПустоеЗначение("Перечисление.НужныйВид");
метаДата = СоздатьОбъект("MetaDataWork");
идПустогоПеречисления = метаДата.ЗначениеВДлиннуюСтрокуБД(пустоеПеречисление);

Хотя может можно и проще, модификаторы в параметрах тоже должны помочь:

"
..
ГДЕ
  нужноеПоле = :идПеречисления~
...
"
запрос.УстановитьТекстовыйПараметр("идПеречисления", ПолучитьПустоеЗначение("Перечисление.НужныйВид"));
  
Наверх
 
IP записан
 
artamir
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #749 - 15. Апреля 2020 :: 10:23
Печать  
Sserj писал(а) 21. Марта 2020 :: 23:56:
artamir писал(а) 21. Марта 2020 :: 09:55:
как в запрос передать пустое перечисление заданного вида?
Например Перечисление.ВидБСО


Ну вообще пустое значение перечисления точно такое еж как и справочника, т.е. $ПустойИД.
Но если в базе у поля тип просто "Перечисление" то как вариант:
пустоеПеречисление = ПолучитьПустоеЗначение("Перечисление.НужныйВид");
метаДата = СоздатьОбъект("MetaDataWork");
идПустогоПеречисления = метаДата.ЗначениеВДлиннуюСтрокуБД(пустоеПеречисление);

Хотя может можно и проще, модификаторы в параметрах тоже должны помочь:

"
..
ГДЕ
  нужноеПоле = :идПеречисления~
...
"
запрос.УстановитьТекстовыйПараметр("идПеречисления", ПолучитьПустоеЗначение("Перечисление.НужныйВид"));


Спасибо. Помогло :ПустойИД
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 48 49 [50] 
ОтправитьПечать