Форум компании Кронос-Информ
https://www.cronos.ru/cgi-bin/YaBB2/YaBB.cgi
Конференции для пользователей >> CronosPRO: формулы >> Узнать будущую дату при условии
https://www.cronos.ru/cgi-bin/YaBB2/YaBB.cgi?num=1615551990

Сообщение написано graffserg в 12.03.2021 :: 16:26:30

Заголовок: Узнать будущую дату при условии
Создано graffserg в 12.03.2021 :: 16:26:30
Доброго день уважаемые форумчане!
Вот, возник вопрос следующего характера:
База: Контроль поставок
0|Системный номер|Ц|10|||
8|Относится к лицу|О|||МН|ЛЦ23
2|КОД поставок|С||КОД|ИФ|
5|Номер поставки|Т|10||ИФ|
3|Дата поставки|Д|||ИФ|
10|Срок выполнения поставки|Т|20||ИФ|
6|Дата ввода|Т|20||НК|
7|Дата изменения|Т|20||НК;МН|

КОД поставок – словарное поле, из которого выбирается одно из значений, которое в свою очередь равно определенному интервалу времени, например:
К1 = 1 месяц
К2 = 1 год
К3 = 2 года
К4 = 5 лет и т.д.

Мне необходимо:
1. Чтобы формула, при выборе одного из значений в поле «КОД поставок», понимала, что
К1 = 28, 29, 30 или 31 день
К2 = 365 или 366 дней
К3 = 730 или 731 день
К4 = 1825 или 1826 дней и т.д.
Количество дней зависит от:
- даты поставки
- високосный год или нет.
К примеру, в Excel есть формула, в которой можно увидеть количество дней в том или ином году:

Code (]
=ДЕНЬ(ДАТА(ГОД(A1);3;0))+337
[/code):

или
[code]
=ДАТА(A2;12;31)-ДАТА(A2-1;12;31).

2. Чтобы формула дату поставки умножила на количество дней из поля «КОД поставок» и итог внесла в поле «Срок выполнения поставки» в виде даты типа ДД.ММ.ГГГГ.

Я пробовал использовать данную формулу:
[code]
ДГ10 := DATETOYMD(DATE(ДГ3) + 365);
[/code]
Где + 365 – количество дней, которое у меня получилось при ручном подсчете

Собственно и сам вопрос – возможно ли создать такую формулу? Если да, то помогите ее доработать. Для Вас это будет разминка для мозга, а для меня неоценимая помощь.
Спасибо!


Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 12.03.2021 :: 23:37:51
Функция ADDAGE тебе в помощь
Назначение

Вычисляет дату, которая наступит позже исходной на указанное количество дней, месяцев и лет.

Синтаксис

ADDAGE ( Дата, Период )

Аргументы

Дата – строка в формате «ДД.ММ.ГГГГ», соответствующая исходной дате;

Период – строка, задающая период времени (количество дней, месяцев и лет в формате «ДД.ММ.ГГГГ»), прибавляемый к исходной дате;

Возвращаемое значение

Строка в формате «ДД.ММ.ГГГГ», соответствующая полученной дате.

Примечания

Для вычисления даты, которая наступит раньше заданной, используйте функцию SUBAGE.

Пример использования

@Date := ADDAGE("29.02.2004", "01.00.0000"); /*переменной @Date присвоено значение "01.03.2004", что соответствует дате, которая наступит через 1 день после 29 февраля 2004 г. */.
@Date := ADDAGE("28.02.2004", "01.02.0003"); /*переменной @Date присвоено значение "29.04.2007", что соответствует дате, которая наступит через 3 года, 2 месяца и 1 день после 28 февраля 2004 г. */.
[code]ДГ10 := ADDAGE(@currentdate, "00.01.0000");[/code]

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 13.03.2021 :: 00:13:24
Уважаемый dron_ffk в мануале я читал про эту функцию, но как в формулу добавить переменную, которая КОД переводила бы в дни:
К1 = 28, 29, 30 или 31 день
К2 = 365 или 366 дней
К3 = 730 или 731 день
К4 = 1825 или 1826 дней и т.д.
Количество дней зависит от:
- даты поставки
- високосный год или нет.

Я имею ввиду есть Дата поставки, например 01.03.2021 года, в поле Срок выполнения поставки мне нужно дату 12.03.2021 * на К1 или К2 и т.д. и получить дату выполнения поставки, к примеру 01.04.2021.

Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 13.03.2021 :: 00:20:23
Можно реализовать в виде такой формулы
[code]// создаем таблицу значений
@a(1):="К1"<<@valueseparator1<<"00.01.0000" // 1 месяц
@a(2):="К2"<<@valueseparator1<<"00.00.0001" // 1 год
@a(3):="К3"<<@valueseparator1<<"00.00.0002" // 2 года
@a(4):="К4"<<@valueseparator1<<"00.00.0005" // 5 лет и т.д.

@kod:=locatevalex(@a,1,ДГ2) // ищем в массиве совпадение с кодом который содержится в ячейке записи ДГ2

ДГ10 := ADDAGE(ДГ3, @a(@kod,2)); // вычисляем будущую дату[/code]

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 13.03.2021 :: 00:33:23
Спасибо за оперативность!
Подскажите пожалуйста, а есть ли аналог LOCATEVALEX и EXISTEX для CRONOSa 5.0?

Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 13.03.2021 :: 00:37:12
С 5 версией к сожалению не работал, начал сразу с версии 6.4

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 13.03.2021 :: 01:45:07
Спасибо!
Может быть есть другой вариант исполнения данной формулы?

Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 13.03.2021 :: 09:05:31
Можно пробежаться циклом по таблице со сравнением значений. Циклы то уж должны работать в 5 версии

Code (]// таблица значений
@a(1):="К1"<<@valueseparator1<<"00.01.0000" // 1 месяц
@a(2):="К2"<<@valueseparator1<<"00.00.0001" // 1 год
@a(3):="К3"<<@valueseparator1<<"00.00.0002" // 2 года
@a(4):="К4"<<@valueseparator1<<"00.00.0005" // 5 лет и т.д.

@r:=1;
WHILE @r<=valcount(@a) DO //создаем цикл для сравнения кода
                             [
                             if (ДГ2=@a(@r,1)) then
                                                                       [
                                                                       @kod:=@a(@r,2);
                                                                       @r:=@r+valcount(@a)
                                                                       ):

                                                                 else @r:=@r+1
                             ];

ДГ10 := ADDAGE(ДГ3, @kod);

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 13.03.2021 :: 09:31:33
Спасибо за оказание помощи, но увы формула почему-то не работает, пробовал менять:
- поле 10|Срок выполнения поставки|Т|20||ИФ| с текстового на тип дата;
- @currentdate на ДГ3.
Но формула не срабатывает и вносит значение текущей даты. И еще заметил, что если поле 3|Дата поставки|Д|||ИФ| не содержит значения, то в поле 10|Срок выполнения поставки|Т|20||ИФ| вносится текущая дата.
Что не так :-/

Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 13.03.2021 :: 10:18:40
Подправил формулу в соответствии с вашей структурой. В цикле вместо ДГ2  по ошибке поставил ДГ3 .

Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 13.03.2021 :: 10:26:13

graffserg записан в 13.03.2021 :: 09:31:33:
Спасибо за оказание помощи, но увы формула почему-то не работает, пробовал менять:
- поле 10|Срок выполнения поставки|Т|20||ИФ| с текстового на тип дата;
- @currentdate на ДГ3.
Но формула не срабатывает и вносит значение текущей даты. И еще заметил, что если поле 3|Дата поставки|Д|||ИФ| не содержит значения, то в поле 10|Срок выполнения поставки|Т|20||ИФ| вносится текущая дата.
Что не так :-/


если поле 3 не содержит дату, то нужно создать условие
if ДГ3 then ДГ10:=addage(ДГ3,@kod)

Заголовок: Re: Узнать будущую дату при условии
Создано Zuluss в 13.03.2021 :: 11:27:02

Цитировать:
К1 = 28, 29, 30 или 31 день
К2 = 365 или 366 дней
К3 = 730 или 731 день
К4 = 1825 или 1826 дней и т.д.
Количество дней зависит от:
- даты поставки
- високосный год или нет.

Я имею ввиду есть Дата поставки, например 01.03.2021 года, в поле Срок выполнения поставки мне нужно дату 12.03.2021 * на К1 или К2 и т.д. и получить дату выполнения поставки, к примеру 01.04.2021.

Что то множество вопросов по данному сообщению.
Например, 30.01.2020+1 месяц, или 29.02.2020+1 месяц, 29.02.2020+1 год какой результат должен быть? Количество дней в каком месяце или каком году считать?
К4 = может быть или 1826, или 1827.
Реализовать можно что угодно, только грамотно описать надо.

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 13.03.2021 :: 11:50:29
Вот подправил:

Code (]
// таблица значений
@a(1):="К1"<<@valueseparator1<<"00.01.0000" // 1 месяц
@a(2):="К2"<<@valueseparator1<<"00.00.0001" // 1 год
@a(3):="К3"<<@valueseparator1<<"00.00.0002" // 2 года
@a(4):="К4"<<@valueseparator1<<"00.00.0005" // 5 лет и т.д.

@r:=1;
WHILE @r<=valcount(@a) DO //создаем цикл для сравнения кода
                             [
                             if (DECODE(ДГ2,0)=@a(@r,1)) then
                                                                       [
                                                                       @kod:=@a(@r,2);
                                                                       @r:=@r+valcount(@a)
                                                                       ):

                                                                 else @r:=@r+1
                             ];

if ДГ4 then ДГ10:=addage(ДГ4,@kod)


Загвоздка была в том, что ДГ2 словарь, а его значения не декодируются - добавил DECODE.

Но вот что еще, если ввести дату 01.01.2021, то и срок будет 01.01.2022. Получается формула выдает значение но не учитывает количество оставшихся дней в году (я имею ввиду не понимает високосный год или нет).
Возможно ли данную формулу "причесать"?

Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 13.03.2021 :: 14:18:11
Високосный год отлично учитывается.
Bezymjannyj_005.jpg (36 KB | 121 )

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 13.03.2021 :: 15:50:23
dron_ffk спасибо за Вашу отзывчивость!
Возможно я не так выразился, но я имел ввиду если в поле 3|Дата поставки|Д|||ИФ| = 01.01.2021 и нам необходимо прибавить, к примеру, 1 год (365 или 366) дней, то 10|Срок выполнения поставки|Т|20||ИФ| должен быть равен 31.12.2021. Не так ли?
Это если заключить контракт с сотрудником фирмы на 1 год, то крайний день его работы будет 31.12.2021, а не до 01.01.2022.

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 13.03.2021 :: 23:29:53

Zuluss записан в 13.03.2021 :: 11:27:02:

Цитировать:
Я имею ввиду есть Дата поставки, например 01.03.2021 года, в поле Срок выполнения поставки мне нужно дату 12.03.2021 * на К1 или К2 и т.д. и получить дату выполнения поставки, к примеру 01.04.2021.

Что то множество вопросов по данному сообщению.
Например, 30.01.2020+1 месяц, или 29.02.2020+1 месяц, 29.02.2020+1 год какой результат должен быть? Количество дней в каком месяце или каком году считать?
К4 = может быть или 1826, или 1827.
Реализовать можно что угодно, только грамотно описать надо.


Zulus, доброго дня/вечера!
Постараюсь объяснить почему я так сделал. Дело в том, что основная задумка это:
- присвоить словарному полю 2|КОД поставок|С||КОД|ИФ| переменную, которая означает, что при выборе
К1 - период равен 1 месяцу
К2 - период равен 1 году
К3 - период равен 2 годам
К4 - период равен 5 годам и т.д.
и что в зависимости от високосный год или нет количество дней как в 1 месяце, так и в 1, 2, 5 годах будет разное. Вы так же об этом упоминали.
- в формуле определить, что при вводе даты в поле 3|Дата поставки|Д|||ИФ|, например 01.01.2021, она (формула) дату поставки прибавит к количеству дней из поля «КОД поставок» и итог отразит в поле «Срок выполнения поставки» в виде даты типа ДД.ММ.ГГГГ (если заключить контракт с сотрудником фирмы на 1 год, то крайний день его работы будет 31.12.2021, а не до 01.01.2022).

Прошу не кидать камнями, понимаю, что до Вашего уровня, даже до уровня уважаемого dron_ffk мне далеко. Вот по этой причине, возможно с простыми и глупыми вопросам я обращаюсь.
Спасибо за понимание.

Заголовок: Re: Узнать будущую дату при условии
Создано dron_ffk в 14.03.2021 :: 10:57:07
Тогда в последнем условии вычти один день, если нужна предшествующая дата за период.
[code]if ДГ4 then ДГ10:=SUBAGE(ADDAGE(ДГ4, @kod), "01.00.0000");[/code]

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 14.03.2021 :: 11:07:44
dron_ffk СПАСИБО!
Все работает.

Заголовок: Re: Узнать будущую дату при условии
Создано Zuluss в 14.03.2021 :: 11:29:28
Чтобы не возиться с перебором и поиском в словаре можно добавить в словарь поле, например, 21, и туда заносить интервалы.
В этом случае все упрощается и помещается в одну строку:
[code]if ДГ4 then ДГ10:=SUBAGE(ADDAGE(ДГ4, fsl(6,ДГ2,21)), "01.00.0000");
//где fsl(6 - номер словаря[/code]

voc.PNG (11 KB | 90 )

Заголовок: Re: Узнать будущую дату при условии
Создано graffserg в 14.03.2021 :: 23:33:50
Zulus спасибо все работает!
Вы вместе с dron_ffk очень помогли. Еще раз спасибо.
Ваши советы и помощь внесу в себе в копилку знаний. ;)


Форум компании Кронос-Информ » Powered by YaBB 2.5.2!
YaBB © 2000-2009. Все права защищены.

Localization by mySOPROMAT.ru