金税RFC接口(开发笔记)

*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IM_BUKRS)   TYPE  ZTS_BILLING_INPUT-IM_BUKRS
*"     VALUE(IM_KUNRG_L) TYPE  ZTS_BILLING_INPUT-IM_KUNRG_L OPTIONAL
*"     VALUE(IM_KUNRG_H) TYPE  ZTS_BILLING_INPUT-IM_KUNRG_H OPTIONAL
*"     VALUE(IM_FKDAT_L) TYPE  ZTS_BILLING_INPUT-IM_FKDAT_L OPTIONAL
*"     VALUE(IM_FKDAT_H) TYPE  ZTS_BILLING_INPUT-IM_FKDAT_H OPTIONAL
*"     VALUE(IM_VBELN_L) TYPE  ZTS_BILLING_INPUT-IM_VBELN_L OPTIONAL
*"     VALUE(IM_VBELN_H) TYPE  ZTS_BILLING_INPUT-IM_VBELN_H OPTIONAL
*"  EXPORTING
*"     VALUE(SUBRC) LIKE  SYST-SUBRC
*"     VALUE(MESSAGE) TYPE  BAPI_MSG
*"  TABLES
*"      OUT_BILL STRUCTURE  ZTS_BILLING_OUTPUT OPTIONAL
*"----------------------------------------------------------------------
  DATA: ITAB_001K TYPE TABLE OF T001K  WITH HEADER LINE.
  DATA: ITAB_001W TYPE TABLE OF T001W  WITH HEADER LINE.
  DATA: GT_MATDOC TYPE TABLE OF MATDOC WITH HEADER LINE.
  DATA: GT_LIPS   TYPE TABLE OF LIPS   WITH HEADER LINE.
  DATA: GT_LIPS1  TYPE TABLE OF LIPS   WITH HEADER LINE.
  DATA: GT_VBAP   TYPE TABLE OF VBAP   WITH HEADER LINE.
  DATA: GT_KNA1   TYPE TABLE OF KNA1   WITH HEADER LINE.
  DATA: GT_ZBILL  TYPE TABLE OF ZBILL  WITH HEADER LINE.
  DATA: GT_VBPA   TYPE TABLE OF VBPA   WITH HEADER LINE.
  DATA: GT_ADRC   TYPE TABLE OF ADRC   WITH HEADER LINE.
  DATA: GT_OUT_BILL TYPE TABLE OF ZTS_BILLING_OUTPUT WITH HEADER LINE.

  DATA: GR_KUNRG TYPE RANGE OF KUNNR,
        GW_KUNRG LIKE LINE  OF GR_KUNRG.
  DATA: GR_DATS TYPE RANGE OF DATS,
        GW_DATS LIKE LINE  OF GR_DATS.
  DATA: GR_VBELN TYPE RANGE OF VBELN_VL,
        GW_VBELN LIKE LINE  OF GR_VBELN.
  DATA: LV_KUNRG TYPE KUNNR.
  DATA: LV_VBELN TYPE VBELN_VL.


*1.根据公司找出该公司对应的工厂清单
  CLEAR ITAB_001K[].
  CLEAR ITAB_001W[].
  CALL FUNCTION 'K_WERKS_OF_BUKRS_FIND'
    EXPORTING
      BUKRS             = IM_BUKRS
    TABLES
      ITAB_001K         = ITAB_001K[]
      ITAB_001W         = ITAB_001W[]
    EXCEPTIONS
      NO_ENTRY_IN_T001K = 1
      NO_ENTRY_IN_T001W = 2
      OTHERS            = 3.

  IF ITAB_001K[] IS NOT INITIAL.
    CLEAR GW_KUNRG.
    CLEAR GR_KUNRG[].
    IF IM_KUNRG_L IS NOT INITIAL.

      LV_KUNRG = IM_KUNRG_L.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LV_KUNRG
        IMPORTING
          OUTPUT = LV_KUNRG.
      IM_KUNRG_L = LV_KUNRG.

      LV_KUNRG = IM_KUNRG_H.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LV_KUNRG
        IMPORTING
          OUTPUT = LV_KUNRG.
      IM_KUNRG_H = LV_KUNRG.

      IF IM_KUNRG_H IS NOT INITIAL.
        GW_KUNRG-SIGN   = 'I'.
        GW_KUNRG-OPTION = 'BT'.
        GW_KUNRG-LOW    = IM_KUNRG_L.
        GW_KUNRG-HIGH   = IM_KUNRG_H.
        APPEND GW_KUNRG TO GR_KUNRG.
      ELSE.
        GW_KUNRG-SIGN   = 'I'.
        GW_KUNRG-OPTION = 'EQ'.
        GW_KUNRG-LOW    = IM_KUNRG_L.
        APPEND GW_KUNRG TO GR_KUNRG.
      ENDIF.
    ENDIF.

    CLEAR GW_DATS.
    CLEAR GR_DATS[].
    IF IM_FKDAT_L IS NOT INITIAL.
      IF IM_FKDAT_H IS NOT INITIAL.
        GW_DATS-SIGN   = 'I'.
        GW_DATS-OPTION = 'BT'.
        GW_DATS-LOW    = IM_FKDAT_L.
        GW_DATS-HIGH   = IM_FKDAT_H.
        APPEND GW_DATS TO GR_DATS.
      ELSE.
        GW_DATS-SIGN   = 'I'.
        GW_DATS-OPTION = 'EQ'.
        GW_DATS-LOW    = IM_FKDAT_L.
        APPEND GW_DATS TO GR_DATS.
      ENDIF.
    ENDIF.

    CLEAR GW_VBELN.
    CLEAR GR_VBELN[].
    IF IM_VBELN_L IS NOT INITIAL.

      LV_VBELN = IM_VBELN_L.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LV_VBELN
        IMPORTING
          OUTPUT = LV_VBELN.
      IM_VBELN_L = LV_VBELN.

      LV_VBELN = IM_VBELN_H.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LV_VBELN
        IMPORTING
          OUTPUT = LV_VBELN.
      IM_VBELN_H = LV_VBELN.

      IF IM_VBELN_H IS NOT INITIAL.
        GW_VBELN-SIGN   = 'I'.
        GW_VBELN-OPTION = 'BT'.
        GW_VBELN-LOW    = IM_VBELN_L.
        GW_VBELN-HIGH   = IM_VBELN_H.
        APPEND GW_VBELN TO GR_VBELN.
      ELSE.
        GW_VBELN-SIGN   = 'I'.
        GW_VBELN-OPTION = 'EQ'.
        GW_VBELN-LOW    = IM_VBELN_L.
        APPEND GW_VBELN TO GR_VBELN.
      ENDIF.
    ENDIF.

*2.MATDOC表KUNNR=客户编码清单、WERKS=第一步的工厂清单、过账日期BUDAT IN 选择条件的时间段 、
*VBELN_IM不为空,取出交货单号VBELN_IM。
    CLEAR GT_MATDOC[].
    SELECT VBELN_IM INTO CORRESPONDING FIELDS OF TABLE GT_MATDOC[] FROM MATDOC
      FOR ALL ENTRIES IN ITAB_001W[]
      WHERE WERKS = ITAB_001W-WERKS
        AND KUNNR IN GR_KUNRG
        AND BUDAT IN GR_DATS
        AND VBELN_IM <> ''
        .
    IF GT_MATDOC[] IS NOT INITIAL.
      SORT GT_MATDOC[] BY VBELN_IM.
      DELETE ADJACENT DUPLICATES FROM GT_MATDOC[] COMPARING VBELN_IM.

*3.判断交货单项目是否已经完成交货,未完成的从清单剔除
      CLEAR GT_LIPS[].
      SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_LIPS[] FROM LIPS
        FOR ALL ENTRIES IN GT_MATDOC[]
        WHERE VBELN = GT_MATDOC-VBELN_IM
          AND WBSTA = 'C'
          AND VBELN IN GR_VBELN
          .

*因有批次拆分,只取出项目LIPS-POSNR 和上层项目UECHA不同的项目号
      GT_LIPS1[] = GT_LIPS[] .
      DELETE GT_LIPS[] WHERE UECHA IS NOT INITIAL .

      CLEAR GT_OUT_BILL.
      LOOP AT GT_LIPS .

*4.LIPS取出交货单项目行的VGBEL参考凭证号,先前凭证类别VGTYP='C',
*表示是销售订单,根据销售订单号和项目号到表VBAP取出净值NETWR,如果净值为0,则对应的交货单项目剔除。
        IF GT_LIPS-VGTYP = 'C'.
          CLEAR GT_VBAP.
          SELECT SINGLE NETWR NETPR KPEIN VBELN POSNR INTO CORRESPONDING FIELDS OF GT_VBAP FROM VBAP
            WHERE VBELN = GT_LIPS-VGBEL
              AND POSNR = GT_LIPS-VGPOS
              .

          IF GT_VBAP-NETWR = 0 .
            DELETE GT_LIPS.
            CONTINUE.
          ENDIF.

*LIPS取出交货单第一行的VGBEL参考凭证号,如果先前凭证类别VGTYP='C',
*表示是销售订单,则根据参考凭证号关联VBPA-VBELN取出合作伙伴PARVW=‘RG’
*付款方对应的客户编码KUNNR,地址号ADRNR 到ADRC取NAME1+NAME2作为购方名称;
          SELECT SINGLE KUNNR ADRNR INTO CORRESPONDING FIELDS OF GT_VBPA FROM VBPA
            WHERE VBPA~VBELN = GT_VBAP-VBELN
              AND VBPA~PARVW = 'AG'
              .

          GT_OUT_BILL-KUNRG = GT_VBPA-KUNNR.

          LOOP AT GT_LIPS1 WHERE VBELN = GT_LIPS-VBELN AND UECHA = GT_LIPS-POSNR.
            GT_LIPS-LFIMG = GT_LIPS-LFIMG + GT_LIPS1-LFIMG .
            CLEAR GT_LIPS1 .
          ENDLOOP.

          GT_OUT_BILL-VBELN = GT_LIPS-VBELN.
          GT_OUT_BILL-POSNR = GT_LIPS-POSNR.
          GT_OUT_BILL-MATNR = GT_LIPS-MATNR.
          GT_OUT_BILL-BUKRS = IM_BUKRS.
          GT_OUT_BILL-FKIMG = GT_LIPS-LFIMG.

          CLEAR GT_ZBILL.
          SELECT SINGLE * INTO CORRESPONDING FIELDS OF GT_ZBILL FROM ZBILL
            WHERE KUNRG = GT_OUT_BILL-KUNRG
              AND MATNR = GT_OUT_BILL-MATNR
              AND BUKRS = GT_OUT_BILL-BUKRS
              .

          IF GT_ZBILL-MAME_EN IS NOT INITIAL.

            CLEAR GT_ADRC .
            SELECT SINGLE * INTO CORRESPONDING FIELDS OF GT_ADRC FROM ADRC
              WHERE ADDRNUMBER = GT_VBPA-ADRNR
              .
            GT_OUT_BILL-NAME1 = GT_ADRC-NAME3 && GT_ADRC-NAME4 .

          ELSE.

            SELECT SINGLE NAME1 NAME2 INTO CORRESPONDING FIELDS OF GT_KNA1 FROM KNA1
              WHERE KUNNR = GT_OUT_BILL-KUNRG
               .
            GT_OUT_BILL-NAME1 = GT_KNA1-NAME1 && GT_KNA1-NAME2 .

          ENDIF.

          GT_OUT_BILL-KZWI1 = GT_OUT_BILL-FKIMG * GT_VBAP-NETPR / GT_VBAP-KPEIN.
          GT_OUT_BILL-MWSBP = GT_OUT_BILL-KZWI1 * GT_ZBILL-SHUILV * '0.01'.
          GT_OUT_BILL-KZWI1 = GT_OUT_BILL-KZWI1 + GT_OUT_BILL-MWSBP.

          GT_OUT_BILL-FKTYP = GT_ZBILL-FKTYP.
          GT_OUT_BILL-FKKTX = GT_ZBILL-FKKTX.
          GT_OUT_BILL-FKRMT = GT_ZBILL-FKRMT.
          GT_OUT_BILL-FKINS = GT_ZBILL-FKINS.
          GT_OUT_BILL-SSFLBM = GT_ZBILL-SSFLBM.
          GT_OUT_BILL-SHUILV = GT_ZBILL-SHUILV.

          APPEND GT_OUT_BILL TO OUT_BILL.

        ENDIF.

        CLEAR GT_OUT_BILL .
        CLEAR GT_LIPS .
      ENDLOOP.

    ENDIF.

  ELSE.
    SUBRC = '1'.
    MESSAGE = '该公司下无工厂记录!'.
  ENDIF.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值