首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在面向对象上下文中,什么是包?

在面向对象上下文中,什么是包?
EN

Stack Overflow用户
提问于 2021-02-17 19:46:53
回答 2查看 348关注 0票数 1

这是给你的。

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

代码语言:javascript
复制
0000000627909

因此,在现实中,它表示以下数字6279.09

在旧世界里有一个美丽的ABAP句子..。

代码语言:javascript
复制
PACK packed_number TO number_with_decimal_type

...unfortunately --在OO上下文中是不允许的,并将其标记为已过时,并附带了一个普通赋值也会这样做的注释。嗯,它不..。至少在有小数位需要关注的地方,情况并非如此。

下面是一个示例:

代码语言:javascript
复制
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

因此,我的问题是:在面向对象上下文中,真正的PACK语句的等价性是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-18 05:15:24

你可以让ABAP相信你的包装数字有0小数点,虽然它没有,通过ASSIGN gv_packed TO

DECIMALS 0.

代码语言:javascript
复制
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'.
票数 4
EN

Stack Overflow用户

发布于 2021-02-18 09:26:25

接受的答案是非常聪明的,虽然我也会张贴我自己的解决方案。

我刚刚创建了一个简单的函数模块,在其上下文中允许PACK语句进行工作。然后在类的方法中使用这样的函数模块,这是(仍然:)可能的。

代码语言:javascript
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66248967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档