Skip to content

贸易合同

注意,如果是合同参考创建的订单,通常会要求通过工作台处理,这时需要在业务执行前加入以下代码:

示例代码
CALL FUNCTION 'WB2_RESET_EXTERNAL_DATA' .

CALL FUNCTION 'WB2_CHECK_TEW_ACTIVE'
  EXCEPTIONS
    not_active = 1
    OTHERS     = 2.

DATA l_tew_type TYPE wb2_tew_type.
CALL FUNCTION 'WB2_TRADE_GET_INIT_DATA'
  IMPORTING
    e_tew_type = l_tew_type.

CALL FUNCTION 'WB2_TEW_ACTION_SET_PARAMETER'
  EXPORTING
    i_tew_type    = i_tew_type
    i_step        = i_step
    i_mode        = i_mode
    i_pre_step    = i_pre_step
    i_catt_active = 'X'.

WTEW配置

SPRO\后勤\全球贸易管理

贸易合同创建与修改

通常,流程首先创建购销合同,然后再参考该合同,创建后续的采购合同和销售合同。这三种合同按合同类型加以区分,可由业务配置。

BAPI_TRADINGCONTRACT_CREATE:创建贸易合同

BAPI_TRADINGCONTRACT_CHANGE:修改贸易合同

WB2_DELETE_TRADING_CONT_ALL:合同批量删除

示例代码
*----------------------------------------------------------------------*
***INCLUDE LZGTM001P01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_wb2_ctr_data
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS lcl_wb2_ctr_data IMPLEMENTATION.

  METHOD read.

    IF contract_id IS SUPPLIED AND m_contract <> contract_id.
      m_contract = contract_id.
      mo_instance = NEW #( ).

      DATA l_tkonn TYPE komwbhk-tkonn.
      DATA ls_t180 TYPE t180.
      l_tkonn = contract_id.
      ls_t180 = VALUE #( trtyp = 'A' ).

      CALL FUNCTION 'WB2_CONTRACT_READ'
        EXPORTING
          i_tkonn                = l_tkonn
          i_t180                 = ls_t180
        IMPORTING
          e_komwbhk              = mo_instance->ms_komwbhk
        TABLES
          t_komwbhk              = mo_instance->mt_komwbhk
          t_komwbhi              = mo_instance->mt_komwbhi
          t_komwbhd              = mo_instance->mt_komwbhd
          t_komwbhe              = mo_instance->mt_komwbhe
          t_komwbhp              = mo_instance->mt_komwbhp
        EXCEPTIONS
          application_data_error = 1
          lock_error             = 2
          customizing_error      = 3
          OTHERS                 = 4.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
    ENDIF.

    " 至少保证不dump
    IF mo_instance IS NOT BOUND.
      mo_instance = NEW #( ).
    ENDIF.

    result = mo_instance.

  ENDMETHOD.

  METHOD get_fiori_head     .

    " 抬头
    result-tkonn                = ms_komwbhk-tkonn          .
    result-tkonn_ex             = ms_komwbhk-tkonn_ex       .
    result-tew_type             = ms_komwbhk-tew_type       .
    result-zframe_tkonn         = ms_komwbhk-zframe_tkonn   .
    result-zzsign_platfrom      = ms_komwbhk-vkorg          .
    result-vtweg                = ms_komwbhk-vtweg          .
    result-spart                = ms_komwbhk-spart          .
    result-zzsndat              = ms_komwbhk-zzsndat        .
    result-btbsta               = ms_komwbhk-btbsta         .
    result-zprictp              = ms_komwbhk-zprictp        .
    result-zzlsch_mm            = ms_komwbhk-zzlsch_mm      .
    result-zzlsch_mm_ex         = ms_komwbhk-zzlsch_txt_mm_n.
    result-zzlsch_sd            = ms_komwbhk-zzlsch_sd      .
    result-zzlsch_sd_ex         = ms_komwbhk-zzlsch_txt_sd_n.
    result-zzrpdate_end         = ms_komwbhk-zzrpdate_end   .
    result-zzamt01_mm           = ms_komwbhk-zzamt01_mm     .
    result-zzcur01_mm           = ms_komwbhk-zzcur01_mm     .
    result-zzpcode_src          = ms_komwbhk-zzpcode_src    .
    result-zzland1_src          = ms_komwbhk-zzland1_src    .
    result-zzpname_src          = ms_komwbhk-zzpname_src    .
    result-zzpcode_des          = ms_komwbhk-zzpcode_des    .
    result-zzland1_des          = ms_komwbhk-zzland1_des    .
    result-zzpname_des          = ms_komwbhk-zzpname_des    .
    result-zzpcode_tra          = ms_komwbhk-zzpcode_tra    .
    result-zzland1_tra          = ms_komwbhk-zzland1_tra    .
    result-zzpname_tra          = ms_komwbhk-zzpname_tra    .
    result-zzis_preins          = ms_komwbhk-zzis_preins    .
    result-zzreceived_data_last = |{ ms_komwbhk-zzzcdh_date DATE = RAW }|.
    result-zzlaycan_from        = ms_komwbhk-zzlaycanq      .
    result-zzlaycan_to          = ms_komwbhk-zzlaycanz      .
    result-tctyp                = ms_komwbhk-tctyp          .
    result-zzbusst              = ms_komwbhk-zzbusst        .
    result-zzsnfile             = ms_komwbhk-zzsnfile       .
    result-zzsnflg              = ms_komwbhk-zzsnflg        .
    result-zzwd_tcdoc_flg       = ms_komwbhk-zzwd_tcdoc_flg .
    result-zzyqd                = ms_komwbhk-zzyqd          .
    result-zzstpga_flg          = ms_komwbhk-zzstpga_flg    .
    result-zzgmyw_flg           = ms_komwbhk-zzgmyw_flg     .
    result-zzflexible           = ms_komwbhk-zzflexible     .
    result-zzwtcgp              = ms_komwbhk-zzwtcgp        .
    result-zzwtcgp_rt           = ms_komwbhk-zzwtcgp_rt     .
    result-guarantee_f          = ms_komwbhk-guarantee_f    .
    result-ciq_lastdt           = ms_komwbhk-ciq_lastdt     .
    result-consnno              = ms_komwbhk-consnno        .
    result-remark1_p            = ms_komwbhk-remark1_p      .
    result-remark2_p            = ms_komwbhk-remark2_p      .
    result-remark3_p            = ms_komwbhk-remark3_p      .
    result-zzwtc_fvdate         = ms_komwbhk-zzwtc_fvdate   .
    result-zzwtc_fvtime         = ms_komwbhk-zzwtc_fvtime   .
    result-zzwtc_fvapper        = ms_komwbhk-zzwtc_fvapper  .
    result-zzefeupt_date        = ms_komwbhk-zzefeupt_date  .
    result-zzpreclo_date        = ms_komwbhk-zzpreclo_date  .
    result-zznatclo_date        = ms_komwbhk-zznatclo_date  .

    " 抬头2
    LOOP AT mt_komwbhd REFERENCE INTO DATA(lr_komwbhd).
      result-bstkd       = lr_komwbhd->bstkd        .
      result-waers       = lr_komwbhd->waers_purch  .
      result-tkrate_mm   = lr_komwbhd->tkrate_mm    .
      result-kurst_mm    = lr_komwbhd->kurst_mm     .
      result-ekorg       = lr_komwbhd->ekorg        .
      result-ekgrp       = lr_komwbhd->ekgrp        .
      result-inco1_mm    = lr_komwbhd->inco1_mm     .
      result-inco1_mm_ex = lr_komwbhd->inco2_l_mm   .
      result-inco1_sd    = lr_komwbhd->inco1_sd     .
      result-inco1_sd_ex = lr_komwbhd->inco2_l_sd   .
      result-zterm       = lr_komwbhd->zterm        .
      result-zzshipping_data_last = lr_komwbhd->edatu_vbak.
      result-zzreceived_data_last = lr_komwbhd->eindt  .
      EXIT.
    ENDLOOP.

    " 抬头金额汇总
    LOOP AT mt_komwbhi REFERENCE INTO DATA(lr_komwbhi).
      result-zamount_sum   = result-zamount_sum + lr_komwbhi->netpr_mm * lr_komwbhi->menge.
      result-zcurrency_sum = lr_komwbhi->waers_mm.
    ENDLOOP.

    " 抬头3
    LOOP AT mt_komwbhp REFERENCE INTO DATA(lr_komwbhp).
      CASE lr_komwbhp->parvw.
        WHEN 'LF' OR 'VN'.
          result-lifnr = lr_komwbhp->lifnr.
        WHEN 'RS' OR 'PI'.
        WHEN 'Z4'.
          result-lifnr2 = lr_komwbhp->lifnr.
        WHEN 'Z1'.
          result-lifnr3 = lr_komwbhp->lifnr.
        WHEN 'ER' OR 'ZM'.
          result-lifnr4 = lr_komwbhp->lifnr.
        WHEN 'SP' OR 'AG'.
        WHEN 'WE' OR 'SH'.
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.

  ENDMETHOD.

  METHOD get_fiori_partner  .

    DATA ls_partner LIKE LINE OF result.

    LOOP AT mt_komwbhp REFERENCE INTO DATA(lr_komwbhp).
      CLEAR ls_partner.
      ls_partner-tkonn     = lr_komwbhp->tkonn    .
      ls_partner-tposn     = lr_komwbhp->tposn    .
      ls_partner-tposn_sub = lr_komwbhp->tposn_sub.
      ls_partner-parvw     = lr_komwbhp->parvw    .
      ls_partner-lifnr     = lr_komwbhp->lifnr    .
      ls_partner-kunnr     = lr_komwbhp->kunnr    .
      ls_partner-adrnr     = lr_komwbhp->adrnr    .
      ls_partner-land      = lr_komwbhp->land     .
      ls_partner-pstlz     = lr_komwbhp->pstlz    .
      ls_partner-regio     = lr_komwbhp->regio    .
      ls_partner-ort01     = lr_komwbhp->ort01    .
      ls_partner-name1     = lr_komwbhp->name1    .
      INSERT ls_partner INTO TABLE result.
    ENDLOOP.

  ENDMETHOD.

  METHOD get_fiori_item     .

    DATA ls_item LIKE LINE OF result.

    LOOP AT mt_komwbhi REFERENCE INTO DATA(lr_komwbhi).
      CLEAR ls_item.
      ls_item-tkonn        = lr_komwbhi->tkonn    .
      ls_item-tposn        = lr_komwbhi->tposn    .
      ls_item-tposn_sub    = lr_komwbhi->tposn_sub.
      ls_item-matnr        = lr_komwbhi->matnr    .
      ls_item-arktx        = lr_komwbhi->arktx    .
      ls_item-menge        = lr_komwbhi->menge    .
      ls_item-meins        = lr_komwbhi->meins    .
      ls_item-uebto_mm     = lr_komwbhi->uebto_mm .
      ls_item-untto_mm     = lr_komwbhi->untto_mm .
      ls_item-netpr_mm     = lr_komwbhi->netpr_mm .
      ls_item-peinh_mm     = lr_komwbhi->peinh_mm .
      ls_item-waers_mm     = lr_komwbhi->waers_mm .
      ls_item-zzsubtotal   = ls_item-netpr_mm * ls_item-menge.
*      ls_item-zzunit_price = lr_komwbhi->zzunit_price.
      ls_item-lgort        = lr_komwbhi->lgort       .
      ls_item-zpcmark      = lr_komwbhi->zpcmark     .

      " 特性取值
      DATA allocvaluesnum   TYPE STANDARD TABLE OF bapi1003_alloc_values_num.
      DATA allocvalueschar  TYPE STANDARD TABLE OF bapi1003_alloc_values_char.
      DATA allocvaluescurr  TYPE STANDARD TABLE OF bapi1003_alloc_values_curr.
      DATA return           TYPE STANDARD TABLE OF bapiret2.

      CLEAR allocvaluesnum.
      CLEAR allocvalueschar.
      CLEAR allocvaluescurr.
      CLEAR return.

      CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
        EXPORTING
          objectkey       = CONV bapi1003_key-object( ls_item-matnr )
          objecttable     = 'MARA'
          classnum        = 'C_01'
          classtype       = '023'
        TABLES
          allocvaluesnum  = allocvaluesnum
          allocvalueschar = allocvalueschar
          allocvaluescurr = allocvaluescurr
          return          = return.

      LOOP AT allocvalueschar REFERENCE INTO DATA(lr_allocvalueschar).
        CASE lr_allocvalueschar->charact.
          WHEN 'B_0001'. " 预算号
          WHEN 'B_0002'. " 外部合同号
          WHEN 'B_0003'. " 采购订单号
          WHEN 'B_0004'. " 采购订单类型
          WHEN 'B_0005'. " 业务形式
          WHEN 'B_0006'. " 采购组
          WHEN 'B_0007'. " 业务员
          WHEN 'B_0008'. " 入库时间
          WHEN 'B_0009'. " 规格属性1
          WHEN 'B_0010'. " 规格属性2
          WHEN 'B_0011'. " 产品种类/材质
            ls_item-zprdcat = lr_allocvalueschar->value_char.
          WHEN 'B_0012'. " 商品等级
            ls_item-zoland = lr_allocvalueschar->value_char.
          WHEN 'B_0013'. " 厂家/品牌
            ls_item-zfactory = lr_allocvalueschar->value_char.
          WHEN 'B_0014'. " 工艺/技术标准
            ls_item-ztechstd = lr_allocvalueschar->value_char.
          WHEN 'B_0015'. " 型号/等级
            ls_item-zprdcat = lr_allocvalueschar->value_char.
          WHEN 'B_0016'. " 备注
          WHEN 'B_0018'. " 尺寸/包装
            ls_item-zccbz = lr_allocvalueschar->value_char.
          WHEN 'B_0019'. " 运输载具号
            ls_item-zyszjh = lr_allocvalueschar->value_char.
          WHEN 'B_0020'. " 运输方式
          WHEN 'B_0021'. " 采购订单行项目
          WHEN 'B_0030'. " 第二计量单位
          WHEN 'B_0031'. " 第二单位转换系数
          WHEN 'B_0032'. " 第二单位可变参数
          WHEN 'B_0017'. " 原产地
          WHEN 'B_0022'. " 性能/用途
          WHEN 'B_0023'. " 运输单据号
            ls_item-zysdjh = lr_allocvalueschar->value_char.
          WHEN 'B_0024'. " 报关单号
            ls_item-zbgdh = lr_allocvalueschar->value_char.
          WHEN 'B_0025'. " 库位(区)号
            ls_item-zkwh = lr_allocvalueschar->value_char.
          WHEN 'B_0026'. " 生产日期
            ls_item-zscrq = lr_allocvalueschar->value_char.
          WHEN 'B_0027'. " 自定义属性1
            ls_item-zzdysx1 = lr_allocvalueschar->value_char.
          WHEN 'B_0028'. " 自定义属性2
            ls_item-zzdysx2 = lr_allocvalueschar->value_char.
          WHEN 'B_0029'. " 自定义属性3
            ls_item-zzdysx3 = lr_allocvalueschar->value_char.
          WHEN OTHERS.
        ENDCASE.
      ENDLOOP.

      INSERT ls_item INTO TABLE result.
    ENDLOOP.

  ENDMETHOD.

  METHOD get_fiori_condition.

    DATA ls_condition LIKE LINE OF result.

    " 定价
    DATA(lt_komwbhd) = mt_komwbhd.
    IF ms_komwbhk-knumv_sd IS NOT INITIAL.
      INSERT VALUE #( knumv_mm = ms_komwbhk-knumv_sd ) INTO TABLE lt_komwbhd.
    ENDIF.

    LOOP AT lt_komwbhd REFERENCE INTO DATA(lr_komwbhd).
      SELECT SINGLE
        knumv       ,
        kposn       ,
        stunr       ,
        zaehk       ,
        kschl       ,
        kbetr       ,
        waers       ,
        kpein       ,
        kmein       ,
        kwert
        FROM prcd_elements
        WHERE knumv = @lr_komwbhd->knumv_mm
        INTO @DATA(ls_prcd_elements).
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.

      CLEAR ls_condition.
      ls_condition-tkonn        = lr_komwbhd->tkonn            .
      ls_condition-tposn        = lr_komwbhd->tposn            .
      ls_condition-tposn_sub    = lr_komwbhd->tposn_sub        .
      ls_condition-knumv        = ls_prcd_elements-knumv       .
      ls_condition-kposn        = ls_prcd_elements-kposn       .
      ls_condition-stunr        = ls_prcd_elements-stunr       .
      ls_condition-zaehk        = ls_prcd_elements-zaehk       .
      ls_condition-kschl        = ls_prcd_elements-kschl       .
*      LS_CONDITION-kschl_text   = ls_prcd_elements-kschl_text  .
*      LS_CONDITION-zzto_cost    = ls_prcd_elements-zzto_cost   .
      ls_condition-kbetr        = ls_prcd_elements-kbetr       .
      ls_condition-waers        = ls_prcd_elements-waers       .
      ls_condition-kpein        = ls_prcd_elements-kpein       .
      ls_condition-kmein        = ls_prcd_elements-kmein       .
*      LS_CONDITION-zzconvertion = ls_prcd_elements-zzconvertion.
      ls_condition-kwert        = ls_prcd_elements-kwert       .
      INSERT ls_condition INTO TABLE result.
    ENDLOOP.

  ENDMETHOD.

  METHOD get_fiori_related  . ENDMETHOD.
  METHOD get_fiori_text     . ENDMETHOD.

ENDCLASS.

*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_fiori_ctr_data
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS lcl_fiori_ctr_data IMPLEMENTATION.

  METHOD read.

    IF contract_id IS SUPPLIED AND m_contract <> contract_id.
      m_contract = contract_id.
      mo_instance = NEW #( ).

      DATA(lo_wb2_ctr_data) = lcl_wb2_ctr_data=>read( m_contract ).
      mo_instance->ms_head      = lo_wb2_ctr_data->get_fiori_head( ).
      mo_instance->mt_partner   = lo_wb2_ctr_data->get_fiori_partner( ).
      mo_instance->mt_item      = lo_wb2_ctr_data->get_fiori_item( ).
      mo_instance->mt_condition = lo_wb2_ctr_data->get_fiori_condition( ).
      mo_instance->mt_related   = lo_wb2_ctr_data->get_fiori_related( ).
      mo_instance->mt_text      = lo_wb2_ctr_data->get_fiori_text( ).
      mo_instance->mt_payment   = mo_instance->read_payment( ).
    ENDIF.

    " 至少保证不dump
    IF mo_instance IS NOT BOUND.
      mo_instance = NEW #( ).
    ENDIF.

    result = mo_instance.

  ENDMETHOD.

  METHOD save_payment.

    DATA lt_zttcpt TYPE STANDARD TABLE OF zttcpt WITH EMPTY KEY.
    DATA ls_zttcpt TYPE zttcpt.

    LOOP AT mt_payment REFERENCE INTO DATA(lr_payment).
      CLEAR ls_zttcpt.
      ls_zttcpt-tkonn         = m_contract.
      ls_zttcpt-zzxh          = sy-tabix.
      ls_zttcpt-zzfktj        = lr_payment->zzterm.
      ls_zttcpt-zzsfkrq       = lr_payment->zzdate_last.
      ls_zttcpt-zzysfkje      = lr_payment->zzamount.
      ls_zttcpt-zwaers_purch  = lr_payment->zzcurrency.
      ls_zttcpt-zzsfk_remark  = lr_payment->zzpay_ex.
      INSERT ls_zttcpt INTO TABLE lt_zttcpt.
    ENDLOOP.

    DELETE FROM zttcpt WHERE tkonn = ms_head-tkonn.
    MODIFY zttcpt FROM TABLE lt_zttcpt.
    COMMIT WORK AND WAIT.

  ENDMETHOD.

  METHOD read_payment.

    DATA(l_tkonn) = contract_id.
    IF contract_id IS NOT SUPPLIED.
      l_tkonn = ms_head-tkonn.
    ENDIF.

    SELECT
      tkonn,
      zzxh,
      zzfktj AS zzterm,
      CAST( zzsfkrq AS CHAR( 10 ) ) AS zzdate_last,
      zzysfkje AS zzamount,
      zwaers_purch AS zzcurrency,
      zzsfk_remark AS zzpay_ex
      FROM zttcpt
      WHERE tkonn = @l_tkonn
        INTO CORRESPONDING FIELDS OF TABLE @mt_payment.
    result = mt_payment.

  ENDMETHOD.

ENDCLASS.

*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_bapi_ctr_create
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS lcl_bapi_ctr_create IMPLEMENTATION.

  METHOD lif_bapi~execute.
    result = me.

    " 增强字段长度大于960,无法使用extensionin字段
    " 因此通过BAPI增强的方式,将值传入
    " 由于是静态参数,等价于内存传值,而且更好的溯源
    zcl_im__wb2_bapi_enhance_ex=>set_extension(
      EXPORTING
        bapi_te_wbhk    = ms_bapi_te_wbhk
        t_bapi_te_wbhi  = mt_bapi_te_wbhi
        t_bapi_te_wbhd  = mt_bapi_te_wbhd
        t_bapi_te_wbhe  = mt_bapi_te_wbhe
        t_bapi_te_wbhp  = mt_bapi_te_wbhp
        bapi_te_wbhkx   = ms_bapi_te_wbhkx
        t_bapi_te_wbhix = mt_bapi_te_wbhix
        t_bapi_te_wbhdx = mt_bapi_te_wbhdx
        t_bapi_te_wbhex = mt_bapi_te_wbhex
        t_bapi_te_wbhpx = mt_bapi_te_wbhpx
    ).

    headdatain-testrun = testrun.
    SET PARAMETER ID 'BAPIHT' FIELD 'X'." BAPI创建合同,用于跳过部分校验
    CALL FUNCTION 'BAPI_TRADINGCONTRACT_CREATE'
      EXPORTING
        headdatain           = headdatain
      IMPORTING
        headdataout          = headdataout
        tradingcontractno    = tradingcontractno
      TABLES
        itemdatain           = itemdatain
        scheduledatain       = scheduledatain
        businessdatain       = businessdatain
        buspartyin           = buspartyin
        extensionin          = extensionin
        headtextin           = headtextin
        itemtextin           = itemtextin
        itemdataout          = itemdataout
        scheduledataout      = scheduledataout
        businessdataout      = businessdataout
        buspartyout          = buspartyout
        headtextout          = headtextout
        itemtextout          = itemtextout
        extensionout         = extensionout
        return               = return
        partneraddresses     = partneraddresses
        vendorcondin         = vendorcondin
        customercondin       = customercondin
        conditionkeydatain   = conditionkeydatain
        conditionkeydatainx  = conditionkeydatainx
        conditionitemdatain  = conditionitemdatain
        conditionitemdatainx = conditionitemdatainx
        conditionkeydataout  = conditionkeydataout
        conditionitemdataout = conditionitemdataout
        scaledatain          = scaledatain
        scaledataout         = scaledataout
        vendorcondout        = vendorcondout
        customercondout      = customercondout.
    SET PARAMETER ID 'BAPIHT' FIELD ''.

    lif_bapi~document = tradingcontractno.
    lif_bapi~mt_bapiret2 = CORRESPONDING #( return ).

    CALL FUNCTION 'Z_MESSAGE_TABLE_TO_FIELD'
      EXPORTING
        t_bapiret2 = lif_bapi~mt_bapiret2
      IMPORTING
        status     = lif_bapi~status
        message    = lif_bapi~message.

    " 发生错误或测试执行的情况,不提交
    IF lif_bapi~status = 'E' OR testrun = abap_true.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CLEAR lif_bapi~document.
      RETURN.
    ENDIF.

    " 正式提交
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.

  ENDMETHOD.

  METHOD set_head.

    DATA(ls_head) = input->ms_head.

    " 抬头数据
    headdatain-tkonn_ex        = ls_head-tkonn_ex.
    headdatain-trcont_type     = ls_head-tctyp.
    headdatain-tew_type        = ls_head-tew_type.
    headdatain-trcont_stat     = ls_head-btbsta.
    headdatain-trcont_currency = ls_head-waers.
    headdatain-currency        = ls_head-waers.
    headdatain-purch_no        = ls_head-bstkd.
    headdatain-comp_code       = ls_head-zzsign_platfrom.
    headdatain-sales_grp       = ls_head-ekgrp.
    headdatain-sales_off       = ls_head-ekorg.
    headdatain-sales_org       = ls_head-zzsign_platfrom.
    headdatain-distr_chan      = ls_head-vtweg.
    headdatain-division        = ls_head-spart.
    IF headdatain-tew_type IS INITIAL.
      headdatain-tew_type = 'Z001'.
    ENDIF.
    IF headdatain-distr_chan IS INITIAL.
      headdatain-distr_chan = '10'.
    ENDIF.
    IF headdatain-division IS INITIAL.
      headdatain-division = '11'.
    ENDIF.

    " 抬头数据扩展字段
    ms_bapi_te_wbhk-vkgrp           = ls_head-ekgrp.
    ms_bapi_te_wbhk-vkbur           = ls_head-ekorg.
    ms_bapi_te_wbhk-tkonn_ex        = ls_head-tkonn_ex.
    ms_bapi_te_wbhk-guarantee_f     = ls_head-guarantee_f        .
    ms_bapi_te_wbhk-ciq_lastdt      = ls_head-ciq_lastdt         .
    ms_bapi_te_wbhk-consnno         = ls_head-consnno            .
    ms_bapi_te_wbhk-zframe_tkonn    = ls_head-zframe_tkonn        .
    ms_bapi_te_wbhk-zzsndat         = ls_head-zzsndat             .
    ms_bapi_te_wbhk-zprictp         = ls_head-zprictp             .
    ms_bapi_te_wbhk-zzlsch_mm       = ls_head-zzlsch_mm           .
    ms_bapi_te_wbhk-zzlsch_txt_mm_n = ls_head-zzlsch_mm_ex        .
    ms_bapi_te_wbhk-zzlsch_sd       = ls_head-zzlsch_sd           .
    ms_bapi_te_wbhk-zzlsch_txt_sd_n = ls_head-zzlsch_sd_ex        .
    ms_bapi_te_wbhk-zzrpdate_end    = ls_head-zzrpdate_end        .
*   ms_bapi_te_wbhk-zzrpdate_end_ex = ls_head-zzrpdate_end_ex     .
    ms_bapi_te_wbhk-zzamt01_mm      = ls_head-zzamt01_mm          .
    ms_bapi_te_wbhk-zzcur01_mm      = ls_head-zzcur01_mm          .
*   ms_bapi_te_wbhk-zzamt01_mm_ex   = ls_head-zzamt01_mm_ex       .
    ms_bapi_te_wbhk-zzpcode_src     = ls_head-zzpcode_src         .
    ms_bapi_te_wbhk-zzland1_src     = ls_head-zzland1_src         .
    ms_bapi_te_wbhk-zzpname_src     = ls_head-zzpname_src         .
    ms_bapi_te_wbhk-zzpcode_des     = ls_head-zzpcode_des         .
    ms_bapi_te_wbhk-zzland1_des     = ls_head-zzland1_des         .
    ms_bapi_te_wbhk-zzpname_des     = ls_head-zzpname_des         .
    ms_bapi_te_wbhk-zzpcode_tra     = ls_head-zzpcode_tra         .
    ms_bapi_te_wbhk-zzland1_tra     = ls_head-zzland1_tra         .
    ms_bapi_te_wbhk-zzpname_tra     = ls_head-zzpname_tra         .
    ms_bapi_te_wbhk-zzis_preins     = ls_head-zzis_preins         .
    ms_bapi_te_wbhk-zzzcdh_date     = ls_head-zzreceived_data_last.
    ms_bapi_te_wbhk-zzlaycanq       = ls_head-zzlaycan_from       .
    ms_bapi_te_wbhk-zzlaycanz       = ls_head-zzlaycan_to         .
*   ms_bapi_te_wbhk-zzlogistics_ex  = ls_head-zzlogistics_ex      .
    ms_bapi_te_wbhk-zzbusst         = ls_head-zzbusst             .
    ms_bapi_te_wbhk-zzsnfile        = ls_head-zzsnfile            .
    ms_bapi_te_wbhk-zzsnflg         = ls_head-zzsnflg             .
    ms_bapi_te_wbhk-zzwd_tcdoc_flg  = ls_head-zzwd_tcdoc_flg      .
    ms_bapi_te_wbhk-zzyqd           = ls_head-zzyqd               .
    ms_bapi_te_wbhk-zzstpga_flg     = ls_head-zzstpga_flg         .
    ms_bapi_te_wbhk-zzgmyw_flg      = ls_head-zzgmyw_flg          .
    ms_bapi_te_wbhk-zzflexible      = ls_head-zzflexible          .
    ms_bapi_te_wbhk-zzwtcgp         = ls_head-zzwtcgp             .
    ms_bapi_te_wbhk-zzwtcgp_rt      = ls_head-zzwtcgp_rt          .
*   ms_bapi_te_wbhk-zzwtcgp_rt_ex   = ls_head-zzwtcgp_rt_ex       .
*   ms_bapi_te_wbhk-zztext1         = ls_head-zztext1             .
*   ms_bapi_te_wbhk-zztext2         = ls_head-zztext2             .
    ms_bapi_te_wbhk-zzwtc_fvdate    = ls_head-zzwtc_fvdate        .
    ms_bapi_te_wbhk-zzwtc_fvtime    = ls_head-zzwtc_fvtime        .
    ms_bapi_te_wbhk-zzwtc_fvapper   = ls_head-zzwtc_fvapper       .
    ms_bapi_te_wbhk-zzefeupt_date   = ls_head-zzefeupt_date       .
    ms_bapi_te_wbhk-zzefeupt_time   = ls_head-zzefeupt_time       .
    ms_bapi_te_wbhk-zzefeupt_name   = ls_head-zzefeupt_apper      .
    ms_bapi_te_wbhk-zzpreclo_date   = ls_head-zzpreclo_date       .
    ms_bapi_te_wbhk-zzpreclo_time   = ls_head-zzpreclo_time       .
    ms_bapi_te_wbhk-zzpreclo_name   = ls_head-zzpreclo_apper      .
    ms_bapi_te_wbhk-zznatclo_date   = ls_head-zznatclo_date       .
    ms_bapi_te_wbhk-zznatclo_time   = ls_head-zznatclo_time       .
    ms_bapi_te_wbhk-zznatclo_name   = ls_head-zznatclo_apper      .
    ms_bapi_te_wbhk-zzfdclo_date    = ls_head-zzcancel_date       .
    ms_bapi_te_wbhk-zzfdclo_time    = ls_head-zzcancel_time       .
    ms_bapi_te_wbhk-zzfdclo_name    = ls_head-zzcancel_apper      .
*   ms_bapi_te_wbhk-zzfield1        = ls_head-zzfield1            .
*   ms_bapi_te_wbhk-zzfield2        = ls_head-zzfield2            .
*   ms_bapi_te_wbhk-zzfield3        = ls_head-zzfield3            .
*   ms_bapi_te_wbhk-zzfield4        = ls_head-zzfield4            .
*   ms_bapi_te_wbhk-zzfield5        = ls_head-zzfield5            .
*   ms_bapi_te_wbhk-zzfield6        = ls_head-zzfield6            .
*   ms_bapi_te_wbhk-zzfield7        = ls_head-zzfield7            .
*   ms_bapi_te_wbhk-zzfield8        = ls_head-zzfield8            .
*   ms_bapi_te_wbhk-zzfield9        = ls_head-zzfield9            .

  ENDMETHOD.

  METHOD set_bussiness.

    DATA(ls_head) = input->ms_head.

    " 业务数据首行是抬头用的
    DATA ls_businessdatain TYPE bapitcbus.
    CLEAR ls_businessdatain.
    ls_businessdatain-vendor        = ls_head-lifnr   .
    ls_businessdatain-pmnttrms      = ls_head-zterm          .
    ls_businessdatain-currency      = ls_head-waers          .
    ls_businessdatain-exch_rate_p   = ls_head-tkrate_mm      .
    ls_businessdatain-exchg_rate    = ls_head-kurst_mm       .
    ls_businessdatain-exch_rate_v   = ls_head-tkrate_sd      .
*   ls_businessdatain-kurst_sd      = ls_head-kurst_sd       .
    ls_businessdatain-incoterms1    = ls_head-inco1_mm       .
    ls_businessdatain-incoterms2    = ls_head-inco1_mm_ex    .
    ls_businessdatain-incoterms1_sd = ls_head-inco1_sd       .
    ls_businessdatain-incoterms2_sd = ls_head-inco1_sd_ex    .
    ls_businessdatain-purch_org     = ls_head-ekorg          .
    ls_businessdatain-pur_group     = ls_head-ekgrp          .
    INSERT ls_businessdatain INTO TABLE businessdatain.

    " 日期处理
    DEFINE _clean_date.
      REPLACE ALL OCCURRENCES OF '[^0-9]' IN &1 WITH ''.
      IF &1 IS INITIAL.
        &1 = '00000000'.
      ENDIF.
    END-OF-DEFINITION.
    _clean_date ls_head-zzshipping_data_last.
    _clean_date ls_head-zzreceived_data_last.

    " 行项目增强结构
    DATA ls_bapi_te_wbhd TYPE bapi_te_wbhd.
    CLEAR ls_bapi_te_wbhd.
    ls_bapi_te_wbhd-bstdk      = ls_head-bstkd.
    ls_bapi_te_wbhd-edatu_vbak = ls_head-zzshipping_data_last.
    ls_bapi_te_wbhd-eindt      = ls_head-zzreceived_data_last.
    INSERT ls_bapi_te_wbhd INTO TABLE mt_bapi_te_wbhd.

  ENDMETHOD.

  METHOD set_item.

    DATA(ls_head) = input->ms_head.
    DATA(lt_item) = input->mt_item.

    DATA ls_itemdatain TYPE bapitcitem.
    DATA ls_bapi_te_wbhi TYPE bapi_te_wbhi.

    " 行项目
    LOOP AT lt_item INTO DATA(ls_item).
      IF ls_item-tposn IS INITIAL.
        ls_item-tposn = sy-tabix * 10.
      ENDIF.

      CLEAR ls_itemdatain.
      ls_itemdatain-trcont_item    = ls_item-tposn.
      ls_itemdatain-trcont_subitem = ls_item-tposn_sub.
      ls_itemdatain-plant          = ls_head-zzsign_platfrom.
      ls_itemdatain-material       = ls_item-matnr.
      ls_itemdatain-material_long  = ls_item-matnr.
      ls_itemdatain-short_text     = ls_item-arktx.

      ls_itemdatain-req_qty = ls_item-menge.
      ls_itemdatain-ordered = ls_item-menge.
      ls_itemdatain-po_unit = ls_item-meins.

      ls_itemdatain-sales_price = ls_item-netpr_mm.
      ls_itemdatain-sales_unit  = ls_item-meins.
      ls_itemdatain-currency    = ls_item-waers_mm.

      ls_itemdatain-pur_price    = ls_item-netpr_mm.
      ls_itemdatain-pur_currency = ls_item-waers_mm.
      ls_itemdatain-price_unit   = ls_item-peinh_mm.
      ls_itemdatain-stge_loc     = ls_item-lgort.
      INSERT ls_itemdatain INTO TABLE itemdatain.

      " 行项目增强结构
      CLEAR ls_bapi_te_wbhi.
      ls_bapi_te_wbhi-trcont_item    = ls_item-tposn    .
      ls_bapi_te_wbhi-trcont_subitem = ls_item-tposn_sub.
      ls_bapi_te_wbhi-uebto_mm       = ls_item-uebto_mm .
      ls_bapi_te_wbhi-untto_mm       = ls_item-untto_mm .
      ls_bapi_te_wbhi-zprdcat        = ls_item-zprdcat  .
      ls_bapi_te_wbhi-zgrade         = ls_item-zgrade   .
      ls_bapi_te_wbhi-zzoland        = ls_item-zoland   .
      ls_bapi_te_wbhi-zfactory       = ls_item-zfactory .
      ls_bapi_te_wbhi-ztechstd       = ls_item-ztechstd .
      ls_bapi_te_wbhi-zccbz          = ls_item-zccbz    .
      ls_bapi_te_wbhi-zxnyy          = ls_item-zxnyy    .
      ls_bapi_te_wbhi-zyszjh         = ls_item-zyszjh   .
      ls_bapi_te_wbhi-zysdjh         = ls_item-zysdjh   .
      ls_bapi_te_wbhi-zbgdh          = ls_item-zbgdh    .
      ls_bapi_te_wbhi-zkwh           = ls_item-zkwh     .
      ls_bapi_te_wbhi-zscrq          = ls_item-zscrq    .
      ls_bapi_te_wbhi-zzdysx1        = ls_item-zzdysx1  .
      ls_bapi_te_wbhi-zzdysx2        = ls_item-zzdysx2  .
      ls_bapi_te_wbhi-zzdysx3        = ls_item-zzdysx3  .
      ls_bapi_te_wbhi-zpcmark        = ls_item-zpcmark  .
      INSERT ls_bapi_te_wbhi INTO TABLE mt_bapi_te_wbhi.
    ENDLOOP.

  ENDMETHOD.

  METHOD set_partner.

    DATA(ls_head) = input->ms_head.
    DATA(lt_partner) = input->mt_partner.

    DATA ls_buspartyin TYPE bapitcparty.
    DATA lr_buspartyin TYPE REF TO bapitcparty.
    DATA ls_bapi_te_wbhp TYPE bapi_te_wbhp.

    " 合作伙伴数据
    LOOP AT lt_partner INTO DATA(ls_partner).
      CLEAR ls_buspartyin.
      ls_buspartyin-trcont_item    = ls_partner-tposn    .
      ls_buspartyin-trcont_subitem = ls_partner-tposn_sub.
      ls_buspartyin-partn_role     = ls_partner-parvw    .
      ls_buspartyin-partcount      = ls_partner-pstlz    .
      ls_buspartyin-vendor_no      = ls_partner-lifnr    .
      ls_buspartyin-cust_no        = ls_partner-kunnr    .
      ls_buspartyin-address        = ls_partner-adrnr    .
      INSERT ls_buspartyin INTO TABLE buspartyin.
    ENDLOOP.

    " 重复代码
    " &1: 合作伙伴角色
    " &2: 供应商编码
    DEFINE _add_partner.
      IF &3 IS NOT INITIAL.
        READ TABLE buspartyin REFERENCE INTO lr_buspartyin WITH KEY partn_role = &2.
        IF sy-subrc <> 0.
          INSERT VALUE #(
            partn_role = &2
          ) INTO TABLE buspartyin REFERENCE INTO lr_buspartyin.
        ENDIF.
        lr_buspartyin->&1 = &3.
      ENDIF.
    END-OF-DEFINITION.
    DEFINE _add_partner_vendor.
      _add_partner vendor_no &1 &2.
    END-OF-DEFINITION.

    " 如果合同伙伴中没这些对象,则根据抬头取值
    _add_partner_vendor 'LF' ls_head-lifnr.
    _add_partner_vendor 'Z4' ls_head-lifnr2.
    _add_partner_vendor 'Z1' ls_head-lifnr3.
    _add_partner_vendor 'ZM' ls_head-lifnr4.

  ENDMETHOD.

  METHOD set_condition.

    DATA(ls_head) = input->ms_head.
    DATA(lt_condition) = input->mt_condition.

    " 查询采购定价过程
    SELECT SINGLE kalsk FROM lfm1 WHERE lifnr = @ls_head-lifnr AND ekorg = @ls_head-ekorg INTO @DATA(l_kalsk).
    SELECT SINGLE kalsm FROM tmks WHERE kalse = '1000' AND kalsk = @l_kalsk INTO @DATA(l_kalsm).
    SELECT * FROM t683s WHERE kalsm = @l_kalsm INTO TABLE @DATA(lt_pricing_process).
    SORT lt_pricing_process BY kschl.

    " 采购(供应商)定价
    DATA ls_vendorcondin TYPE bapitccond.
    LOOP AT lt_condition INTO DATA(ls_condition).
      " 补全编码
      IF ls_condition-tposn IS INITIAL.
        ls_condition-tposn = sy-tabix * 10.
      ENDIF.
      IF ls_condition-zaehk IS INITIAL.
        ls_condition-zaehk = '001'.
      ENDIF.

      " 获取条件类型对应条件过程中的顺序
      READ TABLE lt_pricing_process INTO DATA(ls_pricing_process) WITH KEY kschl = ls_condition-kschl BINARY SEARCH.
      IF sy-subrc <> 0.
        CLEAR ls_pricing_process.
      ENDIF.

      CLEAR ls_vendorcondin.
      ls_vendorcondin-trcont_item    = ls_condition-tposn.
      ls_vendorcondin-trcont_subitem = ls_condition-tposn_sub.
      ls_vendorcondin-cond_st_no     = ls_pricing_process-stunr.
      ls_vendorcondin-cond_count     = '001'.
      ls_vendorcondin-applicatio     = ls_pricing_process-kappl.
      ls_vendorcondin-cond_type = ls_condition-kschl.
      ls_vendorcondin-cond_base = ls_condition-kbetr.
      ls_vendorcondin-currency = ls_condition-waers.
      ls_vendorcondin-cond_p_unt = ls_condition-kpein.
      ls_vendorcondin-cond_unit = ls_condition-kmein.
      INSERT ls_vendorcondin INTO TABLE vendorcondin.
    ENDLOOP.

*    " 费用定价
*    DATA ls_conditionkeydatain TYPE bapitcconditionkey.
*    DATA ls_conditionitemdatain TYPE bapitcconditionitem.
*    LOOP AT mt_condition INTO DATA(ls_condition).
*      DATA(l_order_key) = sy-tabix * 10.
*
*      CLEAR ls_conditionkeydatain.
*      ls_conditionkeydatain-order_key = l_order_key.
*      ls_conditionkeydatain-application = 'M'.
**      ls_conditionkeydatain-cond_group_no = 'G002'.
*      ls_conditionkeydatain-cond_type = ls_condition-kschl.
*      ls_conditionkeydatain-purch_org = ms_head-ekorg.
*      ls_conditionkeydatain-vendor = ms_head-lifnr.
*      INSERT ls_conditionkeydatain INTO TABLE conditionkeydatain.
*
*      CLEAR ls_conditionitemdatain.
*      ls_conditionitemdatain-order_key = l_order_key.
*      ls_conditionitemdatain-cond_count = ls_condition-kposn.
*      ls_conditionitemdatain-amount = ls_condition-kbetr.
*      ls_conditionitemdatain-condcurr = ls_condition-waers.
*      ls_conditionitemdatain-cond_p_unt = ls_condition-kpein.
*      ls_conditionitemdatain-cond_unit = ls_condition-kmein.
*      INSERT ls_conditionitemdatain INTO TABLE conditionitemdatain.
*    ENDLOOP.

  ENDMETHOD.

  METHOD set_text.
  ENDMETHOD.

ENDCLASS.


*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_bapi_ctr_change
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS lcl_bapi_ctr_change IMPLEMENTATION.

  METHOD lif_bapi~execute.

    result = me.

    " 增强字段长度大于960,无法使用extensionin字段
    " 因此通过BAPI增强的方式,将值传入
    " 由于是静态参数,等价于内存传值,而且更好的溯源
    zcl_im__wb2_bapi_enhance_ex=>set_extension(
      EXPORTING
        bapi_te_wbhk    = ms_bapi_te_wbhk
        t_bapi_te_wbhi  = mt_bapi_te_wbhi
        t_bapi_te_wbhd  = mt_bapi_te_wbhd
        t_bapi_te_wbhe  = mt_bapi_te_wbhe
        t_bapi_te_wbhp  = mt_bapi_te_wbhp
        bapi_te_wbhkx   = ms_bapi_te_wbhkx
        t_bapi_te_wbhix = mt_bapi_te_wbhix
        t_bapi_te_wbhdx = mt_bapi_te_wbhdx
        t_bapi_te_wbhex = mt_bapi_te_wbhex
        t_bapi_te_wbhpx = mt_bapi_te_wbhpx
    ).

    headdatain-testrun = testrun.
    SET PARAMETER ID 'BAPIHT' FIELD 'X'." BAPI创建合同,用于跳过部分校验
    CALL FUNCTION 'BAPI_TRADINGCONTRACT_CHANGE'
      EXPORTING
        tradingcontractno    = tradingcontractno
        headdatain           = headdatain
        headdatainx          = headdatainx
      IMPORTING
        headdataout          = headdataout
      TABLES
        itemdatain           = itemdatain
        itemdatainx          = itemdatainx
        scheduledatain       = scheduledatain
        scheduledatainx      = scheduledatainx
        businessdatain       = businessdatain
        businessdatainx      = businessdatainx
        buspartyin           = buspartyin
        buspartyinx          = buspartyinx
        extensionin          = extensionin
        headtextin           = headtextin
        itemtextin           = itemtextin
        itemdataout          = itemdataout
        scheduledataout      = scheduledataout
        businessdataout      = businessdataout
        buspartyout          = buspartyout
        headtextout          = headtextout
        itemtextout          = itemtextout
        extensionout         = extensionout
        return               = return
        partneraddresses     = partneraddresses
        partnerchanges       = partnerchanges
        vendorcondin         = vendorcondin
        vendorcondinx        = vendorcondinx
        customercondin       = customercondin
        customercondinx      = customercondinx
        conditionkeydatain   = conditionkeydatain
        conditionkeydatainx  = conditionkeydatainx
        conditionitemdatain  = conditionitemdatain
        conditionitemdatainx = conditionitemdatainx
        conditionkeydataout  = conditionkeydataout
        conditionitemdataout = conditionitemdataout
        scaledatain          = scaledatain
        scaledataout         = scaledataout
        vendorcondout        = vendorcondout
        customercondout      = customercondout.
    SET PARAMETER ID 'BAPIHT' FIELD ''.

    lif_bapi~document = tradingcontractno.
    lif_bapi~mt_bapiret2 = CORRESPONDING #( return ).

    CALL FUNCTION 'Z_MESSAGE_TABLE_TO_FIELD'
      EXPORTING
        t_bapiret2 = lif_bapi~mt_bapiret2
      IMPORTING
        status     = lif_bapi~status
        message    = lif_bapi~message.

    " 发生错误或测试执行的情况,不提交
    IF lif_bapi~status = 'E' OR testrun = abap_true.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CLEAR lif_bapi~document.
      RETURN.
    ENDIF.

    " 正式提交
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.

  ENDMETHOD.

  METHOD set_head.

    " 获取旧数据
    DATA(lo_old) = lcl_fiori_ctr_data=>read( input->ms_head-tkonn ).
    DATA(lo_new) = input.

    " 比较差异
    DATA lt_compare TYPE STANDARD TABLE OF zscompare_result.
    CALL FUNCTION 'Z_COMPARE_STRUCTURE'
      EXPORTING
        old    = lo_old->ms_head
        new    = lo_new->ms_head
      TABLES
        result = lt_compare.

    LOOP AT lt_compare REFERENCE INTO DATA(lr_compare) WHERE valid = abap_true AND changed = abap_true.
      CASE lr_compare->name.
        WHEN 'BTBSTA         '.
          MOVE lr_compare->value_new TO headdatain-trcont_stat    .
        WHEN 'WAERS          '.
          MOVE lr_compare->value_new TO headdatain-trcont_currency.
          MOVE lr_compare->value_new TO headdatain-currency       .
        WHEN 'BSTKD          '.
          MOVE lr_compare->value_new TO headdatain-purch_no       .
*        WHEN 'ZZSIGN_PLATFROM'.
*          MOVE lr_compare->value_new TO headdatain-comp_code      .
*          MOVE lr_compare->value_new TO headdatain-sales_org      .
*        WHEN 'EKGRP          '.
*          MOVE lr_compare->value_new TO headdatain-sales_grp      .
*        WHEN 'EKORG          '.
*          MOVE lr_compare->value_new TO headdatain-sales_off      .
*        WHEN 'VTWEG          '.
*          MOVE lr_compare->value_new TO headdatain-distr_chan     .
*        WHEN 'SPART          '.
*          MOVE lr_compare->value_new TO headdatain-division       .
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.

    " BAPIX结构自动打X
    CALL FUNCTION 'Z_SAME_FIELD_MARK'
      CHANGING
        data  = headdatain
        datax = headdatainx.

  ENDMETHOD.

  METHOD set_bussiness.

    " 获取旧数据
    DATA(lo_old) = lcl_fiori_ctr_data=>read( input->ms_head-tkonn ).
    DATA(lo_new) = input.

    " 比较差异
    DATA lt_compare TYPE STANDARD TABLE OF zscompare_result.
    CALL FUNCTION 'Z_COMPARE_STRUCTURE'
      EXPORTING
        old    = lo_old->ms_head
        new    = lo_new->ms_head
      TABLES
        result = lt_compare.

    DATA ls_businessdatain LIKE LINE OF businessdatain.
    DATA ls_businessdatainx LIKE LINE OF businessdatainx.

    LOOP AT lt_compare REFERENCE INTO DATA(lr_compare) WHERE valid = abap_true AND changed = abap_true.
      CASE lr_compare->name.
        WHEN 'LIFNR      '.
          MOVE lr_compare->value_new TO ls_businessdatain-vendor       .
        WHEN 'ZTERM      '.
          MOVE lr_compare->value_new TO ls_businessdatain-pmnttrms     .
        WHEN 'WAERS      '.
          MOVE lr_compare->value_new TO ls_businessdatain-currency     .
        WHEN 'TKRATE_MM  '.
          MOVE lr_compare->value_new TO ls_businessdatain-exch_rate_p  .
        WHEN 'KURST_MM   '.
          MOVE lr_compare->value_new TO ls_businessdatain-exchg_rate   .
        WHEN 'TKRATE_SD  '.
          MOVE lr_compare->value_new TO ls_businessdatain-exch_rate_v  .
        WHEN 'INCO1_MM   '.
          MOVE lr_compare->value_new TO ls_businessdatain-incoterms1   .
        WHEN 'INCO1_MM_EX'.
          MOVE lr_compare->value_new TO ls_businessdatain-incoterms2   .
        WHEN 'INCO1_SD   '.
          MOVE lr_compare->value_new TO ls_businessdatain-incoterms1_sd.
        WHEN 'INCO1_SD_EX'.
          MOVE lr_compare->value_new TO ls_businessdatain-incoterms2_sd.
*        WHEN 'EKORG      '.
*          MOVE lr_compare->value_new TO ls_businessdatain-purch_org    .
*        WHEN 'EKGRP      '.
*          MOVE lr_compare->value_new TO ls_businessdatain-pur_group    .
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.

    " BAPIX结构自动打X
    CALL FUNCTION 'Z_SAME_FIELD_MARK'
      CHANGING
        data  = ls_businessdatain
        datax = ls_businessdatainx.

    INSERT ls_businessdatain INTO TABLE businessdatain.
    INSERT ls_businessdatainx INTO TABLE businessdatainx.

  ENDMETHOD.

  METHOD set_item.

    " 获取旧数据
    DATA(lo_old) = lcl_fiori_ctr_data=>read( input->ms_head-tkonn ).
    DATA(lo_new) = input.

    DATA lt_compare TYPE STANDARD TABLE OF zscompare_result.

    DATA ls_itemdatain LIKE LINE OF itemdatain.
    DATA ls_itemdatainx LIKE LINE OF itemdatainx.

    LOOP AT lo_new->mt_item INTO DATA(ls_item_new).
      READ TABLE lo_old->mt_item INTO DATA(ls_item_old)
      WITH KEY
      tposn     = ls_item_new-tposn
      tposn_sub = ls_item_new-tposn_sub
      .
      " 新增行
      IF sy-subrc <> 0.
        ls_item_new-updateflag = 'I'.
        CLEAR ls_item_old.
      ENDIF.

*      " 旧行已删除,新增一行
*      IF ls_item_old-updateflag = 'D'.
*        ls_item_new-updateflag = 'I'.
*        CLEAR ls_item_old.
*      ENDIF.

      " 比较差异
      CLEAR lt_compare.
      CALL FUNCTION 'Z_COMPARE_STRUCTURE'
        EXPORTING
          old    = ls_item_old
          new    = ls_item_new
        TABLES
          result = lt_compare.

      ls_itemdatain-trcont_item    = ls_item_new-tposn    .
      ls_itemdatain-trcont_subitem = ls_item_new-tposn_sub.
      IF lo_old->ms_head-zzsign_platfrom <> lo_new->ms_head-zzsign_platfrom.
        ls_itemdatain-plant = lo_new->ms_head-zzsign_platfrom.
      ENDIF.

      LOOP AT lt_compare REFERENCE INTO DATA(lr_compare) WHERE valid = abap_true AND changed = abap_true.
        CASE lr_compare->name.
          WHEN 'MATNR   '.
            MOVE lr_compare->value_new TO ls_itemdatain-material    .
          WHEN 'ARKTX   '.
            MOVE lr_compare->value_new TO ls_itemdatain-short_text  .
          WHEN 'MENGE   '.
            MOVE lr_compare->value_new TO ls_itemdatain-req_qty     .
          WHEN 'MENGE   '.
            MOVE lr_compare->value_new TO ls_itemdatain-ordered     .
          WHEN 'MEINS   '.
            MOVE lr_compare->value_new TO ls_itemdatain-po_unit     .
          WHEN 'NETPR_MM'.
            MOVE lr_compare->value_new TO ls_itemdatain-sales_price .
          WHEN 'MEINS   '.
            MOVE lr_compare->value_new TO ls_itemdatain-sales_unit  .
          WHEN 'WAERS_MM'.
            MOVE lr_compare->value_new TO ls_itemdatain-currency    .
          WHEN 'NETPR_MM'.
            MOVE lr_compare->value_new TO ls_itemdatain-pur_price   .
          WHEN 'WAERS_MM'.
            MOVE lr_compare->value_new TO ls_itemdatain-pur_currency.
          WHEN 'PEINH_MM'.
            MOVE lr_compare->value_new TO ls_itemdatain-price_unit  .
          WHEN 'LGORT   '.
            MOVE lr_compare->value_new TO ls_itemdatain-stge_loc    .
          WHEN OTHERS.
        ENDCASE.
      ENDLOOP.

      " 自动打X
      CALL FUNCTION 'Z_SAME_FIELD_MARK'
        CHANGING
          data  = ls_itemdatain
          datax = ls_itemdatainx.
      ls_itemdatainx-updateflag = ls_item_new-updateflag.

      INSERT ls_itemdatain  INTO TABLE itemdatain.
      INSERT ls_itemdatainx INTO TABLE itemdatainx.
    ENDLOOP.

  ENDMETHOD.

  METHOD set_condition.

    " 获取旧数据
    DATA(lo_old) = lcl_fiori_ctr_data=>read( input->ms_head-tkonn ).
    DATA(lo_new) = input.

    DATA lt_compare TYPE STANDARD TABLE OF zscompare_result.

    DATA ls_vendorcondin LIKE LINE OF vendorcondin.
    DATA ls_vendorcondinx LIKE LINE OF vendorcondinx.

    " 查询采购定价过程
    SELECT SINGLE kalsk FROM lfm1
      WHERE lifnr = @lo_old->ms_head-lifnr
        AND ekorg = @lo_old->ms_head-ekorg
      INTO @DATA(l_kalsk).
    SELECT SINGLE kalsm FROM tmks WHERE kalse = '1000' AND kalsk = @l_kalsk INTO @DATA(l_kalsm).
    SELECT * FROM t683s WHERE kalsm = @l_kalsm INTO TABLE @DATA(lt_pricing_process).
    SORT lt_pricing_process BY kschl.

    " 采购(供应商)定价
    LOOP AT lo_new->mt_condition INTO DATA(ls_condition_new).
      READ TABLE lo_old->mt_condition INTO DATA(ls_condition_old)
      WITH KEY
      tposn     = ls_condition_new-tposn
      tposn_sub = ls_condition_new-tposn_sub
      knumv     = ls_condition_new-knumv
      kposn     = ls_condition_new-kposn
      stunr     = ls_condition_new-stunr
      zaehk     = ls_condition_new-zaehk
      .

      " 新增行
      IF sy-subrc <> 0.
        ls_condition_new-updateflag = 'I'.
        CLEAR ls_condition_new.
      ENDIF.

      ls_vendorcondin-trcont_item    = ls_condition_new-tposn    .
      ls_vendorcondin-trcont_subitem = ls_condition_new-tposn_sub.
      ls_vendorcondin-cond_st_no     = ls_condition_new-stunr    .
      ls_vendorcondin-cond_count     = ls_condition_new-zaehk    .

      LOOP AT lt_compare REFERENCE INTO DATA(lr_compare) WHERE valid = abap_true AND changed = abap_true.
        CASE lr_compare->name.
          WHEN 'KBETR'.
            MOVE lr_compare->value_new TO ls_vendorcondin-cond_base .
          WHEN 'WAERS'.
            MOVE lr_compare->value_new TO ls_vendorcondin-currency  .
          WHEN 'KPEIN'.
            MOVE lr_compare->value_new TO ls_vendorcondin-cond_p_unt.
          WHEN 'KMEIN'.
            MOVE lr_compare->value_new TO ls_vendorcondin-cond_unit .
          WHEN OTHERS.
        ENDCASE.
      ENDLOOP.

      CALL FUNCTION 'Z_SAME_FIELD_MARK'
        CHANGING
          data  = ls_vendorcondin
          datax = ls_vendorcondinx.

      ls_vendorcondinx-updateflag = ls_condition_new-updateflag.

      INSERT ls_vendorcondin INTO TABLE vendorcondin.
      INSERT ls_vendorcondinx INTO TABLE vendorcondinx.
    ENDLOOP.
  ENDMETHOD.

  METHOD set_partner  .

    " 获取旧数据
    DATA(lo_old) = lcl_fiori_ctr_data=>read( input->ms_head-tkonn ).
    DATA(lo_new) = input.

    DATA lt_compare TYPE STANDARD TABLE OF zscompare_result.

    DATA ls_partner_old LIKE LINE OF lo_old->mt_partner.
    DATA ls_partner_new LIKE LINE OF lo_new->mt_partner.
    DATA ls_buspartyin LIKE LINE OF buspartyin.
    DATA ls_buspartyinx LIKE LINE OF buspartyinx.

    " 合作伙伴数据
    DEFINE _to_partner.
      READ TABLE lo_new->mt_partner INTO ls_partner_new WITH KEY parvw = &1.
      IF sy-subrc <> 0.
        ls_partner_new =  VALUE #(
          parvw = &1
          updateflag = 'I'
          lifnr = lo_new->ms_head-&2
        ).
      ENDIF.

      READ TABLE lo_old->mt_partner INTO ls_partner_old WITH KEY parvw = &1.
      IF sy-subrc = 0.
        ls_partner_new-updateflag = 'U'.
      ENDIF.
    END-OF-DEFINITION.

    " 如果合同伙伴中没这些对象,则根据抬头取值
    _to_partner 'LF' lifnr.
    _to_partner 'Z4' lifnr2.
    _to_partner 'Z1' lifnr3.
    _to_partner 'ZM' lifnr4.

    LOOP AT lo_new->mt_partner INTO ls_partner_new.
      READ TABLE lo_old->mt_partner INTO ls_partner_old
      WITH KEY
      tposn     = ls_partner_new-tposn
      tposn_sub = ls_partner_new-tposn_sub
      parvw     = ls_partner_new-parvw
      .
      " 新增行
      IF sy-subrc <> 0.
        ls_partner_new-updateflag = 'I'.
        CLEAR ls_partner_old.
      ENDIF.

      " 比较差异
      CLEAR lt_compare.
      CALL FUNCTION 'Z_COMPARE_STRUCTURE'
        EXPORTING
          old    = ls_partner_old
          new    = ls_partner_new
        TABLES
          result = lt_compare.

      ls_buspartyin-trcont_item    = ls_partner_new-tposn.
      ls_buspartyin-trcont_subitem = ls_partner_new-tposn_sub.
      ls_buspartyin-partn_role     = ls_partner_new-parvw.
      ls_buspartyin-partcount      = ls_partner_new-pstlz.

      LOOP AT lt_compare REFERENCE INTO DATA(lr_compare) WHERE valid = abap_true AND changed = abap_true.
        CASE lr_compare->name.
          WHEN 'LIFNR   '.
            MOVE lr_compare->value_new TO ls_buspartyin-vendor_no.
          WHEN 'KUNNR   '.
            MOVE lr_compare->value_new TO ls_buspartyin-cust_no.
          WHEN OTHERS.
        ENDCASE.
      ENDLOOP.

      CALL FUNCTION 'Z_SAME_FIELD_MARK'
        CHANGING
          data  = ls_buspartyin
          datax = ls_buspartyinx.
      ls_buspartyinx-updateflag = ls_partner_new-updateflag.

      INSERT ls_buspartyin INTO TABLE buspartyin.
      INSERT ls_buspartyinx INTO TABLE buspartyinx.
    ENDLOOP.

  ENDMETHOD.

  METHOD set_text     .
  ENDMETHOD.

ENDCLASS.

*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_contract_service
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS lcl_contract_service IMPLEMENTATION.

  METHOD create.

    DATA(lo_fiori_ctr_data) = data.

    DATA(lo_bapi_ctr_create) = NEW lcl_bapi_ctr_create( ).
    lo_bapi_ctr_create->set_head( lo_fiori_ctr_data ).
    lo_bapi_ctr_create->set_item( lo_fiori_ctr_data ).
    lo_bapi_ctr_create->set_bussiness( lo_fiori_ctr_data ).
    lo_bapi_ctr_create->set_partner( lo_fiori_ctr_data ).
    lo_bapi_ctr_create->set_condition( lo_fiori_ctr_data ).
    lo_bapi_ctr_create->set_text( lo_fiori_ctr_data ).

    " 执行创建bapi
    DATA(lo_bapi) = lo_bapi_ctr_create->lif_bapi~execute( testrun = abap_true ).
    IF lo_bapi->status <> 'E'.
      lo_bapi = lo_bapi->execute( ).
    ENDIF.
    " 更新付款信息
    IF lo_bapi->status = 'S'.
      lo_fiori_ctr_data->save_payment( ).
    ENDIF.

    contract = lo_bapi->document.
    status   = lo_bapi->status  .
    message  = lo_bapi->message .

  ENDMETHOD.

  METHOD change.

    DATA(lo_fiori_ctr_data) = data.

    DATA(lo_bapi_ctr_change) = NEW lcl_bapi_ctr_change( ).
    lo_bapi_ctr_change->set_head( lo_fiori_ctr_data ).
    lo_bapi_ctr_change->set_item( lo_fiori_ctr_data ).
    lo_bapi_ctr_change->set_bussiness( lo_fiori_ctr_data ).
    lo_bapi_ctr_change->set_partner( lo_fiori_ctr_data ).
    lo_bapi_ctr_change->set_condition( lo_fiori_ctr_data ).
    lo_bapi_ctr_change->set_text( lo_fiori_ctr_data ).

    " 执行创建bapi
    DATA(lo_bapi) = lo_bapi_ctr_change->lif_bapi~execute( testrun = abap_true ).
    IF lo_bapi->status <> 'E'.
      lo_bapi = lo_bapi->execute( ).
    ENDIF.
    " 更新付款信息
    IF lo_bapi->status = 'S'.
      lo_fiori_ctr_data->save_payment( ).
    ENDIF.

    contract = lo_bapi->document.
    status   = lo_bapi->status  .
    message  = lo_bapi->message .

  ENDMETHOD.

ENDCLASS.

WB2_BAPI_ENHANCE_EX:合同增强

WB2_TC_INCOMP_LOG,合同不完整日志增强

合同关闭