cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход

 
 
  ГлавнаяСправкаПоискВход  
 
Страниц: 1 2 
Послать Тему Печать
Узнать будущую дату при условии (Прочитано 3 050 раз)
graffserg
Профи
****
Вне Форума



Сообщений: 134
Узнать будущую дату при условии
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 есть формула, в которой можно увидеть количество дней в том или ином году:
Код:
=ДЕНЬ(ДАТА(ГОД(A1);3;0))+337
 


или
Код:
=ДАТА(A2;12;31)-ДАТА(A2-1;12;31).
 


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

Я пробовал использовать данную формулу:
Код:
ДГ10 := DATETOYMD(DATE(ДГ3) + 365);
 


Где + 365 – количество дней, которое у меня получилось при ручном подсчете

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

Наверх
 
 
IP записан
 
dron_ffk
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Узнать будущую дату при условии
Ответ #1 - 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 г. */.
Код:
ДГ10 := ADDAGE(@currentdate, "00.01.0000"); 

Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Узнать будущую дату при условии
Ответ #2 - 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.
Наверх
 
 
IP записан
 
dron_ffk
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Узнать будущую дату при условии
Ответ #3 - 13.03.2021 :: 00:20:23
 
Можно реализовать в виде такой формулы
Код:
// создаем таблицу значений
@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)); // вычисляем будущую дату 

Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Узнать будущую дату при условии
Ответ #4 - 13.03.2021 :: 00:33:23
 
Спасибо за оперативность!
Подскажите пожалуйста, а есть ли аналог LOCATEVALEX и EXISTEX для CRONOSa 5.0?
Наверх
 
 
IP записан
 
dron_ffk
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Узнать будущую дату при условии
Ответ #5 - 13.03.2021 :: 00:37:12
 
С 5 версией к сожалению не работал, начал сразу с версии 6.4
Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Узнать будущую дату при условии
Ответ #6 - 13.03.2021 :: 01:45:07
 
Спасибо!
Может быть есть другой вариант исполнения данной формулы?
Наверх
 
 
IP записан
 
dron_ffk
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Узнать будущую дату при условии
Ответ #7 - 13.03.2021 :: 09:05:31
 
Можно пробежаться циклом по таблице со сравнением значений. Циклы то уж должны работать в 5 версии
Код:
// таблица значений
@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); 

Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



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



Сообщений: 60
Re: Узнать будущую дату при условии
Ответ #9 - 13.03.2021 :: 10:18:40
 
Подправил формулу в соответствии с вашей структурой. В цикле вместо ДГ2  по ошибке поставил ДГ3 .
Наверх
 
 
IP записан
 
dron_ffk
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Узнать будущую дату при условии
Ответ #10 - 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)
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 021
Санкт-Петербург
Re: Узнать будущую дату при условии
Ответ #11 - 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.
Реализовать можно что угодно, только грамотно описать надо.
Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Узнать будущую дату при условии
Ответ #12 - 13.03.2021 :: 11:50:29
 
Вот подправил:
Код:
// таблица значений
@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. Получается формула выдает значение но не учитывает количество оставшихся дней в году (я имею ввиду не понимает високосный год или нет).
Возможно ли данную формулу "причесать"?
Наверх
 
 
IP записан
 
dron_ffk
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Узнать будущую дату при условии
Ответ #13 - 13.03.2021 :: 14:18:11
 
Високосный год отлично учитывается.
Наверх
 

Bezymjannyj_005.jpg (36 KB | 71 )
Bezymjannyj_005.jpg
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Узнать будущую дату при условии
Ответ #14 - 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.
Наверх
 
 
IP записан
 
Страниц: 1 2 
Послать Тему Печать