ABAP 调用标准报表程序,获取程序输出list

如何调用标准程序,直接获取对应标准程序的字段。

注意点:1当被调用程序有Varient值时,一定要传入值,不然字段的顺序会错乱,固定了Varient才能确保取出来的字段顺序和该Varient一致

2每个报表不同,有抬头会占用行数,所以需要自己debug看一下,从第几行开始有数据

3有些报表中间会有些汇总数据一类的不需要的,需要判断删除一下,列如根据物料为空

4 有些金额,日期字段不能直接取,需要进行转换,有些So类字段需要加前导零。

  DATA: lv_string TYPE string.
  DATA: lv_string2 TYPE string.
  DATA  l_dcpfm LIKE usr01-dcpfm.
  DATA  BEGIN OF itab_list OCCURS 0.
          INCLUDE STRUCTURE abaplist.
  DATA  END OF itab_list.
  DATA: BEGIN OF vlist OCCURS 0, "这个调用程序ALV输出的长度要根据实际长度来确认
     line TYPE c LENGTH 300,
  END OF vlist.
  DATA: lt_itab TYPE TABLE OF string.
  SELECT SINGLE dcpfm INTO l_dcpfm
  FROM usr01
  WHERE bname = sy-uname.
  CLEAR gt_out.
  SUBMIT rm07docs
     WITH matnr IN matnr[]
     WITH werks IN werks[]
     WITH lgort IN lgort[]
     WITH lifnr IN lifnr[]
     WITH kunnr IN kunnr[]
     WITH bwart   IN bwart[]
     WITH sobkz   IN sobkz[]
     WITH aufnr   IN aufnr[]
     WITH ebeln   IN ebeln[]
     WITH ebelp   IN ebelp[]
     WITH grund   IN grund[]
     WITH kostl   IN kostl[]
     WITH mat_kdau IN mat_kdau[]
     WITH mat_kdpo IN mat_kdpo[]
     WITH mat_pspn IN mat_pspn[]
     WITH sgtxt  IN sgtxt[]
     WITH umlgo  IN umlgo[]
     WITH umwrk   IN umwrk[]
     WITH budat   IN budat[]
     WITH usnam   IN usnam[]
     WITH vgart   IN vgart[]
     WITH cpudt   IN cpudt[]
     WITH mblnr   IN mblnr[]
     WITH tcode2  IN tcode2[]
     WITH xblnr   IN xblnr[]
     WITH rhier_l = ''
     WITH rflat_l = 'X'
     WITH alv_def = '/MKS'
     WITH database = database
     WITH shortdoc = shortdoc
     WITH archive  = archive
     WITH pa_aistr = pa_aistr
     WITH pa_dbstd = pa_dbstd
     WITH pa_dbmat = pa_dbmat
     WITH pa_dbdat = pa_dbdat
     WITH pa_maa   = pa_maa
     EXPORTING LIST TO MEMORY
     AND RETURN.
  CALL FUNCTION 'LIST_FROM_MEMORY'
    TABLES
      listobject = itab_list
    EXCEPTIONS
      not_found  = 4
      OTHERS     = 8.
  FREE MEMORY .
  CALL FUNCTION 'LIST_TO_ASCI'
    EXPORTING
      list_index         = -1
    TABLES
      listasci           = vlist
      listobject         = itab_list
    EXCEPTIONS
      empty_list         = 1
      list_index_invalid = 2
      OTHERS             = 3.
  IF sy-subrc = 0.

    LOOP AT vlist.
      AT LAST.
        CONTINUE.
      ENDAT.
      IF sy-tabix > 3 . “每个报表不同,需要Debug看从第几行开始有的数据内容
        CLEAR:gs_out.
        CLEAR: lt_itab,lv_string.
        SPLIT vlist-line AT '|' INTO TABLE lt_itab.
        IF lt_itab IS NOT INITIAL.
*            GS_OUT-kunnr = gs_kunnr-kunnr.
*            GS_OUT-bukrs = p_bukrs.
          LOOP AT lt_itab INTO lv_string.
            CASE sy-tabix.
              WHEN '2'.
                gs_out-lifnr = lv_string.
                CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
                  EXPORTING
                    input  = gs_out-lifnr
                  IMPORTING
                    output = gs_out-lifnr.

              WHEN '3'.
                gs_out-matnr = lv_string.
              WHEN '4'.
                gs_out-maktx = lv_string.
              WHEN '5'.
                gs_out-werks = lv_string.
              WHEN '6'.
                gs_out-lgort = lv_string.
              WHEN '7'.
                gs_out-bwart = lv_string.
              WHEN '8'.
                gs_out-sobkz = lv_string.
              WHEN '9'.
                gs_out-ebeln = lv_string.
                CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
                  EXPORTING
                    input  = gs_out-ebeln
                  IMPORTING
                    output = gs_out-ebeln.
              WHEN '10'.
                gs_out-ebelp = lv_string.
                CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
                  EXPORTING
                    input  = gs_out-ebelp
                  IMPORTING
                    output = gs_out-ebelp.
              WHEN '11'.
                gs_out-mblnr = lv_string.
                CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
                  EXPORTING
                    input  = gs_out-mblnr
                  IMPORTING
                    output = gs_out-mblnr.
              WHEN '12'.
                gs_out-zeile = lv_string.
                CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
                  EXPORTING
                    input  = gs_out-zeile
                  IMPORTING
                    output = gs_out-zeile.
*              WHEN '13'.
*                gs_out-bldat = lv_string.
              WHEN '13'.
                gs_out-budat_c = lv_string.
                CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL' “日期字段转换”
                  EXPORTING
                    date_external            = gs_out-budat_c
*                   ACCEPT_INITIAL_DATE      =
                  IMPORTING
                    date_internal            = gs_out-budat
                  EXCEPTIONS
                    date_external_is_invalid = 1
                    OTHERS                   = 2.
                IF sy-subrc = 0.

                ENDIF.
              WHEN '14'.
                IF lv_string CS '-'.
                  SPLIT  lv_string AT '-' INTO gs_out-erfmg_c lv_string2.
                ELSE.
                  gs_out-erfmg_c = lv_string.
                ENDIF.
                CALL FUNCTION 'UNITS_STRING_CONVERT'
                  EXPORTING
                    units_string = gs_out-erfmg_c
                    dcpfm        = l_dcpfm    "此时为X
*                   MLLN         = 'M'
*                   TSND         = 'T'
                  IMPORTING
                    units        = gs_out-erfmg
                  EXCEPTIONS
                    invalid_type = 1
                    OTHERS       = 2.
                IF lv_string CS '-'.
                  gs_out-erfmg = 0 - gs_out-erfmg.
                ENDIF.
              WHEN '15'.
                gs_out-erfme = lv_string.
              WHEN '16'.
                IF lv_string CS '-'.
                  SPLIT  lv_string AT '-' INTO gs_out-dmbtr_c lv_string2.
                ELSE.
                  gs_out-dmbtr_c = lv_string.
                ENDIF.
                CALL FUNCTION 'UNITS_STRING_CONVERT' “金额字段转换
                  EXPORTING
                    units_string = gs_out-dmbtr_c
                    dcpfm        = l_dcpfm    "此时为X
*                   MLLN         = 'M'
*                   TSND         = 'T'
                  IMPORTING
                    units        = gs_out-dmbtr
                  EXCEPTIONS
                    invalid_type = 1
                    OTHERS       = 2.
                IF lv_string CS '-'.
                  gs_out-dmbtr = 0 - gs_out-dmbtr.
                ENDIF.
            ENDCASE.
            CLEAR lv_string.
          ENDLOOP.
          IF gs_out IS NOT INITIAL.
            SELECT SINGLE bldat INTO gs_out-bldat
              FROM mkpf
              WHERE mblnr = gs_out-mblnr.
            APPEND gs_out  TO gt_out.
            CLEAR gs_out.
          ENDIF.
        ENDIF.
      ENDIF.

    ENDLOOP.
    DELETE gt_out WHERE matnr = ''.

posted @ 2021-01-18 15:53  闫默涵  阅读(844)  评论(0编辑  收藏  举报