Расчетная дата в ГДЕ состоянии просмотра CDS - PullRequest
2 голосов
/ 02 апреля 2020

Я пытаюсь получить список действительного состояния системы для объекта уведомления, чтобы не проверять все уведомления в таблице, я хочу выполнить выбор, проверяя только данные за последние 2 года.

Возможно, есть лучшее решение для моей проблемы, но мне все еще интересно это техническое ограничение. Насколько мне известно, состояние системы в SAP является жестко заданным и не может быть определено для объекта по какой-либо таблице (SAP может добавить новый статус системы в любой момент).

Я попытался создать представленное ниже представление CDS, но функция dats_add_months не может использоваться в условии where, есть ли решение для этого? Обратите внимание, что у 7.50 нет параметра сеанса для системной даты, поэтому я использую переменную среды:

define view ZNOTIF_SYS_STATUS 
    with parameters sydat : abap.dats @<Environment.systemField: #SYSTEM_DATE
    as select distinct from qmel as notif
    inner join jest as notif_status on notif_status.objnr = notif.objnr
                                   and notif_status.inact = ''
    inner join tj02t as sys_status on sys_status.istat = notif_status.stat
                                  and sys_status.spras = $session.system_language
{
    key sys_status.txt04 as statusID,
        sys_status.txt30 as description
} where notif.erdat > dats_add_months($parameters.sydat, -12, '') //THIS CAN'T BE USED!!

1 Ответ

2 голосов
/ 03 апреля 2020

Помещение встроенных функций в положение RHS WHERE поддерживается только начиная с 7,51 , и у вас 7,50, как вы сказали. Вот почему это работает для Haoj ie, а не для вас.

Что здесь можно сделать? Возможная опция - табличная функция CDS, которая использует AMDP-класс. Рассмотрим этот пример:

Табличная функция

@EndUserText.label: 'table_func months'
define table function ZTF_MONTHS
with parameters 
@Environment.systemField : #SYSTEM_DATE 
    p_datum : syst_datum
returns {

    mandt : abap.clnt;
    num   : qmnum;
    type  : qmart;
 }
implemented by method zcl_cds_qmel=>get_last_two_years;

AMDP

CLASS zcl_cds_qmel DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    TYPES: tt_statuses TYPE STANDARD TABLE OF qmel.
    CLASS-METHODS get_last_two_years FOR TABLE FUNCTION ztf_months.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_cds_qmel IMPLEMENTATION.
  METHOD get_last_two_years BY DATABASE FUNCTION
          FOR HDB
          LANGUAGE SQLSCRIPT
          OPTIONS READ-ONLY.

    twoyrs := add_months (CURRENT_DATE,-12)

    RETURN SELECT mandt, qmnum AS num, qmart AS type FROM qmel WHERE erdat > twoyrs;
  ENDMETHOD.
  ENDCLASS.

Это очень упрощено по сравнению с вашим оригинальное задание, но дает вам представление, как это сделать.

...