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

Тема в разделе "1C и всё что с ней связано", создана пользователем SeverBap, 2 июн 2009.

  1. SeverBap

    SeverBap Well-Known Member

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

    может не верно закрываю текст запроса???
     
  2. kaa

    kaa Гость

    а в регистре измерение год есть? и какой тип если есть?
     
  3. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    все есть, год у меня числовой!!! - но это же измерение!!
    потом месяц и день тоже измерение !!!

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Я могу ошибаться, но... Возможно, Год, Месяц, День, Неделя - это зарезервированные слова языка запросов, которые нельзя использовать в качестве измерений.
     
  5. kaa

    kaa Гость

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

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    vitfil ТОгда почему я тогда нигде этого не нашел в описание языка запросов? Но всетаки я так думаю плохо закрываю запрос в целом там же пишет запрос [2] тоесть первый раз проходит!
     
  7. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Это номер строки в запросе, в которой, как считает метапарсер, находится ошибка.

    Плохо искали?
    kaa ответил вам уже:

     
  8. SeverBap

    SeverBap Well-Known Member

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Не врубается что такое РазделительСтрок. Попробуй тупо

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Разделительстрок+"|" замените на " ".
     
  11. SeverBap

    SeverBap Well-Known Member

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Вернуться к запросу, думаю)
     
  13. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    unknown181538 пока думаю насчет возврата, сейчас конечно весьма удобно его реорганизовывать!
     
Загрузка...
Похожие Темы - Интересный запрос
  1. puh14
    Ответов:
    8
    Просмотров:
    3.229
  2. DNT
    Ответов:
    1
    Просмотров:
    2.063
  3. morpheus
    Ответов:
    16
    Просмотров:
    5.912
  4. admin
    Ответов:
    0
    Просмотров:
    2.136
  5. mrtg
    Ответов:
    14
    Просмотров:
    205

Поделиться этой страницей