|
Помогите с запросом | ☑ | ||
---|---|---|---|---|
0
demart-omsk
12.11.12
✎
15:12
|
Подскажите, как повысить производительность у кода (Объединял 2 запроса, терялись незакрытые заказы и все равно быстродействие не увеличилось).
СуммаПродаж=0; запрос = Новый Запрос; запрос.УстановитьПараметр("ДисконтнаяКарта", ДисконтнаяКарта); запрос.Текст= "ВЫБРАТЬ | ЗаказПокупателя.ДисконтнаяКарта, | ЗаказПокупателя.СуммаДокумента, | ЗаказПокупателя.Ссылка |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя |ГДЕ | ЗаказПокупателя.ДисконтнаяКарта = &ДисконтнаяКарта"; результат=запрос.Выполнить(); выгрузка=результат.Выгрузить(); запрос1 = Новый Запрос; запрос1.УстановитьПараметр("ДисконтнаяКарта", ДисконтнаяКарта); запрос1.Текст= "ВЫБРАТЬ | ЗакрытиеЗаказовПокупателейЗаказы.ЗаказПокупателя, | ЗакрытиеЗаказовПокупателейЗаказы.ПричинаЗакрытияЗаказа |ИЗ | Документ.ЗакрытиеЗаказовПокупателей.Заказы КАК ЗакрытиеЗаказовПокупателейЗаказы | ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеЗаказовПокупателей КАК ЗакрытиеЗаказовПокупателей | ПО ЗакрытиеЗаказовПокупателейЗаказы.НомерСтроки = ЗакрытиеЗаказовПокупателей.Номер |ГДЕ | ЗакрытиеЗаказовПокупателейЗаказы.ЗаказПокупателя.ДисконтнаяКарта = &ДисконтнаяКарта"; результат1=запрос1.Выполнить(); выгрузка1=результат1.Выгрузить(); для каждого стр из выгрузка цикл для каждого стр1 из выгрузка1 цикл Если стр.ссылка = стр1.ЗаказПокупателя и стр1.ПричинаЗакрытияЗаказа = Справочники.ПричиныЗакрытияЗаказов.НайтиПоНаименованию("Отказ от заказа") тогда СуммаПродаж=СуммаПродаж-стр.суммадокумента; КонецЕсли; КонецЦикла; Если ТипЗнч(СуммаПродаж)= Тип("Null") Тогда СуммаПродаж=0; КонецЕсли; СуммаПродаж=СуммаПродаж+стр.суммадокумента; КонецЦикла; Если Результат.Пустой() Тогда Предупреждение("Не выбрана дисконтная карта"); Иначе Выборка= Результат.Выбрать(); Выборка.Следующий(); Если СуммаПродаж<30000 Тогда Скидка=3; ИначеЕсли СуммаПродаж<50000 Тогда Скидка = 5; ИначеЕсли СуммаПродаж <100000 Тогда Скидка = 7 Иначе Скидка=10; КонецЕсли; КонецЕсли; а=100-Скидка; Для каждого строки из товары цикл строки.ПроцентАвтоматическихСкидок=Скидка; строки.Сумма=(строки.цена*строки.Количество) / 100 * а; КонецЦикла; |
|||
1
pavelul73
12.11.12
✎
15:13
|
Так может лучше объединить эти 2 запроса в один?
|
|||
2
Undefined vs NULL
12.11.12
✎
15:13
|
(0) скажите, как это развидеть?
|
|||
3
demart-omsk
12.11.12
✎
15:14
|
при объединении теряются незакрытые заказы
|
|||
4
pavelul73
12.11.12
✎
15:16
|
куда они теряются?
|
|||
5
viktor_vv
12.11.12
✎
15:21
|
А полное соединение там зачем ?
Документ.ЗакрытиеЗаказовПокупателей.Заказы КАК ЗакрытиеЗаказовПокупателейЗаказы | ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеЗаказовПокупателей КАК ЗакрытиеЗаказовПокупателей |
|||
6
palpetrovich
12.11.12
✎
15:22
|
(0) неправильно объединял раз "терялись", покажи как
...а то что в (0) - срочно выбрось! |
|||
7
Cunni
12.11.12
✎
15:23
|
тормоза идут отсюда:
<1c>для каждого стр из выгрузка цикл для каждого стр1 из выгрузка1 цикл Если стр.ссылка = стр1.ЗаказПокупателя и стр1.ПричинаЗакрытияЗаказа = Справочники.ПричиныЗакрытияЗаказов.НайтиПоНаименованию("Отказ от заказа") тогда СуммаПродаж=СуммаПродаж-стр.суммадокумента; КонецЕсли; КонецЦикла; Если ТипЗнч(СуммаПродаж)= Тип("Null") Тогда СуммаПродаж=0; КонецЕсли; СуммаПродаж=СуммаПродаж+стр.суммадокумента; КонецЦикла; </1c> Дело не в запросе. Но это не означает, что второй запрос бредовый и весь последующий код надо выбросить, затем написать все заново. |
|||
8
demart-omsk
12.11.12
✎
15:23
|
запрос = Новый Запрос;
запрос.УстановитьПараметр("ДисконтнаяКарта", ДисконтнаяКарта); запрос.Текст= "ВЫБРАТЬ | ЗаказПокупателя1.ДисконтнаяКарта, | ЗаказПокупателя1.СуммаДокумента, | ЗаказПокупателя1.Ссылка, | ВложенныйЗапрос.ЗаказПокупателя, | ВложенныйЗапрос.ПричинаЗакрытияЗаказа |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя1, | (ВЫБРАТЬ | ЗакрытиеЗаказовПокупателейЗаказы.ЗаказПокупателя КАК ЗаказПокупателя, | ЗакрытиеЗаказовПокупателейЗаказы.ПричинаЗакрытияЗаказа КАК ПричинаЗакрытияЗаказа | ИЗ | Документ.ЗакрытиеЗаказовПокупателей.Заказы КАК ЗакрытиеЗаказовПокупателейЗаказы | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеЗаказовПокупателей КАК ЗакрытиеЗаказовПокупателей | ПО ЗакрытиеЗаказовПокупателейЗаказы.НомерСтроки = ЗакрытиеЗаказовПокупателей.Номер) КАК ВложенныйЗапрос |ГДЕ | ЗаказПокупателя1.ДисконтнаяКарта = &ДисконтнаяКарта | И ВложенныйЗапрос.ЗаказПокупателя.Ссылка = ЗаказПокупателя1.Ссылка"; результат=запрос.Выполнить(); выгрузка=результат.Выгрузить(); |
|||
9
demart-omsk
12.11.12
✎
15:24
|
При таком раскладе незакрытый заказ теряется из выгрузки
|
|||
10
Undefined vs NULL
12.11.12
✎
15:24
|
регистры накопления для трусов?
|
|||
11
GANR
12.11.12
✎
15:26
|
Стоп! Для начала поставь задачу на уровне Исходные таблицы - Результирующие таблицы. Тогда желающие составят оптимальное решение "в один запрос". А что до (0) - так почему это должно работать быстро???
|
|||
12
palpetrovich
12.11.12
✎
15:27
|
(9) запрос вообще должен быть не по документам, а по РН "ЗаказыПокупателей". Кста будет все проще :)
|
|||
13
GANR
12.11.12
✎
15:28
|
+(8) Чтобы ещё улучшить - нужно ПЕРЕД, а не после соединением таблиц отфильтровать их.
|
|||
14
palpetrovich
12.11.12
✎
15:35
|
+(12) нечто типа этого:
ВЫБРАТЬ ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя, ЗаказыПокупателейОстаткиИОбороты.Регистратор, ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток, ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход, ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовРасход, ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток ИЗ РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты({&НачалоПериода}, {&КонецПериода}, Регистратор, , {ЗаказыПокупателейОстаткиИОбороты.ДисконтнаяКарта = &ДисконтнаяКарта}) КАК ЗаказыПокупателейОстаткиИОбороты |
|||
15
demart-omsk
12.11.12
✎
15:35
|
Спасибо, буду думать
|
|||
16
demart-omsk
13.11.12
✎
14:41
|
запрос = Новый Запрос;
запрос.УстановитьПараметр("ДК", ДисконтнаяКарта); запрос.УстановитьПараметр("ПричинаЗакрытияЗаказа", Справочники.ПричиныЗакрытияЗаказов.НайтиПоНаименованию("Отказ от заказа")); запрос.Текст= "ВЫБРАТЬ | СУММА(ЗаказыПокупателейОбороты.СуммаВзаиморасчетовПриход) КАК Сумма |ИЗ | РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ЗаказПокупателя.ДисконтнаяКарта = &ДК) КАК ЗаказыПокупателейОбороты | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | -ПричиныЗакрытияЗаказов.СуммаВзаиморасчетов |ИЗ | РегистрСведений.ПричиныЗакрытияЗаказов КАК ПричиныЗакрытияЗаказов |ГДЕ | ПричиныЗакрытияЗаказов.Заказ.ДисконтнаяКарта = &ДК | И ПричиныЗакрытияЗаказов.ПричинаЗакрытияЗаказа = &ПричинаЗакрытияЗаказа |ИТОГИ ПО | ОБЩИЕ"; результат=запрос.Выполнить(); выгрузка=результат.Выгрузить(); СуммаПродаж = выгрузка[0].Сумма; Если СуммаПродаж<30000 Тогда Скидка=3; ИначеЕсли СуммаПродаж<50000 Тогда Скидка = 5; ИначеЕсли СуммаПродаж <100000 Тогда Скидка = 7 Иначе Скидка=10; КонецЕсли; а=100-Скидка; Для каждого строки из товары цикл строки.ПроцентАвтоматическихСкидок=Скидка; строки.Сумма=(строки.цена*строки.Количество) / 100 * а; КонецЦикла; |
|||
17
demart-omsk
13.11.12
✎
14:42
|
по регистрам работает отлично
|
|||
18
palpetrovich
13.11.12
✎
15:09
|
(16) прикольно, получаетя с вами выгодно работать если СуммаПродаж<30000 или СуммаПродаж>100000 :)))
|
|||
19
demart-omsk
13.11.12
✎
15:10
|
внимательно посмотри, все верно
|
|||
20
demart-omsk
13.11.12
✎
15:11
|
выложил, для тех, кому пригодится
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |