前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1228|如何用ALV输出完成SAP报表

1228|如何用ALV输出完成SAP报表

作者头像
不会写代码的杰尼
发布2022-05-19 12:41:05
1K0
发布2022-05-19 12:41:05
举报
文章被收录于专栏:CSDN专栏CSDN专栏

ABAP开发—ALV学习笔记

一、开发思想

ABAP开发:事件驱动开发

SAP请求号意义

程序的封装思想

二、开发ALV的基本流程

第一步:定义ALV所要用到的类型池:TYPE-POOLS:SLIS;

第二步:定义ALV所要显示的数据对应的内表数据类型及内表数据对象;

第三步:定义一些显示ALV时所要使用到的变量;

第四步:定义选择屏幕;

第五步:声明各个选择屏幕事件块;

三、ABAP-ALV-00方法中的ALV的如何自己添加按钮及其响应

步骤一:创建一个事件的处理类

步骤二:类的实现

步骤三:在FROM---set_toolbar中添加button(按钮)

步骤四:创建事件处理对象

四、我的开发实例1:使用ALV输出一个会计凭证清单

五、我的开发实例2:ALV+SMARTFROM,输出物料凭证清单

20201228学习《ABAP_ALV_知识整理》,以下为读书笔记和我的ALV开发实例。

一、开发思想

ABAP开发属于事件驱动开发

这句话清晰的解释了SAP程序的必然结构。对于事件驱动,SAP程序就需要是由一个个事件去触发才能够执行的程序,当我们使用SE38去创建1类型的可执行程序,我们可以直接调试,这个程序是按照上面所写的事件块的顺序去依次执行的。他的事件块的顺序是指定好的,所以可以直接按F8,直接运行。

SAP请求号意义

CR:请求号,可以理解为一个程序的代码版本,所有的SAP程序都是在D(开发)系统,然后传到Q系统(测试)由顾问测试,又不干扰生产系统的程序运营,最后再传到P(生产)系统,覆盖原来的代码,变成修改后的代码逻辑。

我目前正在开发的项目就是100client开发、300client测试,项目后期加了一个600client,集成测试。

程序的封装思想

INCLUDE是一种封装起来的思想,单独产生CR,而和它的主程序没有任何关联。include是一个全局全系统的声明;

perfrom 封装思想、代码块,需要取有意义的名字,方便代码阅读。

在START-OF-SELECTION中,一般有以下几个PERFROM:

frm_get_data                    取数逻辑

frm_alv_layout_build        创建ALV显示格式

frm_alv_set_columns        调用ALV函数

二、开发ALV的基本流程

第一步:定义ALV所要用到的类型池:TYPE-POOLS:SLIS;

第二步:定义ALV所要显示的数据对应的内表数据类型及内表数据对象;

第三步:定义一些显示ALV时所要使用到的变量;

第四步:定义选择屏幕;

第五步:声明各个选择屏幕事件块;

例如:

    1.调用一个子程序frm_get_data,用于获取alv所要显示的数据;

    2.调用一个子程序frm_alv_layout_build,用于设置alv所要显示的样式;

    3.调用显示alv的函数,例如REUSE_ALV_GRID_DISPLAY;

ALV中所用到的函数

显示ALV函数:REUSE_ALV_GRID_DISPLAY

其中参数frm_user_command_alv,该子程序指定相关函数功能码的响应逻辑。

三、ABAP-ALV-00方法中的ALV的如何自己添加按钮及其响应

SAP    在做报表开发中,不同公司对报表的风格往往各异,为此经常使用00方法做ALV,报表中需要去掉自带的工具栏而自行添加一些工具按钮,下面将简单介绍一下添加按钮及如何响应的实现方法:

步骤一:创建一个事件的处理类

这个事件处理类中添加了两个方法:

1.往工具栏添加按钮

2.响应工具栏上按钮的动作

步骤二:类的实现

步骤三:在FROM---set_toolbar中添加button(按钮)

步骤四:创建事件处理对象

这一步一般在grf_grid→set_table_for_fist_display之后

四、我的开发实例1:使用ALV输出一个会计凭证清单

代码语言:javascript
复制
*&---------------------------------------------------------------------*
*& Report ZR_DAY5_40
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZR_DAY5_40.


*声明表名  会计核算凭证标题  会计核算凭证段  采购凭证抬头  采购凭证项目  供应商主数据 (一般地区)
TABLES:BKPF,BSEG,EKKO,EKPO,LFA1.

*表格样式设置
INCLUDE ZINCLUDE.

*引用ALV类型池
TYPE-POOLS:SLIS.

*定义变量类型
TYPES: BEGIN OF GS_OUT,
  BUKRS TYPE BSEG-BUKRS, "公司代码
  GJAHR TYPE BSEG-GJAHR, "财年
  MONAT TYPE BKPF-MONAT, "期间
  BELNR TYPE BSEG-BELNR, "凭证编号
  BKTXT TYPE BKPF-BKTXT, "抬头文本
  BLDAT TYPE BKPF-BLDAT, "凭证日期
  BUDAT TYPE BKPF-BUDAT, "过账日期
  BLART TYPE BKPF-BLART, "凭证类型
  HKONT TYPE BSEG-HKONT, "会计科目
  SHKZG TYPE BSEG-SHKZG, "借贷方(S=借方,H=贷方)
  DMBTR TYPE BSEG-DMBTR, "金额
  LIFNR TYPE BSEG-LIFNR, "供应商编码
  KUNNR TYPE BSEG-KUNNR, "客户编码
  ANLN1 TYPE BSEG-ANLN1, "固定资产
  KOSTL TYPE BSEG-KOSTL, "成本中心
  PRCTR TYPE BSEG-PRCTR , "利润中心
  FIPOS TYPE BSEG-FIPOS , "承诺项目
  PROJK TYPE BSEG-PROJK, "WBS元素
  AUGBL TYPE BSEG-AUGBL, "冲销凭证
END OF GS_OUT.


*定义内表和工作区
DATA :GT_OUT TYPE TABLE OF GS_OUT.
DATA: GS_OUT TYPE  GS_OUT.


*   定义选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
  B_BUKRS FOR BKPF-BUKRS OBLIGATORY NO-EXTENSION NO INTERVALS, "NO-EXTENSION是不出现后面的多选按钮
  B_GJAHR FOR BKPF-GJAHR OBLIGATORY NO-EXTENSION NO INTERVALS, "NO INTERVALS是将多选框变为单选框
  B_MONAT FOR BKPF-MONAT OBLIGATORY,
  B_BELNR FOR BSEG-BELNR,
  B_BLART FOR BKPF-BLART,
  B_BLDAT FOR BKPF-BLDAT,
  B_BUDAT FOR BKPF-BUDAT,
  B_HKONT FOR BSEG-HKONT,
  B_DMBTR FOR BSEG-DMBTR,
  B_USNAM FOR BKPF-USNAM.
SELECTION-SCREEN END OF BLOCK BL1.


*开始选择数据
START-OF-SELECTION.




*调用
PERFORM FRM_PROCESS.


PERFORM FRM_OUTPUT.



*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS .
* 选择数据
  SELECT
  BSEG~BUKRS "公司代码
  BSEG~GJAHR "财年
  BKPF~MONAT "期间
  BSEG~BELNR "凭证编号
  BKPF~BKTXT "抬头文本
  BKPF~BLDAT "凭证日期
  BKPF~BUDAT "过账日期
  BKPF~BLART "凭证类型
  BSEG~HKONT "会计科目
  BSEG~SHKZG "借贷方(S=借方,H=贷方)
  BSEG~DMBTR "金额
  BSEG~LIFNR "供应商编码
  BSEG~KUNNR "客户编码
  BSEG~ANLN1 "固定资产
  BSEG~KOSTL "成本中心
  BSEG~PRCTR  "利润中心
  BSEG~FIPOS "承诺项目
  BSEG~PROJK "WBS元素
  BSEG~AUGBL "冲销凭证
  INTO TABLE GT_OUT
  FROM BSEG
  INNER JOIN BKPF ON BSEG~BUKRS = BKPF~BUKRS "公司代码
  AND BSEG~GJAHR = BKPF~GJAHR "财年
  AND BSEG~BELNR = BKPF~BELNR "凭证编号
  WHERE  BKPF~BUKRS IN B_BUKRS
  AND   BKPF~GJAHR IN B_GJAHR
  AND   BKPF~MONAT IN B_MONAT
  AND   BSEG~BELNR IN B_BELNR
  AND   BKPF~BLART IN B_BLART
  AND   BKPF~BLDAT IN B_BLDAT
  AND   BKPF~BUDAT IN B_BUDAT
  AND   BSEG~HKONT IN B_HKONT
  AND   BSEG~DMBTR IN B_DMBTR
  AND   BKPF~USNAM IN B_USNAM .
ENDFORM.



*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM  FRM_OUTPUT.
PERFORM layout_init_lvc USING gs_layout_lvc.
add_field_lvc 'SEL' '选择框' '' 'X' '' '1' '' '' 'X'.
add_field_lvc 'BUKRS' '公司代码' '' '' '' '' '' '' ''.
add_field_lvc 'GJAHR' '财年' '' '' '' '' '' '' ''.
add_field_lvc 'MONAT' '期间' '' '' '' '' '' '' ''.
add_field_lvc 'BELNR' '凭证编号' '' '' '' '' '' '' ''.
add_field_lvc 'BKTXT' '抬头文本' '' '' '' '' '' '' ''.
add_field_lvc 'BLDAT' '凭证日期' '' '' '' '' '' '' ''.
add_field_lvc 'BUDAT' '过账日期' '' '' '' '' '' '' ''.
add_field_lvc 'BLART' '凭证类型' '' '' '' '' '' '' ''.
add_field_lvc 'HKONT' '会计科目' '' '' '' '' '' '' ''.
add_field_lvc 'SHKZG' '借贷方(S=借方,H=贷方)' '' '' '' '' '' '' ''.
add_field_lvc 'DMBTR' '金额' '' '' '' '' '' '' ''.
add_field_lvc 'LIFNR' '供应商编码' '' '' '' '' '' '' ''.
add_field_lvc 'KUNNR' '客户编码' '' '' '' '' '' '' ''.
add_field_lvc 'ANLN1' '固定资产' '' '' '' '' '' '' ''.
add_field_lvc 'KOSTL' '成本中心' '' '' '' '' '' '' ''.
add_field_lvc 'PRCTR' '利润中心' '' '' '' '' '' '' ''.
add_field_lvc 'FIPOS' '承诺项目' '' '' '' '' '' '' ''.
add_field_lvc 'PROJK' 'WBS元素' '' '' '' '' '' '' ''.
add_field_lvc 'AUGBL' '冲销凭证' '' '' '' '' '' '' ''.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program       = sy-repid
    is_layout_lvc            = gs_layout_lvc
    it_fieldcat_lvc          = gt_fieldcat_lvc
    i_save                   = 'A'
    it_events                = gt_events[]
  TABLES
    t_outtab                 = gt_out
  EXCEPTIONS
    program_error            = 1
    OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

五、我的开发实例2:ALV+SMARTFROM,输出物料凭证清单

代码语言:javascript
复制
*&---------------------------------------------------------------------*
*& Report ZR_DAY6_40
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZR_DAY6_40.
TABLES: MKPF,MSEG,MAKT,LFA1.

INCLUDE:ZINCLUDE.

* ALV使用到的类库
TYPE-POOLS:SLIS.
* SLIS_T_FIELDCAT_ALV

*   输出内表和工作区
TYPES: BEGIN OF GT_OUTPUT,
  CHECKBOX    TYPE C,
  MBLNR       TYPE MKPF-MBLNR, "物料凭证号"
  MJAHR       TYPE MKPF-MJAHR, "会计年度"
  ZEILE       TYPE MSEG-ZEILE, ""
  BUDAT       TYPE MKPF-BUDAT, ""
  MATNR       TYPE MSEG-MATNR, "物料号"
  MAKTX       TYPE MAKT-MAKTX, "物料描述"
  BWART       TYPE MSEG-BWART, ""
  LIFNR       TYPE MSEG-LIFNR, ""
  NAME1       TYPE LFA1-NAME1, "供应商描述"
  DMBTR       TYPE MSEG-DMBTR, "总量"
  MENGE       TYPE MSEG-MENGE, "数量"
  REMARKS(40) TYPE C,
END OF GT_OUTPUT.


*内表
DATA:GT_OUTPUT TYPE TABLE OF GT_OUTPUT.

*  定义工作区
DATA:GS_OUTPUT TYPE GT_OUTPUT.

* 为打印按钮定义的内表和工作区
DATA:GT_OUTPUT_FM TYPE  ZTT32_DAY6_SM.
DATA: GS_OUTPUT_FM TYPE ZS32_DAY6_SM.


* 定义屏幕选择器
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
  MT_DOC   FOR MKPF-MBLNR  ,"多选非必填字段"
  MT_DOC_Y FOR MKPF-MJAHR OBLIGATORY NO-EXTENSION NO INTERVALS, "no-extension 限制为单选   OBLIGATORY为必填字段" “单选必填字段”
  POT_DATE FOR   MKPF-BUDAT,
  MT_NUM   FOR  MSEG-MATNR,
  MM_TYPE  FOR MSEG-BWART.
SELECTION-SCREEN END OF BLOCK BL1.


*开始选择
START-OF-SELECTION.


*调用
PERFORM FRM_PORCESS.
PERFORM FRM_OUTPUT.


*&---------------------------------------------------------------------*
*&      Form  FRM_PORCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM FRM_PORCESS .
* 选择数据
* 查询数据
  SELECT  MKPF~MBLNR
  MKPF~MJAHR
  MSEG~ZEILE
  MKPF~BUDAT
  MSEG~MATNR
  MAKT~MAKTX
  MSEG~BWART
  MSEG~LIFNR
  LFA1~NAME1
  MSEG~DMBTR
  MSEG~MENGE
*CORRESPONDING  匹配相同字段
  INTO CORRESPONDING FIELDS OF TABLE GT_OUTPUT
  FROM MKPF
  INNER JOIN MSEG ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
  INNER JOIN MAKT ON MSEG~MATNR = MAKT~MATNR
  INNER JOIN LFA1 ON MSEG~LIFNR = LFA1~LIFNR
  WHERE MKPF~MBLNR IN MT_DOC
  AND   MKPF~MJAHR IN MT_DOC_Y
  AND   MKPF~BUDAT IN POT_DATE
  AND   MSEG~MATNR IN MT_NUM
  AND   MSEG~BWART IN MM_TYPE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OUTPUT .
* 创建fieldcat
  PERFORM layout_init_lvc USING gs_layout_lvc.
  add_field_lvc 'CHECKBOX' '选择框' '' 'X' '' '1' '' '' 'X'.
  add_field_lvc 'MBLNR' 'Material Document' '' '' '' '' '' '' ''.
  add_field_lvc 'MJAHR' 'Material Document Year' '' '' '' '' '' '' ''.
  add_field_lvc 'ZEILE' 'Item no' '' '' '' '' '' '' ''.
  add_field_lvc 'BUDAT' 'Posting Date' '' '' '' '' '' '' ''.
  add_field_lvc 'MATNR' 'Material Number' '' '' '' '' '' '' ''.
  add_field_lvc 'MAKTX' 'Material Description' '' '' '' '' '' '' ''.
  add_field_lvc 'BWART' 'Vendor' '' '' '' '' '' '' ''.
  add_field_lvc 'LIFNR' 'Movement Type' '' '' '' '' '' '' ''.
  add_field_lvc 'NAME1' 'Vendor Description' '' '' '' '' '' '' ''.
  add_field_lvc 'DMBTR' 'Amount' '' '' '' '' '' '' ''.
  add_field_lvc 'MENGE' 'Quantity' '' 'X' '' '' '' '' ''.
  add_field_lvc 'REMARKS' 'Remarks' '' 'X' '' '' '' '' ''.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program       = sy-repid
    is_layout_lvc            = gs_layout_lvc
    it_fieldcat_lvc          = gt_fieldcat_lvc
    i_callback_pf_status_set = 'STATUS_SET'     "大写!
    i_callback_user_command  = 'USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE   = 'FRM_TOP_OF_PAGE'
    i_save                   = 'A'
    it_events                = gt_events[]
  TABLES
    t_outtab                 = GT_OUTPUT
  EXCEPTIONS
    program_error            = 1
    OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


ENDFORM.


"设置ALV的GUI_STATUS
FORM  status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZGUI1_ZR_DAY6_40'.
ENDFORM.




*为按钮添加新功能
FORM user_command USING rf_ucomm    LIKE sy-ucomm  "sy-ucomm系统字段
      rs_selfield TYPE slis_selfield.


DATA: lr_grid TYPE REF TO cl_gui_alv_grid.


CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
  e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
rs_selfield-REFRESH = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.


CASE RF_UCOMM.
WHEN 'ALL'.
  PERFORM FRM_OKCODE_ALL.
WHEN 'CLEAR'.
  PERFORM FRM_OKCODE_CLEAR.
*     WHEN '&IC1'.
*       PERFORM FRM_OKCODE_IC1.
WHEN 'PRINT'. "打印
PERFORM FRM_OKCODE_PRINT.
ENDCASE.
*RE_SELFIELD-REFRESH = 'X'.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  FRM_OKCODE_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OKCODE_ALL .
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    GS_OUTPUT-CHECKBOX = 'X'.
    MODIFY GT_OUTPUT FROM GS_OUTPUT.
  ENDLOOP.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  FRM_OKCODE_CLEAR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OKCODE_CLEAR .
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    GS_OUTPUT-CHECKBOX = ''.
    MODIFY GT_OUTPUT FROM GS_OUTPUT.
  ENDLOOP.
ENDFORM.


FORM FRM_OKCODE_PRINT .
  CLEAR:GT_OUTPUT,GS_OUTPUT.
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    IF GS_OUTPUT-CHECKBOX = 'X'.
      MOVE-CORRESPONDING GS_OUTPUT TO GS_OUTPUT_FM.
      APPEND GS_OUTPUT_FM TO GT_OUTPUT_FM.
    ENDIF.
  ENDLOOP.




*打印功能
  DATA: G_FM TYPE RS38L_FNAM.
  DATA: CONTROL_PARAMETERS TYPE SSFCTRLOP.
  DATA: GV_DT(14) TYPE C.


  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
  EXPORTING
    FORMNAME           = 'ZR_DAY6_40' "填写创建的smartform的名字
*     VARIANT            = ' '
*     DIRECT_CALL        = ' '
  IMPORTING
    FM_NAME            = G_FM  "功能模块的名字
  EXCEPTIONS
    NO_FORM            = 1
    NO_FUNCTION_MODULE = 2
    OTHERS             = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


*  CONTROL_PARAMETERS-NO_DIALOG = 'X'.
*  CONTROL_PARAMETERS-PREVIEW = 'X'.
*  control_parameters-device  = 'LP01'.


  CALL FUNCTION G_FM
  EXPORTING
    CONTROL_PARAMETERS = CONTROL_PARAMETERS
    GV_DT = GV_DT
  TABLES
    GT_OUTPUT          = GT_OUTPUT   "  smartform里面表格接口里面的表的那个名字
  EXCEPTIONS
    FORMATTING_ERROR   = 1
    INTERNAL_ERROR     = 2
    SEND_ERROR         = 3
    USER_CANCELED      = 4
    OTHERS             = 5.
ENDFORM.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、开发思想
    • ABAP开发属于事件驱动开发
      • SAP请求号意义
        • 程序的封装思想
        • 二、开发ALV的基本流程
          • 第一步:定义ALV所要用到的类型池:TYPE-POOLS:SLIS;
            • 第二步:定义ALV所要显示的数据对应的内表数据类型及内表数据对象;
              • 第三步:定义一些显示ALV时所要使用到的变量;
                • 第四步:定义选择屏幕;
                  • 第五步:声明各个选择屏幕事件块;
                  • 三、ABAP-ALV-00方法中的ALV的如何自己添加按钮及其响应
                    • 步骤一:创建一个事件的处理类
                      • 步骤二:类的实现
                        • 步骤三:在FROM---set_toolbar中添加button(按钮)
                          • 步骤四:创建事件处理对象
                          • 四、我的开发实例1:使用ALV输出一个会计凭证清单
                          • 五、我的开发实例2:ALV+SMARTFROM,输出物料凭证清单
                          相关产品与服务
                          腾讯云 BI
                          腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档