Вход | Регистрация

  1  2  3  4  5   
1С:Предприятие ::

Метки: 

v7: Оптимизация запроса

Я
   bananan
 
25.12.12 - 11:35
Когда я задал обрботку 10 дней он работал 00:05:59, когда я ему задал тужу обработку но в функции ПересчетВЯщики(ТМЦ, Количество) в первой же строке вызвал Возврат - он работал 00:03:34 (на 2 минуты и 25 секунд меньше). Т.е. именно функция ПересчетВЯщики() сильно тормозит. К подчиненному справочнику Справочник.ЕдИз надо как-то иначе обращаться (не в функции, в функции опять же циклы). Т.е. е справочнику Справочник.ЕдИз надообращатьс через Запрос строго через запрос, может выполнять для этого второй Запрос. Подскажите как это сделать?
 
 
   bananan
 
301 - 26.12.12 - 15:28
(300) НЕ спорю и учусь.
А как сделать (299)?
   sapphire
 
302 - 26.12.12 - 15:30
(300) Может его спросить таки что за сервер у него? Вдруг OVER проканаяет? :)
   Ёпрст
 
303 - 26.12.12 - 15:31
самое тупое, это отсортировать в запросе по позиции дока, потом при выводе
ПечДок="";
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
  Ежели ПечДок<>ТЗ.Док Тогда
     ПечДок = ТЗДок;
     ВывестиСекцию("Документ");
  КонецЕсли;
  ВывестиСекцию("Строка");
КонецЦикла;
ВывестиСекцию("Подвал");

ежели еще и переменную для подсчета в ящиках воткнешь унутрь цикла, так еще и поимеешь количество по накладной..

это самый примитив .
   Ёпрст
 
304 - 26.12.12 - 15:32
(302) не, всё равно не поймет, как ТЗ вывести потом :))
Тут пальцем показывать надо
:)
   bananan
 
305 - 26.12.12 - 15:34
(303) Те етот код и будет выводить инфу из запроса на экран?
   Ёпрст
 
306 - 26.12.12 - 15:36
(305) исправишь ошибки синтаксиса - будет
   bananan
 
307 - 26.12.12 - 15:40
(306) Исправил - работает
   Ёпрст
 
308 - 26.12.12 - 15:41
аминь
   Sinus1984
 
309 - 26.12.12 - 15:43
(307) ну круть теперь премию получишь наверно
   bananan
 
310 - 26.12.12 - 15:43
(309) Премию? Ты не знаешь западно-украинских работодателей
 
 Рекламное место пустует
   Sinus1984
 
311 - 26.12.12 - 15:49
(310) я уже хотел порадоваться, что коллективный разум (в лице безработного Ёпрст4) сделал те подарок к НГ в виде премии
   Ёпрст
 
312 - 26.12.12 - 15:50
С чего такая уверенность, что я безработный ?
   bananan
 
313 - 26.12.12 - 15:51
Ёпрст4 - ОГРОМНОЕ СПАСИБО!!!!!!
   Sinus1984
 
314 - 26.12.12 - 15:54
(312) ну не в смысле без зарплатного я сам на работе сижу а без работы ибо лень НГ скоро с наступающим
   bananan
 
315 - 26.12.12 - 16:42
Ребята, еще помогите (я уже почти час ищу - ничего не нашел)
Короче, запрос работает правильно, но... в окне сообщений постоянно (вцикле) вылетает:
Поле агрегатного объекта не обнаружено (ТМЦ)
Вот весь код скрипта:
Процедура ПриОткрытии()
    НачДата = НачМесяца(ПолучитьДатуТА())+19;
    КонДата = ПолучитьДатуТА();
КонецПроцедуры

                 
Процедура Подч()  
    Нач=ТекущееВремя();
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("НоваяТаблица");
    ТекстЗапроса = "                             
        |select         
        |   Жур.iddoc as [Док $Документ]
        |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
        |   ,Таб.Товар as [Товар $Справочник.ТМЦ] 
        |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
        |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
        |from
        |    (
        |      select
        |        $ДокС.ТМЦ as Товар
        |        ,ДокС.iddoc as Документ
        |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
        |     
        |      union all
        |
        |      select
        |        $ДокН.ТМЦ 
        |        ,ДокН.iddoc
        |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
        |    )as Таб
        |
        |inner join
        |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
        |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
        |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
        |      and Жур.Closed&1 = 1
        |left join (
        |             select  
        |                   max($Спр.Коэффициент) as Коэффициент
        |                    ,Спр.parentext as Владелец
        |             from $Справочник.ЕдИзм as Спр (nolock)
        |             where $Спр.Ед =:ВыбЕдиница
        |                   and $Спр.Коэффициент>0
        |                   and Спр.ismark=0
        |             group by Спр.parentext
        |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
        |
        |group by
        |    Жур.iddoc,Жур.iddocdef,Таб.Товар";
    
    Запр=СоздатьОбъект("ODBCRecordset");
    Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик);
    Запр.УстановитьТекстовыйПараметр("НачДата", НачДата);
    Запр.УстановитьТекстовыйПараметр("КонДата", КонДата);
    ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса);
   //Таб.ВывестиСекцию("Шапка");
 
    ТЗ.ВыбратьСтроки();                           

    ПечДок="";
    ТЗ.ВыбратьСтроки();      
    ДокЯщ = 0;
    Итог=0;
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
          Если ПечДок<>ТЗ.Док Тогда
             ПечДок = ТЗ.Док;
             Таб.ВывестиСекцию("Документ");
             ДокЯщ = 0;
         Иначе
             ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках;
             Итог= Итог + ДокЯщ;
          КонецЕсли;
      Таб.ВывестиСекцию("Строка");
    КонецЦикла;              
  
    Таб.ВывестиСекцию("Подвал");

    Кон=ТекущееВремя();
    
   //Таб.Опции(0,0,Таб.ВысотаСекции("Шапка"),0);
 
    Таб.ТолькоПросмотр(1);
    Таб.Защита(0);
    Таб.Показать("Расход","");
    
    
    Сообщить("Обрабатывалось с "+Нач+" до "+Кон);
КонецПроцедуры
В таблице выводятся:
ТЗ.Док
ТЗ.Товар        
ТЗ.КоличествоВЯщиках
Итог                    
Где это чертово ТМЦ?
   Ёпрст
 
316 - 26.12.12 - 16:49
в расщифровке
   Ёпрст
 
317 - 26.12.12 - 16:49
смотри свойства ячеек таблицы
   bananan
 
318 - 26.12.12 - 16:58
(316) Спасибо. Я б до такого сам не догадался
   bananan
 
319 - 26.12.12 - 17:39
Еще один вопрос, на сегодня надеюсь последний.
Код для вывод у меня такой:
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
          Если ПечДок<>ТЗ.Док Тогда
             ПечДок = ТЗ.Док;
             Таб.ВывестиСекцию("Документ");
             ДокЯщ = 0;
             ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках;
         Иначе
             ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках;
             Итог= Итог + ДокЯщ;
          КонецЕсли;
      Таб.ВывестиСекцию("Строка");
    КонецЦикла;              
      Таб.ВывестиСекцию("ПодвалДок");
    Таб.ВывестиСекцию("Итог");

Где поставить Таб.ВывестиСекцию("ПодвалДок");, чтобы он у меня показывал число ящиков по документу, после каждого документа?
   bananan
 
320 - 26.12.12 - 17:51
+(319) Да и количесвто ящиков он у меня неправильно считает :(
   bananan
 
321 - 26.12.12 - 17:53
Кто-нибудь, помогите!
   sapphire
 
322 - 26.12.12 - 17:59
ВыведеноСтрокВДокументе=0;
Пока ТЗ.ПолучитьСтроку()=1 Цикл
          Если ПечДок<>ТЗ.Док Тогда
             Если 0<ВыведеноСтрокВДокументе Тогда
                 Таб.ВывестиСекцию("ПодвалДок"); 
             КонецЕсли;
             ПечДок = ТЗ.Док;
             Таб.ВывестиСекцию("Документ");
             ДокЯщ = 0;
             ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках;
             ВыведеноСтрокВДокументе=0;   
         Иначе
             ВыведеноСтрокВДокументе=ВыведеноСтрокВДокументе+1;  
             ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках;
             Итог= Итог + ДокЯщ;
          КонецЕсли;
      Таб.ВывестиСекцию("Строка");
    КонецЦикла;   
             Если 0<ВыведеноСтрокВДокументе Тогда
                 Таб.ВывестиСекцию("ПодвалДок"); 
             КонецЕсли;
           
 //      Таб.ВывестиСекцию("ПодвалДок");
 
    Таб.ВывестиСекцию("Итог");
   sapphire
 
323 - 26.12.12 - 18:00
(321) Приступ непонимания только по средам или ежедневно? :)
   sapphire
 
324 - 26.12.12 - 18:01
и еще... код сам по себе кривой до безобразия
   sapphire
 
325 - 26.12.12 - 18:02
ВыведеноСтрокВДокументе=0;
Пока ТЗ.ПолучитьСтроку()=1 Цикл
          Если ПечДок<>ТЗ.Док Тогда
             Если 0<ВыведеноСтрокВДокументе Тогда
                 Таб.ВывестиСекцию("ПодвалДок"); 
             КонецЕсли;
             ПечДок = ТЗ.Док;
             Таб.ВывестиСекцию("Документ");
             ДокЯщ = 0;
             
             ВыведеноСтрокВДокументе=0;   

         КонецЕсли;   
             ВыведеноСтрокВДокументе=ВыведеноСтрокВДокументе+1;  
             ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках;
             Итог= Итог + ДокЯщ;

      Таб.ВывестиСекцию("Строка");
    КонецЦикла;   
             Если 0<ВыведеноСтрокВДокументе Тогда
                 Таб.ВывестиСекцию("ПодвалДок"); 
             КонецЕсли;
           
 //      Таб.ВывестиСекцию("ПодвалДок");
 
 
    Таб.ВывестиСекцию("Итог");
   bananan
 
326 - 26.12.12 - 18:03
(323-324) Приступ немонимания... Хотите верьте. хотите нет, но в этом году в феврале месяце умерла моя мама, а в ноябре умерла моя сеестра..
Может потому я торможу
   bananan
 
327 - 26.12.12 - 18:04
(325) Так он никогда Подвал док не выведет
Если 0<ВыведеноСтрокВДокументе Тогда
                 Таб.ВывестиСекцию("ПодвалДок"); 
             КонецЕсли;
   sapphire
 
328 - 26.12.12 - 18:05
(326) Ну и что? У меня жена умерла в ноябре, я же не ною.
   sapphire
 
329 - 26.12.12 - 18:06
(327) Вы и вправду верите в то, что не зайдет?
   bananan
 
330 - 26.12.12 - 18:07
(329) Пардон, опять торможу
   sapphire
 
331 - 26.12.12 - 18:22
(330) Вооттт. Именно-с.
   bananan
 
332 - 26.12.12 - 18:43
Опять какая-то фигня: задаю формат(Итог, "ЧЦ=15; ЧД=2; ЧРД='.'")
Выдает:
59Ц26
   Ёпрст
 
333 - 27.12.12 - 09:33
(332) открой наконец СП и прочти про функцию Формат
 
 
   bananan
 
334 - 27.12.12 - 12:23
Доброе утро! Скрипт работает - все нормально, но...
Теоретический вопрос запрос у нас задается так:
|select        
        |   Жур.iddoc as [Док $Документ]
        |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
        |   ,Таб.Товар as [Товар $Справочник.ТМЦ] 
        |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
        |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
        |from
        |    (
        |      select
        |        $ДокС.ТМЦ as Товар
        |        ,ДокС.iddoc as Документ
        |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
        |     
        |      union all
        |
        |      select
        |        $ДокН.ТМЦ 
        |        ,ДокН.iddoc
        |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
        |    )as Таб
        |
        |inner join
        |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
        |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
        |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
        |      and Жур.Closed&1 = 1
        |left join (
        |             select  
        |                   $Спр.Коэффициент as Коэффициент
        |                    ,Спр.parentext as Владелец
        |             from $Справочник.ЕдИзм as Спр (nolock)
        |             where $Спр.Ед =:ВыбЕдиница
        |                   and $Спр.Коэффициент>0
        |                   and Спр.ismark=0
        |             group by Спр.parentext
        |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
        |
        |group by
        |    Жур.iddoc,Жур.iddocdef,Таб.Товар";
Так вот, в подзапросе union all
        |
        |      select
        |        $ДокН.ТМЦ 
        |        ,ДокН.iddoc
 
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
as Количество - добавил я (хотя и без этого оно работало нормально). Но, по идее, если нет as Количество во втором подзапросе, то через что будет работать  union all?
Второе в строке max($Спр.Коэффициент) as Коэффициент зачем вызывается max? (Хотя без max выдает ошибку: Column '???.SP115' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.)
Т.е. зачем вроде понятно - чтобы не выдавал ошибку.. Но почему так?
   Ёпрст
 
335 - 27.12.12 - 12:33
(334)
1.
http://msdn.microsoft.com/ru-ru/library/ms180026(v=sql.100).aspx

не надо там никаких псевдонимов в селекте во втором запросе и всех последующих.

2. Это "защита от дурака" - если введут несколько единиц измерения "ящик" на одну номенклатуру с разными(одинаковыми/нулевыми) коэффицентами - берем тупо с максимальным коэффициентом
   bananan
 
336 - 27.12.12 - 12:33
(333) Открыл, прочел, исправил. а код (332) я брал с какого-то сайта :(
   bananan
 
337 - 27.12.12 - 12:34
(335) А почему без max выдаетошибку?
   ЧеловекДуши
 
338 - 27.12.12 - 12:36
(337)Познай для себя программу "Query Analyzer" - помогает
   bananan
 
339 - 27.12.12 - 12:40
(338) Программа бесплатная? А то на этой фиирме только лицензионное по
   ЧеловекДуши
 
340 - 27.12.12 - 12:41
(339)Оно в составе сервера :)
   Botanik8888
 
341 - 27.12.12 - 12:41
(339) Вы это серьезно?
   ЧеловекДуши
 
342 - 27.12.12 - 12:41
+ SQL сервера
   Ёпрст
 
343 - 27.12.12 - 12:47
(337) потому, что гроуп бай
   Ёпрст
 
344 - 27.12.12 - 12:49
и тебе как бэ, скуль дословно ответил:

Column '???.SP115' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
   bananan
 
345 - 27.12.12 - 14:11
Прдон еще один (елементарный вопрос) могу я в ячейке таблицы выдать текст в котором к нему прибавлется значение переменной (в данном случае Всего ящиков за заданный период с НачДата по КонДата)?
   Ёпрст
 
346 - 27.12.12 - 14:22
можешь
   bananan
 
347 - 27.12.12 - 14:23
(346) Как? Выражение, шаблон. фиксированный шаблон?
   Ёпрст
 
348 - 27.12.12 - 14:24
свойства ячейки - Шаблон

в формулу:
 Всего ящиков за [ПериодСтр(НачДата,КонДата)]  [ВсегоЯщиков]
   bananan
 
349 - 27.12.12 - 14:24
+(347) Может там какой то синтксис которого я не знаю?
 
 Рекламное место пустует
   bananan
 
350 - 27.12.12 - 14:25
(348) Спасибо - дело в синтаксисе
   bananan
 
351 - 27.12.12 - 15:18
Все-таки еще один вопрос (на этот раз думаю, что последний)
Если в данном запросе не показывать каждвй товар иего количество
, то ону бдет работать быстрее?
Сейчас я сделал тупо когда установлен флажок Подробно - строка Строка (ТМЦ, количество) - показывается, когда флаг не установлен, то эта строка не показывается.
А может еще и запрос поменять? Если да, то как?
   Ёпрст
 
352 - 27.12.12 - 15:19
(351) свёрнуто чтоб по документам было ?
   Ёпрст
 
353 - 27.12.12 - 15:20
выкидываешь из селекта
,$ДокС.ТМЦ as [Товар $Справочник.ТМЦ]

и из гроуп бай тоже
и привет
   bananan
 
354 - 27.12.12 - 15:45
(353) Спасибо. сейчас попробую. А так запрос будет быстрее работать или это там какая милисекунда?
Например подробно за прошлый месяц он у меня работет 2.5 минуты
   Ёпрст
 
355 - 27.12.12 - 16:14
(354) можно еще улучшить, если присоединение журнала делать на каждый документ отдельно в подзапросе с юнионами.
   bananan
 
356 - 27.12.12 - 16:44
(355) Ну, пока и так работает моего опыта и знаний на это пока не хватает. А (355) это для подробнорго отчета или нет или для обоих?
   Ёпрст
 
357 - 27.12.12 - 16:47
для обоих
   Ёпрст
 
358 - 27.12.12 - 16:50
2.5 минуты.. это слишком долго.
Где-то еще есть обращение к серваку, надеюсь, в результате запроса дату свою и другие атрибуты документа не получаешь как

ТЗ.Док.ДатаДок ?
   bananan
 
359 - 27.12.12 - 16:51
(357) Так и думал. попробую сам, а не получитьсчя - обращусь  к тебе
   bananan
 
360 - 27.12.12 - 16:52
(359) ТЗ.Док обращаюсь просто так
   Ёпрст
 
361 - 27.12.12 - 16:52
меня до 7-го не будет ужо.. через 8 минут
   bananan
 
362 - 27.12.12 - 16:53
(361) Тми за 8 минут сможешь такой запрос написать?
   Ёпрст
 
363 - 27.12.12 - 16:58
ТекстЗапроса="
|select         
|   Таб.Документ as [Док $Документ]
|   ,Таб.iddocdef as [Док_вид $ВидДокумента]
|   ,Таб.Товар as [Товар $Справочник.ТМЦ] 
|   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
|   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
|from
|    (
|      select
|        $ДокС.ТМЦ as Товар
|        ,Жур.iddocdef
|        ,ДокС.iddoc as Документ
|        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
|      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
|      inner join _1sjourn as Жур (nolock) on Жур.IDDoc = ДокС.iddoc
|      and Жур.iddocdef  = $ВидДокумента.РасходнаяНакладная
|      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
|      and Жур.Closed&1 = 1
|     
|      union all
|
|      select
|        $ДокН.ТМЦ 
|        ,Жур2.iddocdef
|        ,ДокН.iddoc
|        ,$ДокН.Кво*$ДокН.Коэффициент 
|      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
|      inner join _1sjourn as Жур2 (nolock) on Жур2.IDDoc = ДокН.iddoc
|      and Жур2.iddocdef  = $ВидДокумента.РасходнаяНакладнаяН
|      and Жур2.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
|      and Жур2.Closed&1 = 1
|    )as Таб
|
|left join (
|             select  
|                   max($Спр.Коэффициент) as Коэффициент
|                    ,Спр.parentext as Владелец
|             from $Справочник.Единицы as Спр (nolock)
|             where $Спр.Ед =:ВыбЕдиница
|                   and $Спр.Коэффициент>0
|                   and Спр.ismark=0
|             group by Спр.parentext
|           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
|
|group by
|    Таб.Документ,Таб.iddocdef,Таб.Товар
|";
Запрос.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик);
..................
   bananan
 
364 - 27.12.12 - 17:01
(363) ОГромное спасибо!
   bananan
 
365 - 27.12.12 - 17:38
(363) Прочитаешь уже в следующем году. Но второй вариант, который по твоим словам должен был бы работать быстрее работал на 24 секунды дольше, чем прыдидущий
   Botanik8888
 
366 - 27.12.12 - 17:42
А ты его несколько раз запусти
   bananan
 
367 - 27.12.12 - 18:09
(366) А что єто даст?
   bananan
 
368 - 27.12.12 - 18:11
ПОнятно, что львиную долю времени занимает вывод рещультатов запроса, а не сам запрос. Т.е. если улучшений вариант и давал какую-то экономию то это милисекунды или того меньше
   Botanik8888
 
369 - 27.12.12 - 19:27
1. Вы замер сделайте именно на выполнение запроса.
2. Если правильно составлен запрос то вывод данных на печать не будет занимать "львиной доли" (если не тысячи строк выводятся на печать)
3. К (366) - Понятие план запроса вам знакомо?
   ADirks
 
370 - 27.12.12 - 19:33
(369) это как интересно запрос влияет на время формирования печатной формы? вроде, не связанные процессы
   bananan
 
371 - 27.12.12 - 20:01
(370) Резк\ультаты работы запроса выводяться на экран или как?
   Botanik8888
 
372 - 27.12.12 - 20:26
(370) - может я неверно выразился, имелось ввиду что
если запросом получает все необходимые данные и нет необходимости их дальше преобразовывать, то на печать должно вывестись очень быстро.
Именно потому что они ну совсем не связанные процессы...
   Botanik8888
 
373 - 27.12.12 - 20:27
" то на печать должно вывестись очень быстро. " - читать как формирование печатной формы не должно занять много времени.
   bananan
 
374 - 28.12.12 - 11:39
Сейчас внес дополнения в код и буду знать: общее время работы скрипта, время выполнения запроса, время вывода на экран - Вот и увидем реальные цифры.
+  О выводе на экран, толи у меня видеокарта медленная, то ли ввобще комп, но именно вывод на экран занимает очень много времени.
P.S. Когда я "приукрасил" немного таблицу (разные цвета для шапки, ну шапка - фыгня, а вот для ТМЦ и совсем другой цвет для суммыящиков по документу (а документов скрипт обрабатывает ну очень много) - время работы скрипта увеличилось вдове!
   ADirks
 
375 - 28.12.12 - 11:41
(374) Ты случайно объединений ячеек не добавил при приукрашательстве? Вдвое - подозрительно много.
   bananan
 
376 - 28.12.12 - 11:42
Результаты работы улучшенной версий скрипт работал 13мин 49сек
Запрос работал: 7 секунд
   bananan
 
377 - 28.12.12 - 11:43
(375) Добавлял
   ADirks
 
378 - 28.12.12 - 11:45
ну так убери нафиг
это тормоза, потери памяти, и потециально глюки при отображении
   bananan
 
379 - 28.12.12 - 11:46
(378) Не знал. Спасибо. Уберу
   ADirks
 
380 - 28.12.12 - 11:48
по поводу скорости формирования mxl: http://www.rikcenter.ru/download/TestVivoda.zip

кратко: не выводить агрегатных данных, особенно в расшифровки - это основные тормоза. Ещё прикольно использовать подготовленные секции, но это уже следующим шагом.
   bananan
 
381 - 28.12.12 - 12:07
Простой (первый неоптимизированний вариант скртипта): Общее время работы 13 минут 47 секунд (на 2 секунды меньше от оптимизированного).
Запрос в этой первой версии работал 3секунды - против 7 секунд в оптимизированной версии!
   bananan
 
382 - 28.12.12 - 12:31
(380) Что за линк там в архиве файлы дбф, один вв файл и один мд файл к 1С. Что с ними делать и что они дают?
   ADirks
 
383 - 28.12.12 - 12:33
(382) это тестовая конфа, в которой сравниваются разные методы вывода в mxl
   bananan
 
384 - 28.12.12 - 12:46
(383) Понял, а, не в курсе где обо всем этом можно почитать (скорость формирования)?
   ADirks
 
385 - 28.12.12 - 12:50
Ну ты посмотри там в код - всё примитивно. Это проще, чем русским языком объяснять. Помнится, этот тест мы сделали в ходе обсуждения на 1С++ форуме - можешь там поискать.
   bananan
 
386 - 28.12.12 - 13:40
(385) Спасибо
   bananan
 
387 - 28.12.12 - 14:19
Ребята! еще подскажите как мне из 1С в T-SQL "перевести" 
Условие (ТМЦ в выбТМЦ)
?
WHERE ТМЦ in выбТМЦ
полный текст запроса :
|select         
        |   Жур.iddoc as [Док $Документ]
        |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
        |   ,Таб.Товар as [Товар $Справочник.ТМЦ] 
        |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
        |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
        |from
        |    (
        |      select
        |        $ДокС.ТМЦ as Товар
        |        ,ДокС.iddoc as Документ
        |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
        |     
        |      union all
        |
        |      select
        |        $ДокН.ТМЦ 
        |        ,ДокН.iddoc
        |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
        |    )as Таб
        |
        |inner join
        |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
        |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
        |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
        |      and Жур.Closed&1 = 1
        |left join (
        |             select  
        |                   max($Спр.Коэффициент) as Коэффициент
        |                    ,Спр.parentext as Владелец
        |             from $Справочник.ЕдИзм as Спр (nolock)
        |             where $Спр.Ед =:ВыбЕдиница
        |                   and $Спр.Коэффициент>0
        |                   and Спр.ismark=0
        |             group by Спр.parentext
        |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
        |
        |group by
        |    Жур.iddoc,Жур.iddocdef,Таб.Товар";
   bananan
 
388 - 28.12.12 - 14:21
+(387) И где это поставить в тексте запроса?
   bananan
 
389 - 28.12.12 - 14:25
(387, 388) выбТМЦ у меня на форме отчета окно для выбора тмц
   Mikeware
 
390 - 28.12.12 - 14:26
(388) а документацию будет читать пушкин? или тарас шевченко?
   bananan
 
391 - 28.12.12 - 14:28
(389) Т.е. как этот параметр передать в запрос?
(390) Да я буду читать, но сейчас когда запрос уже готов и рабоатет надо доставить только этот выбор ТМЦ
   bananan
 
392 - 28.12.12 - 14:30
Конечно у меня еще совсем нет опыта, сделал так:
   ТекстЗапроса = "                             
        |select         
        |   Жур.iddoc as [Док $Документ]
        |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
        |   ,Таб.Товар as [Товар $Справочник.ТМЦ] 
        |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
        |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
        |from
        |    (
        |      select
        |        $ДокС.ТМЦ as Товар
        |        ,ДокС.iddoc as Документ
        |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
        |     
        |      union all
        |
        |      select
        |        $ДокН.ТМЦ 
        |        ,ДокН.iddoc
        |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
        |    )as Таб
        |
        |inner join
        |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
        |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
        |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
        |      and Жур.Closed&1 = 1
        |left join (
        |             select  
        |                   max($Спр.Коэффициент) as Коэффициент
        |                    ,Спр.parentext as Владелец
        |             from $Справочник.ЕдИзм as Спр (nolock)
        |             where $Спр.Ед =:ВыбЕдиница
        |                   and $Спр.Коэффициент>0
        |                   and Спр.ismark=0
        |             group by Спр.parentext
        |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
        |
        |group by
        |    Жур.iddoc,Жур.iddocdef,Таб.Товар
        | HAVING Товар in :выбТМЦ"
Дак ругается:
State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 43: Incorrect syntax near ''.
   bananan
 
393 - 28.12.12 - 14:35
+(391) Параметр в запрос передаю так:
Запр.УстановитьТекстовыйПараметр("выбТМЦ", выбТМЦ);Запр.УстановитьТекстовыйПараметр("выбТМЦ", выбТМЦ);
   bananan
 
394 - 28.12.12 - 14:37
Кто-нибудь ПОМОГИТЕ пожалуйста!!!!!!!!!!!!!!!!!!11
   monsterZE
 
395 - 28.12.12 - 14:44
Отбор по списку или группе
Для таких случаев у объекта ODBCRecordset есть метод
УложитьСписокОбъектов(Список, Таблица, ВидСправочника) и 
УложитьСписокОбъектов13(Список, Таблица)
Список – это список или группа. После  выполнения этого метода появляется таблица с именем Таблица и колонками Val, IsFolder
Однако не стоит злоупотреблять этим методом. Анализируя производительность можно увидеть, что этот метод на группах работает медленно и это совершенно очевидно, т.к. группа может содержать огромное число элементов, которые надо переписать во временную таблицу. ГОРАЗДО эффективней получить список подгрупп входящих в выбранную группу и делать условие по принадлежности к родителю, а не по ID

Пример: Выберем все документы реализации, у которых склад входит в выбранную группу

ТекстЗапроса = "
|SELECT
|    Док.IDDoc as [Док $Документ.Реализация]
|FROM
|    $Документ.Реализация as Док
|WHERE
|    $Док.Склад IN (SELECT Val FROM #Группа)";
 
RS.УложитьСписокОбъектов(ВыбГруппа, "#Группа", "Склады");
 

Замечание: Рекомендуется использовать локальные временные таблицы – префикс #. В этом случае не нужно заботиться об уникальности имени таблицы для разных пользователей, а также об их последующем удалении.
В ДБФ версии драйвер сам создает такие таблицы и сам же генерирует им имя.
Можно сделать универсальный способ получения имени таблицы, работающий как в ДБФ, так и в СКЛ:
    ИмяТаблицы="#Группа ";
 
    Запрос.УложитьСписокОбъектов(СписокРодителей,ИмяТаблицы);
    ТекстЗапроса=" (SELECT Val FROM "+ИмяТаблицы+")";
В случае СКЛ запрос выполнится из таблицы "#Группа", а в случае ДБФ система сгенерит имя и вернет ее в переменную ИмяТаблицы. В случае ДБФ имя временной таблицы выглядит так ‘f6d3b234a56c765f52da’ что, конечно не очень красиво для текста запроса(особенно если его еще и разбирать на ошибки нужно или на дополнения). Можно сделать запрос более красивым и универсальным: для этого воспользуемся методом УстановитьТекстовыйПараметр()
   bananan
 
396 - 28.12.12 - 14:46
(395) Спасибо, попробую разобраться
   monsterZE
 
397 - 28.12.12 - 14:46
скачай уже мануал к 1с++ там все, что надо хорошо расписано и с примерами - "MSSQL при помощи ВК 1С.doc"
или кинь мыло в асю или личку - отправлю
   bananan
 
398 - 28.12.12 - 14:47
(397) Сча кину мыло
   bananan
 
399 - 28.12.12 - 14:48
А как кинуть в личку?
   bananan
 
400 - 28.12.12 - 14:49
+399 Аська у меня здесь пока не установлена :(

  1  2  3  4  5   

Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует