前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Some more technical details about SAP note

Some more technical details about SAP note

作者头像
Jerry Wang
发布2019-06-14 10:54:51
7510
发布2019-06-14 10:54:51
举报

Creative Commons

I use this note 2184333 which I am responsible for as an example:

clipboard1
clipboard1

In order to research the technical design of SAP note, I write a simple tool for analysis.

How to use this tool

paste the following source code to create a report and run:

代码语言:javascript
复制
REPORT znote.

PARAMETERS: note TYPE cwbntkeylg-numm OBLIGATORY DEFAULT '2184333'.
DATA: lv_insta           TYPE cwbntinsta,
      ls_note_key        TYPE cwbntkeylg,
      lv_full_length     TYPE i,
      lt_comp            TYPE abap_compdescr_tab,
      lv_data_bin        TYPE xstring,
      lv_code_delta_bin  TYPE xstring,
      lt_object_data_bin TYPE cwbci_t_objdelta,
      lv_rfcmsg          LIKE scwbrfcmsg-text,
      lv_key             TYPE hash160,
      lv_check_key       TYPE hash160,
      lv_offset          TYPE i,
      lv_max_length      TYPE i,
      lv_data            TYPE xstring,
      lv_chunk_data      TYPE xstring,
      lv_unzipped_size   TYPE i,
      lt_cwbnthead       LIKE cwbnthead OCCURS 0,
      lt_cwbntstxt       LIKE cwbntstxt OCCURS 0,
      lt_cwbntdata       TYPE bcwbn_note_text OCCURS 0,
      lt_cwbntdata_html  TYPE bcwbn_notehtml_text OCCURS 0,
      lt_cwbntvalid      LIKE cwbntvalid OCCURS 0,
      lt_cwbntci         LIKE cwbntci OCCURS 0,
      lt_cwbntfixed      LIKE cwbntfixed OCCURS 0,
      lt_cwbntgattr      LIKE cwbntgattr OCCURS 0,
      lt_cwbcihead       LIKE cwbcihead OCCURS 0,
      lt_cwbcidata       TYPE bcwbn_cinst_delta OCCURS 0,
      lt_cwbcidata_ref   TYPE cwb_deltas,
      lt_cwbcivalid      LIKE cwbcivalid OCCURS 0,
      lt_cwbciinvld      LIKE cwbciinvld OCCURS 0,
      lt_cwbcifixed      LIKE cwbcifixed OCCURS 0,
      lt_cwbcidpndc      LIKE cwbcidpndc OCCURS 0,
      lt_cwbciobj        LIKE cwbciobj OCCURS 0,
      lt_cwbcmpnt        LIKE cwbcmpnt OCCURS 0,
      lt_cwbcmtext       LIKE cwbcmtext OCCURS 0,
      lt_cwbcmlast       LIKE cwbcmlast OCCURS 0,
      lt_cwbdehead       LIKE cwbdehead OCCURS 0,
      lt_cwbdeprdc       LIKE cwbdeprdc OCCURS 0,
      lt_cwbdetrack      LIKE cwbdetrack OCCURS 0,
      lt_cwbdeequiv      LIKE cwbdeequiv OCCURS 0,
      lt_cwbcinstattr    TYPE cwbci_t_attr.

START-OF-SELECTION.
  PERFORM main.
FORM main.

  ls_note_key-langu = 'E'.
  ls_note_key-numm = note.

  CALL FUNCTION 'SLIC_GET_LICENCE_NUMBER'
    IMPORTING
      license_number = lv_insta.

  CALL FUNCTION 'BHREM_SAPNOTE_RFC_GET_CHUNKED' DESTINATION 'SAPSNOTE'
    EXPORTING
      is_note_key_lg        = ls_note_key
      iv_check_status       = 'X'
      iv_insta_cust         = lv_insta
      iv_na_fmt_id          = 3
    IMPORTING
      ev_full_length        = lv_full_length
      ev_chunk_data         = lv_chunk_data
    CHANGING
      cv_key                = lv_key
      cv_chunk_offset       = lv_offset
      cv_chunk_max_length   = lv_max_length
    EXCEPTIONS
      system_failure        = 1 MESSAGE lv_rfcmsg
      communication_failure = 2 MESSAGE lv_rfcmsg
      note_not_exist        = 3
      note_not_released     = 4
      note_langu_not_exist  = 5
      pack_error            = 6
      note_incomplete       = 7
      note_format_error     = 8
      protocol_error        = 9
      OTHERS                = 10.

  IF sy-subrc <> 0.
    WRITE: / 'note download failed: ', lv_rfcmsg.
    RETURN.
  ENDIF.

  WRITE: / 'size ( compressed ):', lv_full_length.

  lv_data = lv_chunk_data.

  CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
    EXPORTING
      alg            = 'SHA1'
      data           = lv_data
    IMPORTING
      hash           = lv_check_key
    EXCEPTIONS
      unknown_alg    = 1
      param_error    = 2
      internal_error = 3
      OTHERS         = 4.
  IF lv_check_key <> lv_key.
    WRITE:/ 'note key verification failed.'.
    RETURN.
  ENDIF.

  cl_abap_gzip=>decompress_binary( EXPORTING gzip_in   = lv_data
                                   IMPORTING raw_out   = lv_data ).

  CALL TRANSFORMATION id SOURCE XML lv_data
                         RESULT xml_data_bin         = lv_data_bin
                                xml_code_delta_bint  = lv_code_delta_bin
                                xml_object_data_bin  = lt_object_data_bin.

  CALL FUNCTION 'SCWN_NOTE_UNPACK_XML'
    EXPORTING
      iv_data_bin           = lv_data_bin
      iv_code_delta_bin     = lv_code_delta_bin
      it_object_data_bin    = lt_object_data_bin
    IMPORTING
      et_cwbnthead          = lt_cwbnthead
      et_cwbntstxt          = lt_cwbntstxt
      et_htmltext           = lt_cwbntdata_html
      et_cwbntdata          = lt_cwbntdata
      et_cwbntvalid         = lt_cwbntvalid
      et_cwbntci            = lt_cwbntci
      et_cwbntfixed         = lt_cwbntfixed
      et_cwbntgattr         = lt_cwbntgattr
      et_cwbcihead          = lt_cwbcihead
      et_cwbcidata          = lt_cwbcidata
      et_cwbcidata_ref      = lt_cwbcidata_ref
      et_cwbcivalid         = lt_cwbcivalid
      et_cwbciinvld         = lt_cwbciinvld
      et_cwbcifixed         = lt_cwbcifixed
      et_cwbcidpndc         = lt_cwbcidpndc
      et_cwbciobj           = lt_cwbciobj
      et_cwbcmpnt           = lt_cwbcmpnt
      et_cwbcmtext          = lt_cwbcmtext
      et_cwbcmlast          = lt_cwbcmlast
      et_cwbdehead          = lt_cwbdehead
      et_cwbdeprdc          = lt_cwbdeprdc
      et_cwbdetrack         = lt_cwbdetrack
      et_cwbdeequiv         = lt_cwbdeequiv
      et_cwbcinstattr       = lt_cwbcinstattr
    EXCEPTIONS
      corrupt_data_file     = 1
      incompatible_versions = 2
      OTHERS                = 3.

  PERFORM cal_obj_data_bin_size USING lt_object_data_bin CHANGING lv_unzipped_size.
  WRITE: / 'uncompressed size: (byte): ' , lv_unzipped_size.
  BREAK-POINT.

ENDFORM.

FORM cal_obj_data_bin_size USING it_obj_data TYPE cwbci_t_objdelta CHANGING iv_total_size TYPE i.
  DATA(lo_tab_type) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_name( 'CWBCI_T_OBJDELTA' ) ).

  DATA(lo_line_type) = CAST cl_abap_structdescr( lo_tab_type->get_table_line_type( ) ).
  lt_comp = lo_line_type->components.
  LOOP AT it_obj_data ASSIGNING FIELD-SYMBOL(<obj_data_bin>).
    PERFORM calculate_line_size USING <obj_data_bin> CHANGING iv_total_size.
  ENDLOOP.
ENDFORM.

FORM calculate_line_size USING is_line_data TYPE cwbciobjdelta CHANGING iv_total_size TYPE i.
  DO.
    ASSIGN COMPONENT sy-index OF STRUCTURE is_line_data TO FIELD-SYMBOL(<data>).
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.

    READ TABLE lt_comp ASSIGNING FIELD-SYMBOL(<line_type>) INDEX sy-index.
    CASE <line_type>-type_kind.

      WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_num.
        iv_total_size = iv_total_size + strlen( <data> ) * 2.
      WHEN cl_abap_typedescr=>typekind_xstring.
        iv_total_size = iv_total_size + xstrlen( <data> ).
      WHEN OTHERS.
        ASSERT 1 = 0.
    ENDCASE.

  ENDDO.
ENDFORM. 

Once executed, the report will download the note as a compressed binary stream, display the size of this compressed stream and then uncompress it, allow you to view the building block of the note in detail. In the end the size of uncompressed data is displayed as well. Take note 2184333 for example, around 137 KB is downloaded and after it is decompressed, the size inflates to around 742 KB.

clipboard2
clipboard2

Please note that this tool just gives you a draft estimation about the static size of note. The runtime overhead for memory management against deep data object such as internal table and string are not considered.

clipboard3
clipboard3

Note building blocks

The decompressed content of note is actually a xml file and could be parsed by function module SCWN_NOTE_UNPACK_XML

clipboard4
clipboard4

et_cwbnthead

Note header data. See below picture to find how the note header information is maintained in exporting parameter et_cwbnthead of FM SCWN_NOTE_UNPACK_XML.

clipboard5
clipboard5

et_cwbntstxt

Note tilte in multi language.

clipboard6
clipboard6

et_htmltext

Contains note body in html format in multi language. Content for each language is stored in a single line.

clipboard7
clipboard7

et_cwbntdata

Contains note body in multiple language. Content of each language is stored in a seperate internal table.

clipboard8
clipboard8

et_cwbntvalid

Contains note validity information. In this information, component key: 16929, we can find its description from table CWBCMPNT. And 63 for BBPCRM.

clipboard9
clipboard9

And how to understand DEALEID_V 244 for BBPCRM? From this table we can know “244” represents 713.

clipboard10
clipboard10

detailed code delta change contained in variable LV_CODE_DELTA_BIN

The area below marked with blue rectangle is the code delta change our customer could see in the note browser, and the red area is part of variable lv_code_delta_bin inspected via XML Browser. The delta code change consists of two parts: deletion of keyword “IMPORTING”; insertion of two lines “it_customer_h = it_customer_h” and “IMPORTING”. From the picture we can see clearly that the code fragment for insertion or deletion has corresponding XML tag ( I prefer to call it as “directive” ) maintained so that the node tool can know WHAT operation should be performed on these fragment. Meanwhile the context ( line number 38 ) is also known so that node tool can also know WHERE the delta change should be applied.

clipboard11
clipboard11
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • How to use this tool
  • Note building blocks
  • et_cwbnthead
  • et_cwbntstxt
  • et_htmltext
  • et_cwbntdata
  • et_cwbntvalid
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档