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

Abap 在OO上下文中,PACK的等价物是什么?,abap,Abap,这是给你的 我有一个文本文件中的数字,长度为13,小数点后2位 0000000627909 因此,实际上它代表以下数字6279.09 在旧世界有一句美丽的ABAP句子 PACK packed_number TO number_with_decimal_type …不幸的是,这在OO上下文中是不允许的,并用注释标记为正常赋值也会这样做。嗯,它不。。。至少在有小数点的地方没有 以下是一个例子: REPORT zzpj_unpack_test. DATA: BEGIN OF gs_struct

这是给你的

我有一个文本文件中的数字,长度为13,小数点后2位

0000000627909
因此,实际上它代表以下数字
6279.09

在旧世界有一句美丽的ABAP句子

PACK packed_number TO number_with_decimal_type
…不幸的是,这在OO上下文中是不允许的,并用注释标记为正常赋值也会这样做。嗯,它不。。。至少在有小数点的地方没有

以下是一个例子:

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
中提取出来


因此,我的问题是:在OO上下文中,real
PACK
句子的等价物是什么?

你可以通过以下方式让ABAP相信你的压缩数字有0位小数,尽管它没有:

类lcl\U应用程序定义。
公共部分。
类方法模拟包。
末级。
类lcl_应用程序实现。

方法模拟u包。“您可以通过以下方式使ABAP相信您的压缩数字有0位小数,尽管它没有:

类lcl\U应用程序定义。
公共部分。
类方法模拟包。
末级。
类lcl_应用程序实现。

方法simulate_pack。“接受的答案非常聪明,尽管我也会发布我自己的解决方案

我刚刚创建了一个简单的函数模块,它可以在上下文中使用
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.

被接受的答案是非常聪明的,尽管我也会发布我自己的解决方案

我刚刚创建了一个简单的函数模块,它可以在上下文中使用
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.

据我所知,
PACK
的唯一用途是在“旧SAP世界”中存储货币金额。相反,您可以使用
CL\u ABAP\u DECFLOAT
CONVERT\u DECFLOAT\u TO\u CURR
方法。您好,桑德拉,谢谢您的评论,但它对我不起作用。输入实际上是一个长度为13的字符链,而不是decloat34类型。我想我会把
PACK
语句放在我自己的功能模块中。那么我至少可以从一个方法调用它。如果你先将数字转换为16或34 decfloat类型,那么数字存储在C类型中这一事实就不是问题了。但我猜您的用例与货币无关,因此我发布了通用解决方案的答案。据我所知,
PACK
的唯一用例是在“旧SAP世界”中存储货币金额。相反,您可以使用
CL\u ABAP\u DECFLOAT
CONVERT\u DECFLOAT\u TO\u CURR
方法。您好,桑德拉,谢谢您的评论,但它对我不起作用。输入实际上是一个长度为13的字符链,而不是decloat34类型。我想我会把
PACK
语句放在我自己的功能模块中。那么我至少可以从一个方法调用它。如果你先将数字转换为16或34 decfloat类型,那么数字存储在C类型中这一事实就不是问题了。但我猜您的用例与货币无关,所以我发布了一个通用解决方案的答案。