OO 上下文中的 PACK 等价物是什么?

What is the equivalent of PACK in OO context?

这是给你的。

我在文本文件中提供了一个长度为 13、小数点后两位的压缩数字。

0000000627909

所以实际上它代表下面的数字6279.09

现在在旧世界有这个美丽的 ABAP 句子...

PACK packed_number TO number_with_decimal_type

...不幸的是,这在 OO 上下文中是不允许的,并标记为 obsolete,并附有注释,说明正常赋值也是如此。好吧,它不会......至少在需要关注小数位的地方不会。

这是一个例子:

REPORT zzpj_unpack_test.
DATA:
  BEGIN OF gs_structured,
    loan_entitlement TYPE c LENGTH 13,
  END OF gs_structured.
DATA: gv_packed TYPE p LENGTH 13 DECIMALS 2.

INITIALIZATION.
  gs_structured = VALUE #(
      loan_entitlement = '0000000627909'
    ).
  DATA(gs_dc) = CORRESPONDING /ibs/sbsc_change_main( gs_structured ).
  PACK gs_structured-loan_entitlement TO gv_packed. "works beautifilly!
  gv_packed = gs_structured-loan_entitlement. "does not care about decimal places

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      main.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD main.
    DATA ls_structured LIKE gs_structured.
    DATA lv_packed TYPE p LENGTH 13 DECIMALS 2.

    ls_structured = VALUE #(
      loan_entitlement = '0000000627909'
    ).
    "PACK gs_structured-loan_entitlement TO gv_packed. "does not work in OO context
    lv_packed = ls_structured-loan_entitlement. "does not care about decimal places
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  lcl_main=>main( ).

一个简单的赋值使得 627909.00 变成了 6279.09

所以我的问题是:real 等同于 OO 上下文中的 PACK 句子是什么?

您可以通过 ASSIGN gv_packed TO <p> DECIMALS 0.:

让 ABAP 相信您的打包号码有 0 个小数位,尽管它没有
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS simulate_pack.
ENDCLASS.

CLASS lcl_app IMPLEMENTATION.
  METHOD simulate_pack.                             "<===  simulate PACK
    DATA: gv_packed TYPE p LENGTH 13 DECIMALS 2.
    FIELD-SYMBOLS <dec> TYPE p.
    ASSIGN gv_packed TO <dec> CASTING DECIMALS 0.   "<===  <dec> points to GV_PACKED memory
    <dec> = '0000000627909'.                        "<===  assigns the value to GV_PACKED !

    " Check Actual values = Expected values
    ASSERT <dec> = 627909.
    ASSERT gv_packed = '6279.09'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  lcl_app=>simulate_pack( ).

  DATA: gv_packed TYPE p LENGTH 13 DECIMALS 2.
  PACK '0000000627909' TO gv_packed.                "<===  use PACK
  " Check Actual value = Expected value
  ASSERT gv_packed = '6279.09'.

接受的答案非常聪明,尽管我也会 post 我自己的解决方案。

我刚刚创建了一个简单的功能模块来完成工作,因为 PACK 句子在其上下文中是允许的。然后我在我的 类 方法中使用了这样一个功能模块,这是(仍然 :) )可能的。

FUNCTION Z_PACK_NUMBER.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(IV_PACKED_NUMBER) TYPE  C
*"  EXPORTING
*"     REFERENCE(EV_VALUE) TYPE  P
*"----------------------------------------------------------------------

  PACK iv_packed_number TO ev_value.

ENDFUNCTION.