|   |   | 
| 
 | Подскажите лучший способ прибавления к дате рабочих дней в запросе | ☑ | ||
|---|---|---|---|---|
| 0
    
        tciban 20.01.17✎ 12:02 | 
        Уважаемые коллеги! подскажите как в запросе получить новую дату путем прибавления к ней некоторого количества рабочих дней! Суть проблемы проста как мир - есть документы отгрузки (с датами :)), в документах есть договор, в договоре - поле отсрочки в рабочих днях. Есть Регламентированный Производственный Календарь. Нужно получить в отчете СКД даты истечения отсрочки. Буду благодарен за пример кода или ссылку на оный!     | |||
| 1
    
        piter3 20.01.17✎ 12:05 | 
        РАЗНОСТЬДАТ и ДОБАВИТЬКДАТЕ     | |||
| 2
    
        tciban 20.01.17✎ 12:10 | 
        (1) Мне нужно добавить к дате рабочие дни. Только рабочие, без праздников и выходных.     | |||
| 3
    
        piter3 20.01.17✎ 12:11 | 
        ну и ставь условия на (2).     | |||
| 4
    
        tciban 20.01.17✎ 12:17 | 
        Люди накрученные запросы пишут, по пять виртуалных таблиц вычисляют (http://catalog.mista.ru/public/358927/), а у вас так просто - поставить условия да и все. Что то я видно не понимаю ни в запросах ни в программировании вовсе.
 Не предоставите ли любезно образчик запроса? | |||
| 5
    
        WebberNSK 20.01.17✎ 12:45 | 
        Посмотрите в ERP метод ОбеспечениеСервер.ТекстЗапросаДатГрафика     | |||
| 6
    
        SSSSS_AAAAA 20.01.17✎ 12:53 | 
        (2) В запросах нормальные люди ничего к специфическим датам, Дкоими, в частности, являются и рабочие, не прибавляют. Жаты вообще не вычисляют, а используют таблицы с календарями, на которые и накладывают нужные условия.     | |||
| 7
    
        FIXXXL 20.01.17✎ 13:03 | 
        (0) мож проще при проведении документа эту дату писать в свой регистр? и его цеплять в запрос
 в договоре срок отсрочки менять ведь нельзя? | |||
| 8
    
        tciban 20.01.17✎ 13:13 | 
        (7) Ну как всегда мы пишем отчет и исходим из условия, что рабочую конфу менять нельзя :)     | |||
| 9
    
        tciban 20.01.17✎ 13:15 | 
        (5) Ох-хо-хо... Это ж еще надо скачать и установить erp! А я для УПП 1.2 делаю :(
 Можно вас попросить любезно скинуть мне на почту текст помянутого вами метода? | |||
| 10
    
        FIXXXL 20.01.17✎ 13:18 | 
        (8) ну сваргань таблицу, обсчитай и сунь ее в набор данных СКД
 или временную в запрос, в СКД уже финальную таблицу | |||
| 11
    
        svsvsv 20.01.17✎ 13:30 | 
        (0)
 В УПП 1.3 (может и в УПП 1.2 тоже) есть такой регистр - РегламентированныйПроивзодственныйКалендарь. ВЫБРАТЬ ПЕРВЫЕ 5 //ЗДЕСЬ НУЖНО ПОСТАВИТЬ КОЛ-ВО ДНЕЙ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря ПОМЕСТИТЬ ВТ_РабочиеДни ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ РегламентированныйПроизводственныйКалендарь.ВидДня = &ВидДня_РабочийДень И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &ИсходнаяДата ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(ВТ_РабочиеДни.ДатаКалендаря) КАК ДатаКалендаря ИЗ ВТ_РабочиеДни КАК ВТ_РабочиеДни Как то так. | |||
| 12
    
        svsvsv 20.01.17✎ 13:30 | 
        (11) и в первой таблице поставить "=" вместо ">="     | |||
| 13
    
        FIXXXL 20.01.17✎ 13:39 | 
        (11) напиши на каждую строку отчета, разные договора, разные даты документов     | |||
| 14
    
        kumena 20.01.17✎ 13:44 | 
        > Как то так.
 не так, твой одноразовый запрос нафиг не уперся. | |||
| 15
    
        kumena 20.01.17✎ 13:46 | 
        технология вообще такая, нужно сделать таблицу с пронумерованными днями. сделав соединение по дате узнаем номер дня, а к номеру дня прибавим количество дней и узнаем нужный день.     | |||
| 16
    
        kumena 20.01.17✎ 13:47 | 
        естественно все в запросе, я делал такое давным давно     | |||
| 17
    
        tciban 20.01.17✎ 14:44 | 
        Коллеги! Больше идей нет?     | |||
| 18
    
        Быдло замкадное 20.01.17✎ 14:47 | 
        (17) нужна платформенная функция ПрибавитьКДатеРабочихДней() ? Ее нет     | |||
| 19
    
        tciban 20.01.17✎ 14:54 | 
        (18) Я типа про запросы тут.     | |||
| 20
    
        kumena 20.01.17✎ 15:05 | 
        (17) а чем тебе технология в 15 посте не нравиться?     | |||
| 21
    
        kumena 20.01.17✎ 15:07 | 
        там все разжевано, если запросы писать умеешь, то сделать вообще не проблема.     | |||
| 22
    
        DrZombi гуру 20.01.17✎ 15:07 | 
        (0) через запрос     | |||
| 23
    
        kumena 20.01.17✎ 15:08 | 
        могу написать пример, не бесплатно.     | |||
| 24
    
        FIXXXL 20.01.17✎ 15:10 | 
        (15) (20) (23) в каждой строке отчета Дата и Число
 из таблицы с рабочими днями надо выдернуть начиная с Дата столько строк с "1", сколько в Число и потом просуммировать "1" наверное можно в запросе, но в пятницу неохота думать :) | |||
| 25
    
        marvak 20.01.17✎ 15:11 | 
        (0)
 Если нужно учитывать праздники, то только через производственный календарь. | |||
| 26
    
        FIXXXL 20.01.17✎ 15:11 | 
        (24) не проссумировать, а получить последнюю старшую из "1"-ых
 пятница :) | |||
| 27
    
        Лефмихалыч 20.01.17✎ 15:11 | 
        |ВЫБРАТЬ
 | Календарь.Дата КАК Дата |ПОМЕСТИТЬ ДанныеКалендаря |ИЗ | РегистрСведений.ДанныеПроизводственногоКалендаря КАК Календарь | ПО (Календарь.Дата > &ТвояДата) | И (Календарь.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Суббота)) | И (Календарь.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Воскресенье)) | И (Календарь.ВидДня <> ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник)) | И (Календарь.ПроизводственныйКалендарь = &ПроизводственныйКалендарь) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1 | ДанныеКалендаря.Дата КАК Дата |ПОМЕСТИТЬ ДатаПлатежа |ИЗ | ДанныеКалендаря КАК ДанныеКалендаря | ЛЕВОЕ СОЕДИНЕНИЕ ДанныеКалендаря КАК ДанныеКалендаря1 | ПО ДанныеКалендаря.Дата > ДанныеКалендаря1.Дата | |СГРУППИРОВАТЬ ПО | ДанныеКалендаря.Дата, | ОтсрочкаПоСоглашению.КоличествоДней | |ИМЕЮЩИЕ | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря1.Дата) = &НужноеКоличествоРабочихДней | |||
| 28
    
        Лефмихалыч 20.01.17✎ 15:12 | 
        ОтсрочкаПоСоглашению.КоличествоДней - выкосить, это лишнее     | |||
| 29
    
        svsvsv 20.01.17✎ 15:50 | 
 | |||
| 30
    
        svsvsv 20.01.17✎ 15:59 | 
        (29) так тоже неправильно     | |||
| 31
    
        tciban 20.01.17✎ 16:21 | 
        (29) (27) Спасибо! Будем пробовать!     | |||
| 32
    
        svsvsv 20.01.17✎ 16:24 | 
        (31) В последней таблице надо не РАЗНОСТЬДАТ использовать, нужно более сложный запрос писать, сейчас пока не твремени     | |||
| 33
    
        tciban 20.01.17✎ 16:27 | 
        (28) Не, твой запрос под добавление ко многим датам документов перепилить не смог...     | |||
| 34
    
        tciban 20.01.17✎ 16:27 | 
        Ладно, давайте ужо в понедельник поднимем тему... Сейчас уже все.     | |||
| 35
    
        SoulPower 20.01.17✎ 16:30 | ||||
| 36
    
        ELEA26 20.01.17✎ 16:46 | 
        (34) праздники надо учитывать или нет? От этого зависит - только производственный календарь или можно без него.     | |||
| 37
    
        tciban 20.01.17✎ 20:20 | 
        Праздники конечно надо учитывать     | |||
| 38
    
        tciban 23.01.17✎ 11:02 | 
        (35) Все классно, заработало! Правда не очень быстро... Исходный запрос, в котором получаю документы возникновения долга, выполняется за 1 183 мс, а с расчетом дат - 170 474 мс :(
 //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Документы.Период КАК Период, ВТ_Документы.ДнейОтсрочкиДолга КАК Отсрочка ПОМЕСТИТЬ ИсходныеДаты ИЗ ВТ_Документы КАК ВТ_Документы ИНДЕКСИРОВАТЬ ПО Период, Отсрочка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ИсходныеДаты.Период КАК Период, ИсходныеДаты.Отсрочка КАК Отсрочка, ДанныеПроизводственногоКалендаря.ДатаКалендаря КАК РабочийДень ПОМЕСТИТЬ СоединениеСРабочими ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК ДанныеПроизводственногоКалендаря ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсходныеДаты КАК ИсходныеДаты ПО (ИсходныеДаты.Период <= ДанныеПроизводственногоКалендаря.ДатаКалендаря) И (ДОБАВИТЬКДАТЕ(ИсходныеДаты.Период, ДЕНЬ, ИсходныеДаты.Отсрочка * 2 + 10) > ДанныеПроизводственногоКалендаря.ДатаКалендаря) ГДЕ ДанныеПроизводственногоКалендаря.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)) ИНДЕКСИРОВАТЬ ПО Период, Отсрочка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СоединениеСРабочими.Период КАК Период, СоединениеСРабочими.Отсрочка КАК Отсрочка, СоединениеСРабочими1.РабочийДень КАК ДатаОплаты ПОМЕСТИТЬ ВТ_ДатыОплат ИЗ СоединениеСРабочими КАК СоединениеСРабочими ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоединениеСРабочими КАК СоединениеСРабочими1 ПО СоединениеСРабочими.РабочийДень <= СоединениеСРабочими1.РабочийДень СГРУППИРОВАТЬ ПО СоединениеСРабочими.Отсрочка, СоединениеСРабочими.Период, СоединениеСРабочими1.РабочийДень ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоединениеСРабочими.РабочийДень) = СоединениеСРабочими.Отсрочка ИНДЕКСИРОВАТЬ ПО Период, Отсрочка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Документы.Организация, ВТ_Документы.Контрагент.ОсновнойМенеджерПокупателя КАК Менеджер, ВТ_Документы.Контрагент, ВТ_Документы.ДоговорКонтрагента КАК Договор, ВТ_Документы.ДнейОтсрочкиДолга КАК Отсрочка, ВТ_Документы.Период, ВТ_Документы.Регистратор, ВТ_ДатыОплат.ДатаОплаты КАК ДатаОплаты, ВТ_Документы.Долг ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДатыОплат КАК ВТ_ДатыОплат ПО ВТ_Документы.Период = ВТ_ДатыОплат.Период И ВТ_Документы.ДнейОтсрочкиДолга = ВТ_ДатыОплат.Отсрочка УПОРЯДОЧИТЬ ПО ДатаОплаты | |||
| 39
    
        Ildarovich 23.01.17✎ 11:35 | 
        (38) Посмотрите статью http://catalog.mista.ru/public/358927/ . В ней похожая задача и достаточно экономный по времени метод прибавления рабочих дней, а также ссылки на множество других публикаций по тому же вопросу. 
 Проблема запроса в (38) в том, что неэкономные соединения делаются для всех заданных дат, а нужно, как уже говорилось в (15) и как сделано в статье по ссылке, сначала получить единую таблицу пронумерованных подряд рабочих дней, а затем работать уже с ней - находить по заданной дате номер рабочего дня, прибавлять к этому номеру число дней отсрочки и по прибавленному номеру находить обратно искомую дату. В итоге время работы запроса должно очень сильно сократиться из-за однократности использования тэта-соединения. | |||
| 40
    
        tciban 23.01.17✎ 11:44 | 
        (39) Это был первый вариант, но при отгрузке в нерабочие дни он не рассчитывает даты. Кстати, документы я получаю по вашему алгоритму из (http://catalog.mista.ru/public/262300/)
 Огромное вам за него спасибо!!! | |||
| 41
    
        tciban 23.01.17✎ 11:46 | 
        Кстати, померял в консоле запросов оба варианта на выборке документов с начала декабря - получилось что у SoulPower (
 http://catalog.mista.ru/public/385395/) быстрее чем алгоритм Игронова | |||
| 42
    
        tciban 23.01.17✎ 11:55 | 
        (39) Сергей! Раз уж Вы заглянули сюда - вопросик по Вашему алгоритму - почему резко увеличивается время выполнения когда добавляю в настройках СКД группировку по Контрагент.ОсновнойМенеджерПокупателя с иерархией? Так и должно быть или же есть способ, что бы работало быстрее?     | |||
| 43
    
        Fragster гуру 23.01.17✎ 11:57 | 
        В новых БСП в этом РС есть хорошее измерение РабочихДнейСНачалаГода или как-то так... тогда не надо считать сумму, а можно просто прибавить нужное количество (ну, и немного поизвращаться с переходом через границу года)     | |||
| 44
    
        tciban 23.01.17✎ 12:03 | 
        (43) Увы, но я пишу отчетец для УПП 1.2, какие уж тут БСП!     | |||
| 45
    
        tciban 23.01.17✎ 12:03 | 
        (43) И конечно же нужно не лезть в конфу и не менять структуру данных...     | |||
| 46
    
        Fragster гуру 23.01.17✎ 12:05 | 
        (45) может я пропустил, но где в этой ветке указание на то, какая версия БСП, или хотя бы какая версия типового решения используется?     | |||
| 47
    
        Fragster гуру 23.01.17✎ 12:06 | 
        кроме (44)     | |||
| 48
    
        Fragster гуру 23.01.17✎ 12:07 | 
        а, нашел. ну, тогда только суммировать. но я бы не в два раза больше запас делал, а в 15 дней на каждый год + 2 на каждую неделю.     | |||
| 49
    
        tciban 23.01.17✎ 12:14 | 
        (48) Попробую, спасибо за совет! :)     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |