使用 SAP ABAP 代码下载一个 note 到本地 ABAP 系统

简介: 使用 SAP ABAP 代码下载一个 note 到本地 ABAP 系统

源代码:

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.
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.

什么是 SAP note?

在详细讲解 SAP ABAP 系统的 note 之前,我们需要明确一点:在 SAP 生态系统中,note 是一种特殊且重要的文档资源,为 SAP 用户和开发者提供了一个关键的信息来源,尤其是在处理系统错误、进行性能优化、更新系统补丁或者是遵循最佳实践方面。SAP Note 通常由 SAP 的服务支持团队发布,旨在解决特定问题或提供详细的技术指导。

SAP Notes 可以是关于错误修正的说明、新功能的引入、法律更改的适应、系统优化的建议或是安全性相关的更新。每一条 Note 都被赋予了一个唯一的编号,用户可以通过 SAP Note 管理器或是 SAP 支持门户网站进行访问。

为了更好地理解 SAP Note 的作用和重要性,我们可以分析几个实际的应用场景:

例子 1:系统错误修正

假设一个企业在使用 SAP ERP 系统的过程中遇到了一个程序错误,这个错误导致了财务报表无法正确生成。在这种情况下,SAP 的开发支持团队可能会发布一个 Note,其中包含了针对这个特定错误的详细诊断信息、产生原因以及如何通过修正 ABAP 代码或调整配置来解决这个问题的指导。Note 中可能会提供一段修正代码(即所谓的修正指令或 patch),ABAP 开发者可以直接将这段代码应用于他们的系统中,以修复该错误。

例子 2:性能优化

在另一个场景中,可能有用户反映,某个特定的 SAP 应用运行效率低下。针对这类问题,SAP 可能会发布一个专门的 Note,详细描述了如何通过调整 ABAP 程序或数据库查询等方式来提升系统性能。这个 Note 中可能包含了一系列的性能检测结果和优化后的效果对比,以及具体的代码更改建议,帮助开发者理解和实施这些优化措施。

例子 3:法律法规更新

由于法律和行业标准的不断变化,SAP 系统需要定期更新以确保合规。例如,如果一个国家的税法发生了变化,这可能影响到 SAP 系统中财务和会计模块的处理逻辑。SAP 会发布相应的 Note 来描述这一变更对 SAP 系统的影响,提供必要的系统调整指导或代码更改,确保企业能够及时准确地遵守新的法律规定。

通过这些例子,我们可以看到 SAP Note 在维护和优化 SAP 系统中扮演了一个不可或缺的角色。对于 ABAP 开发者来说,熟悉如何查找、解读和应用这些 Note 是一个基本且重要的技能。正确利用 SAP Note 不仅可以帮助解决现有的问题,还能预防未来可能出现的问题,确保系统的稳定性和安全性。

需要注意的是,应用 Note 前应仔细阅读其中的所有说明,确保理解了所有的前提条件和可能的影响。在某些情况下,可能需要与 SAP 的支持团队合作,以确保复杂问题的正确解决。同时,定期访问 SAP 支持门户,关注相关领域的最新 Note,对于保持系统的最新状态和最佳性能同样重要。

综上所述,SAP ABAP 系统的 Note 是一个强大的工具,帮助开发者和用户确保他们的系统能够高效、安全地运行。了解如何有效地使用这些 Note,对于每一个 SAP 专业人员来说都是一项必备的技能。

相关文章
|
2月前
|
存储 安全 数据库
什么是 SAP ABAP 数据库表的 Display Maintenance Allowed with Restrictions
什么是 SAP ABAP 数据库表的 Display Maintenance Allowed with Restrictions
|
2月前
|
安全 API 数据库
SAP ABAP OData 中 Function import 的概念介绍
SAP ABAP OData 中 Function import 的概念介绍
|
2月前
|
前端开发 数据库 开发者
如何在 SEGW 事务码里为 SAP ABAP OData 服务实现 Function Import 试读版
如何在 SEGW 事务码里为 SAP ABAP OData 服务实现 Function Import 试读版
SAP ABAP OData 服务里需要指定 guid 类型的请求参数时,正确语法是什么?
SAP ABAP OData 服务里需要指定 guid 类型的请求参数时,正确语法是什么?
|
2月前
|
SQL 监控 Oracle
SAP ABAP 系统错误 Return value of the database layer SQL dbsl rc 99
SAP ABAP 系统错误 Return value of the database layer SQL dbsl rc 99
|
2月前
|
前端开发 开发工具 Android开发
小技巧分享 - 使用 Visual Studio Code 查看和修改 ABAP 代码试读版
小技巧分享 - 使用 Visual Studio Code 查看和修改 ABAP 代码试读版
小技巧分享 - 使用 Visual Studio Code 查看和修改 ABAP 代码试读版
|
2月前
|
BI
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示
工具分享 - 将一个 ABAP Function Group 内所有 Function Module 按照代码行数从高到低排序并显示
|
2月前
|
开发者 供应链 BI
SAP ABAP CALL SUBSCREEN 代码解析
SAP ABAP CALL SUBSCREEN 代码解析
|
2月前
|
存储 数据处理 开发者
ABAP 如何把 unicode 代码点转换成字符
ABAP 如何把 unicode 代码点转换成字符
|
2月前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id