SAP FPM通过ABAP读取EXCEL值到动态内表并把数据发送到其他组件


需求

在网页应用中(FPM、FBI、WDA)通过ABAP读取EXCEL值到动态内表并把数据发送到其他组件


一、效果

有网页应用如下需要实现数据导入功能,但是此页签行列信息都是动态生成,所以我们在处理上传excel时也需要动态处理
在这里插入图片描述
点击数据上传后实现读取与数据回传
在这里插入图片描述

二、实现

1.部分代码

先通过GET_VALUE获取到事先传递的结构信息,再读取excel内容,插入data中,最后唤起refresh事件,通知页面接收数据
这是在上载类中PROCESS_EVENT中实现的方法

如下:

  METHOD if_fpm_guibb_form~process_event.

    DATA: lo_fpm   TYPE REF TO if_fpm,
          lo_event TYPE REF TO cl_fpm_event.
    DATA: lr_upload TYPE REF TO data.
    DATA: lv_num TYPE i.
    FIELD-SYMBOLS: <fs_data>       TYPE                 zes_s_co_upload,
                   <fs_table>      TYPE STANDARD TABLE,
                   <fs_table_data> TYPE STANDARD TABLE,
                   <fs_struc>      TYPE                 any,
                   <fs_struc_data> TYPE                 any,
                   <fs_temp>       TYPE                 any,
                   <fs_temp_value> TYPE                 any.
    DATA: lr_excel      TYPE REF TO            cl_fdt_xl_spreadsheet,
          lr_excel_core TYPE REF TO            cx_fdt_excel_core,
          lr_data       TYPE REF TO            data,
          lt_worksheets TYPE STANDARD TABLE OF string,
          lv_ws_name    TYPE                   string,
          lv_xstring    TYPE                   xstring.
    DATA lr_struc TYPE REF TO cl_abap_structdescr.
    DATA lr_table TYPE REF TO cl_abap_tabledescr.
    DATA lr_type TYPE REF TO cl_abap_typedescr.
    DATA lt_comp TYPE abap_component_tab.
    DATA ls_comp LIKE LINE OF lt_comp.
    DATA lr_struct_data TYPE REF TO data.
    DATA lr_table_data TYPE REF TO data.
    DATA lv_struct TYPE string.
    DATA lv_index TYPE i.
    DATA lv_index_unit TYPE i.
    DATA:lt_component TYPE abap_compdescr_tab .

    DATA:
      lo_ref      TYPE REF TO cx_root,
      ls_bapiret2 TYPE        bapiret2,
      lv_string   TYPE        string.

*    FIELD-SYMBOLS <fs_table> TYPE STANDARD TABLE.
*    FIELD-SYMBOLS <fs_struc> TYPE any.

    lo_fpm ?= cl_fpm_factory=>get_instance( ).
    CALL METHOD lo_fpm->mo_app_parameter->get_value
      EXPORTING
        iv_key   = 'TABLE'
      IMPORTING
        er_value = lr_table_data.

    CALL METHOD lo_fpm->mo_app_parameter->get_value
      EXPORTING
        iv_key   = 'LINE'
      IMPORTING
        er_value = lr_struct_data.


    CALL METHOD lo_fpm->mo_app_parameter->get_value
      EXPORTING
        iv_key   = 'INDEX'
      IMPORTING
        ev_value = lv_index.
*
*    lr_struc ?= cl_abap_structdescr=>describe_by_name( lv_struct ).
*    lt_component = lr_struc->components.
*    DESCRIBE TABLE lt_component LINES lv_index.
*
*    CALL METHOD cl_abap_tabledescr=>create
*      EXPORTING
*        p_line_type = lr_struc
*      RECEIVING
*        p_result    = lr_table.
*
*    CREATE DATA lr_struct_data TYPE HANDLE lr_struc.
*    CREATE DATA lr_table_data  TYPE HANDLE lr_table.
    ASSIGN lr_struct_data->* TO <fs_struc_data>.
    ASSIGN lr_table_data->* TO <fs_table_data>.

    CASE io_event->mv_event_id.
      WHEN cl_fpm_event=>gc_event_close_dialog_box.
        ASSIGN ms_data TO <fs_data>.
        IF <fs_data> IS ASSIGNED.
          lv_xstring = <fs_data>-data.
          TRY.
              CREATE OBJECT lr_excel
                EXPORTING
                  document_name = <fs_data>-filename
                  xdocument     = lv_xstring.
            CATCH cx_fdt_excel_core INTO lr_excel_core.
              RETURN.
          ENDTRY.
* Call method to get list of worksheets in the .xlsx file
          IF lr_excel IS BOUND.
            lr_excel->if_fdt_doc_spreadsheet~get_worksheet_names(
                 IMPORTING
                   worksheet_names = lt_worksheets ).
* Condition to check whether .xlsx file has any active worksheets
            IF lt_worksheets IS NOT INITIAL.
              READ TABLE lt_worksheets INDEX 1 INTO lv_ws_name.
* Get reference of .xlsx file contents in the active worksheet
              lr_data = lr_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
                                                         lv_ws_name ).
* Check if any blank excel file is uploaded by user
              IF lr_data IS BOUND.
                ASSIGN lr_data->* TO <fs_table>.
                IF <fs_table> IS ASSIGNED.
                  LOOP AT <fs_table> ASSIGNING <fs_struc>.

                    CHECK <fs_struc> IS NOT INITIAL."skip blank line
                    IF sy-tabix = 1.
*                      DO lv_index TIMES.
*                        ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struc> TO <fs_temp>.
*                        IF <fs_temp> IS ASSIGNED AND <fs_temp> = '基本计量单位'.
*                          lv_index_unit = sy-index.
*                          UNASSIGN <fs_temp>.
*                        ENDIF.
*                      ENDDO.
                      CONTINUE.
                    ENDIF.

                    DO lv_index TIMES.
                      ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struc> TO <fs_temp>.
                      ASSIGN COMPONENT sy-index OF STRUCTURE <fs_struc_data> TO <fs_temp_value>.
                      IF <fs_temp> IS ASSIGNED..
                        TRY .
                            <fs_temp_value> = <fs_temp>.
                          CATCH cx_root INTO lo_ref.
                            lv_string = lo_ref->get_text( ).
                            ls_bapiret2-message_v2 = lv_string.
                            ls_bapiret2-message_v3 = <fs_temp>.
                            ls_bapiret2-type = 'E'.
                            ls_bapiret2-id = 'ZPS'.
                            ls_bapiret2-number = '147'.
                            ls_bapiret2-message_v1 = text-010.
                            CALL METHOD lo_fpm->mo_message_manager->report_bapiret2_message
                              EXPORTING
                                is_bapiret2  = ls_bapiret2
                                io_component = lo_fpm->mo_message_manager.
                        ENDTRY.
*                        IF lv_index_unit = sy-index.
*                          CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
*                            EXPORTING
*                              input          = <fs_temp_value>
**                             LANGUAGE       = SY-LANGU
*                            IMPORTING
*                              output         = <fs_temp_value>
*                            EXCEPTIONS
*                              unit_not_found = 1
*                              OTHERS         = 2.
*                        ENDIF.
                        UNASSIGN <fs_temp>.
                      ENDIF.
                    ENDDO.

                    APPEND <fs_struc_data> TO <fs_table_data>.

                  ENDLOOP.

                  IF <fs_table_data> IS NOT INITIAL.
                    CREATE OBJECT lo_event
                      EXPORTING
                        iv_event_id = 'REFRESH'.

                    GET REFERENCE OF <fs_table_data> INTO lr_upload.
                    lo_event->mo_event_data->set_value(
                         iv_key  = 'UPLOAD_DATA'
                         ir_value = lr_upload ).

                    lo_fpm->raise_event( io_event = lo_event ).

                  ENDIF.

                ENDIF.

              ENDIF.

            ENDIF.
          ENDIF.
        ENDIF.

    ENDCASE.

  ENDMETHOD.

2.其中相关的内容可查看系列文章获悉

FPM从头开发一个高级应用程序


总结

以上。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ggreekn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值