• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
^ω^SAp傻X^o^
博客园    首页    新随笔    联系   管理    订阅  订阅
自动清账
REPORT zfid001.

TYPE-POOLS: slis.
TABLES: bseg,bkpf,knb1,lfb1,knvv.",
************************************************************************
*                       定义类型
************************************************************************

* 定义用与转换的类型
TYPES: BEGIN OF ty_out,
         object TYPE char4,
         lifnr TYPE char10,
         budat TYPE budat,
         belnr TYPE bseg-belnr,

        checkbox TYPE c LENGTH 1,
        cellcolor TYPE lvc_t_scol,
  END OF ty_out.

************************************************************************
*                    声明内表、工作区和全局变量
************************************************************************
DATA: ts_out TYPE STANDARD TABLE OF ty_out WITH HEADER LINE,
      tl_out LIKE LINE OF ts_out.
TYPES: BEGIN OF gy_out,
       bukrs TYPE bukrs,
       prctr TYPE prctr,
       flag TYPE char10,
       lifnr TYPE char20,
       name1 TYPE char40,
       belnr TYPE bseg-belnr,
       pswsl TYPE pswsl,
       dmbtr TYPE dmbtr,
      rdmbtr TYPE dmbtr,
       shkzg TYPE char1,
       hkont TYPE hkont,
       txt50 TYPE skat-txt50,

       blart TYPE bkpf-blart,"凭证类型
       xref3 TYPE bseg-xref3,                               "参考码3
       sgtxt TYPE bseg-sgtxt,"文本
       zuonr TYPE bseg-zuonr,"分配

       kkber TYPE bseg-kkber,"信贷范围
       vkbur TYPE knvv-vkbur,

       budat TYPE budat,
       bldat TYPE bldat,

  END OF gy_out.
DATA: gs_out TYPE STANDARD TABLE OF gy_out WITH HEADER LINE,
      gl_out LIKE LINE OF gs_out.

DATA tsk_bseg TYPE STANDARD TABLE OF bseg WITH HEADER LINE.
DATA gsk_bseg TYPE STANDARD TABLE OF bseg WITH HEADER LINE.

DATA ts_bseg TYPE TABLE OF bseg WITH HEADER LINE.
DATA ts_bseg1 TYPE TABLE OF bseg WITH HEADER LINE.
DATA ts_bseg2 TYPE TABLE OF bseg WITH HEADER LINE.

DATA ts_bkpf1 TYPE TABLE OF bkpf WITH HEADER LINE.
DATA ts_bkpf2 TYPE TABLE OF bkpf WITH HEADER LINE.


DATA tsd_bseg TYPE STANDARD TABLE OF bseg WITH HEADER LINE.
DATA gsd_bseg TYPE STANDARD TABLE OF bseg WITH HEADER LINE.

DATA: ts_lfa1 TYPE TABLE OF lfa1 WITH HEADER LINE,
      ts_kna1 TYPE TABLE OF kna1 WITH HEADER LINE,
      ts_skat TYPE TABLE OF skat WITH HEADER LINE.
DATA: ts_skb1 TYPE TABLE OF skb1 WITH HEADER LINE.
*DATA: TS_KNVV TYPE TABLE OF KNVV WITH HEADER LINE.

DATA gs_bseg TYPE STANDARD TABLE OF bseg WITH HEADER LINE.
DATA w_bseg TYPE bseg.
DATA: l_wrbtr_h TYPE bseg-wrbtr,
      l_wrbtr_s TYPE bseg-wrbtr,
      l_wrbtr TYPE bseg-wrbtr.
DATA l_object TYPE char4.
DATA l_bschl TYPE char2.
DATA l_money TYPE char30.
** 使用 ALV
DATA: it_fieldcat TYPE slis_t_fieldcat_alv,    " ALV 标题内表
      it_fieldcat01 TYPE slis_t_fieldcat_alv,    " ALV 标题内表
      wa_layout   TYPE slis_layout_alv.        " ALV 格式
*      it_events   TYPE slis_t_event.           " ALV事件处理

FIELD-SYMBOLS <p_hsl>.                         " 定义指针


DATA :l_group TYPE apqi-groupid,
      l_subrc TYPE sy-subrc.

DATA: l_t_blntab LIKE TABLE OF blntab WITH HEADER LINE,
      l_t_ftclear LIKE TABLE OF ftclear WITH HEADER LINE,
      l_t_ftpost LIKE TABLE OF ftpost WITH HEADER LINE,
      l_t_fttax LIKE TABLE OF fttax WITH HEADER LINE.

DEFINE rellena_ftclear.
  l_t_ftclear-agkoa = &1.             "清账条件:科目类型
  l_t_ftclear-agbuk = &2.             "清账条件:公司代码
  l_t_ftclear-selfd = &3.             "附加字段:BELNR 凭证编号
  l_t_ftclear-xnops = &4.             "清账条件:标准未清项目
  l_t_ftclear-agums = &5.             "用于选择的特殊总帐标识符
  CONCATENATE &6 &7 &8
         INTO l_t_ftclear-selvon.     "选择未清项目的搜索标准的输入字段

  APPEND l_t_ftclear.
END-OF-DEFINITION.


DEFINE rellena_ftpost.
  l_t_ftpost-stype = &1.   "用于内部过帐接口的记录类型
  l_t_ftpost-count = &2.   "对于凭证抬头或行项目的计数器(记帐界面)
  l_t_ftpost-fnam  = &3.   "BDC 字段名
  l_t_ftpost-fval  = &4.   "BDC 字段值
  APPEND l_t_ftpost.
END-OF-DEFINITION.


************************************************************************
*                    选择屏幕                                          *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.


SELECTION-SCREEN END OF BLOCK blk1.

SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE TEXT-002.

SELECT-OPTIONS:  s_kunnr FOR knb1-kunnr,"客户
                 s_lifnr FOR lfb1-lifnr."供应商
SELECT-OPTIONS:  s_budat FOR bkpf-budat,
                 s_bldat FOR bkpf-bldat.
SELECT-OPTIONS:  s_kkber FOR bseg-kkber,
                 s_vkbur FOR knvv-vkbur.
PARAMETERS:   p_bukrs TYPE bseg-bukrs OBLIGATORY,
              p_prctr TYPE bseg-prctr ,
              p_budat TYPE bkpf-budat OBLIGATORY,
              p_pswsl TYPE bseg-pswsl OBLIGATORY.
*              p_umskz TYPE bseg-umskz."特殊总账标识
*PARAMETERS:   P_XNPOS AS CHECKBOX DEFAULT '' .
PARAMETERS:p_xnpos TYPE  c NO-DISPLAY."不起作用


parameters :  P_MODE type RFPDO-ALLGAZMD default 'E'.



SELECTION-SCREEN END OF BLOCK blk2.

************************************************************************
*                    初始化事件                                        *
************************************************************************
INITIALIZATION.








************************************************************************
*                    选择屏幕事件                                      *
************************************************************************
AT SELECTION-SCREEN.




************************************************************************
*                   START-OF-SELECTION                                *
************************************************************************
START-OF-SELECTION.

  IF s_lifnr[] IS INITIAL AND s_kunnr[] IS   INITIAL.
    MESSAGE '请填入供应商编号或客户编号' TYPE 'S'.
    EXIT.
  ENDIF.
  PERFORM  frm_getdata.


************************************************************************
*                   END-OF-SELECTION                                   *
************************************************************************
END-OF-SELECTION.
* using alv to display report
  PERFORM frm_alv.

*&---------------------------------------------------------------------*
*&      Form  FRM_GETDATA
*&---------------------------------------------------------------------*
*  功能描述:按指定条件从数据库表中取出数据,并传入相应的内表或工作区
*----------------------------------------------------------------------*
*  入口参数:无
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_getdata .
  IF s_lifnr[] IS NOT INITIAL.
    "l_object = '供应商'.
    REFRESH ts_bseg1.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE ts_bseg1 FROM bseg
      WHERE bukrs = p_bukrs
        AND prctr = p_prctr
        AND lifnr IN s_lifnr
        AND augbl = ''
        AND buzid = ''
*        AND ( umskz = p_umskz OR umskz = '')
        AND pswsl = p_pswsl
        AND kkber IN s_kkber.

    IF ts_bseg1[] IS NOT INITIAL.
      SELECT * INTO TABLE ts_bkpf1 FROM bkpf FOR ALL ENTRIES IN ts_bseg1
                                  WHERE  bukrs = ts_bseg1-bukrs
                                    AND  belnr = ts_bseg1-belnr
                                    AND  gjahr = ts_bseg1-gjahr
                                    AND  budat IN s_budat
                                    AND  bldat IN s_bldat.
    ENDIF.
    IF p_xnpos EQ 'X'.
      IF ts_bseg1[] IS NOT INITIAL.
        SELECT * INTO CORRESPONDING FIELDS OF TABLE tsk_bseg FROM bseg
          FOR ALL ENTRIES IN ts_bseg1
          WHERE belnr = ts_bseg1-belnr
            AND bukrs = p_bukrs
            AND lifnr IN s_lifnr
            AND augbl = ''
            AND buzid = ''
*            AND ( umskz = p_umskz OR umskz EQ '' )
            AND pswsl = p_pswsl
            AND kkber IN s_kkber.
           " and ( HKONT like '1123%' or HKONT like  '2202%' or   HKONT like  '2241%').

      ENDIF.
    ELSE.
      IF ts_bseg1[] IS NOT INITIAL.
        SELECT * INTO CORRESPONDING FIELDS OF TABLE tsk_bseg FROM bseg
          FOR ALL ENTRIES IN ts_bseg1
          WHERE belnr = ts_bseg1-belnr
           AND bukrs = p_bukrs
          AND lifnr IN s_lifnr
          AND augbl = ''
          AND buzid = ''
*          AND umskz = p_umskz
          AND pswsl = p_pswsl
          AND kkber IN s_kkber.
          "and ( HKONT like '1123%' or HKONT like  '2202%' or   HKONT like  '2241%').
      ENDIF.
    ENDIF.
  ENDIF.
  IF s_kunnr[] IS NOT INITIAL.
    "l_object = '客户'.
    REFRESH ts_bseg2.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE ts_bseg2 FROM bseg
  WHERE bukrs = p_bukrs
    AND prctr = p_prctr
    AND kunnr IN s_kunnr
    AND augbl = ''
*    AND ( umskz = p_umskz OR umskz EQ '' )
    AND pswsl = p_pswsl
    AND kkber IN s_kkber.
    IF ts_bseg2[] IS NOT INITIAL.
      SELECT * INTO TABLE ts_bkpf2 FROM bkpf FOR ALL ENTRIES IN ts_bseg2
                                  WHERE  bukrs = ts_bseg2-bukrs
                                    AND  belnr = ts_bseg2-belnr
                                    AND  gjahr = ts_bseg2-gjahr
                                    AND  budat IN s_budat
                                    AND  bldat IN s_bldat.
    ENDIF.
    IF p_xnpos EQ 'X'.
      IF ts_bseg2[] IS NOT INITIAL.
        SELECT * INTO CORRESPONDING FIELDS OF TABLE tsd_bseg FROM bseg
           FOR ALL ENTRIES IN ts_bseg2
          WHERE belnr = ts_bseg2-belnr
            AND bukrs = p_bukrs
            AND kunnr IN s_kunnr
            AND augbl = ''
*            AND ( umskz = p_umskz OR umskz EQ '' )
            AND pswsl = p_pswsl
            AND kkber IN s_kkber.
           "and ( HKONT like '1122%' or HKONT like  '1221%' or   HKONT like  '2203%').
      ENDIF.
    ELSE.
      IF ts_bseg2[] IS NOT INITIAL.
        SELECT * INTO CORRESPONDING FIELDS OF TABLE tsd_bseg FROM bseg
           FOR ALL ENTRIES IN ts_bseg2
          WHERE belnr = ts_bseg2-belnr
             AND bukrs = p_bukrs
             AND kunnr IN s_kunnr
              AND augbl = ''
*             AND umskz = p_umskz
             AND pswsl = p_pswsl
             AND kkber IN s_kkber.
            "and ( HKONT like '1122%' or HKONT like  '1221%' or   HKONT like  '2203%').
      ENDIF.
    ENDIF.
  ENDIF.


  APPEND LINES OF tsk_bseg TO gsk_bseg.
  APPEND LINES OF tsd_bseg TO gsd_bseg.

  IF gsk_bseg[] IS NOT INITIAL.
    SELECT * INTO TABLE ts_lfa1 FROM lfa1 FOR ALL ENTRIES IN gsk_bseg WHERE lifnr = gsk_bseg-lifnr.
    SELECT * INTO TABLE ts_skat FROM skat FOR ALL ENTRIES IN gsk_bseg WHERE saknr = gsk_bseg-hkont AND spras = sy-langu.
    SELECT * INTO TABLE ts_skb1 FROM skb1 FOR ALL ENTRIES IN gsk_bseg WHERE saknr = gsk_bseg-hkont AND bukrs = gsk_bseg-bukrs AND mitkz = 'K' .
  ENDIF.
  LOOP AT gsk_bseg.
    CLEAR gl_out.
    CLEAR ts_lfa1.
    READ TABLE ts_lfa1 WITH KEY lifnr = gsk_bseg-lifnr.
    CLEAR ts_skat.
    READ TABLE ts_skat WITH KEY saknr = gsk_bseg-hkont.
    CLEAR ts_bseg1.
    READ TABLE ts_bseg1 WITH KEY belnr = gsk_bseg-belnr
                                 bukrs = gsk_bseg-bukrs
                                 gjahr = gsk_bseg-gjahr.

    CLEAR ts_bkpf1.
    READ TABLE ts_bkpf1 WITH KEY belnr = gsk_bseg-belnr
                                 bukrs = gsk_bseg-bukrs
                                 gjahr = gsk_bseg-gjahr.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.

    CLEAR ts_skb1.
    READ TABLE ts_skb1 WITH KEY saknr = gsk_bseg-saknr
                                bukrs = gsk_bseg-bukrs.
    IF sy-subrc NE 0.
        CONTINUE.
    ENDIF.

    gl_out-bukrs = gsk_bseg-bukrs.
    gl_out-prctr = ts_bseg1-prctr.
    gl_out-flag = '供应商'.
    gl_out-lifnr = gsk_bseg-lifnr.
    gl_out-name1 = ts_lfa1-name1.
    gl_out-belnr = gsk_bseg-belnr.
    gl_out-pswsl = gsk_bseg-pswsl.
    gl_out-dmbtr = gsk_bseg-dmbtr.
    gl_out-rdmbtr = gl_out-dmbtr.
    gl_out-shkzg = gsk_bseg-shkzg.
    IF gl_out-shkzg = 'H'.
      gl_out-shkzg = '贷'.
      gl_out-rdmbtr = gl_out-rdmbtr * -1.
    ELSE.
      gl_out-shkzg = '借'.
    ENDIF.
    gl_out-hkont = gsk_bseg-hkont.
    gl_out-txt50 = ts_skat-txt50.

    gl_out-blart = ts_bkpf1-blart."凭证类型
    gl_out-budat = ts_bkpf1-budat.
    gl_out-bldat = ts_bkpf1-bldat.
    gl_out-xref3 = gsk_bseg-xref3.                          "参考码3
    gl_out-sgtxt = gsk_bseg-sgtxt."文本
    gl_out-zuonr = gsk_bseg-zuonr."分配
    gl_out-kkber = gsk_bseg-kkber.
    APPEND gl_out TO gs_out.
  ENDLOOP.

  IF gsd_bseg[] IS NOT INITIAL.
    SELECT * INTO TABLE ts_kna1 FROM kna1 FOR ALL ENTRIES IN gsd_bseg WHERE kunnr = gsd_bseg-kunnr.
    SELECT * INTO TABLE ts_skat FROM skat FOR ALL ENTRIES IN gsd_bseg WHERE saknr = gsd_bseg-hkont AND spras = sy-langu.
*    SELECT * INTO TABLE TS_KNVV FROM KNVV FOR ALL ENTRIES IN GSD_BSEG WHERE KUNNR = GSD_BSEG-KUNNR AND VKBUR IN S_VKBUR.
    SELECT * INTO TABLE ts_skb1 FROM skb1 FOR ALL ENTRIES IN gsd_bseg WHERE saknr = gsd_bseg-hkont AND bukrs = gsd_bseg-bukrs AND mitkz = 'D' .
  ENDIF.
  LOOP AT gsd_bseg.
    CLEAR gl_out.
    CLEAR ts_kna1.
    READ TABLE ts_kna1 WITH KEY kunnr = gsd_bseg-kunnr.
    CLEAR ts_skat.
    READ TABLE ts_skat WITH KEY saknr = gsd_bseg-hkont.
    CLEAR ts_bseg2.
    READ TABLE ts_bseg2 WITH KEY belnr = gsd_bseg-belnr
                                 bukrs = gsd_bseg-bukrs
                                 gjahr = gsd_bseg-gjahr.
    CLEAR ts_bkpf2.
    READ TABLE ts_bkpf2 WITH KEY belnr = gsd_bseg-belnr
                                 bukrs = gsd_bseg-bukrs
                                 gjahr = gsd_bseg-gjahr.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.

    CLEAR ts_skb1.
    READ TABLE ts_skb1 WITH KEY saknr = gsd_bseg-saknr
                                bukrs = gsd_bseg-bukrs.
    IF sy-subrc NE 0.
        CONTINUE.
    ENDIF.

*    CLEAR TS_KNVV.
*    READ TABLE TS_KNVV WITH KEY KUNNR = GSD_BSEG-KUNNR.
*    IF SY-SUBRC NE 0.
*      CONTINUE.
*    ENDIF.
    gl_out-bukrs = gsd_bseg-bukrs.
    gl_out-prctr = ts_bseg2-prctr.
    gl_out-flag = '客户'.
    gl_out-lifnr = gsd_bseg-kunnr.
    gl_out-name1 = ts_kna1-name1.
    gl_out-belnr = gsd_bseg-belnr.
    gl_out-pswsl = gsd_bseg-pswsl.
    gl_out-dmbtr = gsd_bseg-dmbtr.
    gl_out-rdmbtr = gl_out-dmbtr.
    gl_out-shkzg = gsd_bseg-shkzg.
    IF gl_out-shkzg = 'H'.
      gl_out-shkzg = '贷'.
      gl_out-rdmbtr = gl_out-rdmbtr * -1.
    ELSE.
      gl_out-shkzg = '借'.
    ENDIF.
    gl_out-hkont = gsd_bseg-hkont.
    gl_out-txt50 = ts_skat-txt50.

    gl_out-blart = ts_bkpf2-blart."凭证类型
    gl_out-budat = ts_bkpf2-budat.
    gl_out-bldat = ts_bkpf2-bldat.
    gl_out-xref3 = gsd_bseg-xref3.                          "参考码3
    gl_out-sgtxt = gsd_bseg-sgtxt."文本
    gl_out-zuonr = gsd_bseg-zuonr."分配
    gl_out-kkber = gsd_bseg-kkber.
*    GL_OUT-VKBUR = TS_KNVV-VKBUR.
    APPEND gl_out TO gs_out.
  ENDLOOP.

ENDFORM.                    "frm_getdata
*&---------------------------------------------------------------------*
*&      Form  FRM_ALL_CLEAR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_all_clear.
  SORT gsk_bseg BY lifnr.
  DELETE ADJACENT DUPLICATES FROM gsk_bseg COMPARING  lifnr hkont.


  SORT gsd_bseg BY kunnr.
  DELETE ADJACENT DUPLICATES FROM gsd_bseg COMPARING  kunnr hkont.
  "处理供应商

  l_object = '供应商'.
  LOOP AT gsk_bseg."供应商
    REFRESH gs_bseg.
    APPEND LINES OF tsk_bseg TO gs_bseg.
    DELETE gs_bseg[] WHERE lifnr NE gsk_bseg-lifnr OR hkont NE gsk_bseg-hkont .
    PERFORM frm_qingzhang  TABLES gs_bseg
                       USING 'K'
                         gsk_bseg-lifnr
                         l_object.
  ENDLOOP.
  "供应商end

  "处理客户

  l_object = '客户'.
  LOOP AT gsd_bseg."供应商
    REFRESH gs_bseg.
    APPEND LINES OF tsd_bseg TO gs_bseg .
    DELETE gs_bseg[] WHERE kunnr NE gsd_bseg-kunnr OR hkont NE gsd_bseg-hkont .
    PERFORM frm_qingzhang  TABLES gs_bseg
                       USING 'D'
                         gsd_bseg-kunnr
                         l_object.
  ENDLOOP.
  "客户end
ENDFORM.                    "FRM_ALL_CLEAR
*&---------------------------------------------------------------------*
*&      Form  QINGZHANG
*&---------------------------------------------------------------------*
*       清账BDC.
*----------------------------------------------------------------------*
FORM frm_qingzhang  TABLES tt_bseg  STRUCTURE  tsk_bseg
                 USING zkind TYPE c
                       kunnr TYPE char10
                       object TYPE char4.
  REFRESH:l_t_blntab  ,
      l_t_ftclear ,
      l_t_ftpost  ,
      l_t_fttax  .
  CLEAR:l_t_blntab  ,
    l_t_ftclear ,
    l_t_ftpost  ,
    l_t_fttax  ,
    l_wrbtr_h,
    l_wrbtr_s.
  rellena_ftpost 'K' 1 'BKPF-BUKRS' p_bukrs.
  rellena_ftpost 'K' 1 'BKPF-BLART' 'AB'.
  rellena_ftpost 'K' 1 'BKPF-BLDAT' p_budat.
  rellena_ftpost 'K' 1 'BKPF-BUDAT' p_budat.
  rellena_ftpost 'K' 1 'BKPF-WAERS' p_pswsl.
  rellena_ftpost 'K' 1 'BKPF-BKTXT' '清帐'.


** 针对借贷不平衡情况,手工追加行项目信息
  "累计借贷金额
  LOOP AT tt_bseg INTO w_bseg.
    IF w_bseg-shkzg = 'H'.
      l_wrbtr_h = l_wrbtr_h + w_bseg-wrbtr.
    ELSE.
      l_wrbtr_s = l_wrbtr_s + w_bseg-wrbtr.
    ENDIF.
  ENDLOOP.
  IF l_wrbtr_h EQ 0 OR l_wrbtr_s EQ 0.
    RETURN.
  ENDIF.
  "SORT tt_bseg DESCENDING BY lifnr DESCENDING kunnr DESCENDING shkzg DESCENDING zfbdt DESCENDING.

  " 如果借方大于贷方
  IF l_wrbtr_s >=  l_wrbtr_h .

    LOOP AT tt_bseg WHERE shkzg = 'H'.
      rellena_ftclear  zkind
                          p_bukrs
                          'BELNR'
                          'X'
                         tt_bseg-umskz
                         tt_bseg-belnr
                         tt_bseg-gjahr
                         tt_bseg-buzei .
    ENDLOOP.

    IF zkind = 'K'."供应商
*      IF p_umskz IS NOT INITIAL."特定总账标识
*        l_bschl = '29'.  "S
*      ELSE.
        l_bschl = '26'.
*      ENDIF.
*      L_BSCHL = '21'.
    ELSE."客户
*      IF p_umskz IS NOT INITIAL.
*        l_bschl = '09'.
*      ELSE.
        l_bschl = '06'.
*      ENDIF.
*      L_BSCHL = '01'.
    ENDIF.
    DELETE tt_bseg[] WHERE shkzg = 'H'.
    SORT tt_bseg BY zfbdt.
    LOOP AT tt_bseg INTO w_bseg.
      rellena_ftclear  zkind
                          p_bukrs
                          'BELNR'
                          'X'
                         w_bseg-umskz
                         w_bseg-belnr
                         w_bseg-gjahr
                         w_bseg-buzei .
      l_wrbtr_h = l_wrbtr_h - w_bseg-wrbtr.
      IF l_wrbtr_h <= 0.
        l_wrbtr_h = l_wrbtr_h + w_bseg-wrbtr.
        l_money = w_bseg-wrbtr - l_wrbtr_h.
        EXIT.
      ENDIF.
    ENDLOOP.
    IF l_wrbtr_s NE l_wrbtr_h AND l_money NE 0.
*      IF P_UMSKZ IS NOT INITIAL.
        rellena_ftpost 'P' 1 'BSEG-ZFBDT'  w_bseg-zfbdt.
        rellena_ftpost 'P' 1 'BSEG-XNEGP'  'X'.
*      ENDIF.
      rellena_ftpost 'P' 1 'RF05A-NEWBS' l_bschl."记账码
      rellena_ftpost 'P' 1 'RF05A-NEWKO' kunnr.
*    l_wrbtr = l_wrbtr_s - l_wrbtr_h.
*    l_money = l_wrbtr.
      SHIFT l_money LEFT DELETING LEADING ' '.
      rellena_ftpost 'P' 1 'BSEG-WRBTR'  l_money.
      rellena_ftpost 'P' 1 'BSEG-UMSKZ'  w_bseg-umskz.
*      rellena_ftpost 'P' 1 'BSEG-KKBER'  w_bseg-kkber.
      rellena_ftpost 'P' 1 'BSEG-HKONT'  w_bseg-hkont.
      rellena_ftpost 'P' 1 'BSEG-SGTXT'  '清帐'.
    ENDIF.

  ENDIF.

  " 如果贷方大于借方
  IF l_wrbtr_h > l_wrbtr_s.

    LOOP AT tt_bseg INTO w_bseg WHERE shkzg = 'S'.
      rellena_ftclear  zkind
                          p_bukrs
                          'BELNR'
                          'X'
                         w_bseg-umskz
                         w_bseg-belnr
                         w_bseg-gjahr
                         w_bseg-buzei .
    ENDLOOP.

    IF zkind = 'K'."供应商
*      IF p_umskz IS NOT INITIAL."特定总账标识
*        l_bschl = '39'.  "S
*      ELSE.
        l_bschl = '36'.
*      ENDIF.
*      L_BSCHL = '31'.
    ELSE."客户
*      IF p_umskz IS NOT INITIAL.
*        l_bschl = '19'.
*      ELSE.
        l_bschl = '16'.
      ENDIF.
*      L_BSCHL = '11'.
*    ENDIF.
    DELETE tt_bseg[] WHERE shkzg = 'S'.
    SORT tt_bseg BY zfbdt.
    LOOP AT tt_bseg INTO w_bseg.
      rellena_ftclear  zkind
                    p_bukrs
                    'BELNR'
                    'X'
                   w_bseg-umskz
                   w_bseg-belnr
                   w_bseg-gjahr
                   w_bseg-buzei .
      l_wrbtr_s = l_wrbtr_s - w_bseg-wrbtr.
      IF l_wrbtr_s <= 0.
        l_wrbtr_s = l_wrbtr_s + w_bseg-wrbtr.
        l_money = w_bseg-wrbtr - l_wrbtr_s.
        EXIT.
      ENDIF.
    ENDLOOP.

    IF l_money NE 0.
*        IF P_UMSKZ IS NOT INITIAL.
        rellena_ftpost 'P' 1 'BSEG-ZFBDT'  w_bseg-zfbdt.
        rellena_ftpost 'P' 1 'BSEG-XNEGP'  'X'.
*        ENDIF.
        rellena_ftpost 'P' 1 'RF05A-NEWBS' l_bschl."记账码
        rellena_ftpost 'P' 1 'RF05A-NEWKO' kunnr.
*        l_wrbtr = l_wrbtr_h - l_wrbtr_s.
*        l_money = l_wrbtr.
        SHIFT l_money LEFT DELETING LEADING ' '.
        rellena_ftpost 'P' 1 'BSEG-WRBTR'  l_money.
        rellena_ftpost 'P' 1 'BSEG-UMSKZ'  w_bseg-umskz.
*        rellena_ftpost 'P' 1 'BSEG-KKBER'  w_bseg-kkber.
        rellena_ftpost 'P' 1 'BSEG-HKONT'  w_bseg-hkont.
        rellena_ftpost 'P' 1 'BSEG-SGTXT'  '清帐'.
    ENDIF.

  ENDIF.
** 针对借贷不平衡情况,手工追加行项目信息 end

  CALL FUNCTION 'POSTING_INTERFACE_START'
    EXPORTING
      i_function         = 'C'       "Using Call Transaction
      i_mode             = P_MODE         " i_group = l_group
      i_update           = 'S'
      i_user             = sy-uname
    EXCEPTIONS
      client_incorrect   = 1         " i_xbdcc = 'X'
      function_invalid   = 2
      group_name_missing = 3
      mode_invalid       = 4
      update_invalid     = 5
      OTHERS             = 6.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*--- Posting interface clearing
  CALL FUNCTION 'POSTING_INTERFACE_CLEARING'
    EXPORTING
      i_auglv                    = 'EINGZAHL' "清账程序
      i_tcode                    = 'FB05'     "系统使用的清账事务码
    IMPORTING
      e_msgid                    = sy-msgid          "i_sgfunct = 'C'
      e_msgno                    = sy-msgno
      e_msgty                    = sy-msgty
      e_msgv1                    = sy-msgv1
      e_msgv2                    = sy-msgv2
      e_msgv3                    = sy-msgv3
      e_msgv4                    = sy-msgv4
      e_subrc                    = l_subrc
    TABLES
      t_blntab                   = l_t_blntab  "返回清账凭证号
      t_ftclear                  = l_t_ftclear "传递未清项选择条件
      t_ftpost                   = l_t_ftpost  "传递清账凭证抬头数据
      t_fttax                    = l_t_fttax   "税务数据,一般不需要
    EXCEPTIONS
      clearing_procedure_invalid = 1
      clearing_procedure_missing = 2
      table_t041a_empty          = 3
      transaction_code_invalid   = 4
      amount_format_error        = 5
      too_many_line_items        = 6
      company_code_invalid       = 7
      screen_not_found           = 8
      no_authorization           = 9
      OTHERS                     = 10.

  IF sy-msgty = 'E'.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*--- Posting interface end
  CALL FUNCTION 'POSTING_INTERFACE_END'
    EXCEPTIONS
      session_not_processable = 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.
  CLEAR ts_out.
  READ TABLE l_t_blntab INDEX 1.
  IF sy-subrc EQ 0.
    ts_out-object = object.
    ts_out-lifnr = kunnr.
    ts_out-budat = p_budat.
    ts_out-belnr = l_t_blntab-belnr.
    APPEND ts_out.
  ENDIF.
ENDFORM.                    "QINGZHANG





*&---------------------------------------------------------------------*
*&      Form  FRM_ALV
*&---------------------------------------------------------------------*
*  功能描述:ALV显示子程序
*----------------------------------------------------------------------*
*  入口参数:无
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_alv .

  PERFORM frm_fieldcat.
  PERFORM frm_layout.
  PERFORM frm_output.

ENDFORM.                    " FRM_ALV
*&---------------------------------------------------------------------*
*&      Form  FRM_FIELDCAT
*&---------------------------------------------------------------------*
*  功能描述:显示ALV列的标题、列宽、CHECKBOX
*----------------------------------------------------------------------*
*  入口参数:无
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_fieldcat .
  PERFORM frm_disp TABLES it_fieldcat USING:
 'BUKRS' '公司代码'  'X' '' '' '',
 'PRCTR' '利润中心'  'X' '' '' '',
 'FLAG'  '供应商客户标志'  'X' '' '' '',
 'LIFNR' '供应商/客户编码'  'X' '' '' '',
 'BUDAT' '过账日期'  'X' '' '' '',
 'BLDAT' '凭证日期'  'X' '' '' '',
 'KKBER'  '信贷范围'  'X' '' '' '',
* 'VKBUR'  '销售部门'  'X' '' '' '',
 'BELNR' '凭证编号'  'X' '' '' '',
 'PSWSL' '货币码'  'X' '' '' '',
 'RDMBTR' '金额'  'X' '' '' '',
 'SHKZG' '借贷方向'  'X' '' '' '',
  'HKONT'  '总账科目'   'X' '' '' '',
  'TXT50'  '总账描述'  'X' '' '' '',
   'BLART'  '凭证类型'  'X' '' '' '',
   'XREF3'  '参考码3'  'X' '' '' '',
   'SGTXT'  '文本'  'X' '' '' '',
   'ZUONR'  '分配'  'X' '' '' ''.

  PERFORM frm_disp TABLES it_fieldcat01 USING:
        'OBJECT' '清账对象'  'X' '' '' '',
        'LIFNR'  '供应商/客户编号'  'X' '' '' '',
        'BUDAT'  '清账过账日期'  'X' '' '' '',
        'BELNR'  '会计凭证编号'  'X' '' '' ''.


ENDFORM.                    " FRM_FIELDCAT
*&---------------------------------------------------------------------
*&      Form  FRM_FIELD_DISP
*&---------------------------------------------------------------------*
*  功能描述:通过传入字段名、字段名的相应描述,得到ALV视图的列标题
*----------------------------------------------------------------------*
*  入口参数:大写字段名、字段名的描述,列的宽度,参考的系统表字段名,参考
*            的系统表名(不需要的参数传为空)。
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_disp TABLES it_fieldcat
               USING fu_name TYPE slis_fieldcat_alv-fieldname" 自定义数据库表字段
                    fu_disp TYPE slis_fieldcat_alv-seltext_l" 字段描述
*                    fu_colwidth TYPE slis_fieldcat_alv-outputlen" 输出列的宽度
                    fu_nozero TYPE slis_fieldcat_alv-no_zero" 是否显示前导零
                    fu_refname TYPE slis_fieldcat_alv-ref_fieldname" 参考的系统表字段
                    fu_reftab TYPE slis_fieldcat_alv-ref_tabname" 参考的系统表
                    fu_just   TYPE slis_fieldcat_alv-just.
  "形参类型与slis_fieldcat_alv中相应字段名的类型保持一致

  DATA: lw_fieldcat TYPE slis_fieldcat_alv.

  CLEAR lw_fieldcat.
  lw_fieldcat-fieldname = fu_name.         " 自定义数据库表字段
  lw_fieldcat-ref_fieldname = fu_refname.  " 参考的系统表字段
  lw_fieldcat-ref_tabname = fu_reftab.     " 参考的系统表
  lw_fieldcat-seltext_l = fu_disp.         " 字段描述
*  lw_fieldcat-outputlen = fu_colwidth.     " 输出列的宽度
  lw_fieldcat-no_zero = fu_nozero.         " 是否显示前导零
  lw_fieldcat-just = fu_just.
  APPEND lw_fieldcat TO it_fieldcat.

ENDFORM.                    " FRM_DISP
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT
*&---------------------------------------------------------------------*
*  功能描述:显示ALV报表中的斑马线,设置ALV报表的第一列为CHECKBOX
*----------------------------------------------------------------------*
*  入口参数:无
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_layout .

  wa_layout-colwidth_optimize = 'X'.     " ALV显示的列宽自动调整
  wa_layout-zebra             = 'X'.     " ALV中显示斑马线
  " WA_LAYOUT-BOX_FIELDNAME = 'CHECKBOX'.  " 第一列设置为CHECKBOX按钮
  " WA_LAYOUT-COLTAB_FIELDNAME = 'CELLCOLOR'.

ENDFORM.                    " FRM_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT
*&---------------------------------------------------------------------*
*  功能描述:输出ALV报表的视图
*----------------------------------------------------------------------*
*  入口参数:无
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_output .

  DATA: l_repid LIKE sy-repid,
  gs_variant   TYPE disvariant.

  gs_variant-report = sy-repid.
  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_pf_status_set = 'FRM_SET_STATUS' "自定义按钮及事件
      i_callback_user_command  = 'FRM_USER_COMMAND'
      i_callback_program       = l_repid
      is_variant               = gs_variant
      i_html_height_top        = 26  " i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
      is_layout                = wa_layout
      it_fieldcat              = it_fieldcat[]
      i_save                   = 'A'
    TABLES
      t_outtab                 = gs_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.                    " FRM_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT01
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_output01.

  DATA: l_repid LIKE sy-repid,
  gs_variant   TYPE disvariant.

  gs_variant-report = sy-repid.
  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_pf_status_set = 'FRM_SET_STATUS' "自定义按钮及事件
      i_callback_user_command  = 'FRM_USER_COMMAND'
      i_callback_program       = l_repid
      is_variant               = gs_variant
      i_html_height_top        = 26  " i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
      is_layout                = wa_layout
      it_fieldcat              = it_fieldcat01[]
      i_save                   = 'A'
    TABLES
      t_outtab                 = ts_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.                    " FRM_OUTPUT


*&---------------------------------------------------------------------*
*&      Form  FRM_SET_STATUS
*&---------------------------------------------------------------------*
*  功能描述:在SE80中定义一个STANDARD_FULLSCREEN的状态栏
*----------------------------------------------------------------------*
*  入口参数:无
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_set_status USING rt_extab TYPE slis_t_extab..

  SET PF-STATUS 'STANDARD'.    "定义GUI状态,添加应用工具栏按钮

ENDFORM.                    " FRM_SET_STATUS
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_STATUS01
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM frm_set_status01 USING rt_extab TYPE slis_t_extab..

  SET PF-STATUS 'STANDARD'.    "定义GUI状态,添加应用工具栏按钮

ENDFORM.                    " FRM_SET_STATUS
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*  功能描述:响应用户的操作
*----------------------------------------------------------------------*
*  入口参数:无
*  出口参数:无
*----------------------------------------------------------------------*
FORM frm_user_command USING ucomm LIKE sy-ucomm
                         selfield TYPE slis_selfield..


  CASE sy-ucomm.    "sy-ucomm获得按钮的功能码

    WHEN 'BACK'  .
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'CLEAR'.
      PERFORM frm_all_clear.
      PERFORM frm_output01.

  ENDCASE.

ENDFORM.                    " FRM_USER_COMMANDREPORT ZFI030.

 

^_^很多人都把资料锁进了note里,以后还怎么百度呢^_^
posted on 2018-11-28 16:51  ^ω^SAP傻X^o^  阅读(1166)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3