Loading



+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » SE37 - Построитель функций (Модератор: Dmitriy)Тема:
|- Функции работы с датами



Автор Тема: Функции работы с датами  (Прочитано 4693 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Функции работы с датами
« : Июнь 18, 2007, 06:49:46 pm »
Функций для работы с датами к сожалению в системе написано много, ощущение, что каждый индус (как каждый хомячок, которому в жизни требуется нажраться и сдохнуть) должен был при возникновении потребности в расчете даты писать свою реализацию. Может это было бы и неплохо, если бы не одно, но... некоторые функции учитывают рабочий календарь, другие нет... третьи вообще не знают что есть высокосные года (может в Индии их просто нет), четвертые просто содержать ошибку при расчетах и т.д. В общем у кого есть свой наработанный материал по работе с датами и есть время поделится, пишем. Небольшая подборка которой пользуюсь:

* Возвращает номер недели для даты: в формате YYYYWW (YYYY - Год, WW - Неделя)

DATA: l_week LIKE scal-week.
                                                                       
CALL FUNCTION 'DATE_GET_WEEK'
     EXPORTING
          date         = sy-datum
     IMPORTING
          week         = l_week
     EXCEPTIONS
          date_invalid = 1
          OTHERS       = 2.


* Возвращает дату с которой начинается неделя по ее номеру.
* Номер недели в формате  YYYYWW (YYYY - Год, WW - Неделя)
* Дата в стандартном формате типа SY-DATUM (YYYYMMDD, YYYY - Год, MM - Месяц, DD - День)
DATA: l_week LIKE scal-week,
      l_datum like sy-datum.

CALL FUNCTION 'WEEK_GET_FIRST_DAY'
  EXPORTING
    week               = l_week
 IMPORTING
   DATE               = l_datum
 EXCEPTIONS
   WEEK_INVALID       = 1
   OTHERS             = 2.                                                                       


* Возвращает дату последнего дня в месяце, в принципе можно использовать так же
* для получения количества дней в месяце. О высокосном годе знает ;)
* Дата передается и возвращается в стандартном формате типа SY-DATUM (YYYYMMDD,
* YYYY - Год, MM - Месяц, DD - День)
DATA: l_datum LIKE sy-datum.

CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
     EXPORTING
          day_in            = sy-datum
     IMPORTING
          last_day_of_month = l_datum
     EXCEPTIONS
          day_in_no_date    = 1
          OTHERS            = 2.

* Выполняет преобразование внутреннего представления даты в стандартный вид
* типа SY-DATUM. Я знаю только одну ситуацию, где используется такое, это таблица
* курсов валют TCURR, там все даты заданы именно во внутреннем формате.
* Передается дата  в формате вида  TCURR-GDATU, а возвращается стандартное
* представление типа SY-DATUM (YYYYMMDD, YYYY - Год, MM - Месяц, DD - День)
DATA:  l_datum LIKE sy-datum,
      l_gdatu LIKE tcurr-gdatu.

l_gdatu = '79948998'.
CALL FUNCTION 'DATE_CONV_EXT_TO_INT'
     EXPORTING
          i_date_ext = l_gdatu
     IMPORTING
          e_date_int = l_datum
     EXCEPTIONS
          error      = 1
          OTHERS     = 2.


* Получить дату начала периода к варианту финансового года. Стандартные параметры
* Год вида YYYY. Вариант финансового года для БЕ в виде CC. Номер требуемого периода
* задается в формате NNN Возвращаемая дата представлена в стандартном типе SY-DATUM
* (YYYYMMDD, YYYY - Год, MM - Месяц, DD - День)
* Стандартно как бы используется практически везде вариант финансового года K4 - т.е.
* 4 квартала, однако знавал я систему, где были настроены свои периоды. Так что если
* пишем универсальную программу, то начало периода лучше считать используя данный ФМ

DATA: l_gjahr LIKE t009b-bdatj,
      l_periv LIKE t009b-periv,
      l_poper LIKE t009b-poper,
      l_datum LIKE sy-datum.
                                                                       
l_gjahr = '2007'.
l_periv = 'K4'.
l_poper = '002'.
CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET'
     EXPORTING
          i_gjahr        = l_gjahr
*         I_MONMIT             = 00
          i_periv        = l_periv
          i_poper        = l_poper
     IMPORTING
          e_date         = l_datum
     EXCEPTIONS
          input_false    = 1
          t009_notfound  = 2
          t009b_notfound = 3
          OTHERS         = 4.

* Получить дату конца периода к варианту финансового года. Стандартные параметры
* Год вида YYYY. Вариант финансового года для БЕ в виде CC. Номер требуемого периода
* задается в формате NNN Возвращаемая дата представлена в стандартном типе SY-DATUM
* (YYYYMMDD, YYYY - Год, MM - Месяц, DD - День)
* Собственно причина почему ее желательно использовать такая же как и для предыдущего
* функционального модуля FIRST_DAY_IN_PERIOD_GET.
DATA: l_gjahr LIKE t009b-bdatj,
      l_periv LIKE t009b-periv,
      l_poper LIKE t009b-poper,
      l_datum LIKE sy-datum.
                                                                       
l_gjahr = '2007'.
l_periv = 'K4'.
l_poper = '002'.
CALL FUNCTION 'LAST_DAY_IN_PERIOD_GET'
     EXPORTING
          i_gjahr        = l_gjahr
*         I_MONMIT             = 00
          i_periv        = l_periv
          i_poper        = l_poper
     IMPORTING
          e_date         = l_datum
     EXCEPTIONS
          input_false    = 1
          t009_notfound  = 2
          t009b_notfound = 3
          OTHERS         = 4.

* Позволяет узнать какая будет дата через NN-Дней, MM-Месяцев и YY-Лет от заданной.
* При этом можно как суммировать так и отнимать требуемое количество дней, месяцев и
* лет. О высокосном годе вроде как тоже знает. Из полезного можно добавлять например 55
* дней и 1 месяц и т.д. Если даты нужно отнимать, тогда нужно задать параметр SIGNUM = '-'
DATA: l_days LIKE t5a4a-dlydy,
      l_months LIKE t5a4a-dlymo,
      l_years LIKE t5a4a-dlyyr,
      l_datum LIKE sy-datum.
                                                                       
l_days = '10'.
l_month = '05'.
l_years = '02'
call function 'RP_CALC_DATE_IN_INTERVAL'
     exporting
          date      = sy-datum
          days      = l_days
          months    = l_months
          signum    = '+'
          years     = l_years
     importing
          calc_date = l_datum.

* В данном вызове для даты 01.02.2007 будет возвращена дата 11.07.2009.


* Высчитывает разницу в днях и часах между двумя произвольно заданными датами
* Дата и время начала и конца диапазона задаются в стандартном типе SY-DATUM
* (YYYYMMDD, YYYY - Год, MM - Месяц, DD - День).
* Из особенностей работы:
* 1. Разница вычисляется только для полного количества часов, т.е. между 01:00 и 02:30
*    будет возвращено все равно 1 час.
* 2. Обязательно нужно задавать поля времени, например хотя бы 1 минута, иначе функция
*    ничего не вернет (Спасибо индусам за наше счастливое детство, но оказывается в этой
*    Индии 00:00:00 времени не бывает в принципе)
* 3. Даты можно задавать как от большей к меньшей так и наоборот, при этом переменная l_earliest
*    будет содержать следующие значения =2 - дата1 больше даты2, =1 - дата1 меньше дата2, если даты
*    равны, тогда сравниваются времена и =2 - время1 больше времени2 и =1 - время 1 меньше времени2,
*    если даты и время совпадают, тогда переменная = 0.
DATA: l_datum_one LIKE sy-datum,
      l_time_one LIKE sy-uzeit,
      l_datum_two LIKE sy-datum,
      l_time_two LIKE sy-uzeit.
DATA: l_datediff TYPE p,
      l_timediff TYPE p,
      l_earliest TYPE  c.
                                                                       
CALL FUNCTION 'SD_DATETIME_DIFFERENCE'
     EXPORTING
          date1            = l_datum_one
          time1            = l_time_on
          date2            = l_datum_two
          time2            = l_time_two
     IMPORTING
          datediff         = l_datediff
          timediff         = l_timediff
          earliest         = l_earliest
     EXCEPTIONS
          invalid_datetime = 1
          OTHERS           = 2.

* Возвращает внутренню таблицу со списком как сокращенных наименований месяцев
* (3 символа), так и полных в именительном падеже на заданном языке. По умолчанию
* используется язык регистрации в системе.
DATA: l_retcode LIKE like sy-subrc,
      lt_month LIKE t247 OCCURS 1 WITH HEADER LINE.
                                                                       
CALL FUNCTION 'MONTH_NAMES_GET'
     EXPORTING
          language              = sy-langu
     IMPORTING
          return_code           = l_retcode
     TABLES
          month_names           = lt_month
     EXCEPTIONS
          month_names_not_found = 1
          OTHERS                = 2.

* Для языка RU таблица lt_month, будет содержать что-то типа такого:
* SP MN KTX LTX       
* -------------
* RU 01 ЯНВ Январь   
* RU 02 ФЕВ Февраль   
* RU 03 МАР Март     
* RU 04 АПР Апрель   
* RU 05 МАЙ Май       
* RU 06 ИЮН Июнь     
* RU 07 ИЮЛ Июль     
* RU 08 АВГ Август   
* RU 09 СЕН Сентябрь 
* RU 10 ОКТ Октябрь   
* RU 11 НОЯ Ноябрь   
* RU 12 ДЕК Декабрь   


* Возвращает в заданном диапазоне список выходных/праздничных дней для выбранного
* производственного и праздничного календаря. Праздничные и выходные дни берутся из
* настройки соответствующих календарей, так что если там пусто, то и список будет пустой.
* Если заданные календари не найдены тогда l_returncode = '4'.
DATA: l_holiday_calendar LIKE scal-hcalid,
      l_factory_calendar LIKE scal-fcalid,
      l_date_from LIKE scal-date,
      l_date_to LIKE scal-date,
      l_year_of_valid_from LIKE scal-year,
      l_year_of_valid_to LIKE scal-year,
      l_returncode LIKE sy-subrc,
      lt_holidays LIKE iscal_day OCCURS 1 WITH HEADER LINE.
                                                                       
l_factory_calendar = 'UA'.
l_holiday_calendar = 'UA'
l_date_from = '18.07.2007'.
l_date_to = '18.07.2007'.
CALL FUNCTION 'HOLIDAY_GET'
     EXPORTING
          holiday_calendar           = l_holiday_calendar
          factory_calendar           = l_factory_calendar
          date_from                  = l_date_from
          date_to                    = l_date_to
     IMPORTING
          year_of_valid_from         = l_year_of_valid_from
          year_of_valid_to           = l_year_of_valid_to
          returncode                 = l_returncode
     TABLES
          holidays                   = lt_holidays
     EXCEPTIONS
          factory_calendar_not_found = 1
          holiday_calendar_not_found = 2
          date_has_invalid_format    = 3
          date_inconsistency         = 4
          OTHERS                     = 5.

* Формат вывода таблички lt_holidays, для приведенного пример следующий:
* DATE       F H HOL TXT_SHORT  TXT_LONG             
* ----------------------------------------                                                                                                           
* 28.06.2007 X X 168 День конст День конституції           
* 24.08.2007 X X 169 День Незал День Незалежності           
* 01.01.2008 X X 171 Новий Рік  Новий Рік                   
* 07.01.2008 X X 172 Різдво Хри Різдво Христово             
* 01.05.2008 X X 163 1 Травня   1 Травня                   
* 02.05.2008 X X 164 2 Травня   2 Травня                   
* 09.05.2008 X X 170 День Перем День Перемоги               

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами
« Ответ #1 : Май 16, 2008, 12:34:02 pm »
Случайненько нашлась интересная ФМ-ка для коллекции. Вызывается при создании входящих/исходящих поставок для получения информации является ли день рабочим и если нет, то в зависимости от параметров ФМ возвращает следующий/предыдущий рабочий день.

*Позволяте получить информацию о статусе рабочего дня исходя из данных
* призводственного календаря, присвоенного заводу. При этом если день
* не является рабочим, то функция вернет следующий рабочий день в зави-
* симости от параметров:
* CORRECT_OPTION      = '+' - Будет возвращен следующий рабочий день
*                     = '-' - Будет возвращен предыдущий рабочий день
* DATE                = Дата которую требуется проверить
* FACTORY_CALENDAR_ID = Код производственного календаря из T001W
*
* Результат:
* DATE                 = Дата формата SY-DATUM
* FACTORYDATE          = Дата во внутреннем формате видв TCURR-GDATU,
*                        полезно для чтения курса валюты например.
* WORKINGDAY_INDICATOR = В принципе в нем возвращается значение, кото-
*                        рое передается в CORRECT_OPTION, что видно из
*                        кода
*                        CASE CORRECT_OPTION.
*                          WHEN '+'.
*                            WORKINGDAY_INDICATOR = '+'.
*                          WHEN '-'.
*                            WORKINGDAY_INDICATOR = '-'.
*                        ENDCASE.
*                        Правда зачем так сложно, через CASE сделано,
*                        это нам наверное никто не подскажет, ну хотя
*                        может найдется тот индус который это писал,
*                        а так может были какие мысли, да так и не реа-
*                        лизовались :-)
DATA: l_date LIKE scal-date,
      l_factorydate LIKE scal-facdate,
      l_workingday_indicator LIKE scal-indicator.

CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
     EXPORTING
          correct_option               = '+'
          date                         = sy-datum
          factory_calendar_id          = 'RU'
     IMPORTING
          date                         = l_date
          factorydate                  = l_factorydate
          workingday_indicator         = l_workingday_indicator
     EXCEPTIONS
          calendar_buffer_not_loadable = 1
          correct_option_invalid       = 2
          date_after_range             = 3
          date_before_range            = 4
          date_invalid                 = 5
          factory_calendar_not_found   = 6
          OTHERS                       = 7.

В общем если задать дату 17.05.2008 и CORRECT_OPTION  = '+' , для календаря где суббота и воскресение отмечены как выходные дни, то ФМ вернет дату 19.05.2007, А для CORRECT_OPTION  = '-', дата будет 16.05.2008.

Вроде как проблем не обнаружил, можно использовать вместо собственного чтения данных календаря для определения рабочего дня.  Опять же для даты 16.05.2008 возвращается 16.05.2008.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами
« Ответ #2 : Май 16, 2008, 12:48:05 pm »
Там же был обнаружен еще один маленький модулек:

* Простенький ФМ-чик, возвращающий номер дня в неделе, понедельник счи-
* тается первым днем, воскресение 7. В принципе можно пишется за пару
* минут и самим, но зачем, если уже есть кем-то сделанное :-)
DATA: l_day LIKE scal-indicator.

CALL FUNCTION 'DATE_COMPUTE_DAY'
     EXPORTING
          date = sy-datum
     IMPORTING
          day  = l_day.
В общем для даты 16.05.2008 будет возвращен параметр 5, что и требовалось доказать, а это значит сегодня вечером пиво, рыбка и вообще пора готовиться к выходным  ;)

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами
« Ответ #3 : Сентябрь 08, 2008, 04:42:04 pm »
FACTORYDATE_CONVERT_TO_DATE - Функция возвращает дату представленную во внутреннем формате в нормальный формат, т.е. это обратная коныертация для функции DATE_CONVERT_TO_FACTORYDATE, которая описана выше. Обратите внимание что поправка на рабочий день выполняется автоматически, т.е. к пример если вы укажите число 3995, что равно 01.01.2008, то будет возвращена дата 31.12.2007, т.е. фактически CORRECT_OPTION = '-'. Ну а остальное вроде как ясно из текста.

DATA: l_datum LIKE scal-date,
      l_factorydate LIKE scal-facdate.

l_factorydate = '3 996'.
CALL FUNCTION 'FACTORYDATE_CONVERT_TO_DATE'
     EXPORTING
          factorydate                  = l_factorydate
          factory_calendar_id          = 'UA'
     IMPORTING
          date                         = l_date
     EXCEPTIONS
          calendar_buffer_not_loadable = 1
          factorydate_after_range      = 2
          factorydate_before_range     = 3
          factorydate_invalid          = 4
          factory_calendar_id_missing  = 5
          factory_calendar_not_found   = 6
          OTHERS                       = 7.

Результат: 02.01.2008

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами
« Ответ #4 : Октябрь 23, 2008, 03:40:51 pm »
MONTH_PLUS_DETERMINE - Функция позволяющая добавить или отнять месяцы от заданной даты. В принципе как бы ничего вроде как и интересного нет, хотя:
DATA: l_date LIKE sy-datum.
CALL FUNCTION 'MONTH_PLUS_DETERMINE'
     EXPORTING
          months  = '1'
          olddate = '20080131'
     IMPORTING
          newdate = l_date.
Параметры:
  • months - Количество месяцев которое нужно добавить или отнять от даты. Для вычитания нужно записать значение как -1.
  • olddate - Дата от которой требуется вычесть месяцы.
  • l_date - Новое значение даты.

Из интересного если запустить модуль как в написанном примере, то результат будет 29.02.2008, т.е. последний день месяца будет рассчитан корректно и функция знает таки про высокосные года. В общем если работает корректно, плюсь корректно делает переход через год. Так сказать можно использовать.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами TB_DATAFEED_CHECK_DATE
« Ответ #5 : Ноябрь 25, 2008, 11:46:41 pm »
TB_DATAFEED_CHECK_DATE - Проверяет значение введенной даты на корректность и выдает, строку ошибки, которую можно показать пользователю, что не нравится в веденной им дате.

DATA: l_date LIKE vtb_market-ddate,
      l_sstats LIKE vtb_market-sstats,
      l_error_flg LIKE vtb_market-rupdhist,
      l_error_msg LIKE vtb_market-error.
                                                                       
l_date = '301173'.
CALL FUNCTION 'TB_DATAFEED_CHECK_DATE'
     EXPORTING
          date      = l_date
     CHANGING
          sstats    = l_sstats
          error_flg = l_error_flg
          error_msg = l_error_msg.
В ответ будет получено типа:
  • l_sstats  = E
  • l_error_flg = X
  • l_error_msg = Дата 301173   содержит недопустимый пробел!

Обратите внимание, что дата не правильная потому что не выполняется ее преобразование, т.е. правильная дата была бы 30.11.1973, тогда бы ошибки небыло.

PS: Да, область использования например при чтении данных из файла при загрузках и т.д.  или разборе строк где есть дата... а экраны диалоговых программ, ну там работает программа преобразования... так что там и так будет сказано, что не так в веденной дате.
« Последнее редактирование: Ноябрь 25, 2008, 11:54:54 pm от Uukrul »

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (DATE_CHECK_PLAUSIBILITY)
« Ответ #6 : Январь 12, 2009, 03:04:48 pm »
DATE_CHECK_PLAUSIBILITY - Проверка значения введенной даты. Так сказать еще одна вариация, когда проверяется что введено. Собственно говоря что и как проверяется лучше всего видно из исходного кода данного ФМ. Так что в комментариях думаю это все не нуждается.
function date_check_plausibility.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"       IMPORTING
*"              DATE LIKE  SY-DATUM
*"       EXCEPTIONS
*"              PLAUSIBILITY_CHECK_FAILED
*"----------------------------------------------------------------------

  data: check_year_1 type p.
  data: check_year_2 type p.

  if date cn '0123456789'.
    message s011 with date raising plausibility_check_failed.
  endif.

  if date+4(2) lt '01'
  or date+4(2) gt '12'.
    message s003 with date+4(2) raising plausibility_check_failed.
  endif.

  if date+6(2) lt '01'
  or date+6(2) gt '31'.
    message s006 with date+6(2) raising plausibility_check_failed.
  endif.

  if date+4(2) eq '01'
  or date+4(2) eq '03'
  or date+4(2) eq '05'
  or date+4(2) eq '07'
  or date+4(2) eq '08'
  or date+4(2) eq '10'
  or date+4(2) eq '12'.
    if date+6(2) gt '31'.
      message s004 with date+6(2) date+4(2)
                   raising plausibility_check_failed.
    endif.
  elseif date+4(2) eq '04'
  or     date+4(2) eq '06'
  or     date+4(2) eq '09'
  or     date+4(2) eq '11'.
    if date+6(2) gt '30'.
      message s004 with date+6(2) date+4(2)
                   raising plausibility_check_failed.
    endif.
  else.
    check_year_1 = date(4) mod 4.      " alle 4 Jahre ist schaltjahr
    if check_year_1 eq 0.
      check_year_1 = date(4) mod 100.  " aber nicht alle 100 Jahre
      check_year_2 = date(4) mod 400.  " aber alle 400 Jahre
      if check_year_1 eq 0
      and check_year_2 ne 0.
        if date+6(2) gt '28'.
          message s004 with date+6(2) date+4(2)
                       raising plausibility_check_failed.
        endif.
      else.
        if date+6(2) gt '29'.
          message s004 with date+6(2) date+4(2)
                       raising plausibility_check_failed.
        endif.
      endif.
    else.
      if date+6(2) gt '28'.
        message s004 with date+6(2) date+4(2)
                     raising plausibility_check_failed.
      endif.
    endif.
  endif.
endfunction.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (PERIOD_DAY_DETERMINE)
« Ответ #7 : Февраль 10, 2009, 11:00:57 pm »
PERIOD_DAY_DETERMINE - Возвращает начальную и конечную дату периода, для заданного варианта финансового года.
DATA: l_fday LIKE bkpf-budat,
      l_lday LIKE bkpf-budat,
      l_speriod LIKE bkpf-bstat.

CALL FUNCTION 'PERIOD_DAY_DETERMINE'
  EXPORTING
    i_gjahr              = '2009'
    i_monat              = '02'
    i_periv              = 'K4'
  IMPORTING
    e_fday               = l_fday
    e_lday               = l_lday
    e_speriod            = l_speriod
  EXCEPTIONS
    error_period         = 1
    error_period_version = 2
    firstday_not_defined = 3
    period_not_defined   = 4
    year_invalid         = 5
    OTHERS               = 6.
На выходе получим:
L_FDAY - 01.02.2009 Дата начала периода
L_LDAY - 28.02.2009 Дата конца периода
L_SPERIOD - SPACE - Признак специального периода проводки, ну думаю FI-щики про специальные периоды проводки знают лучше ММ-щиков  ;)

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами
« Ответ #8 : Февраль 23, 2009, 10:50:42 am »
ROUND_DATE - Функция округления даты. В общем виде типа возвращает последний/первый день недели, месяца, года... иногда полезно, чтобы не вызвать кучу функций расчета даты.
DATA: l_datum LIKE sy-datum.

l_datum = sy-datum.
CALL FUNCTION 'ROUND_DATE'
     EXPORTING
          i_iprkz            = '2'
          i_rdmhd            = '+'
     CHANGING
          c_date             = l_datum
     EXCEPTIONS
          invalid_round_rule = 1
          OTHERS             = 2.
WRITE: / l_datum DD/MM/YYYY.
i_iprkz - Код периода. Могут быть следующие значения:
  • SPACE - День, смысла в этом коде нет, так как время не округляется а возваращаемая дата = переданной дате.
  • '1' = Неделя, возвращает дату конца/начала недели.
  • '2' = Месяца, возвращает дату конца/начала месяца.
  • '3' = Год, возвращает дату конца/начала года.
i_rdmhd - Направление округления:
  • '+' - Округление до конца периода, т.е. если задан код периода 2, то текущая дата будет округлена до конца периода и будет содержать дату последнего дня месяца.
  • '-' - Округление до начала периода, т.е. если задан код периода 2, то текущая дата будет округлена до начала периода и будет содержать дату первого дня месяца.  Наверное это не очень полезно так как  так ясно что дата = 01, а вот началом недели уже не так просто и придется считать.
  • 'F' - Округление до конца периода, при этом будет возвращаться следующий день за концом периода, т.е. если выбрано тип '1', то будет возращена дата понедельника следующей недели, тогда как при  '+' возвращается дата воскресения.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (CALCULATE_DATE)
« Ответ #9 : Март 11, 2009, 05:26:40 pm »
CALCULATE_DATE - Название говорит само за себя, т.е. позволяет получить от заданной даты новую дату в будущем путем добавления месяцев и дней. Про высокосный год таки знает, так что вроде как считает правильно, можно применять  ;)
DATA: l_result_date LIKE sy-datum.
CALL FUNCTION 'CALCULATE_DATE'
     EXPORTING
          days        = '1'
          months      = '10'
          start_date  = '20080228'
     IMPORTING
          result_date = l_result_date.

WRITE: / l_result_date.
В данном примере возвращает 29.12.2008

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (DATE_TO_DAY)
« Ответ #10 : Март 11, 2009, 05:29:45 pm »
DATE_TO_DAY - Возвращает название дня недели по заданной дате. К сожалению написано ну очень по тупому, так что дни недели возвращает только на английском. Примера не будет, так как использование на наших  просторах мало вероятно, но если кому надо будет что-то похоже сделать для себя, то за пример можно брать.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (DAY_ATTRIBUTES_GET)
« Ответ #11 : Март 11, 2009, 05:45:03 pm »
DAY_ATTRIBUTES_GET - Полезный ФМ, для писателей отчетов, так как возвращает красивенькие строчки с расшифровками запрошенных дат, т.е. например 11.02.2008 будут сформированы строки номер дня недели = 3, краткое название дня недели в виде "Ср",  полное название дня "Среда" и типа название дня недели + дата в виде строки "Среда, 11.Март. 2009", в общем таки удобно, плюс знает что это все может быть написано на разных языках.
DATA: l_date_from LIKE sy-datum,
      l_date_to LIKE sy-datum,
      l_year_of_valid_from LIKE scal-year,
      l_year_of_valid_to LIKE scal-year,
      l_returncode LIKE sy-subrc,
      lt_day_attributes LIKE casdayattr OCCURS 1 WITH HEADER LINE.

l_date_from = sy-datum.
l_date_to = sy-datum + 7.
CALL FUNCTION 'DAY_ATTRIBUTES_GET'
  EXPORTING
*   FACTORY_CALENDAR                 = ' '
*   HOLIDAY_CALENDAR                 = ' '
    date_from                        = l_date_from
    date_to                          = l_date_to
    language                         = sy-langu
  IMPORTING
    year_of_valid_from               = l_year_of_valid_from
    year_of_valid_to                 = l_year_of_valid_to
    returncode                       = l_returncode
  TABLES
    day_attributes                   = lt_day_attributes
  EXCEPTIONS
   factory_calendar_not_found       = 1
   holiday_calendar_not_found       = 2
   date_has_invalid_format          = 3
   date_inconsistency               = 4
   OTHERS                           = 5.

IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Пример возвращенной таблички на рисунке ниже, просто бери и вставляй описание даты в отчет или ALV-табличку и никаких умственных затрат не надо  ;)

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (MONTHS_BETWEEN_TWO_DATES)
« Ответ #12 : Март 11, 2009, 05:53:20 pm »
MONTHS_BETWEEN_TWO_DATES - Рассчитать количество месяцев между двумя датами. Ну так себе модуль, не ясно почему первый параметр большая дата, а второй меньшая. Хотя если учесть что количество месяцев может быть как положительным так и отрицательным, то вопрос тогда нет. Из особенностей, если i_kz_incl_bis не равно SPACE, тогда к переданной дате i_datum_bis до начала вычислений добавляется один день, что  само собой может увеличить/уменьшить количество месяцев на единицу.
DATA: l_datum_bis LIKE sy-datum,
      l_datum_von LIKE sy-datum,
      l_month TYPE i.

l_datum_bis = sy-datum + 100.
l_datum_von = sy-datum.
CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
     EXPORTING
          i_datum_bis   = l_datum_bis
          i_datum_von   = l_datum_von
          i_kz_incl_bis = ' '
     IMPORTING
          e_monate      = l_month.

WRITE: / l_month.
В данном примере l_month = 03

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (END_OF_MONTH_DETERMINE_2)
« Ответ #13 : Март 11, 2009, 06:01:58 pm »
END_OF_MONTH_DETERMINE_2 - Проверяет является переданная дата последним днем месяца + если это высокосный год, то второй параметр e_tt будет содержать признак высокосной даты в году, параметр e_kz_ult = space дата не последняя дата месяца, "X" - дата является последним днем месяца. В общем не знаю, куда его можно применить, но может кому пригодиться.
DATA: l_kz_ult(1) TYPE c,
      l_tt TYPE i.

CALL FUNCTION 'END_OF_MONTH_DETERMINE_2'
     EXPORTING
          i_datum  = '20080329'
     IMPORTING
          e_kz_ult = l_kz_ult
          e_tt     = l_tt.
« Последнее редактирование: Март 11, 2009, 06:18:48 pm от Uukrul »

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (SD_CALC_DURATION_FROM_DATETIME)
« Ответ #14 : Март 11, 2009, 06:13:52 pm »
SD_CALC_DURATION_FROM_DATETIME - Рассчет времени в часах и минутах между двумя датами. Выцеплено где-то в недрах SD. Типа таки считает сколько часов и минут прошло между датами.
DATA: l_date1 LIKE sy-datum,
      l_time1 LIKE sy-uzeit,
      l_date2 LIKE sy-datum,
      l_time2 LIKE sy-uzeit,
      l_tdiff LIKE tvro-fahztd,
      l_date2_early LIKE rv56a-selkz.

l_date1 = sy-datum.
l_time1 = sy-uzeit + 5.
l_date2 = sy-datum + 1.
l_time2 = sy-uzeit + 76.

CALL FUNCTION 'SD_CALC_DURATION_FROM_DATETIME'
     EXPORTING
          i_date1          = l_date1
          i_time1          = l_time1
          i_date2          = l_date2
          i_time2          = l_time2
     IMPORTING
          e_tdiff          = l_tdiff
          e_date2_early    = l_date2_early
     EXCEPTIONS
          invalid_datetime = 1
          OTHERS           = 2.

IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

WRITE: / l_tdiff,
       / l_date2_early.
Параметр e_date2_early  = Х, если i_date1 > i_date2, иначе равно SPACE. В общем может опять же кому пригодиться.
« Последнее редактирование: Март 11, 2009, 06:19:08 pm от Uukrul »

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (L_MC_TIME_DIFFERENCE)
« Ответ #15 : Март 11, 2009, 06:20:35 pm »
L_MC_TIME_DIFFERENCE - Аналогично предыдущему ФМ рассчитывает время между двумя датами, но в минутах. Опять же может кому надо будет, может вот в условиях кризиса будет считать тарификацию за консалт в минутах  ;)
DATA: l_date1 LIKE sy-datum,
      l_time1 LIKE sy-uzeit,
      l_date2 LIKE sy-datum,
      l_time2 LIKE sy-uzeit,
      l_delta_time LIKE mcwmit-be_ae,
      l_delta_unit LIKE mcwmit-lzeit.

l_date1 = sy-datum.
l_time1 = sy-uzeit + 5.
l_date2 = sy-datum + 1.
l_time2 = sy-uzeit + 76.

CALL FUNCTION 'L_MC_TIME_DIFFERENCE'
     EXPORTING
          date_from       = l_date1
          date_to         = l_date2
          time_from       = l_time1
          time_to         = l_time2
     IMPORTING
          delta_time      = l_delta_time
          delta_unit      = l_delta_unit
     EXCEPTIONS
          from_greater_to = 1
          OTHERS          = 2.

IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
WRITE: / l_delta_time,
       / l_delta_unit.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (GET_CURRENT_YEAR)
« Ответ #16 : Март 16, 2009, 04:13:34 pm »
GET_CURRENT_YEAR - Собственно возвращает не только текущий год но и месяц. Фактически текущий открытый период.
DATA: l_currm LIKE bkpf-monat,
      l_curry LIKE bkpf-gjahr,
      l_prevm LIKE bkpf-monat,
      l_prevy LIKE bkpf-gjahr.

CALL FUNCTION 'GET_CURRENT_YEAR'
     EXPORTING
          bukrs = '1000'
          date  = sy-datum
     IMPORTING
          currm = l_currm
          curry = l_curry
          prevm = l_prevm
          prevy = l_prevy.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (DATUMSAUFBEREITUNG)
« Ответ #17 : Октябрь 25, 2009, 09:35:57 pm »
DATUMSAUFBEREITUNG - Функция возвращает различное представление даты в формате пользователя. Рекомендуется использовать для формирования строк даты при передаче в бач-интпуты, так как там данные должны быть введены с разделителями пользователя.
DATA: l_mdat4(5) TYPE c,
      l_mdat6(7) TYPE c,
      l_tdat4(5) TYPE c,
      l_tdat6(8) TYPE c,
      l_tdat8(10) TYPE c,
      l_wdat4(5) TYPE c,
      l_wdat6(7) TYPE c.

CALL FUNCTION 'DATUMSAUFBEREITUNG'
 EXPORTING
   flagm                 = 'X'
   flagw                 = 'X'
   idate                 = sy-datum
*   IMONT                 = ' '
*   IWEEK                 = ' '
 IMPORTING
   mdat4                 = l_mdat4
   mdat6                 = l_mdat6
   tdat4                 = l_tdat4
   tdat6                 = l_tdat6
   tdat8                 = l_tdat8
   wdat4                 = l_wdat4
   wdat6                 = l_wdat6
 EXCEPTIONS
   datfm_ungueltig       = 1
   datum_ungueltig       = 2
   OTHERS                = 3.

WRITE: / l_mdat4,
       / l_mdat6,
       / l_tdat4,
       / l_tdat6,
       / l_tdat8,
       / l_wdat4,
       / l_wdat6.
Пример на рисунке ниже... вроде как использование прозрачное.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Функции работы с датами (RE_ADD_MONTH_TO_DATE)
« Ответ #18 : Декабрь 08, 2010, 08:16:21 pm »
RE_ADD_MONTH_TO_DATE - Позволяет к заданной дате добавить требуемое количество месяцев.  Вроде бы вещь простая, однако надо помнить про высокосные года и т.д. например если это 29.02.2008, то добавив 12 месяцев получим правильное значение 28.02.2009 ну и т.д.
DATA: l_stdate LIKE sy-datum,
      l_count  TYPE i,
      l_eddate LIKE sy-datum.

l_stdate = sy-datum.
l_count = '5'.
CALL FUNCTION 'RE_ADD_MONTH_TO_DATE'
  EXPORTING
    months  = l_count
    olddate = l_stdate
  IMPORTING
    newdate = l_eddate.
WRITE: / 'Начальная дата:', l_stdate,
       / '+', l_count, 'месяцев',
       / 'Конечная дата:', l_eddate.


 


Facebook Comments