|
Подскажите лучший способ прибавления к дате рабочих дней в запросе | ☑ | ||
---|---|---|---|---|
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) Попробую, спасибо за совет! :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |