Вход | Регистрация
    1  2  3  4  5   
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

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

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   

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