Синтаксическая ошибка с универсальным типом P при расчете в SELECT - PullRequest
2 голосов
/ 09 июня 2019

У меня есть метод в классе, который имеет тип параметра P, но я получаю следующую синтаксическую ошибку при попытке активации:

Никакие переменные общего типа (например, I_DISCOUNT) не могут бытьиспользуется в выражениях.

Код:

  METHODS ceil_floor_abs IMPORTING i_discount TYPE p .

  METHOD ceil_floor_abs.
    SELECT carrid, connid, paymentsum, paymentsum * @i_discount AS disc_payment,
           ceil( paymentsum * @i_discount ) AS ceil_payment,
           floor(  paymentsum * @i_discount ) AS floor_payment,
           abs( paymentsum ) AS abs_payment
        INTO TABLE @DATA(it_sflight4) UP TO 10 ROWS
      FROM sflight.
  ENDMETHOD.

Что не так?

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Определить локальную промежуточную переменную

Определите lv_discount с помощью TYPE p LENGTH 16 DECIMALS 2 (или что вам нужно), заполните его содержимым i_discount и используйте его в SELECT:

  METHODS ceil_floor_abs IMPORTING i_discount TYPE p .

  DATA: lv_discount TYPE p LENGTH 16 DECIMALS 2.

  lv_discount = i_discount.

  METHOD ceil_floor_abs.
    SELECT carrid, connid, paymentsum, paymentsum * @lv_discount AS disc_payment,
           ceil( paymentsum * @lv_discount ) AS ceil_payment,
           floor(  paymentsum * @lv_discount ) AS floor_payment,
           abs( paymentsum ) AS abs_payment
        INTO TABLE @DATA(it_sflight4) UP TO 10 ROWS
      FROM sflight.
  ENDMETHOD.
1 голос
/ 10 июня 2019

В выражении SQL недопустимы универсальные типы. Это нужно сделать Internal Table.

SELECT carrid, connid, paymentsum, paymentsum AS disc_payment,
     paymentsum AS ceil_payment,
     paymentsum  AS floor_payment,
     abs( paymentsum )  AS abs_payment
  INTO TABLE @DATA(lt_sflight4) UP TO 10 ROWS
FROM sflight.

DATA:
      lt_sflight_ceil_floor_abs LIKE lt_sflight4.

lt_sflight_ceil_floor_abs =  VALUE #( FOR sflight IN lt_sflight4 (
                                                       carrid        =  sflight-carrid
                                                       connid        =  sflight-connid
                                                       paymentsum    =  sflight-paymentsum
                                                       disc_payment  =  sflight-paymentsum * i_discount
                                                       ceil_payment  =  ceil( sflight-paymentsum * i_discount )
                                                       floor_payment =  floor(  sflight-paymentsum * i_discount )
                                                       abs_payment   =  sflight-abs_payment ) ).
...