|
запрос, но без цикла | ☑ | ||
---|---|---|---|---|
0
Vvvvv
17.07.14
✎
10:50
|
может кто подскажет решение одной задачки,
есть табличная часть(ТЧ) с реквизитом товар. Есть запрос, который обрабатывает каждый товар в ТЧ. т.е. В запросе просто выбран регистр сведений для каждого стр из ТЧ Цикл Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // а здесь выполняется код КонецЦикла КонецЦикла; как изменить код, что бы не использовать цикл |
|||
1
Vvvvv
17.07.14
✎
10:51
|
(0) если товаров 1000, то цикл будет выполняться 1000 раз, а это долго
|
|||
2
butterbean
17.07.14
✎
10:52
|
написать запрос, который обрабатывает сразу все товары.
|
|||
3
Godofsin
17.07.14
✎
10:52
|
пихай ТЧ во временную и таблицу и делай соединение с РС
|
|||
4
Ymryn
17.07.14
✎
10:53
|
(0) Мне несколько боязно спрашивать, но запрос же по всей номенклатуре в табличной части? Если нет, то надо сделать. А получать нужный результат можно через НайтиСледующий(Новый Структура("Номенклатура", Стр.Номенклатура)) (ну или как-то так). И да, Выборка = Запрос.Выполнить().Выбрать(); лучше чтобы было до начала цикла.
|
|||
5
Vvvvv
17.07.14
✎
10:57
|
(3) а есть какие нибудь статьи, примеры?
|
|||
6
Лефмихалыч
17.07.14
✎
11:06
|
(0)
Запрос = новый запрос(" |ВЫБРАТЬ номенклатура, Сумма(Количество) как Количество, Сумма(Сумма) как Сумма |ИЗ Документ.РасходнаяНакладная.Товары |где |Ссылка = &Ссылка |Сгруппировать по Номенклатура"); Запрос.установитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Выборка.Номенклатура.ПолучитьОбъект().Удалить(); КОнецЦикла; |
|||
7
Dionis Sergeevich
17.07.14
✎
11:09
|
(0) В цикле параметры не передаешь? тогда
Выборка = Запрос.выаолнить().выбрать() для каждого стр из ТЧ Цикл Пока Выборка.Следующий() Цикл // а здесь выполняется код КонецЦикла Выборка.Сбросить(); КонецЦикла; |
|||
8
spiller26
17.07.14
✎
11:10
|
(0) что нужно хоть сделать с таблицей, пересчет всей таблицы или чисто по строке?
|
|||
9
Ymryn
17.07.14
✎
11:11
|
(6) какой милый пример. Особенно в случае попытки его продублировать. :)
|
|||
10
User_Agronom
17.07.14
✎
11:15
|
(6) Добрый мальчик. Душевный.
|
|||
11
JeyRico
17.07.14
✎
11:25
|
(6) Автор может и скописастить...
(7) Опять квадратичный алгоритм получается. Нужно выгрузитьКолонку номенклатуры и пихнуть ее параметром в запрос. |
|||
12
JeyRico
17.07.14
✎
11:27
|
(0) Запрос в студию
|
|||
13
Fragster
гуру
17.07.14
✎
11:37
|
у меня так в обработке получения данных:
Процедура ПодготовитьСтрокиКОформлению(ОформленияСтрок, КлючевойРеквизит, СоответствиеСтрок, МассивКлючей) Экспорт СоответствиеСтрок = Новый Соответствие; МассивКлючей = Новый Массив; Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл Ключ = ОформлениеСтроки.ДанныеСтроки[КлючевойРеквизит]; СоответствиеСтрок.Вставить(Ключ, ОформлениеСтроки); МассивКлючей.Добавить(Ключ); КонецЦикла; КонецПроцедуры Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок) Перем СоответствиеСтрок, МассивКлючей; УправлениеФормами.ПодготовитьСтрокиКОформлению(ОформленияСтрок, "Ссылка", СоответствиеСтрок, МассивКлючей); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТЗ.Ссылка, | ТЗ.ВидОперации, | ТЗ.ВидОперации.ВыполняетДвижения КАК ВыполняетДвижения, | ВЫРАЗИТЬ(ТЗ.Контрагент КАК Справочник.ИнформационныеКарты).ВидДисконтнойКарты.ЦветКарты КАК ЦветКарты |ИЗ | Документ.РеализацияТоваров КАК ТЗ |ГДЕ | ТЗ.Ссылка В(&Массив)"; Запрос.УстановитьПараметр("Массив", Массив); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); мШрифт = Новый Шрифт( , , Истина); мЦвет = Новый Цвет(255, 255, 210); Пока Выборка.Следующий() Цикл ОформлениеСтроки = Соответствие.Получить(Выборка.Ссылка); Если Выборка.ВыполняетДвижения Тогда ОформлениеСтроки.Шрифт = мШрифт; КонецЕсли; Если Выборка.ЦветКарты <> NULL Тогда мЦветКарты = Выборка.ЦветКарты.Получить(); Если ТипЗнч(мЦветКарты)=Тип("Цвет") Тогда ОформлениеСтроки.ЦветТекста = мЦветКарты; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
14
Vvvvv
17.07.14
✎
11:41
|
мой запрос
Для каждого стр из ТЧ Цикл если стр.Товар.ЭтоГруппа = Ложь тогда // УСЛОВИЕ 1 Запрос1 = новый Запрос; Запрос1.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ЦеныСрезПоследних.Номенклатура, | ЦеныСрезПоследних.ТипЦен, | ЦеныСрезПоследних.Период КАК Период, | ЦеныСрезПоследних.Цена |ИЗ | РегистрСведений.Цены.СрезПоследних(, ) КАК ЦеныСрезПоследних |ГДЕ | ЦеныСрезПоследних.ТипЦен = &ТипЦ | И ЦеныСрезПоследних.Номенклатура = &Номен | |УПОРЯДОЧИТЬ ПО | Период УБЫВ"; Запрос1.УстановитьПараметр("ТипЦ", Подразделение.ТипЦенРеализации); Запрос1.УстановитьПараметр("Номен",стр.Товар); Выборка1 = Запрос1.Выполнить().Выбрать(); пока Выборка1.Следующий() Цикл Сообщить(Выборка1.Номенклатура); Сообщить("его цена " +Выборка1.Цена + " на дату: " + Выборка1.Период); Сообщить("тип цен: " + Подразделение.ТипЦенРеализации); Сообщить("_____________________________________________"); КонецЦикла; КонецЕсли; КонецЦикла; |
|||
15
JeyRico
17.07.14
✎
11:43
|
(13) Запрос.УстановитьПараметр("Массив", Массив) - а в массиве что?
|
|||
16
JeyRico
17.07.14
✎
11:50
|
(14)
Товары = ТЧ.ВыгрузитьКолонку("Товар"); Запрос1 = новый Запрос; Запрос1.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ЦеныСрезПоследних.Номенклатура, | ЦеныСрезПоследних.ТипЦен, | ЦеныСрезПоследних.Период КАК Период, | ЦеныСрезПоследних.Цена |ИЗ | РегистрСведений.Цены.СрезПоследних(,ТипЦен = &ТипЦ | И Номенклатура В (&Номен) ) КАК ЦеныСрезПоследних | |УПОРЯДОЧИТЬ ПО | Период УБЫВ"; Запрос1.УстановитьПараметр("ТипЦ", Подразделение.ТипЦенРеализации); Запрос1.УстановитьПараметр("Номен",Товары ); Выборка1 = Запрос1.Выполнить().Выбрать(); пока Выборка1.Следующий() Цикл Сообщить(Выборка1.Номенклатура); Сообщить("его цена " +Выборка1.Цена + " на дату: " + Выборка1.Период); Сообщить("тип цен: " + Подразделение.ТипЦенРеализации); Сообщить("_____________________________________________"); КонецЦикла; Если тип цен на группы не установлен, то появляться не будут, хотя можно условие на ЦеныСрезПоследних.Номенклатура.ЭтоГруппа = Ложь можно в секцию ГДЕ запихнуть |
|||
17
Лефмихалыч
17.07.14
✎
11:51
|
(9),(10),(11) добро должно быть с кулаками, ящетаю
|
|||
18
Fragster
гуру
17.07.14
✎
11:58
|
(15) а, там МассивКлючей и СоответствиеСтрок, просто скопипастил криво (из нескольких функций).
|
|||
19
JeyRico
17.07.14
✎
12:00
|
(18) Понятно.
|
|||
20
echo77
17.07.14
✎
12:04
|
(16) ВЫБРАТЬ ПЕРВЫЕ 1 нах , а остальное нормально.
И еще ТС уверен что срез последних нужен на дату самой последней записи, а не на дату документа? |
|||
21
Fragster
гуру
17.07.14
✎
12:14
|
(20) нифига, еще нужно запихать исходную таблицу с ключем (или всю таблицу, если по типам возможно), например НомерСтроки в запрос, соединить с ней уже срез последних.
в обходе выборки по этому "ключу" сразу заполнить что надо (Товары[Выборка.НомерСтроки].Цена = Выборка.Цена), или загрузить целиком товары, если они были переданы в запрос целиком. |
|||
22
Fragster
гуру
17.07.14
✎
12:15
|
[Выборка.НомерСтроки-1]
|
|||
23
Лефмихалыч
17.07.14
✎
12:24
|
"ВЫБРАТЬ
| вт.Номенклатура |ПОМЕСТИТЬ ВТ |ИЗ &Табчасть как ВТ |; |ВЫБРАТЬ |ВТ.Номенклатура, |РС.ТипЦен, |РС.Период, |РС.Цена |ИЗ ВТ |ЛЕВОЕ СОЕДИНЕНИЕ |РегистрСведений.ЦеныНоменклатуры(,Номенклатура в (ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура ИЗ ВТ)) как РС |ПО РС.Номенклатура = ВТ.Номенклатура" Запрос.УстановитьПараметр("Табчасть", ЭтотОбъект.ИмяТабличнойЧасти); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |