Форум компании Кронос-Информ | |
http://www.cronos.ru/cgi-bin/YaBB2/YaBB.cgi
Конференции для пользователей >> CronosPRO: формулы >> Узнать будущую дату при условии http://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):
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) ):
|
Заголовок: 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:
если поле 3 не содержит дату, то нужно создать условие if ДГ3 then ДГ10:=addage(ДГ3,@kod) |
Заголовок: Re: Узнать будущую дату при условии Создано Zuluss в 13.03.2021 :: 11:27:02 Цитировать:
Что то множество вопросов по данному сообщению. Например, 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) ):
Загвоздка была в том, что ДГ2 словарь, а его значения не декодируются - добавил DECODE. Но вот что еще, если ввести дату 01.01.2021, то и срок будет 01.01.2022. Получается формула выдает значение но не учитывает количество оставшихся дней в году (я имею ввиду не понимает високосный год или нет). Возможно ли данную формулу "причесать"? |
Заголовок: Re: Узнать будущую дату при условии Создано dron_ffk в 13.03.2021 :: 14:18:11
Високосный год отлично учитывается.
![]() |
Заголовок: 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:
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] ![]() |
Заголовок: Re: Узнать будущую дату при условии Создано graffserg в 14.03.2021 :: 23:33:50
Zulus спасибо все работает!
Вы вместе с dron_ffk очень помогли. Еще раз спасибо. Ваши советы и помощь внесу в себе в копилку знаний. ;) |
Форум компании Кронос-Информ » Powered by YaBB 2.5.2! YaBB © 2000-2009. Все права защищены. Localization by mySOPROMAT.ru |