Интересный запрос

SeverBap

Well-known member
18.09.2007
451
0
#1
Есть функция
Код:
//************************************************************************
Функция ПолучитьСводныйОстатокЗаДень(ГодОтбораДанных,МесяцОтбораДанных,ТипОтбораДанных,ЧислоДняОтбора,Измерение)
Перем ЗначениеВозврата, Запрос, ТекстЗапроса;
Если ТипОтбораДанных="ИРВСоставеППП" Тогда
ЗначениеВозврата=Регистр.НакоплениеВремени.СводныйОстаток(ГодОтбораДанных,МесяцОтбораДанных,,ЧислоДняОтбора,,Измерение);	
Иначе
ПодразделениеОтбора="";
Если ТипОтбораДанных="ИРВППП" Тогда
ПодразделениеОтбора=Перечисление.ТипПодразделения.Промышленное;
Иначе
ПодразделениеОтбора=Перечисление.ТипПодразделения.НеПромышленное;
КонецЕсли;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(Сформировать)
|ГодОтбора=Регистр.НакоплениеВремени.Год;
|МесяцОтбора=Регистр.НакоплениеВремени.Месяц;
|ТипПодразделения=Регистр.НакоплениеВремени.Подразделение.ТипПодразделения;
|ДеньОтбора=Регистр.НакоплениеВремени.День;"+СокрЛП("|"+Измерение+";")+
"|Группировка ГодОтбора;
|Группировка МесяцОтбора;
|Группировка ТипПодразделения;
|Группировка ДеньОтбора;
|Условие(ГодОтбора=ГодОтбораДанных);
|Условие(МесяцОтбора=МесяцОтбораДанных);
|Условие(ТипПодразделения = ПодразделениеОтбора);
|Условие(ДеньОтбора = ЧислоДняОтбора);"+СокрЛП("|Функция Результат = Сумма("+Измерение+");");
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат 0;
КонецЕсли;
ЗначениеВозврата=Запрос.Результат;
КонецЕсли;	
Возврат ЗначениеВозврата;
КонецФункции
ошибка:
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
{Отчет.ИспользованиеРабочегоВремени.Форма.Модуль(41)}: ГодОтбора=Регистр.НакоплениеВремени. <<?>> Год;
Запрос[2] : Неожиданное выражение 'Год'

может не верно закрываю текст запроса???
 
K
#2
а в регистре измерение год есть? и какой тип если есть?
 

SeverBap

Well-known member
18.09.2007
451
0
#3
все есть, год у меня числовой!!! - но это же измерение!!
потом месяц и день тоже измерение !!!

так же можно? или нельзя?
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#4
Я могу ошибаться, но... Возможно, Год, Месяц, День, Неделя - это зарезервированные слова языка запросов, которые нельзя использовать в качестве измерений.
 
K
#5
Вероятно потому-что есть жишь Группировки День/Месяц/Год
 

SeverBap

Well-known member
18.09.2007
451
0
#6
vitfil ТОгда почему я тогда нигде этого не нашел в описание языка запросов? Но всетаки я так думаю плохо закрываю запрос в целом там же пишет запрос [2] тоесть первый раз проходит!
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#7
Это номер строки в запросе, в которой, как считает метапарсер, находится ошибка.

ТОгда почему я тогда нигде этого не нашел в описание языка запросов?
Плохо искали?
kaa ответил вам уже:

Вероятно потому-что есть жишь Группировки День/Месяц/Год
 

SeverBap

Well-known member
18.09.2007
451
0
#8
vitfil Поменял в регистре теперь ругается:
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
{Отчет.ИспользованиеРабочегоВремени.Форма.Модуль(42)}: <<?>> |ПриостановкаРаботы = Регистр.НакоплениеВремени.ПриостановкаРаботы;
Запрос[6] : Неизвестая ошибка '|'
сейчас функция такова:
Код:
Функция ПолучитьСводныйОстатокЗаДень(ГодОтбораДанных,МесяцОтбораДанных,ТипОтбораДанных,ЧислоДняОтбора,Измерение)
Перем ЗначениеВозврата, Запрос, ТекстЗапроса;
Если ТипОтбораДанных="ИРВСоставеППП" Тогда
ЗначениеВозврата=Регистр.НакоплениеВремени.СводныйОстаток(ГодОтбораДанных,МесяцОтбораДанных,,ЧислоДняОтбора,,Измерение);	
Иначе
ПодразделениеОтбора="";
Если ТипОтбораДанных="ИРВППП" Тогда
ПодразделениеОтбора=Перечисление.ТипПодразделения.Промышленное;
Иначе
ПодразделениеОтбора=Перечисление.ТипПодразделения.НеПромышленное;
КонецЕсли;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(Сформировать)
|ГодОтбора=Регистр.НакоплениеВремени.ГодП;
|МесяцОтбора=Регистр.НакоплениеВремени.МесяцП;
|ТипПодразделения=Регистр.НакоплениеВремени.Подразделение.ТипПодразделения;
|ДеньОтбора=Регистр.НакоплениеВремени.ДеньП; "+Строка(Разделительстрок+"|"+Измерение+" = Регистр.НакоплениеВремени."+Измерение+";")+
"
|Группировка ГодОтбора;
|Группировка МесяцОтбора;
|Группировка ТипПодразделения;
|Группировка ДеньОтбора;
|Условие(ГодОтбора=ГодОтбораДанных);
|Условие(МесяцОтбора=МесяцОтбораДанных);
|Условие(ТипПодразделения = ПодразделениеОтбора);
|Условие(ДеньОтбора = ЧислоДняОтбора);"+СокрЛП("|Функция Результат = Сумма("+Измерение+");");
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат 0;
КонецЕсли;
ЗначениеВозврата=Запрос.Результат;
КонецЕсли;	
Возврат ЗначениеВозврата;
КонецФункции
 

puh14

Well-known member
11.07.2008
1 412
0
#9
{Отчет.ИспользованиеРабочегоВремени.Форма.Модуль(42)}: <<?>> |ПриостановкаРаботы = Регистр.НакоплениеВремени.ПриостановкаРаботы;
Запрос[6] : Неизвестая ошибка '|'
Не врубается что такое РазделительСтрок. Попробуй тупо

|ДеньОтбора=Регистр.НакоплениеВремени.ДеньП;
|"+Строка(Измерение+" = Регистр.НакоплениеВремени."+Измерение+";")+
"
|Группировка ГодОтбора;
 

SeverBap

Well-known member
18.09.2007
451
0
#11
Я отказался от запроса и сделал вот так:
Код:
//************************************************************************
Процедура ПодготовитьДанные(ТипОтбораДанных)
ТаблицаДанных.УдалитьСтроки();
Если ТипОтбораДанных="ИРВСоставеППП" Тогда
Для Сч=1 По ДатаЧисло(КонМесяца(ДатаСтрока)) Цикл
ТаблицаДанных.НоваяСтрока();
ТаблицаДанных.ДеньМесяца=Сч;
НомерСтрокиОбработки=ТаблицаДанных.НомерСтроки;
Для Счк=1 По ТаблицаДанных.КоличествоКолонок() Цикл
КолонкаОбработки=СокрЛП(ТаблицаДанных.ПолучитьПараметрыКолонки(Счк));
Если (КолонкаОбработки<>"НомерСтрокиДокумента") И (КолонкаОбработки<>"ДеньМесяца") Тогда
ЗначениеУстановки=Регистр.НакоплениеВремени.СводныйОстаток(ДатаГод(ДатаСтрока),ДатаМесяц(ДатаСтрока),,Сч,,КолонкаОбработки);	
ТаблицаДанных.УстановитьЗначение(НомерСтрокиОбработки,КолонкаОбработки,ЗначениеУстановки);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Иначе
Если ТипОтбораДанных="ИРВППП" Тогда
ПодразделениеОтбора=Перечисление.ТипПодразделения.Промышленное;
Иначе
ПодразделениеОтбора=Перечисление.ТипПодразделения.НеПромышленное;
КонецЕсли;
СписокВхожденийПодразделений=СоздатьОбъект("СписокЗначений");
СправочникПодразделений=СоздатьОбъект("Справочник.Подразделение");
СправочникПодразделений.ВыбратьЭлементыПоРеквизиту("ТипПодразделения",ПодразделениеОтбора,0,0);
Пока СправочникПодразделений.ПолучитьЭлемент()=1 Цикл
СписокВхожденийПодразделений.ДобавитьЗначение(СправочникПодразделений.ТекущийЭлемент());
КонецЦикла;	
Для Сч=1 По ДатаЧисло(КонМесяца(ДатаСтрока)) Цикл
ТаблицаДанных.НоваяСтрока();
ТаблицаДанных.ДеньМесяца=Сч;
НомерСтрокиОбработки=ТаблицаДанных.НомерСтроки;
Для Счк=1 По ТаблицаДанных.КоличествоКолонок() Цикл
КолонкаОбработки=СокрЛП(ТаблицаДанных.ПолучитьПараметрыКолонки(Счк));
Если (КолонкаОбработки<>"НомерСтрокиДокумента") И (КолонкаОбработки<>"ДеньМесяца") Тогда
ЗначениеУстановки=0;
Для СчП=1 По СписокВхожденийПодразделений.РазмерСписка() Цикл
Подразделение=СписокВхожденийПодразделений.ПолучитьЗначение(СчП);
ЗначениеУстановки=ЗначениеУстановки+Регистр.НакоплениеВремени.СводныйОстато
к(ДатаГод(ДатаСтрока),ДатаМесяц(ДатаСтрока),Подразделение,Сч,,КолонкаОбработки);	
КонецЦикла;
ТаблицаДанных.УстановитьЗначение(НомерСтрокиОбработки,КолонкаОбработки,ЗначениеУстановки);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры	
//************************************************************************
Функция ПолучитьСводныйОстатокЗаДень(ЧислоДняОтбора,Измерение)
Перем ЗначениеВозврата,СтрокаДанныхВТаблице;
Если ТаблицаДанных.НайтиЗначение(ЧислоДняОтбора,СтрокаДанныхВТаблице,"ДеньМесяца")=1 Тогда
ЗначениеВозврата=ТаблицаДанных.ПолучитьЗначение(СтрокаДанныхВТаблице,Измерение);
Иначе
ЗначениеВозврата=0;
КонецЕсли;	
Возврат ЗначениеВозврата;
КонецФункции
Времени оставалось немного поэтому пришлось так писать результат выводит верно но скорость слабовата!!! :)
Можно еще как-нибудь это улучшить? :mellow:
 

SeverBap

Well-known member
18.09.2007
451
0
#13
unknown181538 пока думаю насчет возврата, сейчас конечно весьма удобно его реорганизовывать!