SAP ALV模板

主代码

*&---------------------------------------------------------------------*
*& Report ZFIR202
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFIR202.

INCLUDE ZFIR202T.


INCLUDE ZFIR202S.


INCLUDE ZFIR202F.

ZFIR202T 定义字段结构等

*&---------------------------------------------------------------------*
*& 包含               ZFIR202T
*&---------------------------------------------------------------------*
TABLES: ztmm062a.

TYPES: BEGIN OF ty_detial,
*         box   TYPE c,
         bukrs      TYPE t001-bukrs              , "公司代码
         gjahr      TYPE gjahr                   , "年度
         monat      TYPE acdoca-poper            , "期间
       END OF ty_detial.


DATA: gt_output  TYPE TABLE OF ty_detial,
      gs_output  TYPE ty_detial.

DATA: lv_monat      TYPE char2,
      lv_losgr      TYPE ckmlprkeko-losgr.

DATA: gs_layout   TYPE lvc_s_layo."alv需要布局
DATA: gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat.


DATA:it_out01 TYPE TABLE OF ty_detial.
DATA:is_excel TYPE  ty_excel.

选择屏幕:带有在选择屏幕增加按钮跳转表格维护生成器,F4搜索帮助,以及后台下载布置

*&---------------------------------------------------------------------*
*& 包含               ZFIR202S
*&---------------------------------------------------------------------*
TABLES:t001w,bkpf,ztmm2094,tgsb,bsid,sscrfields.
DATA functxt TYPE smp_dyntxt. "SMP_DYNTXT(菜单制作器:动态文本的程序接口)

SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE TEXT-001.
PARAMETERS:  p_bukrs TYPE t001-bukrs OBLIGATORY."公司代码
SELECT-OPTIONS:s_werks FOR t001w-werks."工厂
PARAMETERS:  p_gjahr TYPE gjahr OBLIGATORY."年度
SELECT-OPTIONS:s_monat FOR bsid-monat."期间
SELECT-OPTIONS:s_zmtype FOR ztmm2094-zmtype."车型
SELECT-OPTIONS:s_gsber FOR tgsb-gsber."业务范围
PARAMETERS:p_sum    RADIOBUTTON GROUP g1 USER-COMMAND uc1 DEFAULT 'X',  "USER-COMMAND UC1
           p_detial RADIOBUTTON GROUP g1.

SELECTION-SCREEN SKIP 1.

PARAMETERS: c_h AS CHECKBOX USER-COMMAND com.

SELECTION-SCREEN SKIP 1.

*PARAMETERS: p_line TYPE i DEFAULT 60000.

SELECTION-SCREEN END OF BLOCK block1.

"增加预留的选择屏幕按钮
SELECTION-SCREEN FUNCTION KEY 1.

"初始化

INITIALIZATION.
  CLEAR functxt.
  functxt-icon_id   = icon_table_settings. "图标,可以通过ICON查找
  functxt-icon_text = '维护【零件和MTCO映射关系表】'."描述
  sscrfields-functxt_01 = functxt.
  "如果还有其他按钮依次添加到functxt_02、functxt_03、functxt_04、functxt_05中

AT SELECTION-SCREEN OUTPUT.

*  LOOP AT SCREEN.
*    IF c_h = abap_true.
*      IF screen-name = 'P_ELINE'.
*        screen-invisible = '0'.
*        MODIFY SCREEN.
*      ENDIF.
*    ELSE.
*      IF screen-name = 'P_ELINE'.
*        screen-invisible = '1'.
*        MODIFY SCREEN.
*      ENDIF.
*    ENDIF.
*  ENDLOOP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_bukrs."按F4键时触发
  CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
    EXPORTING
      tabname     = 'T001' "参照表
      fieldname   = 'BUKRS' "参照字段
      dynpprog    = sy-repid "指定执行程序
      dynpnr      = sy-dynnr "指定执行程序的屏蔽编码
      dynprofield = 'P_BUKRS'. "触发事件的屏幕字段名称

AT SELECTION-SCREEN.

  CASE sscrfields-ucomm.
    WHEN 'FC01'.

      CALL TRANSACTION 'ZTFI3005' .
*CALL FUNCTION 'TH_CREATE_MODE'
*  EXPORTING
*    transaktion    = 'ZTFI3005'
*  EXCEPTIONS
*    max_sessions   = 1
*    internal_error = 2
*    no_authority   = 3
*    OTHERS         = 4.
  ENDCASE.

START-OF-SELECTION.

  PERFORM frm_load.
  IF c_h <> 'X'.
    PERFORM frm_select_data.
    PERFORM frm_set_alv.
    PERFORM frm_dis_alv.
  ENDIF.


END-OF-SELECTION.

ZFIR202F:取值以及后台操作等

*&---------------------------------------------------------------------*
*& 包含               ZFIR202F
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_SELECT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_select_data .

*---------------------1.0销售数据取值逻辑
  SELECT  a~bukrs ,
          substring( a~fkdat,1,4 ) AS gjahr ,
          substring( a~fkdat,5,2 ) AS monat,
          a~vbeln,
          a~waerk,
          a~fkdat,
          a~kurrf,
          a~knumv,
          a~vbtyp,
          a~kunag,
          i~name1,

          b~werks,
          b~posnr,
          b~vgbel,
          b~vgpos,
          b~matnr,
          b~gsber,
          b~vrkme AS meins,
          b~fkimg AS qrsrsl,
          b~netwr,
          b~mwsbp,
          b~aubel,
          b~aupos,

          b~vgtyp,
          b~auref,

          c~wadat_ist,
          e~butxt,
          f~maktx,
          g~gtext,
          d~kwert AS bzcb,

          h~mtart ,
          h~kzkfg ##DB_FEATURE_MODE[TABLE_LEN_MAX1]

    FROM vbrk AS a
    JOIN vbrp AS b ON a~vbeln = b~vbeln
    LEFT JOIN likp AS c ON b~vgbel = c~vbeln
    LEFT JOIN t001 AS e ON a~bukrs = e~bukrs
    JOIN prcd_elements AS d ON a~knumv = d~knumv AND b~posnr = d~kposn AND ( kschl = 'ZPR2' OR kschl = 'ZPR1' )
    LEFT JOIN makt AS f ON f~spras = '1' AND b~matnr = f~matnr
    LEFT JOIN tgsbt AS g ON g~gsber = b~gsber
    LEFT JOIN mara AS h ON b~matnr = h~matnr
    LEFT JOIN kna1 AS i ON a~kunag = i~kunnr
    WHERE a~bukrs = @p_bukrs
    AND substring( a~fkdat,1,4 ) = @p_gjahr
    AND substring( a~fkdat,5,2 ) IN @s_monat
    AND a~rfbsk = 'C'
    AND b~werks IN @s_werks
    AND ( b~fkimg <>  '0' OR b~netwr <>  '0' )
    INTO TABLE @DATA(lt_xs).
  MOVE-CORRESPONDING  lt_xs TO gt_xs.
  SORT gt_xs BY bukrs gjahr monat.


*---------------------2.0零件领用数据取值逻辑
  SELECT a~bukrs ,
         a~werks     ,
         substring( a~budat_mkpf,1,4 ) AS gjahr ,
         substring( a~budat_mkpf,5,2 ) AS monat,
         a~mblnr     ,
         a~zeile     ,
         a~budat_mkpf,
         a~matnr     ,
         a~pargb AS  gsber    ,
         a~waers     ,
         a~meins     ,
         a~menge AS qrsrsl ,
         a~dmbtr AS bzcb,
         a~shkzg      ,
         b~maktx,
         c~gtext,
         d~butxt,
         e~mtart ,
         e~kzkfg
    FROM mseg AS a
    LEFT JOIN makt AS b ON b~spras = '1' AND a~matnr = b~matnr
    LEFT JOIN tgsbt AS c ON a~pargb = c~gsber
     LEFT JOIN t001 AS d ON a~bukrs = d~bukrs
    LEFT JOIN mara AS e ON a~matnr = e~matnr
    WHERE a~bukrs = @p_bukrs
    AND substring( budat_mkpf,1,4 ) = @p_gjahr
    AND substring( budat_mkpf,5,2 ) IN @s_monat
    AND ( bwart = 'Z37' OR bwart = 'Z38' OR bwart = 'Z47' OR bwart = 'Z48' )
    AND menge <> '0'
    AND a~werks IN @s_werks
    INTO TABLE @DATA(lt_lj).
  MOVE-CORRESPONDING  lt_lj TO gt_lj.
  SORT gt_lj BY bukrs gjahr monat.

*--------------为gt_out赋值
  LOOP AT gt_xs ASSIGNING FIELD-SYMBOL(<fs_xs>).

*    IF <fs_xs>-kwert = '0'.
*      <fs_xs>-fkimg = 0.
*    ENDIF.
    IF <fs_xs>-vbtyp = 'N' OR <fs_xs>-vbtyp = 'O' OR <fs_xs>-vbtyp = '6'.
      <fs_xs>-qrsrsl = <fs_xs>-qrsrsl * -1.
      <fs_xs>-netwr = <fs_xs>-netwr * -1.
      <fs_xs>-mwsbp = <fs_xs>-mwsbp * -1.
      <fs_xs>-bzcb = <fs_xs>-bzcb * -1.
    ENDIF.
    MOVE-CORRESPONDING <fs_xs> TO gs_output.
    gs_output-zebelp1 = <fs_xs>-aupos.
    gs_output-ebelp = <fs_xs>-aupos.
    APPEND gs_output TO gt_output.
    CLEAR gs_output.
  ENDLOOP.

  LOOP AT gt_lj ASSIGNING FIELD-SYMBOL(<fs_lj>).

*    IF <fs_lj>-DMBTR = '0'.
*      <fs_lj>-MENGE = 0.
*    ENDIF.
*    <fs_lj>-waers = 'CNY'.
    IF <fs_lj>-shkzg = 'S'.
      <fs_lj>-qrsrsl = <fs_lj>-qrsrsl * -1.
      <fs_lj>-bzcb = <fs_lj>-bzcb * -1.
    ENDIF.
    MOVE-CORRESPONDING <fs_lj> TO gs_output.
    gs_output-kurrf = '1'.
    gs_output-waerk = 'CNY'.
    APPEND gs_output TO gt_output.
    CLEAR gs_output.
  ENDLOOP.

  "没有数据终止执行
  CHECK gt_output IS NOT INITIAL.

*---------------------3.0共用逻辑
  "公司代码描述
*  SELECT SINGLE butxt
*    FROM t001
*    WHERE bukrs = @p_bukrs
*    INTO @DATA(lv_butxt).


  "物料描述
*    SELECT matnr,
*           maktx
*      FROM makt
*      FOR ALL ENTRIES IN @gt_output
*      WHERE spras = '1' AND matnr = @gt_output-matnr
*      INTO TABLE @DATA(lt_maktx).

  "业务范围描述
*    SELECT gsber,
*           gtext
*      FROM tgsbt
*      FOR ALL ENTRIES IN @gt_output
*      WHERE gsber = @gt_output-gsber
*      INTO TABLE @DATA(lt_gsber).

  "车型的前提条件
*  SELECT a~matnr,
*         a~mtart,
*         a~kzkfg
*    FROM mara AS a
*    FOR ALL ENTRIES IN @gt_output
*    WHERE matnr = @gt_output-matnr
*    AND ( mtart = 'Z004' OR mtart = 'Z005' )
*    AND kzkfg = ''
*    INTO TABLE @DATA(lt_mara).
*  SORT lt_mara BY matnr mtart.

  SELECT a~matnr,
         a~zebeln1 AS aubel,
         a~zebelp1 AS zebelp1,
         a~zmtype
    FROM ztmm2094 AS a
    FOR ALL ENTRIES IN @gt_output
    WHERE a~zebeln1 = @gt_output-aubel
    AND   a~zebelp1 = @gt_output-zebelp1
    AND   a~matnr   = @gt_output-matnr
    AND   zstat_sto1 = 'S'
INTO TABLE @DATA(lt_zmtype).
  SORT lt_zmtype BY matnr.

*  LOOP AT lt_mara INTO DATA(ls_mara).
*    IF ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg = ''.
*      gs_zmtype-zmtype = ls_mara-matnr+0(12).
*      gs_zmtype-matnr = ls_mara-matnr.
*
*    ELSEIF  ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg = 'X'.
*      READ TABLE lt_zmtype INTO DATA(ls_zmtype) WITH KEY matnr = ls_mara-matnr .
*      gs_zmtype-zmtype = ls_zmtype-zmtype.
*      gs_zmtype-matnr = ls_mara-matnr.
*    ENDIF.
*    APPEND gs_zmtype TO gt_zmtype.
*    CLEAR gs_zmtype.
*  ENDLOOP.


  "vin码

  SELECT  a~posnr ,
          a~lief_nr,
          b~sernr
  FROM ser01 AS a
  JOIN objk AS b ON a~obknr = b~obknr
  FOR ALL ENTRIES IN @gt_output
  WHERE a~posnr = @gt_output-vgpos AND  a~lief_nr = @gt_output-vgbel
  INTO TABLE @DATA(lt_vin).

*-------------4.0成本数据取值
  "kalnr
  "VBRP-VGTYP=J,VBRP-AUREF=X
  SELECT b~matnr,
         b~bwkey,
         a~ebeln AS aubel,
         a~ebelp,
         b~kalnr
    FROM ekkn AS a
   JOIN ckmlhd AS b ON a~vbeln = b~vbeln AND a~vbelp = b~posnr
    JOIN @gt_output AS c ON  a~ebeln = c~aubel AND   a~ebelp = c~ebelp
    WHERE c~vgtyp = 'J'
    AND   c~auref = 'X'
    AND   a~zekkn = '1'
    INTO TABLE @DATA(lt_kalnr).
*  SORT lt_kalnr  BY matnr bwkey aubel aupos kalnr.

  "否则
  SELECT a~matnr,
         a~bwkey,
         a~vbeln AS aubel,
         a~posnr AS aupos,
         a~kalnr
    FROM ckmlhd AS a
    FOR ALL ENTRIES IN @gt_output
    WHERE a~matnr = @gt_output-matnr
    AND a~bwkey = @gt_output-werks
    AND a~posnr = @gt_output-aupos
    AND  a~vbeln = @gt_output-aubel
    INTO TABLE @DATA(lt_kalnr2).
  SORT lt_kalnr2 BY matnr bwkey aubel aupos kalnr.

  "如取不到
  SELECT a~matnr,
         a~bwkey,
         a~kalnr
    FROM ckmlhd AS a
    FOR ALL ENTRIES IN @gt_output
    WHERE a~matnr = @gt_output-matnr
    AND a~bwkey = @gt_output-werks
    AND a~posnr = ''
    AND  a~vbeln = ''
    INTO TABLE @DATA(lt_kalnr3).
  SORT lt_kalnr3 BY matnr bwkey kalnr.

  LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_outkalnr>).
    "kalnr
    CLEAR lv_kalnr.

    IF <fs_outkalnr>-vgtyp = 'J' AND <fs_outkalnr>-auref = 'X'.
      READ TABLE lt_kalnr INTO DATA(ls_kalnr) WITH KEY matnr = <fs_outkalnr>-matnr bwkey = <fs_outkalnr>-werks  aubel = <fs_outkalnr>-aubel  ebelp = <fs_outkalnr>-ebelp .
      IF ls_kalnr IS NOT INITIAL.
        lv_kalnr = ls_kalnr-kalnr.
      ENDIF.
    ELSE.
      READ TABLE lt_kalnr2 INTO DATA(ls_kalnr2) WITH KEY matnr = <fs_outkalnr>-matnr bwkey = <fs_outkalnr>-werks  aubel = <fs_outkalnr>-aubel  aupos = <fs_outkalnr>-aupos .
      IF ls_kalnr2 IS NOT INITIAL.
        lv_kalnr = ls_kalnr2-kalnr.
      ENDIF.
    ENDIF.

    IF lv_kalnr IS INITIAL.
      READ TABLE lt_kalnr3 INTO DATA(ls_kalnr3) WITH KEY matnr = <fs_outkalnr>-matnr bwkey = <fs_outkalnr>-werks .
      IF lt_kalnr3 IS NOT INITIAL.
        lv_kalnr = ls_kalnr3-kalnr.
      ENDIF.
    ENDIF.
    CLEAR ls_kalnr.
    CLEAR ls_kalnr2.
    CLEAR ls_kalnr3.
    <fs_outkalnr>-kalnr = lv_kalnr.
  ENDLOOP.

*  SELECT a~matnr,
*         a~bwkey,
*         a~vbeln,
*         a~posnr,
*         a~kalnr
*    FROM ckmlhd AS a
*    FOR ALL ENTRIES IN @gt_output
*    WHERE a~matnr = @gt_output-matnr
*  AND a~bwkey = @gt_output-werks
*  AND ( ( a~posnr = @gt_output-aupos  AND  a~vbeln = @gt_output-aubel ) OR ( a~posnr = ''  AND  a~vbeln = '' ) )
*    INTO TABLE @DATA(lt_kalnr).
**  SORT lt_kalnr BY matnr bwkey vbeln posnr.
*  MOVE-CORRESPONDING lt_kalnr TO gt_kalnr.

*  SELECT a~matnr,
*       a~bwkey,
*       a~vbeln,
*       a~posnr,
*       a~kalnr
*   FROM ckmlhd AS a
*  FOR ALL ENTRIES IN @gt_output
*  WHERE a~matnr = @gt_output-matnr
*AND a~bwkey = @gt_output-werks
*AND  a~posnr = ''
*AND  a~vbeln = ''
*    INTO TABLE @DATA(lt_kalnr2).
*  into table @data(lt_kalnr2).
*  SORT lt_kalnr2 BY matnr bwkey vbeln.
*  SORT gt_kalnr BY matnr bwkey vbeln posnr.
*  MOVE-CORRESPONDING lt_kalnr2 TO gt_kalnr2.
*  DELETE ADJACENT DUPLICATES FROM gt_kalnr COMPARING matnr bwkey vbeln posnr.


*  IF gt_kalnr IS NOT INITIAL.
*    "标准LOSGR
*    SELECT a~kalnr,
*           a~losgr,
*           a~bdatj,
*           a~poper
*    FROM ckmlprkeko AS a
*    FOR ALL ENTRIES IN @gt_kalnr
*    WHERE  a~kalnr = @gt_kalnr-kalnr
*    AND a~prtyp = 'S'
*    INTO TABLE @DATA(lt_losgr).
*    SORT lt_losgr BY kalnr bdatj poper.
*
*    "实际LOSGR
*    SELECT a~kalnr,
*           a~losgr,
*           a~bdatj,
*           a~poper
*    FROM ckmlprkeko AS a
*    FOR ALL ENTRIES IN @gt_kalnr
*    WHERE  a~kalnr = @gt_kalnr-kalnr
*    AND a~prtyp = 'V'
*    INTO TABLE @DATA(lt_losgr2).
*    SORT lt_losgr2 BY kalnr bdatj poper.
*  ENDIF.

*  SELECT a~matnr,
*    a~losgr,
*    a~werks
*  FROM marc AS a
*    FOR ALL ENTRIES IN @gt_output
*    WHERE a~matnr = @gt_output-matnr AND  a~werks = @gt_output-werks
*  INTO TABLE @DATA(lt_mlosgr).
*  SORT lt_mlosgr BY matnr werks.


  "标准成本kst

  SELECT  a~kalnr  ,
          a~bdatj  ,
          a~poper  ,
          a~kst001 ,
          a~kst003 ,
          a~kst005 ,
          a~kst007 ,
          a~kst009 ,
          a~kst011
    FROM ckmlprkeph AS a
    FOR ALL ENTRIES IN @gt_output
    WHERE  a~kalnr = @gt_output-kalnr
    AND  a~curtp = '10' AND prtyp = 'S' AND kkzst = '' AND keart = 'H'
    AND poper IN @s_monat  AND bdatj = @p_gjahr
    INTO TABLE @DATA(lt_cb).
  DELETE ADJACENT DUPLICATES FROM lt_cb COMPARING kalnr bdatj poper.
  SORT lt_cb BY kalnr bdatj poper DESCENDING.


  "实际成本kst
  SELECT  a~kalnr  ,
          a~bdatj  ,
          a~poper  ,
          a~kst001 ,
          a~kst003 ,
          a~kst005 ,
          a~kst007 ,
          a~kst009 ,
          a~kst011
    FROM ckmlprkeph AS a
    FOR ALL ENTRIES IN @gt_output
    WHERE  a~kalnr = @gt_output-kalnr
    AND a~curtp = '10' AND prtyp = 'V' AND kkzst = '' AND keart = 'H' AND poper IN @s_monat AND bdatj = @p_gjahr
    INTO TABLE @DATA(lt_sjcb).
  DELETE ADJACENT DUPLICATES FROM lt_sjcb COMPARING kalnr bdatj poper.
  SORT lt_cb BY kalnr bdatj poper DESCENDING.



  "实际成本A
  SELECT rbukrs,
    gjahr,
    poper AS monat,
    werks,
    matnr,
    rbusa AS gsber,"y业务范围
    SUM( hsl ) AS hsl
    FROM acdoca

    WHERE rbukrs  = @p_bukrs
    AND gjahr = @p_gjahr
    AND poper  IN @s_monat
    AND racct LIKE '6401%'
    GROUP BY  rbukrs ,  gjahr ,  poper , werks , matnr, rbusa
    INTO TABLE @DATA(lt_hsl).
  SORT lt_hsl BY rbukrs gjahr monat DESCENDING.




  "实际成本B
  SELECT a~bukrs,
  a~gjahr,
  a~monat,
  a~werks,
  a~matnr,
  a~gsber,
  SUM( qrsrsl ) AS qrsrsl
  FROM @gt_output AS a
  GROUP BY  bukrs ,  gjahr ,  monat , werks , matnr , gsber
  INTO TABLE @DATA(lt_qrsrslb).
*    MOVE-CORRESPONDING lt_qrsrslb TO gt_qrsrsl.
  "实际成本c
  SELECT a~bukrs,
  a~gjahr,
  a~monat,
  a~werks,
  a~matnr,
  a~gsber,
  SUM( qrsrsl ) AS qrsrsl
  FROM @gt_output AS a
  WHERE a~qrsrsl > 0
  GROUP BY  bukrs ,  gjahr ,  monat , werks , matnr, gsber
  INTO TABLE @DATA(lt_qrsrslc).
*    MOVE-CORRESPONDING lt_qrsrslc TO gt_qrsrsl2.

  LOOP AT lt_qrsrslb INTO DATA(ls_qrsrslb).

    IF ls_qrsrslb-qrsrsl = 0."b=0

      READ TABLE lt_qrsrslc INTO DATA(ls_qrsrslc)  WITH KEY bukrs = ls_qrsrslb-bukrs gjahr = ls_qrsrslb-gjahr monat = ls_qrsrslb-monat werks = ls_qrsrslb-werks matnr = ls_qrsrslb-matnr gsber = ls_qrsrslb-gsber.

      IF ls_qrsrslc-qrsrsl <> 0."c<>0 b= c
        ls_qrsrslb-qrsrsl = ls_qrsrslc-qrsrsl.
      ENDIF.
    ENDIF.

    MOVE-CORRESPONDING ls_qrsrslb TO gs_qrsrsl.
    APPEND gs_qrsrsl TO gt_qrsrsl.
    CLEAR gs_qrsrsl.

  ENDLOOP.

  SELECT *
    FROM ztfi3005
    INTO TABLE @DATA(lt_all3005).
  SORT lt_all3005 BY zdyzc.


*  LOOP AT gt_output INTO gs_output.
*
*    lv_qrsrsl = lv_qrsrsl + gs_output-qrsrsl.
*    IF gs_output-qrsrsl > 0.
*      lv_qrsrsl2 = lv_qrsrsl2 + gs_output-qrsrsl.
*    ENDIF.
*
*    AT END OF gsber.
*
*      gs_qrsrsl-bukrs  = gs_output-bukrs   .
*      gs_qrsrsl-gjahr  = gs_output-gjahr   .
*      gs_qrsrsl-monat  = gs_output-monat   .
*      gs_qrsrsl-werks  = gs_output-werks   .
*      gs_qrsrsl-matnr  = gs_output-matnr   .
*      gs_qrsrsl-gsber  = gs_output-gsber   .
*      gs_qrsrsl-qrsrsl = lv_qrsrsl         .
*      APPEND gs_qrsrsl TO gt_qrsrsl.
*      CLEAR gs_qrsrsl.
*      lv_qrsrsl = 0.
*
*      gs_qrsrsl2-bukrs  = gs_output-bukrs   .
*      gs_qrsrsl2-gjahr  = gs_output-gjahr   .
*      gs_qrsrsl2-monat  = gs_output-monat   .
*      gs_qrsrsl2-werks  = gs_output-werks   .
*      gs_qrsrsl2-matnr  = gs_output-matnr   .
*      gs_qrsrsl2-gsber  = gs_output-gsber   .
*      gs_qrsrsl2-qrsrsl = lv_qrsrsl2        .
*      APPEND gs_qrsrsl2 TO gt_qrsrsl2.
*      CLEAR gs_qrsrsl2.
*      lv_qrsrsl2 = 0.
*    ENDAT.
*  ENDLOOP.
  SORT gt_output BY bukrs gjahr monat werks matnr gsber .
  LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output>).
    CLEAR lv_kalnr.
    "公司代码描述
*    <fs_output>-butxt =  lv_butxt .
    "物料描述
*    READ TABLE lt_maktx INTO DATA(ls_maktx) WITH KEY matnr = <fs_output>-matnr.
*    <fs_output>-maktx = ls_maktx-maktx.
*    CLEAR ls_maktx.
    "业务范围描述
*    READ TABLE lt_gsber INTO DATA(ls_gsber) WITH KEY gsber = <fs_output>-gsber.
*    <fs_output>-gtext = ls_gsber-gtext.
*    CLEAR ls_gsber.
    "车型
    IF ( <fs_output>-mtart = 'Z004' OR <fs_output>-mtart = 'Z005'  ) AND <fs_output>-kzkfg = ''.

      <fs_output>-zmtype = <fs_output>-matnr+0(12).

    ELSEIF ( <fs_output>-mtart = 'Z004' OR <fs_output>-mtart = 'Z005'  ) AND <fs_output>-kzkfg = 'X'.
      READ TABLE lt_zmtype INTO DATA(ls_zmtype) WITH KEY matnr = <fs_output>-matnr aubel = <fs_output>-aubel zebelp1 = <fs_output>-zebelp1.
      IF sy-subrc = 0.
        <fs_output>-zmtype = ls_zmtype-zmtype.
      ENDIF.
    ENDIF.
*    READ TABLE gt_zmtype INTO DATA(ls_zmtype2) WITH KEY matnr = <fs_output>-matnr.
*    <fs_output>-zmtype = ls_zmtype2-zmtype .
*    CLEAR ls_zmtype2.
*    READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = <fs_output>-matnr.
*    READ TABLE lt_zmtype INTO DATA(ls_zmtype) WITH KEY matnr = <fs_output>-matnr.
*    IF ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg IS INITIAL.
*      <fs_output>-zmtype = ls_mara-matnr+0(12) .
*    ELSEIF ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg = 'X'.
*      <fs_output>-zmtype = ls_zmtype-zmtype .
*    ENDIF.
*    CLEAR ls_mara.
*    CLEAR ls_zmtype.
    "vin码
    READ TABLE lt_vin INTO DATA(ls_vin) WITH KEY posnr = <fs_output>-vgpos   lief_nr = <fs_output>-vgbel.
    <fs_output>-sernr = ls_vin-sernr.
    CLEAR ls_vin.

    "kalnr
*    CLEAR lv_kalnr.
*    IF <fs_output>-vgtyp = 'J' AND <fs_output>-auref = 'X'.
*      READ TABLE lt_kalnr INTO DATA(ls_kalnr) WITH KEY matnr = <fs_output>-matnr bwkey = <fs_output>-werks  aubel = <fs_output>-aubel  aupos = <fs_output>-aupos BINARY SEARCH.
*      IF ls_kalnr IS NOT INITIAL.
*        lv_kalnr = ls_kalnr-kalnr.
*      ENDIF.
*    ELSE.
*      READ TABLE lt_kalnr2 INTO DATA(ls_kalnr2) WITH KEY matnr = <fs_output>-matnr bwkey = <fs_output>-werks  aubel = <fs_output>-aubel  aupos = <fs_output>-aupos BINARY SEARCH.
*      IF ls_kalnr2 IS NOT INITIAL.
*        lv_kalnr = ls_kalnr-kalnr.
*      ENDIF.
*    ENDIF.
*    IF lv_kalnr IS INITIAL.
*      READ TABLE lt_kalnr3 INTO DATA(ls_kalnr3) WITH KEY matnr = <fs_output>-matnr bwkey = <fs_output>-werks BINARY SEARCH.
*      IF lt_kalnr3 IS NOT INITIAL.
*        lv_kalnr = ls_kalnr3-kalnr.
*      ENDIF.
*    ENDIF.
*    CLEAR ls_kalnr.
*    CLEAR ls_kalnr2.
*    CLEAR ls_kalnr3.
*    <fs_output>-kalnr = lv_kalnr.
*    READ TABLE gt_kalnr INTO DATA(ls_kalnr) WITH KEY matnr = <fs_output>-matnr
*    bwkey = <fs_output>-werks
*    vbeln = <fs_output>-aubel
*    posnr = <fs_output>-aupos.
*    IF ls_kalnr-kalnr IS INITIAL.
*      READ TABLE gt_kalnr INTO DATA(ls_kalnr2) WITH KEY matnr = <fs_output>-matnr
*      bwkey = <fs_output>-werks
*      vbeln = ''
*      posnr = ''.
*      lv_kalnr = ls_kalnr2-kalnr.
*    ELSE.
*      lv_kalnr = ls_kalnr-kalnr.
*    ENDIF.
*    CLEAR ls_kalnr.
*    <fs_output>-kalnr = lv_kalnr.
    "LOSGR
*    READ TABLE lt_losgr INTO DATA(ls_losgr2) WITH KEY kalnr = lv_kalnr
*      bdatj = <fs_output>-gjahr
*      poper = <fs_output>-monat.
*
*    IF <fs_output>-budat_mkpf IS INITIAL AND <fs_output>-wadat_ist IS NOT INITIAL.
*      READ TABLE lt_losgr INTO DATA(ls_losgr1)  WITH KEY kalnr = lv_kalnr
*      bdatj = <fs_output>-wadat_ist+0(4)
*      poper = <fs_output>-wadat_ist+5(2).
*      lv_losgr = ls_losgr1-losgr.
*    ELSE.
*      lv_losgr = ls_losgr2-losgr.
*    ENDIF.
*    IF lv_losgr IS INITIAL.
*      READ TABLE lt_mlosgr INTO DATA(ls_mlosgr) WITH KEY matnr = <fs_output>-matnr
*      werks = <fs_output>-werks.
*      lv_losgr = ls_mlosgr-losgr.
*    ENDIF.
*    CLEAR ls_losgr1.
*    CLEAR ls_losgr2.
*    CLEAR ls_mlosgr.
    "实际成本
    READ TABLE lt_hsl INTO DATA(ls_hsl) WITH KEY rbukrs = <fs_output>-bukrs gjahr = <fs_output>-gjahr monat = <fs_output>-monat werks = <fs_output>-werks matnr = <fs_output>-matnr  gsber = <fs_output>-gsber."实际成本a
    DATA(lv_a) = ls_hsl-hsl.
    CLEAR ls_hsl.
    READ TABLE gt_qrsrsl INTO DATA(ls_qrsrsl) WITH KEY bukrs = <fs_output>-bukrs gjahr = <fs_output>-gjahr monat = <fs_output>-monat werks = <fs_output>-werks matnr = <fs_output>-matnr  gsber = <fs_output>-gsber.
    DATA(lv_b) = ls_qrsrsl-qrsrsl."实际成本b/c
    CLEAR ls_qrsrsl.

    <fs_output>-zact_cb = lv_a / lv_b * <fs_output>-qrsrsl.
    lv_act_cb = <fs_output>-zact_cb.
*    IF lv_b = 0."计算每一条确认收入数量为正数的实际成本=A/C*确认收入数量,最后一条数据倒挤。
*      READ TABLE gt_qrsrsl2 INTO DATA(ls_qrsrsl2) WITH KEY bukrs = <fs_output>-bukrs gjahr = <fs_output>-gjahr monat = <fs_output>-monat werks = <fs_output>-werks matnr = <fs_output>-matnr gsber = <fs_output>-gsber."实际成本c
*      DATA(lv_c) = ls_qrsrsl2-qrsrsl.
*      CLEAR ls_qrsrsl2.
*      IF lv_c <> '0'.
*        <fs_output>-zact_cb = lv_a / lv_c * <fs_output>-qrsrsl.
*      ENDIF.
*    ELSE.
    "计算每一条数据的实际成本=A/B*确认收入数量,最后一条数据倒挤;
*      <fs_output>-zact_cb = lv_a / lv_b * <fs_output>-qrsrsl.
*    ENDIF.

    AT END OF gsber.
      <fs_output>-zact_cb = lv_a - lv_sum_actcb.
      lv_sum_actcb = 0.
      lv_act_cb = 0.
    ENDAT.

    "最后一条数据倒挤。
    lv_sum_actcb = lv_sum_actcb + lv_act_cb.

    "标准组件
    IF <fs_output>-budat_mkpf IS INITIAL AND <fs_output>-wadat_ist IS NOT INITIAL."过账日期为空,如果实际交互日期不为空值

      IF <fs_output>-bzcb <> 0.
        READ TABLE lt_cb INTO DATA(ls_cd) WITH KEY  kalnr = lv_kalnr bdatj = <fs_output>-wadat_ist+0(4)  poper = <fs_output>-wadat_ist+4(2) .
        IF ls_cd IS NOT INITIAL.

          lv_kst001 = ls_cd-kst001.
          lv_kst003 = ls_cd-kst003.
          lv_kst005 = ls_cd-kst005.
          lv_kst007 = ls_cd-kst007.
          lv_kst009 = ls_cd-kst009.
          lv_kst011 = ls_cd-kst011.
          CLEAR ls_cd.
        ENDIF.
      ENDIF.

*      IF <fs_output>-zact_cb <> 0.
*        READ TABLE lt_sjcb INTO DATA(ls_sjcb) WITH KEY  kalnr = lv_kalnr bdatj = <fs_output>-wadat_ist+0(4) poper = <fs_output>-wadat_ist+4(2).
*        IF ls_sjcb IS NOT INITIAL.
*          lv_act_kst001 = ls_sjcb-kst001.
*          lv_act_kst003 = ls_sjcb-kst003.
*          lv_act_kst005 = ls_sjcb-kst005.
*          lv_act_kst007 = ls_sjcb-kst007.
*          lv_act_kst009 = ls_sjcb-kst009.
*          lv_act_kst011 = ls_sjcb-kst011.
*          CLEAR ls_sjcb.
*        ENDIF.
*    ENDIF.

    ELSE."如果实际交互日期为空值,则取该行的年度、期间
      IF <fs_output>-bzcb <> 0.
        READ TABLE lt_cb INTO DATA(ls_cd2) WITH KEY  kalnr = lv_kalnr
        bdatj = <fs_output>-gjahr
        poper = <fs_output>-monat
        .
        IF ls_cd2 IS NOT INITIAL.
          lv_kst001 = ls_cd2-kst001.
          lv_kst003 = ls_cd2-kst003.
          lv_kst005 = ls_cd2-kst005.
          lv_kst007 = ls_cd2-kst007.
          lv_kst009 = ls_cd2-kst009.
          lv_kst011 = ls_cd2-kst011.
          CLEAR ls_cd2.
        ENDIF.
      ENDIF.

*      IF <fs_output>-zact_cb <> 0.
*        READ TABLE lt_sjcb INTO DATA(ls_sjcb2) WITH KEY kalnr = lv_kalnr
*        bdatj = <fs_output>-gjahr
*        poper = <fs_output>-monat.
*        IF ls_sjcb2 IS NOT INITIAL.
*          lv_act_kst001 = ls_sjcb2-kst001.
*          lv_act_kst003 = ls_sjcb2-kst003.
*          lv_act_kst005 = ls_sjcb2-kst005.
*          lv_act_kst007 = ls_sjcb2-kst007.
*          lv_act_kst009 = ls_sjcb2-kst009.
*          lv_act_kst011 = ls_sjcb2-kst011.
*          CLEAR ls_sjcb2.
*        ENDIF.
*      ENDIF.
    ENDIF.
    "标准成本组件计算
    IF <fs_output>-bzcb = 0 .
      <fs_output>-zstan_zc  = 0.
      <fs_output>-zstan_fc  = 0.
      <fs_output>-zstan_rg  = 0.
      <fs_output>-zstan_dl  = 0.
      <fs_output>-zstan_zj  = 0.
      <fs_output>-zstan_qt  = 0.
    ELSE.
      "如果KST001/KST003/KST005/KST007/KST009/KST011均为零或者取不到值,则原材料-主材(标准)=标准成本,其余组件为零
      IF ( lv_kst001 = 0 AND lv_kst003 = 0 AND lv_kst005 = 0 AND lv_kst007 = 0 AND lv_kst009 = 0 AND lv_kst011 = 0 )
        OR ( lv_kst001 IS INITIAL AND lv_kst003 IS INITIAL AND lv_kst005 IS INITIAL AND lv_kst007 IS INITIAL AND lv_kst009 IS INITIAL AND lv_kst011 IS INITIAL )..
        <fs_output>-zstan_zc = <fs_output>-bzcb.
        <fs_output>-zstan_fc  = 0.
        <fs_output>-zstan_rg  = 0.
        <fs_output>-zstan_dl  = 0.
        <fs_output>-zstan_zj  = 0.
        <fs_output>-zstan_qt  = 0.
      ELSE.
        "abcd
        lv_stan_sum = lv_kst001 + lv_kst003 + lv_kst005 + lv_kst007 + lv_kst009 + lv_kst011.
        lv_stan_a = lv_kst001 / lv_stan_sum   .
        lv_stan_b = lv_kst003 / lv_stan_sum .
        lv_stan_c = lv_kst005 / lv_stan_sum  .
        lv_stan_d = lv_kst007 / lv_stan_sum .
        lv_stan_e = lv_kst009 / lv_stan_sum.

        "abcd **标准成本
        <fs_output>-zstan_zc  = lv_stan_a * <fs_output>-bzcb.
        <fs_output>-zstan_fc  = lv_stan_b * <fs_output>-bzcb.
        <fs_output>-zstan_rg  = lv_stan_c * <fs_output>-bzcb.
        <fs_output>-zstan_dl  = lv_stan_d * <fs_output>-bzcb.
        <fs_output>-zstan_zj  = lv_stan_e * <fs_output>-bzcb.
        "倒挤
        <fs_output>-zstan_qt  = <fs_output>-bzcb - <fs_output>-zstan_zc
        - <fs_output>-zstan_fc
        - <fs_output>-zstan_rg
        - <fs_output>-zstan_dl
        - <fs_output>-zstan_zj.
      ENDIF.
    ENDIF.

    READ TABLE lt_all3005 INTO DATA(ls_all3005) WITH KEY zdyzc = <fs_output>-zmtype+0(2) BINARY SEARCH.
    IF sy-subrc = 0.
      <fs_output>-zljbs = ls_all3005-zljbs.
    ENDIF.



*    "实际组件
*    IF ( lv_act_kst001 = 0 AND lv_act_kst003 = 0 AND lv_act_kst005 = 0 AND lv_act_kst007 = 0 AND lv_act_kst009 = 0 AND lv_act_kst011 = 0 ) OR <fs_output>-zact_cb = 0.
*      <fs_output>-zact_zc = <fs_output>-zact_cb.
*      <fs_output>-zact_fc  = 0.
*      <fs_output>-zact_rg  = 0.
*      <fs_output>-zact_dl  = 0.
*      <fs_output>-zact_zj  = 0.
*    ELSEIF lv_act_kst001 IS INITIAL AND lv_act_kst003 IS INITIAL AND lv_act_kst005 IS INITIAL AND lv_act_kst007 IS INITIAL AND lv_act_kst009 IS INITIAL AND lv_act_kst011 IS INITIAL .
*
*      <fs_output>-zact_zc = 0.
*      <fs_output>-zact_fc  = 0.
*      <fs_output>-zact_rg  = 0.
*      <fs_output>-zact_dl  = 0.
*      <fs_output>-zact_zj  = 0.
*    ELSE.
*      lv_act_sum = lv_act_kst001 + lv_act_kst003 + lv_act_kst005 + lv_act_kst007 + lv_act_kst009 + lv_act_kst011.
*      lv_act_a = lv_act_kst001 / lv_act_sum  .
*      lv_act_b = lv_act_kst003 / lv_act_sum  .
*      lv_act_c = lv_act_kst005 / lv_act_sum  .
*      lv_act_d = lv_act_kst007 / lv_act_sum  .
*      lv_act_e = lv_act_kst009 / lv_act_sum  .
*
*      <fs_output>-zact_zc = lv_act_a * <fs_output>-zact_cb.
*      <fs_output>-zact_fc = lv_act_b * <fs_output>-zact_cb.
*      <fs_output>-zact_rg = lv_act_c * <fs_output>-zact_cb.
*      <fs_output>-zact_dl = lv_act_d * <fs_output>-zact_cb.
*      <fs_output>-zact_zj = lv_act_e * <fs_output>-zact_cb.
*
*      <fs_output>-zact_qt = <fs_output>-zact_cb - <fs_output>-zact_zc - <fs_output>-zact_fc - <fs_output>-zact_rg - <fs_output>-zact_dl - <fs_output>-zact_zj.
*    ENDIF.
*    "其他手工分摊的成本E/F
*    lv_sum_actcb = lv_sum_actcb + <fs_output>-zact_cb.
*    IF <fs_output>-zmtype IS NOT INITIAL.
*      lv_sum_qrsrs = lv_sum_qrsrs + <fs_output>-qrsrsl.
*    ENDIF.
*
*    AT END OF monat.
*      gs_cost-bukrs = <fs_output>-bukrs.
*      gs_cost-gjahr = <fs_output>-gjahr.
*      gs_cost-monat = <fs_output>-monat.
*      gs_cost-qrsrsl = lv_sum_qrsrs.
*      gs_cost-zact_cb = lv_sum_actcb.
*
*      APPEND gs_cost TO gt_cost.
*      CLEAR gs_cost.
*      lv_sum_actcb = 0.
*      lv_sum_qrsrs = 0.
*    ENDAT.

  ENDLOOP.
  UNASSIGN <fs_output>.

  "其他手工分摊的成本
  "汇总物料编码(排除参与过实际成本运算的ACDOCA条目hsl

  DATA: gr_zljbs TYPE RANGE OF zeljbs,
        gw_zljbs LIKE LINE  OF gr_zljbs,
        lv_zljbs TYPE string.

* 宏定义
  DEFINE set_range.
    gw_zljbs-sign   = 'I'.
    gw_zljbs-option = 'CP'.
    gw_zljbs-low    = &1.
    APPEND gw_zljbs TO gr_zljbs.
  END-OF-DEFINITION.

  SELECT DISTINCT zljbs
    FROM ztfi3005
    INTO TABLE @DATA(lt_ztfi3005).

  SORT lt_ztfi3005 BY zljbs.

  LOOP AT lt_ztfi3005 INTO DATA(ls_ztfi3005).

    CLEAR lv_zljbs.
    lv_zljbs = '*' && ls_ztfi3005-zljbs && '*'.
    set_range lv_zljbs.

  ENDLOOP.

  SELECT DISTINCT a~bukrs,
                  a~gjahr,
                  a~monat,
                  a~matnr,
                  a~werks,
                  a~gsber
                    "公司代码、年度、期间、工厂、物料、业务范围
                FROM @gt_output AS a
                INTO TABLE @DATA(lt_out).
  SORT lt_out BY bukrs gjahr monat matnr werks gsber DESCENDING.

  SELECT DISTINCT rbukrs,
     a~gjahr,
     a~poper AS monat,
     a~matnr,
     a~werks,
     a~rbusa,
     hsl
*  hsl
  FROM acdoca AS a
*  FOR ALL ENTRIES IN  @ztfi3005
  FOR ALL ENTRIES IN @lt_out
  WHERE rbukrs  = @p_bukrs
  AND a~gjahr = @p_gjahr
  AND a~poper  IN @s_monat
  AND a~racct LIKE '6401%'
  AND a~matnr IN @gr_zljbs
  AND  (  a~poper <> @lt_out-monat OR a~werks <> @lt_out-werks  OR a~matnr <> @lt_out-matnr OR a~rbusa <> @lt_out-gsber  )
*  GROUP BY  rbukrs ,  a~gjahr ,  a~poper , a~matnr
  INTO TABLE @DATA(lt_acdoca).
  SORT lt_acdoca BY rbukrs gjahr monat matnr werks rbusa DESCENDING.

  LOOP AT lt_out INTO DATA(ls_same) .
    DELETE lt_acdoca  WHERE rbukrs = ls_same-bukrs AND gjahr = ls_same-gjahr AND werks = ls_same-werks AND  matnr = ls_same-matnr AND  rbusa = ls_same-gsber AND monat = ls_same-monat.
  ENDLOOP.

  SELECT a~rbukrs,
   a~gjahr,
   a~monat,
   a~matnr,
   SUM( hsl ) AS hsl
    FROM @lt_acdoca AS a
    GROUP BY  a~rbukrs ,  a~gjahr ,  a~monat , a~matnr
    INTO TABLE @DATA(lt_di).
  SORT lt_di BY rbukrs gjahr monat matnr DESCENDING.



  LOOP AT lt_di INTO DATA(ls_di).

    LOOP AT lt_ztfi3005 INTO DATA(ls_ztfi30052).

      CLEAR gs_ysgx.
      SEARCH ls_di-matnr FOR ls_ztfi30052-zljbs.
      IF sy-subrc = 0.
        READ TABLE gt_ysgx INTO gs_ysgx WITH KEY bukrs = ls_di-rbukrs gjahr = ls_di-gjahr monat = ls_di-monat zljbs = ls_ztfi30052-zljbs.
        IF sy-subrc = 0.

          gs_ysgx-hsl = gs_ysgx-hsl + ls_di-hsl.
          MODIFY gt_ysgx FROM gs_ysgx TRANSPORTING hsl WHERE bukrs = gs_ysgx-bukrs AND gjahr = gs_ysgx-gjahr AND monat = gs_ysgx-monat AND zljbs = gs_ysgx-zljbs.

        ELSE.

          gs_ysgx-bukrs = ls_di-rbukrs.
          gs_ysgx-gjahr = ls_di-gjahr.
          gs_ysgx-monat = ls_di-monat.
          gs_ysgx-hsl   = ls_di-hsl.
          gs_ysgx-zljbs = ls_ztfi30052-zljbs.
          APPEND gs_ysgx TO gt_ysgx.

        ENDIF.

      ENDIF.

    ENDLOOP.

  ENDLOOP.
  "汇总车型qrsrsl
  SELECT
   a~bukrs,
   a~gjahr,
   a~monat,
   b~zljbs,
   SUM( a~qrsrsl ) AS qrsrsl
   FROM @gt_output AS a
   JOIN ztfi3005 AS b ON substring( a~zmtype,1,2 ) = b~zdyzc
   GROUP BY bukrs , gjahr , monat , b~zljbs
   INTO TABLE @DATA(gt_fi).
  SORT gt_fi BY bukrs gjahr monat zljbs DESCENDING.

  CLEAR lv_sum_cost .
  CLEAR lv_qt_cost .
  "第一次分摊
  SORT gt_output BY bukrs gjahr monat zljbs zmtype.
  LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output3>) .

*    READ TABLE lt_all3005 INTO DATA(ls_all3005) WITH KEY zdyzc = <fs_output3>-zmtype+0(2) BINARY SEARCH.
*    IF sy-subrc = 0.
*      DATA(lv_ljbs) = ls_all3005-zljbs.
*    ENDIF.

    READ TABLE gt_ysgx INTO DATA(ls_ysgx) WITH KEY bukrs = <fs_output3>-bukrs gjahr = <fs_output3>-gjahr monat = <fs_output3>-monat zljbs = <fs_output3>-zljbs.
    IF sy-subrc = 0.
      DATA(lv_di) = ls_ysgx-hsl.
    ENDIF.

    READ TABLE gt_fi INTO DATA(gs_fi) WITH KEY bukrs = <fs_output3>-bukrs gjahr = <fs_output3>-gjahr monat = <fs_output3>-monat zljbs = <fs_output3>-zljbs.
    IF sy-subrc = 0 AND gs_fi-qrsrsl <> 0.
      DATA(lv_fi) = gs_fi-qrsrsl.
      <fs_output3>-zqt_cost = lv_di / lv_fi * <fs_output3>-qrsrsl.
    ENDIF.


    CLEAR lv_qt_cost.
    lv_qt_cost = <fs_output3>-zqt_cost.

    "倒挤
    AT END OF zljbs.

      <fs_output3>-zqt_cost = lv_di - lv_sum_cost.
      lv_sum_cost = 0.
      lv_qt_cost = 0.

    ENDAT.

    lv_sum_cost = lv_sum_cost + lv_qt_cost.
    CLEAR lv_di.
    CLEAR lv_fi.
  ENDLOOP.

  UNASSIGN <fs_output3>.



  "汇总实际成本E
  SELECT
    a~bukrs,
    a~gjahr,
    a~monat,
    SUM( a~zact_cb ) AS zact_cb
    FROM @gt_output AS a
    GROUP BY bukrs , gjahr , monat
    INTO TABLE @DATA(gt_e).
  SORT gt_e BY bukrs gjahr monat.
  "汇总车型字段不为空的所有行的确认收入数量F
  SELECT
   a~bukrs,
   a~gjahr,
   a~monat,
   SUM( qrsrsl ) AS qrsrsl
   FROM @gt_output AS a
   WHERE zmtype <> ''
   GROUP BY bukrs , gjahr , monat
   INTO TABLE @DATA(gt_f).
  SORT gt_f BY bukrs gjahr monat.


  "汇总已赋值的实际成本-手工分摊G
  SELECT
   a~bukrs,
   a~gjahr,
   a~monat,
   SUM( zqt_cost ) AS zqt_cost
   FROM @gt_output AS a
   GROUP BY bukrs , gjahr , monat
   INTO TABLE @DATA(gt_g).
  SORT gt_g BY bukrs gjahr monat.

  "其他手工分摊的成本D
  SELECT rbukrs,
    gjahr,
    poper AS monat,
    SUM( hsl ) AS hsl
    FROM acdoca

    WHERE rbukrs  = @p_bukrs
    AND gjahr = @p_gjahr
    AND poper  IN @s_monat
    AND racct LIKE '6401%'
    GROUP BY  rbukrs , gjahr ,poper
    INTO TABLE @DATA(lt_hsld).
  SORT lt_hsld BY rbukrs gjahr monat DESCENDING.

  LOOP AT lt_hsld INTO DATA(ls_have) WHERE hsl <> 0.
    READ TABLE gt_output INTO DATA(ls_out) WITH KEY bukrs = ls_have-rbukrs gjahr = ls_have-gjahr monat = ls_have-monat.
    IF sy-subrc <> 0 .

      DATA ls_null  TYPE ty_detial.
      ls_null-bukrs = ls_have-rbukrs.
      ls_null-gjahr = ls_have-gjahr.
      ls_null-monat = ls_have-monat.
      ls_null-zqt_cost = ls_have-hsl.
      APPEND ls_null TO gt_output.
      CLEAR ls_null.
    ENDIF.
  ENDLOOP.


  CLEAR lv_sum_cost .
  CLEAR lv_qt_cost .
  SORT gt_output BY bukrs gjahr monat zmtype.
  LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output2>) .

    "其他手工分摊的成本
    "D
    READ TABLE lt_hsld INTO DATA(ls_hsld) WITH KEY rbukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
    DATA(lv_d) = ls_hsld-hsl.
    CLEAR ls_hsld.

    "EFG
    READ TABLE gt_e INTO DATA(gs_e) WITH KEY bukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
    READ TABLE gt_f INTO DATA(gs_f) WITH KEY bukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
    READ TABLE gt_g INTO DATA(gs_g) WITH KEY bukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
    DATA(lv_f) = gs_f-qrsrsl.
    DATA(lv_e) = gs_e-zact_cb.
    DATA(lv_g) = gs_g-zqt_cost.
    CLEAR gs_e.
    CLEAR gs_f.
    CLEAR gs_g.

    IF <fs_output2>-zmtype IS NOT INITIAL.
      IF lv_f <> 0.
        <fs_output2>-zqt_cost = <fs_output2>-zqt_cost + ( lv_d - lv_e - lv_g ) / lv_f * <fs_output2>-qrsrsl.
      ENDIF.
*    ELSE.
*      <fs_output2>-zqt_cost = 0.
    ENDIF.
    CLEAR lv_qt_cost.
    lv_qt_cost = <fs_output2>-zqt_cost.
    "倒挤
    AT END OF monat.

      IF lv_f IS NOT INITIAL.
        <fs_output2>-zqt_cost =  lv_d - lv_e - lv_sum_cost.
      ELSEIF ( lv_d - lv_e - lv_g ) <> 0.
        IF <fs_output2>-zqt_cost IS  INITIAL .
          DATA ls_output  TYPE ty_detial.
          ls_output-bukrs = <fs_output2>-bukrs.
          ls_output-gjahr = <fs_output2>-gjahr.
          ls_output-monat = <fs_output2>-monat.
          ls_output-zqt_cost = lv_d - lv_e .
          INSERT ls_output INTO gt_output .
          CLEAR ls_output.
        ENDIF.
*        UPDATE gt_output FROM  ls_output.
      ENDIF.
      CLEAR lv_d .
      CLEAR lv_e .
      CLEAR lv_f .
      CLEAR lv_g .
      lv_sum_cost = 0.
      lv_qt_cost = 0.
    ENDAT.

    lv_sum_cost = lv_sum_cost + lv_qt_cost.

    "实际成本+实际成本-手工分摊
*    lv_act_cost = <fs_output2>-zqt_cost + <fs_output2>-zact_cb.

    IF <fs_output2>-zact_cb = 0 .
      <fs_output2>-zact_zc = 0.
      <fs_output2>-zact_fc  = 0.
      <fs_output2>-zact_rg  = 0.
      <fs_output2>-zact_dl  = 0.
      <fs_output2>-zact_zj  = 0.
    ELSE.
      "过账日期不为空 /(如果实际交互日期为空值,则取该行的年度、期间
      IF <fs_output2>-budat_mkpf IS INITIAL AND <fs_output2>-wadat_ist IS NOT INITIAL.

        READ TABLE lt_sjcb INTO DATA(ls_sjcb) WITH KEY  kalnr = <fs_output2>-kalnr bdatj = <fs_output2>-wadat_ist+0(4) poper = <fs_output2>-wadat_ist+4(2).
        IF ls_sjcb IS NOT INITIAL.
          lv_act_kst001 = ls_sjcb-kst001.
          lv_act_kst003 = ls_sjcb-kst003.
          lv_act_kst005 = ls_sjcb-kst005.
          lv_act_kst007 = ls_sjcb-kst007.
          lv_act_kst009 = ls_sjcb-kst009.
          lv_act_kst011 = ls_sjcb-kst011.
          CLEAR ls_sjcb.
        ENDIF.

      ELSE.

        READ TABLE lt_sjcb INTO DATA(ls_sjcb2) WITH KEY kalnr = <fs_output2>-kalnr
        bdatj = <fs_output2>-gjahr
        poper = <fs_output2>-monat.
        IF ls_sjcb2 IS NOT INITIAL.
          lv_act_kst001 = ls_sjcb2-kst001.
          lv_act_kst003 = ls_sjcb2-kst003.
          lv_act_kst005 = ls_sjcb2-kst005.
          lv_act_kst007 = ls_sjcb2-kst007.
          lv_act_kst009 = ls_sjcb2-kst009.
          lv_act_kst011 = ls_sjcb2-kst011.
          CLEAR ls_sjcb2.
        ENDIF.
      ENDIF.

    ENDIF.

    IF lv_act_kst001 = 0 AND  lv_act_kst003  = 0 AND   lv_act_kst005  = 0 AND   lv_act_kst007  = 0 AND   lv_act_kst009  = 0 AND   lv_act_kst011 = 0.

      <fs_output2>-zact_zc  = <fs_output2>-zact_cb.
      <fs_output2>-zact_fc  = 0.
      <fs_output2>-zact_rg  = 0.
      <fs_output2>-zact_dl  = 0.
      <fs_output2>-zact_zj  = 0.

    ELSE.

      "KST001+KST003+KST005+KST007+KST009+KST011
      CLEAR lv_act_sum.
      lv_act_sum = lv_act_kst001 + lv_act_kst003 + lv_act_kst005 + lv_act_kst007 + lv_act_kst009 + lv_act_kst011.
      "abcd
      lv_act_a = lv_act_kst001 / lv_act_sum  .
      lv_act_b = lv_act_kst003 / lv_act_sum  .
      lv_act_c = lv_act_kst005 / lv_act_sum  .
      lv_act_d = lv_act_kst007 / lv_act_sum  .
      lv_act_e = lv_act_kst009 / lv_act_sum  .
      "abcd *  (实际成本+实际成本-手工分摊)
      <fs_output2>-zact_zc  = lv_act_a  * <fs_output2>-zact_cb.
      <fs_output2>-zact_fc  = lv_act_b  * <fs_output2>-zact_cb.
      <fs_output2>-zact_rg  = lv_act_c  * <fs_output2>-zact_cb.
      <fs_output2>-zact_dl  = lv_act_d  * <fs_output2>-zact_cb.
      <fs_output2>-zact_zj  = lv_act_e  * <fs_output2>-zact_cb."lv_act_cost.
      "倒挤
      <fs_output2>-zact_qt = <fs_output2>-zact_cb - <fs_output2>-zact_zc - <fs_output2>-zact_fc - <fs_output2>-zact_rg - <fs_output2>-zact_dl - <fs_output2>-zact_zj.
    ENDIF.

*----------5.0所有数据处理完之后,再限制工厂、车型、业务范围
*    IF <fs_output2>-werks IN s_werks AND <fs_output2>-gsber = p_gjahr AND <fs_output2>-zmtype IN s_zmtype.
*      MOVE-CORRESPONDING <fs_output2> TO gs_detial.
*      APPEND gs_detial TO gt_detial.
*      CLEAR gs_detial.
*    ENDIF.
*去除matnr的前导零

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = <fs_output2>-matnr
      IMPORTING
        output = <fs_output2>-matnr.
  ENDLOOP.

  UNASSIGN <fs_output2>.
*----------5.0所有数据处理完之后,再限制工厂、车型、业务范围
  SELECT *
    FROM @gt_output AS a
    WHERE werks IN @s_werks
    AND gsber IN @s_gsber
    AND zmtype IN @s_zmtype
    INTO TABLE @DATA(lt_detial).
  MOVE-CORRESPONDING lt_detial TO gt_detial.
  IF  p_sum = 'X'.
*---------汇总取值逻辑
    SELECT a~bukrs            ,
           a~butxt            ,
           a~werks            ,
           a~gjahr            ,
           a~monat            ,
           a~zmtype           ,
           a~gsber            ,
           a~gtext            ,
           a~meins            ,
           a~waerk            ,
           a~kurrf            ,
           SUM( a~qrsrsl )  AS  qrsrsl    ,
           SUM( a~netwr )   AS netwr  ,
           SUM( a~mwsbp )   AS mwsbp   ,
           SUM( a~bzcb )    AS bzcb  ,
           SUM( a~zstan_zc ) AS zstan_zc,
           SUM( a~zstan_fc ) AS zstan_fc,
           SUM( a~zstan_rg ) AS zstan_rg,
           SUM( a~zstan_dl ) AS zstan_dl,
           SUM( a~zstan_zj ) AS zstan_zj,
           SUM( a~zstan_qt ) AS zstan_qt,
           SUM( a~zact_cb  ) AS zact_cb ,
           SUM( a~zact_zc  ) AS zact_zc ,
           SUM( a~zact_fc  ) AS zact_fc ,
           SUM( a~zact_rg  ) AS zact_rg ,
           SUM( a~zact_dl  ) AS zact_dl ,
           SUM( a~zact_zj  ) AS zact_zj ,
           SUM( a~zact_qt  ) AS zact_qt ,
           SUM( a~zqt_cost ) AS zqt_cost
      FROM @gt_output AS a
      WHERE werks IN @s_werks
    AND gsber IN @s_gsber
    AND zmtype IN @s_zmtype
      GROUP BY bukrs ,
               butxt ,
               werks ,
               gjahr ,
               monat ,
               zmtype,
               gsber ,
               gtext ,
               meins ,
               waerk ,
               kurrf
      INTO TABLE @DATA(lt_sum).
    MOVE-CORRESPONDING lt_sum TO gt_sum.

    LOOP AT gt_sum ASSIGNING FIELD-SYMBOL(<fs_sum>).
      IF <fs_sum>-qrsrsl = 0.
        <fs_sum>-zunit_sjcb  = 0  .
        <fs_sum>-zunit_zc    = 0  .
        <fs_sum>-zunit_fc    = 0  .
        <fs_sum>-zunit_zjrg  = 0  .
        <fs_sum>-zunit_dl    = 0  .
        <fs_sum>-zunit_zj    = 0  .
        <fs_sum>-zunit_qt    = 0  .
        <fs_sum>-zunit_cost  = 0  .
      ELSE.
        <fs_sum>-zunit_sjcb  = <fs_sum>-zact_cb  /  <fs_sum>-qrsrsl.
        <fs_sum>-zunit_zc    = <fs_sum>-zact_zc  /  <fs_sum>-qrsrsl.
        <fs_sum>-zunit_fc    = <fs_sum>-zact_fc  /  <fs_sum>-qrsrsl.
        <fs_sum>-zunit_zjrg  = <fs_sum>-zact_rg  /  <fs_sum>-qrsrsl.
        <fs_sum>-zunit_dl    = <fs_sum>-zact_dl  /  <fs_sum>-qrsrsl.
        <fs_sum>-zunit_zj    = <fs_sum>-zact_zj  /  <fs_sum>-qrsrsl.
        <fs_sum>-zunit_qt    = <fs_sum>-zact_qt  /  <fs_sum>-qrsrsl.
        <fs_sum>-zunit_cost  = <fs_sum>-zqt_cost /  <fs_sum>-qrsrsl.
      ENDIF.

    ENDLOOP.

    SORT gt_sum BY bukrs werks gjahr monat vgbel vgpos mblnr zeile.
  ENDIF.

  SORT gt_detial BY bukrs werks gjahr monat zmtype gsber.

  IF sy-batch = abap_true.
    PERFORM frm_to_excel.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_PF_STATUS
*&---------------------------------------------------------------------*
FORM set_pf_status1 USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDRD1' .
ENDFORM.

*&      Form  FRM_DIS_ALV
*&---------------------------------------------------------------------*
*       alv输出
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_dis_alv .

  DATA: lv_grid TYPE lvc_s_glay.

*  lv_grid-edt_cll_cb = 'X'.
  CHECK c_h <> 'X'.

  IF p_sum = 'X'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = 'SET_PF_STATUS1'
        i_grid_settings          = lv_grid
        is_layout_lvc            = gs_layout
        it_fieldcat_lvc          = gt_fieldcat
      TABLES
        t_outtab                 = gt_sum.
  ENDIF.
  IF p_detial = 'X'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = 'SET_PF_STATUS1'
        i_grid_settings          = lv_grid
        is_layout_lvc            = gs_layout
        it_fieldcat_lvc          = gt_fieldcat
      TABLES
        t_outtab                 = gt_detial.
  ENDIF.

ENDFORM.                "     FRM_ALV


*&---------------------------------------------------------------------*
*&      Form  FRM_SET_ALV
*&---------------------------------------------------------------------*
*       alv设置
*---------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_alv.
  DATA: l_colpos TYPE lvc_s_fcat-col_pos VALUE 0.

*&---------------------------------------------------------------------*
*&      定义宏
*&---------------------------------------------------------------------*
  DEFINE  macro_fill_fcat.
    CLEAR gs_fieldcat.
    &1 = &1 + 1.
    gs_fieldcat-col_pos       = &1.
    gs_fieldcat-fieldname     = &2.
    gs_fieldcat-ref_table     = &3.
    gs_fieldcat-ref_field     = &4.    "内表中数量参照字段
    gs_fieldcat-coltext       = &5.
    gs_fieldcat-outputlen       = &6.
    APPEND gs_fieldcat TO gt_fieldcat.
  END-OF-DEFINITION.

  FIELD-SYMBOLS: <fs_fieldcat> TYPE lvc_s_fcat.

  CLEAR gt_fieldcat.
  IF p_detial = 'X'.
    macro_fill_fcat:
*                     l_colpos 'BOX'      '' '' '',
                     l_colpos 'BUKRS'      '' '' '公司代码' '',
                     l_colpos 'BUTXT'      '' '' '公司代码描述' '',
                     l_colpos 'WERKS'      '' '' '工厂' '',
                     l_colpos 'GJAHR'      '' '' '年度' '',
                     l_colpos 'MONAT'      '' '' '期间' '',
                     l_colpos 'VBELN'      '' '' '发票号' '',
                     l_colpos 'POSNR'      '' '' '发票行' '',
                     l_colpos 'FKDAT'      '' '' '开票日期' '',
                     l_colpos 'KUNAG'      '' '' '客户编码' '',
                     l_colpos 'NAME1'      '' '' '客户名称' '',
                     l_colpos 'VGBEL'      '' '' '交货单' '',
                     l_colpos 'VGPOS'      '' '' '交货单行' '',
                     l_colpos 'WADAT_IST'   '' '' '实际交货日期' '',
                     l_colpos 'MBLNR'      '' '' '物料凭证号 ' '',
                     l_colpos 'ZEILE'      '' '' '物料凭证行' '',
                     l_colpos 'BUDAT_MKPF' '' '' '过账日期' '',
                     l_colpos 'MATNR'      '' '' '物料号' '40',
                     l_colpos 'MAKTX'      '' '' '物料描述' '',
                     l_colpos 'ZMTYPE'     '' '' '车型' '',
                     l_colpos 'SERNR'      '' '' 'VIN码' '',
                     l_colpos 'GSBER'      '' '' '业务范围' '',
                     l_colpos 'GTEXT'      '' '' '业务范围描述' '',
                     l_colpos 'MEINS'      '' '' '单位' '',
                     l_colpos 'WAERK'      '' '' '币种' '',
                     l_colpos 'KURRF'      '' '' '汇率' '',
                     l_colpos 'QRSRSL'     '' '' '确认收入数量' '',
                     l_colpos 'NETWR'      '' '' '收入金额' '',
                     l_colpos 'MWSBP'      '' '' '税额' '',
                     l_colpos 'BZCB'       '' '' '标准成本' '',
                     l_colpos 'ZSTAN_ZC'   '' '' '原材料-主材(标准)' '',
                     l_colpos 'ZSTAN_FC'   '' '' '原材料-辅材(标准)' '',
                     l_colpos 'ZSTAN_RG'   '' '' '直接人工(标准)' '',
                     l_colpos 'ZSTAN_DL'   '' '' '制费-动力(标准)' '',
                     l_colpos 'ZSTAN_ZJ'   '' '' '制费-折旧(标准)' '',
                     l_colpos 'ZSTAN_QT'   '' '' '制费-其他(标准)' '',
                     l_colpos 'ZACT_CB'    '' '' '实际成本' '',
                     l_colpos 'ZQT_COST'   '' '' '实际成本-手工分摊' '',
                     l_colpos 'ZACT_ZC'    '' '' '原材料-主材(实际)' '',
                     l_colpos 'ZACT_FC'    '' '' '原材料-辅材(实际)' '',
                     l_colpos 'ZACT_RG'    '' '' '直接人工(实际)' '',
                     l_colpos 'ZACT_DL'    '' '' '制费-动力(实际)' '',
                     l_colpos 'ZACT_ZJ'    '' '' '制费-折旧(实际)' '',
                     l_colpos 'ZACT_QT'    '' '' '制费-其他(实际)' ''
                     .


  ENDIF.
  IF p_sum = 'X'.
    macro_fill_fcat:
*                     l_colpos 'BOX'      '' '' '',
                     l_colpos 'BUKRS'      '' '' '公司代码' '',
                     l_colpos 'BUTXT'      '' '' '公司代码描述' '',
                     l_colpos 'WERKS'      '' '' '工厂' '',
                     l_colpos 'GJAHR'      '' '' '年度' '',
                     l_colpos 'MONAT'      '' '' '期间' '',
                     l_colpos 'ZMTYPE'     '' '' '车型' '',
                     l_colpos 'GSBER'      '' '' '业务范围' '',
                     l_colpos 'GTEXT'      '' '' '业务范围描述' '',
                     l_colpos 'MEINS'      '' '' '单位' '',
                     l_colpos 'WAERK'      '' '' '币种' '',
                     l_colpos 'KURRF'      '' '' '汇率' '',
                     l_colpos 'QRSRSL'     '' '' '确认收入数量' '',
                     l_colpos 'NETWR'      '' '' '收入金额' '',
                     l_colpos 'MWSBP'      '' '' '税额' '',
                     l_colpos 'BZCB'       '' '' '标准成本' '',
                     l_colpos 'ZSTAN_ZC'   '' '' '原材料-主材(标准)' '',
                     l_colpos 'ZSTAN_FC'   '' '' '原材料-辅材(标准)' '',
                     l_colpos 'ZSTAN_RG'   '' '' '直接人工(标准)' '',
                     l_colpos 'ZSTAN_DL'   '' '' '制费-动力(标准)' '',
                     l_colpos 'ZSTAN_ZJ'   '' '' '制费-折旧(标准)' '',
                     l_colpos 'ZSTAN_QT'   '' '' '制费-其他(标准)' '',
                     l_colpos 'ZACT_CB'    '' '' '实际成本' '',
                     l_colpos 'ZQT_COST'   '' '' '实际成本-手工分摊' '',
                     l_colpos 'ZACT_ZC'    '' '' '原材料-主材(实际)' '',
                     l_colpos 'ZACT_FC'    '' '' '原材料-辅材(实际)' '',
                     l_colpos 'ZACT_RG'    '' '' '直接人工(实际)' '',
                     l_colpos 'ZACT_DL'    '' '' '制费-动力(实际)' '',
                     l_colpos 'ZACT_ZJ'    '' '' '制费-折旧(实际)' '',
                     l_colpos 'ZACT_QT'    '' '' '制费-其他(实际)' '',
                     l_colpos  'ZUNIT_SJCB' '' '' '单位-实际成本' '',
                     l_colpos  'ZUNIT_COST' '' '' '单位-实际成本-手工分摊' '',
                     l_colpos  'ZUNIT_ZC'   '' '' '单位-原材料-主材(实际)'  '',
                     l_colpos  'ZUNIT_FC'   '' '' '单位-原材料-辅材(实际)'  '',
                     l_colpos  'ZUNIT_ZJRG' '' '' '单位-直接人工(实际)' '',
                     l_colpos  'ZUNIT_DL'   '' '' '单位-制费-动力(实际) ' '' ,
                     l_colpos  'ZUNIT_ZJ'   '' '' '单位-制费-折旧(实际)'  '',
                     l_colpos  'ZUNIT_QT'   '' '' '单位-制费-其他(实际)' ''
                     .


  ENDIF.

  CLEAR gs_layout.
  gs_layout-zebra = 'X'."设置斑马线
  gs_layout-sel_mode = 'A'.
*  gs_layout-no_rowmark = 'X'.
  gs_layout-cwidth_opt = 'X'."优化列宽设置
ENDFORM.

*&---------------------------------------------------------------------*
*& FORM FRM_LOAD
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_load .

  IF c_h = abap_true."后台执行

    DATA: lv_job_name         LIKE tbtco-jobname,     "作业名
          lv_job_nr           LIKE tbtco-jobcount,    "作业号
          lv_job_released     TYPE c,
          lv_job_start_sofort TYPE c,
          lv_print_parameters TYPE pri_params.

    DATA:lt_rspar        TYPE TABLE OF rsparams,
         lt_rspar_buffer TYPE TABLE OF rsparams,
         lw_line         LIKE LINE OF lt_rspar.
    "如果是要传给PARAMETER  根据需求设置屏幕参数
    "公司代码
    lw_line-selname = 'P_BUKRS'.
    lw_line-kind    = 'P'.
    lw_line-sign    = 'I'.
    lw_line-option  = 'EQ'.
    lw_line-low     = p_bukrs.
    APPEND lw_line TO lt_rspar.

    lw_line-selname = 'P_GJAHR'.
    lw_line-kind    = 'P'.
    lw_line-sign    = 'I'.
    lw_line-option  = 'EQ'.
    lw_line-low     = p_gjahr.
    APPEND lw_line TO lt_rspar.

    lw_line-selname = 'P_DETIAL'.
    lw_line-kind    = 'P'.
    lw_line-sign    = 'I'.
    lw_line-option  = 'EQ'.
    lw_line-low     = p_detial.
    APPEND lw_line TO lt_rspar.

    "R_PDF
    lw_line-selname = 'P_SUM'.
    lw_line-kind    = 'P'.
    lw_line-sign    = 'I'.
    lw_line-option  = 'EQ'.
    lw_line-low     = p_sum.
    APPEND lw_line TO lt_rspar.

*    lw_line-selname = 'C_EXCEL'.
*    lw_line-kind    = 'P'.
*    lw_line-sign    = 'I'.
*    lw_line-option  = 'EQ'.
*    lw_line-low     = c_excel.
*    APPEND lw_line TO lt_rspar.

    "p_eline
*    lw_line-selname = 'P_ELINE'.
*    lw_line-kind    = 'P'.
*    lw_line-sign    = 'I'.
*    lw_line-option  = 'EQ'.
*    lw_line-low     = p_eline.
*    APPEND lw_line TO lt_rspar.

    lt_rspar_buffer = CORRESPONDING #( s_werks[] ).
    LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_werks>).
      <fs_werks>-selname = 'S_WERKS'.
      <fs_werks>-kind = 'S'.
    ENDLOOP.

    APPEND LINES OF lt_rspar_buffer TO lt_rspar.

    lt_rspar_buffer = CORRESPONDING #( s_monat[] ).
    LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_monat>).
      <fs_monat>-selname = 'S_MONAT'.
      <fs_monat>-kind = 'S'.
    ENDLOOP.

    APPEND LINES OF lt_rspar_buffer TO lt_rspar.

    lt_rspar_buffer = CORRESPONDING #( s_zmtype[] ).
    LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_zmtype>).
      <fs_zmtype>-selname = 'S_ZMTYPE'.
      <fs_zmtype>-kind = 'S'.
    ENDLOOP.

    APPEND LINES OF lt_rspar_buffer TO lt_rspar.

    lt_rspar_buffer = CORRESPONDING #( s_gsber[] ).
    LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_gsber>).
      <fs_gsber>-selname = 'S_GSBER'.
      <fs_gsber>-kind = 'S'.
    ENDLOOP.

    APPEND LINES OF lt_rspar_buffer TO lt_rspar.


    lv_job_name = 'ZFIR202' .
    "打开JOB 通过JOB NAME 获得JOB号
    CALL FUNCTION 'JOB_OPEN'
      EXPORTING
        jobname          = lv_job_name
      IMPORTING
        jobcount         = lv_job_nr
      EXCEPTIONS
        cant_create_job  = 1
        invalid_job_data = 2
        jobname_missing  = 3
        OTHERS           = 4.

    IF sy-subrc = 0.
      SUBMIT (lv_job_name)
          WITH SELECTION-TABLE  lt_rspar
          USER sy-uname          " MANDATORY
         VIA JOB lv_job_name NUMBER lv_job_nr AND RETURN.
      "运行结束  关闭JOB
      IF sy-subrc = 0.
        CALL FUNCTION 'JOB_CLOSE'
          EXPORTING
            jobcount             = lv_job_nr
            jobname              = lv_job_name
            strtimmed            = 'X'
          IMPORTING
            job_was_released     = lv_job_released
          EXCEPTIONS
            cant_start_immediate = 1
            invalid_startdate    = 2
            jobname_missing      = 3
            job_close_failed     = 4
            job_nosteps          = 5
            job_notex            = 6
            lock_failed          = 7
            OTHERS               = 8.
        IF syst-subrc <> 0.
          MESSAGE '关闭后台作业出错' TYPE 'I'.
        ELSE.
          MESSAGE '后台JOB开始运行' TYPE 'I'.
        ENDIF.
      ENDIF.
    ENDIF.

    RETURN.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  TO_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_to_excel.
  IF p_detial = 'X'.
    CHECK gt_detial IS NOT INITIAL.
  ENDIF.

  IF p_sum = 'X'.
    CHECK gt_sum IS NOT INITIAL.
  ENDIF.


*&-------------------------------------------------*
*& 后台执行
*&-------------------------------------------------*
  DATA: lt_line TYPE ztts_lines.
  CONSTANTS: c_key TYPE i VALUE 26101957."密钥
  CONSTANTS: c_pwd(10) VALUE 'Hand@2018'.
  CONSTANTS: c_user(6) VALUE 'SAPFTP'.
  CONSTANTS: c_host(14) VALUE '10.88.61.117'.
*  *SAPFTPA:表示以SAP服务器为目的地,上传与下载都会放在SAP服务器上;SAPFTP:以Client端为目的地
  CONSTANTS: c_rfcdest LIKE rfcdes-rfcdest VALUE 'SAPFTPA'.
  DATA:lv_pwd(40).
  DATA:lv_command(99),
       lv_len         TYPE i,
       lv_hdl         TYPE i.
  DATA: BEGIN OF lt_result OCCURS 0,
          line(100) TYPE c,
        END OF lt_result.

  DATA:lv_filename TYPE char128.
  DATA oref TYPE REF TO cx_root.

  DATA: BEGIN OF lt_data_txt OCCURS 0 ,
          line(500),
        END OF lt_data_txt.

  DATA: BEGIN OF lt_data_binary OCCURS 0,
          x(2000) TYPE x,
        END OF lt_data_binary.
  DATA: lv_binary_len TYPE i.
  DATA:  l_codepage(4) TYPE n .
  DATA:  l_encoding(20).

  CONSTANTS:
    c_tab      TYPE c VALUE cl_bcs_convert=>gc_tab,
    c_crlf     TYPE c VALUE cl_bcs_convert=>gc_crlf,
    c_mimetype TYPE char64 VALUE 'APPLICATION/MSEXCEL;charset=utf-16le'.
  DATA: v_xattach TYPE xstring.
  DATA: lv_string TYPE string.
  DATA lv_shsl TYPE string.
  DATA lv_hhsl  TYPE string.
  DATA lv_netpr TYPE string.


*  IF sy-batch = abap_true."后台执行
  " 将密码转化为SAP的格式
  lv_len = strlen( c_pwd ).
  CALL FUNCTION 'HTTP_SCRAMBLE'
    EXPORTING
      source      = c_pwd
      sourcelen   = lv_len
      key         = c_key
    IMPORTING
      destination = lv_pwd. "加密密码

  TRY .
      CALL FUNCTION 'FTP_CONNECT'
        EXPORTING
          user            = c_user
          password        = lv_pwd
          host            = c_host
          rfc_destination = c_rfcdest
        IMPORTING
          handle          = lv_hdl.
    CATCH cx_root INTO oref.
      MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
      RETURN.
  ENDTRY.

  lv_command = 'cd' && | | && p_bukrs && 'ZFIR202 ' && sy-datum && sy-uzeit.

  TRY .
      PERFORM frm_ftp_commond TABLES lt_result USING lv_command lv_hdl.
      IF sy-subrc <> 0.
        lv_command = 'mkdir' && | | && p_bukrs && 'ZFIR202 ' && sy-datum && sy-uzeit.
        PERFORM frm_ftp_commond TABLES lt_result USING lv_command lv_hdl.
        lv_command = 'cd' && | | && p_bukrs && 'ZFIR202 ' && sy-datum && sy-uzeit.
        PERFORM frm_ftp_commond TABLES lt_result USING lv_command lv_hdl.
      ENDIF.
    CATCH cx_root INTO oref.
      MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
      PERFORM frm_disconnect USING lv_hdl c_rfcdest.
      RETURN.
  ENDTRY.

*  ENDIF.

*&-------------------------------------------------*

  DATA: g_fm_name      TYPE rs38l_fnam.
  DATA: lw_result      TYPE ssfcrescl,
        gw_result      TYPE ssfcrescl,
        gw_output      TYPE ssfcompop,
        g_filename     TYPE string,
        g_bin_filesize TYPE i,
        gt_lines       TYPE STANDARD TABLE OF tline,
        gw_control     TYPE ssfctrlop.

  DATA: lt_item  TYPE zttfi_05_item,
        lw_item  TYPE ty_detial,
        lw_head  TYPE zsfi_05_head,
        lv_racct TYPE string,
        lv_char2 TYPE char4.

  DATA: lt_bin TYPE TABLE OF xstring,
        l_bin  TYPE xstring.

  DATA: lv_index TYPE i.

  DATA: lv_fsum  TYPE zpercentage.
  DATA: lv_csum  TYPE zpercentage.
  DATA: lv_tnum TYPE i.

  DATA l_desktopdirectory TYPE string.

  IF p_sum = 'X'.
    lv_tnum = lines( gt_sum ).
    MOVE-CORRESPONDING gt_sum TO it_out01.
  ELSEIF p_detial = 'X'.
    lv_tnum = lines( gt_detial ).
    MOVE-CORRESPONDING gt_detial TO it_out01.
  ENDIF.

  DATA(lv_path_name) = |mx{ sy-datum }-{ sy-uzeit }|.

  "获取公司描述
  SELECT SINGLE bukrs, butxt FROM t001 INTO @DATA(lw_t001) WHERE bukrs = @p_bukrs AND spras = @sy-langu.

  DATA: lv_lines        TYPE i,
        lv_suffix       TYPE i,
        lv_flag         TYPE c VALUE abap_false,
        i_page          TYPE string,
        e_page          TYPE string,
        i_page_total    TYPE string,
        lv_mod          TYPE i,
        lt_string_table TYPE string_table,
        lv_racct_la     TYPE string,
        lv_total        TYPE string,
        lv_de_head      TYPE string,
        lv_sum_head     TYPE string
        .

*  IF p_eline IS INITIAL.
  DATA(p_eline) = 60000 .
*  ENDIF.


  CONCATENATE lv_de_head
      '公司代码'       c_tab
      '公司代码描述'   c_tab
      '工厂'           c_tab
      '年度'           c_tab
      '期间'           c_tab
      '发票号'         c_tab
      '发票行'         c_tab
      '开票日期'       c_tab
      '客户编码'       c_tab
      '客户中文名称'       c_tab
      '交货单'         c_tab
      '交货单行'       c_tab
       '实际交货日期'  c_tab
      '物料凭证号 '    c_tab
      '物料凭证行'     c_tab
      '过账日期'       c_tab
      '物料号'         c_tab
      '物料描述'       c_tab
      '车型'           c_tab
      'VIN码'          c_tab
      '业务范围'       c_tab
      '业务范围描述'   c_tab
      '单位'           c_tab
      '币种'           c_tab
      '汇率'           c_tab
      '确认收入数量'   c_tab
      '收入金额'       c_tab
      '税额'           c_tab
      '标准成本'       c_tab
      '原材料-主材(标准)'    c_tab
      '原材料-辅材(标准)'    c_tab
      '直接人工(标准)'       c_tab
      '制费-动力(标准)'      c_tab
      '制费-折旧(标准)'      c_tab
      '制费-其他(标准)'      c_tab
      '实际成本'               c_tab
      '实际成本-手工分摊'      c_tab
      '原材料-主材(实际)'    c_tab
      '原材料-辅材(实际)'    c_tab
      '直接人工(实际)'       c_tab
      '制费-动力(实际)'      c_tab
      '制费-折旧(实际)'      c_tab
      '制费-其他(实际)'      c_crlf
                   INTO lv_de_head.


  CONCATENATE lv_sum_head
    '公司代码'           c_tab
    '公司代码描述'        c_tab
    '工厂'            c_tab
    '年度'            c_tab
    '期间'           c_tab
    '车型'        c_tab
    '业务范围'          c_tab
    '业务范围描述'        c_tab
    '单位'         c_tab
    '币种'         c_tab
    '汇率'       c_tab
    '确认收入数量'          c_tab
    '收入金额'         c_tab
    '税额'          c_tab
    '标准成本'          c_tab
    '原材料-主材(标准)'          c_tab
    '原材料-辅材(标准)'           c_tab
    '直接人工(标准)'            c_tab
    '制费-动力(标准)'         c_tab
    '制费-折旧(标准)'     c_tab
    '制费-其他(标准)'          c_tab
    '实际成本'           c_tab
    '实际成本-手工分摊'           c_tab
    '原材料-主材(实际)'       c_tab
    '原材料-辅材(实际)'         c_tab
    '直接人工(实际)'           c_tab
    '制费-动力(实际)'         c_tab
    '制费-折旧(实际)'   c_tab
    '制费-其他(实际)'    c_tab
     '单位-实际成本'    c_tab
     '单位-实际成本-手工分摊'     c_tab
     '单位-原材料-主材(实际)'     c_tab
     '单位-原材料-辅材(实际)'     c_tab
     '单位-直接人工(实际)'        c_tab
     '单位-制费-动力(实际) '    c_tab
     '单位-制费-折旧(实际)'    c_tab
     '单位-制费-其他(实际)'   c_crlf

                 INTO lv_sum_head.

  LOOP AT it_out01 ASSIGNING FIELD-SYMBOL(<fs_out01>).

    lv_index = lv_index + 1.
    lv_fsum = floor( lv_index / p_eline ).
    lv_csum = ceil( lv_index / p_eline ).

    CLEAR is_excel.
    MOVE-CORRESPONDING <fs_out01> TO is_excel.

    IF p_detial = 'X'.
      IF lv_index = 1 OR lv_flag = abap_true.
        CONCATENATE lv_string
                    lv_de_head
        INTO lv_string.
        lv_flag = abap_false.
      ENDIF.


      CONCATENATE lv_string
                  is_excel-bukrs       c_tab
                  is_excel-butxt       c_tab
                  is_excel-werks       c_tab
                  is_excel-gjahr       c_tab
                  is_excel-monat       c_tab
                  is_excel-vbeln       c_tab
                  is_excel-posnr       c_tab
                  is_excel-fkdat       c_tab
                  is_excel-kunag       c_tab
                  is_excel-name1       c_tab
                  is_excel-vgbel       c_tab
                  is_excel-vgpos       c_tab
                  is_excel-wadat_ist   c_tab
                  is_excel-mblnr       c_tab
                  is_excel-zeile       c_tab
                  is_excel-budat_mkpf   c_tab
                  is_excel-matnr       c_tab
                  is_excel-maktx       c_tab
                  is_excel-zmtype      c_tab
                  is_excel-sernr       c_tab
                  is_excel-gsber       c_tab
                  is_excel-gtext       c_tab
                  is_excel-meins       c_tab
                  is_excel-waerk       c_tab
                  is_excel-kurrf       c_tab
                  is_excel-qrsrsl      c_tab
                  is_excel-netwr       c_tab
                  is_excel-mwsbp       c_tab
                  is_excel-bzcb        c_tab
                  is_excel-zstan_zc    c_tab
                  is_excel-zstan_fc    c_tab
                  is_excel-zstan_rg    c_tab
                  is_excel-zstan_dl    c_tab
                  is_excel-zstan_zj    c_tab
                  is_excel-zstan_qt    c_tab
                  is_excel-zact_cb     c_tab
                  is_excel-zqt_cost    c_tab
                  is_excel-zact_zc     c_tab
                  is_excel-zact_fc     c_tab
                  is_excel-zact_rg     c_tab
                  is_excel-zact_dl     c_tab
                  is_excel-zact_zj     c_tab
                  is_excel-zact_qt     c_crlf
                  INTO lv_string.
    ELSEIF p_sum = 'X'.

      IF lv_index = 1 OR lv_flag = abap_true.
        CONCATENATE lv_string
                    lv_sum_head
        INTO lv_string.
        lv_flag = abap_false.
      ENDIF.
      CONCATENATE lv_string
                is_excel-bukrs  c_tab
                is_excel-butxt  c_tab
                is_excel-werks  c_tab
                is_excel-gjahr  c_tab
                is_excel-monat  c_tab
                is_excel-zmtype        c_tab
                is_excel-gsber         c_tab
                is_excel-gtext         c_tab
                is_excel-meins         c_tab
                is_excel-waerk         c_tab
                is_excel-kurrf      c_tab
                is_excel-qrsrsl        c_tab
                is_excel-netwr         c_tab
                is_excel-mwsbp        c_tab
                is_excel-bzcb          c_tab
                is_excel-zstan_zc      c_tab
                is_excel-zstan_fc      c_tab
                is_excel-zstan_rg      c_tab
                is_excel-zstan_dl      c_tab
                is_excel-zstan_zj      c_tab
                is_excel-zstan_qt      c_tab
                is_excel-zact_cb       c_tab
                is_excel-zqt_cost      c_tab
                is_excel-zact_zc      c_tab
                is_excel-zact_fc      c_tab
                is_excel-zact_rg      c_tab
                is_excel-zact_dl      c_tab
                is_excel-zact_zj      c_tab
                is_excel-zact_qt      c_tab
                is_excel-zunit_sjcb    c_tab
                is_excel-zunit_cost    c_tab
                is_excel-zunit_zc     c_tab
                is_excel-zunit_fc     c_tab
                is_excel-zunit_zjrg    c_tab
                is_excel-zunit_dl     c_tab
                is_excel-zunit_zj     c_tab
                is_excel-zunit_qt     c_crlf
                INTO lv_string.
    ENDIF.



    IF ( lv_index = lv_tnum ) OR ( lv_index = p_eline ) OR ( lv_fsum >= lv_csum ) .


      lv_suffix = lv_suffix + 1.

      IF p_detial = 'X'.
        lv_char2 = 'mx'.
*        CONCATENATE lv_string
*                    is_excel-bukrs       c_tab
*                    is_excel-butxt       c_tab
*                    is_excel-werks       c_tab
*                    is_excel-gjahr       c_tab
*                    is_excel-monat       c_tab
*                    is_excel-vbeln       c_tab
*                    is_excel-posnr       c_tab
*                    is_excel-fkdat       c_tab
*                    is_excel-vgbel       c_tab
*                    is_excel-vgpos       c_tab
*                    is_excel-wadat_ist   c_tab
*                    is_excel-mblnr       c_tab
*                    is_excel-zeile       c_tab
*                    is_excel-budat_mkpf   c_tab
*                    is_excel-matnr       c_tab
*                    is_excel-maktx       c_tab
*                    is_excel-zmtype      c_tab
*                    is_excel-sernr       c_tab
*                    is_excel-gsber       c_tab
*                    is_excel-gtext       c_tab
*                    is_excel-meins       c_tab
*                    is_excel-waerk       c_tab
*                    is_excel-kurrf       c_tab
*                    is_excel-qrsrsl      c_tab
*                    is_excel-netwr       c_tab
*                    is_excel-mwsbp       c_tab
*                    is_excel-bzcb        c_tab
*                    is_excel-zstan_zc    c_tab
*                    is_excel-zstan_fc    c_tab
*                    is_excel-zstan_rg    c_tab
*                    is_excel-zstan_dl    c_tab
*                    is_excel-zstan_zj    c_tab
*                    is_excel-zstan_qt    c_tab
*                    is_excel-zact_cb     c_tab
*                    is_excel-zqt_cost    c_tab
*                    is_excel-zact_zc     c_tab
*                    is_excel-zact_fc     c_tab
*                    is_excel-zact_rg     c_tab
*                    is_excel-zact_dl     c_tab
*                    is_excel-zact_zj     c_tab
*                    is_excel-zact_qt     c_crlf
*                    INTO lv_string.
      ELSEIF p_sum = 'X'.
        lv_char2 = 'hz'.
*        CONCATENATE lv_string
*                  is_excel-bukrs  c_tab
*                  is_excel-butxt  c_tab
*                  is_excel-werks  c_tab
*                  is_excel-gjahr  c_tab
*                  is_excel-monat  c_tab
*                  is_excel-zmtype        c_tab
*                  is_excel-gsber         c_tab
*                  is_excel-gtext         c_tab
*                  is_excel-meins         c_tab
*                  is_excel-waerk         c_tab
*                  is_excel-kurrf         c_tab
*                  is_excel-qrsrsl        c_tab
*                  is_excel-netwr         c_tab
*                  is_excel-mwsbp         c_tab
*                  is_excel-bzcb          c_tab
*                  is_excel-zstan_zc      c_tab
*                  is_excel-zstan_fc      c_tab
*                  is_excel-zstan_rg      c_tab
*                  is_excel-zstan_dl      c_tab
*                  is_excel-zstan_zj      c_tab
*                  is_excel-zstan_qt      c_tab
*                  is_excel-zact_cb       c_tab
*                  is_excel-zqt_cost      c_tab
*                  is_excel-zact_zc       c_tab
*                  is_excel-zact_fc       c_tab
*                  is_excel-zact_rg       c_tab
*                  is_excel-zact_dl       c_tab
*                  is_excel-zact_zj       c_tab
*                  is_excel-zact_qt       c_tab
*                  is_excel-zunit_sjcb    c_tab
*                  is_excel-zunit_cost    c_tab
*                  is_excel-zunit_zc      c_tab
*                  is_excel-zunit_fc      c_tab
*                  is_excel-zunit_zjrg    c_tab
*                  is_excel-zunit_dl      c_tab
*                  is_excel-zunit_zj      c_tab
*                  is_excel-zunit_qt      c_crlf
*                  INTO lv_string.
      ENDIF.

      CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
        EXPORTING
          text     = lv_string
          mimetype = c_mimetype
        IMPORTING
          buffer   = v_xattach
        EXCEPTIONS
          failed   = 1
          OTHERS   = 2.
      IF sy-subrc = 0.
        CONCATENATE cl_abap_char_utilities=>byte_order_mark_little
        v_xattach INTO v_xattach IN BYTE MODE.
      ENDIF.
      CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
        EXPORTING
          buffer     = v_xattach
        TABLES
          binary_tab = lt_line.

      DESCRIBE TABLE lt_line LINES DATA(lv_num).
      lv_binary_len = lv_num * 255.


      IF lv_suffix IS NOT INITIAL.
        lv_filename = p_bukrs && '-' && p_gjahr && '-' && lv_char2 && s_monat-low && s_monat-high && '(' && lv_suffix && ')' && '.xls'.
      ELSE.
        lv_filename = p_bukrs && '-' && p_gjahr && '-' && lv_char2 && s_monat-low && s_monat-high && '.xls'.
      ENDIF.

      TRY .
          CALL FUNCTION 'FTP_R3_TO_SERVER'
            EXPORTING
              handle        = lv_hdl
              fname         = lv_filename
              blob_length   = lv_binary_len
            TABLES
              blob          = lt_line "二进制输出
            EXCEPTIONS
              tcpip_error   = 1
              command_error = 2
              data_error    = 3.

          IF sy-subrc = 0.
            WRITE:/ '上传成功:' , lv_filename .
            lv_flag = abap_true.
          ELSE.
            WRITE:/ '上传时发生了错误:' , lv_filename .
          ENDIF.

        CATCH cx_root INTO oref.
          MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
          WRITE:/ '上传时发生了错误' , lv_filename .
          "RETURN.
      ENDTRY.

      CLEAR: lt_line, lv_string, v_xattach.

    ENDIF.

  ENDLOOP.

*  IF sy-batch = abap_true.
  PERFORM frm_disconnect USING lv_hdl c_rfcdest.
*  ENDIF.

ENDFORM.
*
**&---------------------------------------------------------------------*
**& Form FRM_DISCONNECT
**&---------------------------------------------------------------------*
**& text
**&---------------------------------------------------------------------*
**&      --> LV_HDL
**&      --> C_RFCDEST
**&---------------------------------------------------------------------*
FORM frm_disconnect  USING    pv_hdl
                              pv_rfcdest.
  "关闭SAP与其他系统的连接
  CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
      handle = pv_hdl.

  "关闭SAP与其他系统的RFC连接.
  CALL FUNCTION 'RFC_CONNECTION_CLOSE'
    EXPORTING
      destination = pv_rfcdest
    EXCEPTIONS
      OTHERS      = 1.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FTP_COMMOND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_RESULT
*&      --> LV_COMMAND
*&      --> LV_HDL
*&---------------------------------------------------------------------*
FORM frm_ftp_commond  TABLES   pt_result TYPE table
                      USING    pv_command
                               pv_hdl.
  CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        = pv_hdl
      command       = pv_command
    TABLES
      data          = pt_result
    EXCEPTIONS
      error_message = 99
      OTHERS        = 34.
ENDFORM.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值