27 апреля 2011 г.

ABAP: FM для вычисления даты +/- определенное кол-во дней

ФМ – DATE_IN_FUTURE, во входных параметрах дата должна быть в формате “ddmmyyyy”

Пример:

lv_datum+0 = sy-datum+6(2).
lv_datum+2 = sy-datum+4(2).
lv_datum+4 = sy-datum(4).


CALL FUNCTION 'DATE_IN_FUTURE'
  EXPORTING
    ANZAHL_TAGE             = -10
    IMPORT_DATUM            = lv_datum
  IMPORTING
*   EXPORT_DATUM_EXT_FORMAT =
    EXPORT_DATUM_INT_FORMAT = lv_fdmdt.

А то все время забываю как он называется.

5 комментариев:

  1. lv_new_date = sy-datum - 10.
    " но это с обычным форматом "yyyymmdd"

    ОтветитьУдалить
  2. Хм, ты вот меня сейчас озадачил, т.е. вот так просто от любой даты во внутреннем формате можно отнять или прибавить кол-во дней и это правильно сработает? Как то не ожидал, что все может быть так просто.

    ОтветитьУдалить
  3. у Макса была надобность выгражать в эксель дату в формате даты, а не текста.
    так повозились с разными фм-ами - нормального результата не получили.
    i = sy-datum - '19000101' + 2.
    причём один +1 - это поправка на базу отсчёта.
    а второй +1 очень интересный: Excel по умолчанию считает 1900-ый год високосным, что не правда.

    ОтветитьУдалить
  4. Есть еще хорошая и нужная функция - получение последнего дня ТЕКУЩЕГО месяца.

    просто добавить месяц и получить предыдущий день по п.2. не получится, ибо еще надо проверять тогда что месяц не 12...

    CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
    EXPORTING DAY_IN =
    IMPORTING LAST_DAY_OF_MONTH =
    .

    2. для предыдушего месяца можно получить с помощью
    date+6(2) = '01'.
    subtract 1 from date.

    ОтветитьУдалить
  5. вполне можно просто добавить месяц или несколько вот так:
    so_erdat-sign = 'I'.
    so_erdat-option = 'BT'.
    CONCATENATE sy-datum(6) '01' into so_erdat-low. " первый день месяца
    CALL FUNCTION 'RE_ADD_MONTH_TO_DATE'
    EXPORTING
    MONTHS = 1
    OLDDATE = so_erdat-low
    IMPORTING
    NEWDATE = so_erdat-high. " первый день следующего месяца
    so_erdat-high = so_erdat-high - 1. " последний день этого месяца
    APPEND so_erdat.

    но твой фм удобнее если работаем строго с текущим месяцем.

    ОтветитьУдалить