Получить запросом периоды действия цены #712241


#0 by Любопытная
Здравствуйте. Имеется таблица значений: Номенклатура, ДатаНачалаПериода, ДатаОкончанияПериода. И еще имеется регистр сведений ЦеныНоменклатуры, независимый, с периодичностью в день. Необходимо получить периоды действия цены номенклатуры за заданный период. Т.е. если период задан датами 01.06 - 30.06, а цена номенклатуры менялась 01.06 и 10.06, то в результате получится два периода 01.06-09.06 и 10.06-30.06. Очень хочется получить эту таблицу сразу в запросе, но никак не могу понять, как это сделать. Подкиньте идею, дорогие товарищи, будьте так любезны :)
#1 by dj_serega
регламентированный календарь заполнен?
#2 by Любопытная
Допустим, что он есть и заполнен. А зачем он?
#3 by dj_serega
Хотя да :))) не туда подумал... ГДЕ     ЦеныПродуктов.Период МЕЖДУ &НачалоПериода И &КонецПериода     ЦеныПродуктовСрезПоследних.Продукт     ЦеныПродуктовСрезПервых.Продукт
#4 by Скай
И где в твоем запросе конец периода действия? Последнюю таблицу нужно соединить саму с собой по условию ВыборкаЦен1.Период<ВыборкаЦен2.Период, И взять минимум по второму периоду. Вроде так, на вскидку.
#5 by dj_serega
Так конец периода это будет -1 секунда следующего периода :) А такой запросец учили писать на курсах на спеца по платформе :)
#6 by Любопытная
Что-то тут не так. Мне нужно в конечной таблице поиметь Начало период, конец периода, цена. Я могу получить все цены за период вместе с их датами регистрации, мне надо потом первоначально заданный период разбить на кусочки, согласно датам регистрации цен, и вот эта часть у меня не получается. Хотя может я вообще не в ту сторону думаю
#7 by Скай
То, что у тебя все отсортировано по порядку - это прекрасно, но ТС конкретно пишет, что таблицу требуемого вида(Ном, НачалоПериода, КонецПериода) нужно получить в запросе.
#8 by Скай
в же все написано
#9 by Enders
А получить таблицу Типа: Период,Номенклатура,Цена После чего сгруппировать по номенклатуре и цене и рассчитать Минимум(период) и Максимум(Период), вариант? Или у вас может быть заведен документ установки цен, а цена на товар не изменится?
#10 by Любопытная
Это мне страшно хочется получить все в запросе и не городить огороды с постобработкой результата. Но, если не получится, значит буду разбирать потом руками в цикле. Написала до того, как прочитала . Всем спасибо, попробуем применить советы на практике :)
#11 by Любопытная
цены в регистр пишутся напрямую в регистр. Предположим, что они не повторяются, т.е. каждая запись несет в себе изменения. Это не рабочая работа, это я учусь просто) Наткнулась на такую вот задачу, думала сделаю легко, а вот не получилось. Пришлось просить о помощи :) Спасибо за внимание и участие :)
#12 by Скай
И что даст твой запрос, если одна и та же цена была установлена на два разных периода? Оно сольет все в один?
#13 by Enders
Да в один, по-этому я и уточнил.
#14 by Скай
Ну так это не ситуация, когда есть установка цен, но цена не изменилась. Ситуацию 1 июня - 10 р 5 июня - 5 р 10 июня - 10 р тоже не корректно обработает
#15 by Enders
Туплю, не до конца продумал мысль) Ну тогда как ты в писал, соединить саму с собой по периоду и взять минимум. Просто я бы саму итоговую таблицу немного по другому получал. Хотя суть та же, согласен)
#16 by dj_serega
Это имел ввиду?
#17 by Любопытная
Это конечно замечательно, но по условиям задачи у меня  не одна номенклатура и один период, а целая таблица с номенклатурами и периодами. В таком варианте СрезПервых и СрезПоследних использовать не получится, если только не добавить условия, что все периоды в ТЗ укладываются в один определенный период (к примеру месяц) и изначально брать изменения за месяц. В таком случае, все равно придется обрабатывать после запроса. Выходит, мое желание собрать все в запросе невыполнимо :( Печаль
#18 by Любопытная
ДА и вообще - поствила в параметрах период 15.06-30.06, а получила две записи регистра 01.06 и 23.06, т.е. те даты, в которые действительно менялась цена, к моим параметрам это не имеет никакого отношения :(
#19 by Enders
Почему?) Выполнима У тебя может быть как-то так Ном1 01.05.2014 31.05.2014 Ном2 15.05.2014 15.06.2014?
#20 by Скай
Все выполнимо :)
#21 by Enders
у тебя уже есть готовая ТЗ которую ты хочешь скормить запрос? Или эта ТЗ уже рассчитана в запросе и тебе требуется его дописать?
#22 by Любопытная
Давайте считать, что в таблице может быть несколько записей по одной номенклатуре с разными периодами. Периоды по одной номенклатуре между собой не пересекаются, но укладываются в один месяц. Есть готовая ТЗ, которую я скармливаю в запрос.
#23 by Любопытная
Наверное. Но пока я не познала это Дао, для меня это что-то из области фантастики.
#24 by Скай
Ключевой момент - это связь таблицы самой с собой по условию больше/меньше, с последующим получением максимального или минимального периода. Запросы как правило тяжелые получаются.
#25 by Любопытная
Может быть так: Ном1 01.06.2014 10.06.2014 Ном1 15.06.2014 25.06.2014 Ном2 01.06.2014 30.06.2014 На Ном1 цены устанавливались 25.05 - 100; 23.06 - 200; На Ном2 цены устанавливались 01.06 - 300; 10.06 - 150; В итоге надо получить таблицу Ном1 01.06 10.06 100 Ном1 15.06 22.06 100 Ном1 23.06 25.06 200 Ном2 01.06 09.06 300 Ном2 10.06 30.06 150
#26 by Любопытная
Что значит Тяжелые - долго выполняются или для понимания сложные?
#27 by Жан Пердежон
ничего нет там тяжелого, просто садишься и пишешь запрос
#28 by Скай
Для выполнения на больших таблицах
#29 by Enders
Ну в таком случае я б делал как-то так: 1. рассчитать период с Выбрать Минимум(ПериодС) Из &Тз как ТЗ 2. рассчитать период по Выбрать Максимум(периодПо) Из &Тз как ТЗ. Пункты 1 и 2 использовать как параметры для запроса 3. Перевел бы вашу таблицу в вид Период Номенклатура Товар Можно получить Запросом к производственному календарю     Выбрать ТЗ.Номенклатура, ТЗ.ПериодС, ТЗ.ПериодПо Поместить Таб Из &Тз как ТЗ ; Выбрать Календарь.Период, Таб.номенклатура Поместить ДатыТовары Из РегистрСведений.ПроизводственныйКалендарь(или как он там) как Календарь Внутреннее соединение Таб как Таб По Календарь.Период >=Таб.ПериодС и Календарь.Период<=Таб.ПериодПо ; Выбрать ЦеныТоваровНаНачало.Период, ЦеныТоваровНаНачало.Номенклатура, ЦеныТоваровНаНачало.Цена Поместить ЦеныЗаПериод Из регистрСведений.ЦеныТоваров.СрезПоследних(КонецПериода(&НачалоПериода,День),Номенклатурав (Выбрать Различные ДатыТовар.Номенклатура из ДатыТовар)) как ЦеныТоваровНаНачало Выбрать ЦеныТоваровЗаПериод.Период, ЦеныТоваровЗаПериод.Номенклатура, ЦеныТоваровЗаПериод.Цена Из регистрСведений.ЦеныТоваров как ЦеныТоваровЗаПериод Где Период Между НачалоПериода(ДобавитьКДате(&НачалоПериода,День,1),День) И КонецПериода(&КонецПериода) И Номенклатурав (Выбрать Различные ДатыТовар.Номенклатура из ДатыТовар) ; ВЫбрать ДатыТовар.Период, ДатыТовар.Номенклатура, Из ДатыТовар ДатыТовар.Период, ДатыТовар.Номенклатура ; выбрать АктуальныеДатыЦен.Период, АктуальныеДатыЦен.Номенклатура, Из АктуальныеДатыЦен Левое Соединение ЦеныЗаПериод По АктуальныеДатыЦен.ПериодЦен=ЦеныЗаПериод.период АктуальныеДатыЦен.Период, АктуальныеДатыЦен.Номенклатура, актуальныеДатыЦен.ПериодЦен ; Выбрать Итог.Номенклутара, Итог.Цена, Из Итог Левое Соединение Итог как Итог1 Итог.Номенклатура, Итог.Цена Кажется в конце не додумал, но проверить не могу) Или вообще бред написал)
#30 by Enders
Блин, ещё и в теги не влезло)
#31 by Любопытная
Т.е. что у нас получается: 1.Получаем первую и последнюю даты из всех периодов ТЗ, будем использовать их для ограничения по периодам. 2.Для каждой номенклатуры из ТЗ получаем запись с каждой датой из периода (используем для этого производственный календарь) 3.Получаем актуальные цены на каждую дату из таблицы п.2 4.Как-то собираем периоды обратно в кучу, соединяя для этого таблицу с самой собой. В итоге, как мне кажется, данные за весь месяц по каждой номенклатуре. От этого уже можно будет отталкиваться, выкидывая лишние периоды. Вроде умозрительно так, но делать сейчас уже не возьмусь - лучше с утра на свежую голову перед работой. Спасибо большое. Всем остальным, принявшим участие в обсуждении, тоже спасибо :) Как приятно, что в мире так много умных и в тоже время добрых и отзывчивых людей :)
#32 by Enders
Суть вы уловили правильно ;) Если несложно, отпишитесь о результатах. Просто интересно:)
#33 by Любопытная
Ничего толкового не вышло. Жаль. Сейчас об этом думать не хочу, соберу циклами все, что надо для дальнейшего решения задачи, с запросом как-нибудь в следующей жизни повоюю
#34 by shuhard
слабак женского полу вероятно слабачка
#35 by samozvanec
вот чето такое делал когда-то давно, но не помню точно, что и как. вроде надо соединить таблицу цен с таблицей периодов 4 раза - 2 раза по период регистрации больше даты начала, 2 раза меньше даты окончания, при этом по очереди брать даты - в первый раз вместо начала период регистрации, во второй - вместо конца. и потом как то это дело группировать и отбирать. попробуй)
#36 by samozvanec
не, не так...
#37 by Любопытная
Что дальше?
#38 by Enders
А в чем проблема? Итоговую таблицу вы получили? Проблема в соединении самой к себе или в чем?
#39 by Любопытная
Ерунду получила в итоговой таблице. Просто натурально ерунду. Запрос не сохранила, запостить не удастся) Ну да, я слабак, признаю. Ну и ладно)
#40 by Wobland
ВЫБРАТЬ     РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ     ЦеныНоменклатуры.Период МЕЖДУ &ДатаС И &ДатаПо     И ЦеныНоменклатуры.Номенклатура В             (ВЫБРАТЬ                 ТЧ.Номенклатура             ИЗ                 ТЧ)
#41 by Wobland
смущает то, что подтягиваются прошлые цены
#42 by Wobland
ну.. не из периода ТЧ документа
#43 by Enders
Ещё раз присоединить цены Только по условию что период второй таблицы больше периода первой таблицы цен. Потом сгруппировать и получим: Период первой таблицы это ДатаС, если она меньше чем датаДокумента - берём дату документа. а период второй таблицы это датаПо, если его нет, то берём дату из документа. Мб как, то так?)
#44 by Wobland
ступил. ГДЕ     ЦеныНоменклатурыСрезПоследних.Период  МЕЖДУ &ДатаС И &ДатаПо это в срезе последних цен. вроде всё как надо
#45 by Wobland
цены на крайнюю дату в ТЧ ещё докрутить...
#46 by Enders
А ты срез то берёшь на ДатуС какой период между?Оо
#47 by Wobland
чтоб выкинуть цены, установленные в пятом году и не менявшиеся с тех пор. там же ещё измерение ТипЦены, я его тут не учитывал. да и вообще могу быть неправ ;)
#48 by Enders
а зачем их выкидывать? они ж до сих пор актуальные, просто не будут влиять на итоговый период. Может как в ?) Да и не совсем понятно, ты берёшь срез последних на 01.06.2014 00:00:00 и тут же ставишь условие на период между 01.06.2014 и 01.07.2014? или я тут не допонял?)
#49 by Wobland
перегрелся я слегка. достаточно было фильтровать по типу цены (ну регистр у меня такой ;) и никаких где
#50 by Wobland
кстати, первым делом тупо скопипастил - не взлетело
#51 by Enders
Вроде работает: началоПериода и КонецПериода это пункт 1,2 из
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям