|
Обход результата запроса для заполнения табличной части | ☑ | ||
---|---|---|---|---|
0
Serdolik55
05.06.12
✎
12:44
|
ЦеноваяГруппа Сумма ЗначениеУсловия ПроцентСкидкиНаценки
Велосипеды 36 075,6 Велосипеды 36 075,6 10 000 1 Велосипеды 36 075,6 20 000 5 Игрушки 21 882,3 Игрушки 21 882,3 10 000 7 Игрушки 21 882,3 20 000 11 Коллеги, такая проблема, мне нужно обойти вот это дерево(результат запроса), так чтобы заполнить табличную часть док-та Чек ККМ по условию: Если "Сумма" (сумма по ценовым группам) превышает "ЗначениеУсловия" тогда выставляется "ПроцентСкидкиНаценки" соответсвующий этому условию, например 36 075,6 > 20 000 тогда выставляется скидка 5%, если сумма меньше 20000, тогда 1% (см. пример). Пишу так: Пока Выборка.Следующий()Цикл Если НачалоДня(ЭтотОбъект.Дата) >= НачалоДня(Выборка.ДатаОкончания) Тогда ПараметрыОтбора = Новый Структура; МассивНоменклатуры = ПолучитьМассивНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"),Выборка.ЦеноваяГруппа); Для Каждого СтрокаМассиваНоменклатуры Из МассивНоменклатуры Цикл ПараметрыОтбора.Вставить("Номенклатура",СтрокаМассиваНоменклатуры.Ссылка); МассивСтрок = Товары.НайтиСтроки(ПараметрыОтбора); ВыборкаДетальныхЗаписей = Выборка.Выбрать(); Пока ВыборкаДетальныхЗаписей.Следующий()Цикл Для Каждого Строка Из МассивСтрок Цикл Если Выборка.Сумма >= ВыборкаДетальныхЗаписей.ЗначениеУсловия Тогда Строка.ПроцентАвтоматическихСкидок = ВыборкаДетальныхЗаписей.ПроцентСкидкиНаценки; ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка,ЭтотОбъект); КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла; |
|||
1
Serdolik55
05.06.12
✎
12:53
|
Вопрос как правильно это сделать, чтобы нужная скидка подцеплялась?
|
|||
2
Pashkaa
05.06.12
✎
12:54
|
Ты напиши в чем затык в решении
|
|||
3
Serdolik55
05.06.12
✎
12:59
|
(2) Затык в том, что нужно правильно условие прописать, чтобы ставилась нужная скидка:
Вот это условие, работает только в одну сторону: Если Выборка.Сумма >= ВыборкаДетальныхЗаписей.ЗначениеУсловия Тогда Строка.ПроцентАвтоматическихСкидок = ВыборкаДетальныхЗаписей.ПроцентСкидкиНаценки; ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка,ЭтотОбъект); КонецЕсли; |
|||
4
Pashkaa
05.06.12
✎
13:03
|
Покажи запрос. Не понятно что выбираешь и какие итоги
|
|||
5
Serdolik55
05.06.12
✎
13:06
|
Если Товары.Количество()>0 Тогда
Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТЗтовары",Товары.Выгрузить()); Запрос.УстановитьПараметр("Ссылка",Товары.ВыгрузитьКолонку("Номенклатура")); Запрос.Текст = "ВЫБРАТЬ | ТЗтовары.Номенклатура, | ТЗтовары.Количество * ТЗтовары.Цена КАК Сумма |ПОМЕСТИТЬ Товары |ИЗ | &ТЗтовары КАК ТЗтовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Номенклатура.Ссылка, | Номенклатура.ЦеноваяГруппа |ПОМЕСТИТЬ ЦенГруппы |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ПометкаУдаления = ЛОЖЬ | И Номенклатура.ЭтоГруппа = ЛОЖЬ | И Номенклатура.Ссылка В(&Ссылка) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦенГруппы.ЦеноваяГруппа, | СУММА(Товары.Сумма) КАК Сумма |ИЗ | Товары КАК Товары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦенГруппы КАК ЦенГруппы | ПО Товары.Номенклатура = ЦенГруппы.Ссылка | |СГРУППИРОВАТЬ ПО | ЦенГруппы.ЦеноваяГруппа"; МассивРезультатов = Запрос.ВыполнитьПакет(); Результат = Запрос.Выполнить().Выгрузить(); ЗапросНаЗаполнение = Новый Запрос; ЗапросНаЗаполнение.УстановитьПараметр("ТЗ",Результат); ЗапросНаЗаполнение.УстановитьПараметр("ДатаСреза",ТекущаяДата()); ЗапросНаЗаполнение.УстановитьПараметр("Склад",ЭтотОбъект.Склад); ЗапросНаЗаполнение.Текст = "ВЫБРАТЬ | ТЗ.ЦеноваяГруппа, | ТЗ.Сумма |ПОМЕСТИТЬ ТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ.ЦеноваяГруппа КАК ЦеноваяГруппа, | ТЗ.Сумма КАК Сумма, | СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ЗначениеУсловия КАК ЗначениеУсловия, | СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ПроцентСкидкиНаценки, | СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ДатаОкончания КАК ДатаОкончания |ИЗ | ТЗ КАК ТЗ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних( | &ДатаСреза, | ЦеноваяГруппа В | (ВЫБРАТЬ | ТЗ.ЦеноваяГруппа | ИЗ | ТЗ КАК ТЗ) | И ПолучательСкидки = &Склад) КАК СкидкиНаценкиПоЦеновымГруппамСрезПоследних | ПО ТЗ.ЦеноваяГруппа = СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ЦеноваяГруппа | |УПОРЯДОЧИТЬ ПО | ЗначениеУсловия |ИТОГИ | МАКСИМУМ(Сумма), | МАКСИМУМ(ДатаОкончания) |ПО | ЦеноваяГруппа"; ПакетЗапросовНаВыполнение = ЗапросНаЗаполнение.ВыполнитьПакет(); РезультатЗапросаНаЗаполнение = ЗапросНаЗаполнение.Выполнить(); Выборка = РезультатЗапросаНаЗаполнение.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий()Цикл Если НачалоДня(ЭтотОбъект.Дата) >= НачалоДня(Выборка.ДатаОкончания) Тогда ПараметрыОтбора = Новый Структура; МассивНоменклатуры = ПолучитьМассивНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"),Выборка.ЦеноваяГруппа); Для Каждого СтрокаМассиваНоменклатуры Из МассивНоменклатуры Цикл ПараметрыОтбора.Вставить("Номенклатура",СтрокаМассиваНоменклатуры.Ссылка); МассивСтрок = Товары.НайтиСтроки(ПараметрыОтбора); ВыборкаДетальныхЗаписей = Выборка.Выбрать(); Пока ВыборкаДетальныхЗаписей.Следующий()Цикл Для Каждого Строка Из МассивСтрок Цикл Если Выборка.Сумма >= ВыборкаДетальныхЗаписей.ЗначениеУсловия Тогда Строка.ПроцентАвтоматическихСкидок = ВыборкаДетальныхЗаписей.ПроцентСкидкиНаценки; ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка,ЭтотОбъект); КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла; КонецЕсли; |
|||
6
Pashkaa
05.06.12
✎
13:15
|
А нельзя во запросе ЗапросНаЗаполнение получить во вложенной таблице сразу диапазоны по суммам и потом соединять с накоплением по ценовой группе? Тогда в итоге циклы и переборы будут не нужны
|
|||
7
Serdolik55
05.06.12
✎
13:20
|
(6) Я думал об этом но не знаю как правильно прописать это. Можно в запросе поле ЗначениеУсловия вынести в секцию ГДЕ и написать ЗначениеУсловия Между Зн1 и Зна2? Ты об этом?
|
|||
8
Pashkaa
05.06.12
✎
13:24
|
Нет.
Нужно Соединить Регистр сам с собой с СОЕДИНЕНИЕ по ЦеновойГруппе И Регистр1.ЗначениеУсловия < Регистр2.ЗначениеУсловия Потом Группировать по ЦеновойГруппе И по Регистр2.ЗначениеУсловия сделать МИНИМУМ(Регистр2.ЗначениеУсловия) по итогу получишь Регистр1.ЦеноваяГруппа Регистр1.ЗначениеУсловия Регистр2.ЗначениеУсловия Регистр1.ПроцентСкидкиНаценки |
|||
9
Serdolik55
05.06.12
✎
13:28
|
(8) Слуш, я тебя не совсем понял, можешь в мой последний запрос дополнить это?
|
|||
10
Pashkaa
05.06.12
✎
13:33
|
Писал не глядя, тк. нет тестовых данных в базе по скидкам
Запрос.Текст = "ВЫБРАТЬ | ТЗ.ЦеноваяГруппа, | ТЗ.Сумма |ПОМЕСТИТЬ ТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЗ.ЦеноваяГруппа КАК ЦеноваяГруппа, | ТЗ.Сумма КАК Сумма, | ТаблицаСкидок.ЗначениеУсловия КАК ЗначениеУсловия1, | ТаблицаСкидок.ЗначениеУсловия1 КАК ЗначениеУсловия11, | ТаблицаСкидок.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки1 |ИЗ | ТЗ КАК ТЗ | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | СкидкиНаценки1.ЦеноваяГруппа КАК ЦеноваяГруппа, | МИНИМУМ(СкидкиНаценки1.ЗначениеУсловия) КАК ЗначениеУсловия, | МИНИМУМ(СкидкиНаценки2.ЗначениеУсловия) КАК ЗначениеУсловия1, | МИНИМУМ(СкидкиНаценки1.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки | ИЗ | РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки1 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки2 | ПО СкидкиНаценки1.ЦеноваяГруппа = СкидкиНаценки2.ЦеноваяГруппа | И СкидкиНаценки1.ЗначениеУсловия < СкидкиНаценки2.ЦеноваяГруппа | | СГРУППИРОВАТЬ ПО | СкидкиНаценки1.ЦеноваяГруппа) КАК ТаблицаСкидок | ПО ТЗ.Сумма >= ТаблицаСкидок.ЗначениеУсловия | И ТЗ.Сумма <= ТаблицаСкидок.ЗначениеУсловия1 |ИТОГИ | МАКСИМУМ(Сумма) |ПО | ЦеноваяГруппа"; |
|||
11
Serdolik55
05.06.12
✎
13:40
|
Спасибо, сейчас попробую
|
|||
12
Pashkaa
05.06.12
✎
13:44
|
Проверь главное вот этот кусок
ВЫБРАТЬ | СкидкиНаценки1.ЦеноваяГруппа КАК ЦеноваяГруппа, | МИНИМУМ(СкидкиНаценки1.ЗначениеУсловия) КАК ЗначениеУсловия, | МИНИМУМ(СкидкиНаценки2.ЗначениеУсловия) КАК ЗначениеУсловия1, | МИНИМУМ(СкидкиНаценки1.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки | ИЗ | РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки1 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки2 | ПО СкидкиНаценки1.ЦеноваяГруппа = СкидкиНаценки2.ЦеноваяГруппа | И СкидкиНаценки1.ЗначениеУсловия < СкидкиНаценки2.ЦеноваяГруппа | | СГРУППИРОВАТЬ ПО | СкидкиНаценки1.ЦеноваяГруппа |
|||
13
Pashkaa
05.06.12
✎
13:47
|
Если тут диапазоны правильные получатся тогда я вообще не вижу смысла в первом запросе. Зачем ты там объединял Ценовые группы и ТЧ документа?
Одним запросом получил всю ТЧ документа дополнил столбец со скидкой и одной строкой назад в документ загрузил + пересчет сумм |
|||
14
Serdolik55
05.06.12
✎
13:59
|
Спасибо! Получилось!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |