• SAP IDOC


    物料主数据
    供应商主数据
    价格档案
    采购订单
    采购计划协议
    srm发货单
    物料凭证
    发票校验
    发票校验过账或删除信息返回
    
          CALL FUNCTION 'BAPI_INCOMINGINVOICE_PARK'
            EXPORTING
              headerdata          = headerdata
              addressdata         = addressdata
            IMPORTING
              invoicedocnumber    = invoicedocnumber
              fiscalyear          = fiscalyear
            TABLES
              itemdata            = itemdata
              accountingdata      = accountingdata
              glaccountdata       = glaccountdata
              materialdata        = materialdata
              taxdata             = taxdata
              withtaxdata         = withtaxdata
              vendoritemsplitdata = vendoritemsplitdata
              return              = return
              extensionin         = extensionin.
    
    *&---------------------------------------------------------------------*
    *&      Form  prepare_bapi_invoice
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    form prepare_bapi_invoice.
    
    * Definitions
      data: w_cnt   type i,
            w_netwr like ekpo-netwr,
            w_menge like ekpo-menge.
    
      data: begin of it_headerdata occurs 0.
              include structure bapi_incinv_create_header.
      data: end of it_headerdata.
    
      data: begin of it_additional occurs 0.
              include structure bapi_incinv_save_header_backgr.
      data: end of it_additional.
    
      data: begin of it_selectp occurs 0.
              include structure bapi_incinv_select_po.
      data: end of it_selectp.
    
      data: begin of it_itemdata occurs 0.
              include structure bapi_incinv_create_item.
      data: end of it_itemdata.
    
      data: begin of it_accountdata occurs 0.
              include structure bapi_incinv_create_account.
      data: end of it_accountdata.
    
      data: begin of it_accdata occurs 0.
              include structure bapi_incinv_create_gl_account.
      data: end of it_accdata.
    
      data: begin of it_taxdata occurs 0.
              include structure bapi_incinv_create_tax.
      data: end of it_taxdata.
    
      data: begin of it_return occurs 0.
              include structure bapiret2.
      data: end of it_return.
    
    * Fill tables for BAPI-Call
      clear it_headerdata.
      it_headerdata-ref_doc_no   = save-refnr.
      it_headerdata-invoice_ind  = 'X'.
      it_headerdata-doc_type     = 'RN'.
      it_headerdata-pstng_date   = sy-datum.
      if not save-redat is initial.
        it_headerdata-doc_date   = save-redat.
      else.
        it_headerdata-doc_date   = sy-datum.
      endif.
      it_headerdata-comp_code    = save-bukrs.
      it_headerdata-currency     = save-waers.
      it_headerdata-gross_amount = save-wrbtr.
      it_headerdata-supcountry   = save-lndwe.
      append it_headerdata.
    
      clear it_additional.
      it_additional-assign_deliv  = 'X'.
      it_additional-deliv_posting = 'S'.
      it_additional-sel_goods     = 'X'.
      append it_additional.
    
      clear: w_cnt, save-mwskz.
      loop at xekpo.
    *   Read PO item
        clear ekpo.
        select single * from ekpo
          where ebeln eq xekpo-ebeln
            and ebelp eq xekpo-ebelp.
    *   Check if entry already exist
        read table it_itemdata
          with key po_number = xekpo-ebeln
                   po_item = xekpo-ebelp.
        if sy-subrc = 0.
    *     Collect entry in item table
          it_itemdata-item_amount = it_itemdata-item_amount + xekpo-netwr.
          it_itemdata-quantity = it_itemdata-quantity + xekpo-menge.
          modify it_itemdata index sy-tabix.
        else.
    *     Load entry in item table
          clear it_itemdata.
          add 1 to w_cnt.
          it_itemdata-invoice_doc_item = w_cnt.
          it_itemdata-po_number = xekpo-ebeln.
          it_itemdata-po_item = xekpo-ebelp.
          it_itemdata-item_amount = xekpo-netwr.
          it_itemdata-quantity = xekpo-menge.
          it_itemdata-po_unit_iso = xekpo-meins.
          it_itemdata-tax_code = xekpo-mwskz.
          it_itemdata-item_text = xekpo-txz01.
    *     Set GR reference document
          if not ekpo-webre is initial.
            select * from ekbe
              where ebeln eq xekpo-ebeln
                and ebelp eq xekpo-ebelp
                and vgabe eq '1'
                and bewtp eq 'E'
                and bwart eq '101'.
              it_itemdata-ref_doc = ekbe-belnr.
              it_itemdata-ref_doc_year = ekbe-gjahr.
              it_itemdata-ref_doc_it = ekbe-buzei.
            endselect.
          endif.
          append it_itemdata.
        endif.
    *   Acoounting data
        if not ekpo-twrkz is initial.
          select * from ekkn
            where ebeln eq xekpo-ebeln
              and ebelp eq xekpo-ebelp.
            clear it_accountdata.
            it_accountdata-invoice_doc_item = w_cnt.
            it_accountdata-serial_no = ekkn-zekkn.
            it_accountdata-tax_code = xekpo-mwskz.
            it_accountdata-gl_account = ekkn-sakto.
            it_accountdata-costcenter = ekkn-kostl.
            it_accountdata-sd_doc     = ekkn-vbeln.
            it_accountdata-sdoc_item  = ekkn-vbelp.
            it_accountdata-wbs_elem   = ekkn-ps_psp_pnr.
            w_netwr = xekpo-netwr * ekkn-vproz / 100.
            it_accountdata-item_amount = w_netwr.
            w_menge = xekpo-menge * ekkn-vproz / 100.
            it_accountdata-quantity = w_menge.
            it_accountdata-po_unit_iso = xekpo-meins.
            append it_accountdata.
          endselect.
        endif.
    *   Determine MWSKZ for Header tax
        if save-mwskz is initial.
          save-mwskz = xekpo-mwskz.
        elseif save-mwskz ne xekpo-mwskz.
          save-mwskz = '??'.
        endif.
      endloop.
      if save-mwskz = '??'.
        clear save-mwskz.
      endif.
    
      clear w_cnt.
      loop at it_cond where betrg ne 0.
        clear it_accdata.
        add 1 to w_cnt.
        it_accdata-invoice_doc_item = w_cnt.
        it_accdata-comp_code = save-bukrs.
        it_accdata-gl_account = it_cond-skont.
        it_accdata-tax_code = it_cond-mwskz.
        it_accdata-item_amount = it_cond-betrg.
        it_accdata-db_cr_ind = it_cond-shkzg.
        it_accdata-costcenter = it_cond-kostl.
        it_accdata-orderid = it_cond-aufnr.
        it_accdata-item_text = save-name1.
        append it_accdata.
      endloop.
    
      clear it_taxdata.
      it_taxdata-tax_code = save-mwskz.
      it_taxdata-tax_amount = save-wmwst.
      append it_taxdata.
    
    * Start of IDOC changes - Local
    * =============================
    
      select single * from yasekgfunct
        where ybukrs     = save-bukrs
          and modulepool = 'LYAP_XIF01'
          and cust_fn_id = '002'.
    
      if sy-subrc = 0.
        call function yasekgfunct-kgfunction
          tables
            t_itemdata       = it_itemdata
            t_glaccountdata  = it_accdata
            t_accountingdata = it_accountdata
            t_taxdata        = it_taxdata
          changing
            c_headerdata     = it_headerdata.
      endif.
    
    * End of IDOC changes - Local
    * ===========================
    
    * Check if error message exist
      if not it_headerdata-item_text is initial.
        save-msgv2 = it_headerdata-item_text.
        save-idocst = '51'.
        exit.
      endif.
    
    *----------------------------------------------"Start 
    **Check if invoice already posted
    * select single * from rbkp
    *   where xblnr eq save-refnr
    *     and lifnr eq save-lifnr
    *     and gjahr eq sy-datum(4)
    *     and rbstat ne '2'.
    * if sy-subrc = 0.
    *   save-msgv2 = 'Invoice with same Reference number already exists'.
    *   save-idocst = '68'.
    *   exit.
    * endif.
    *----------------------------------------------"Ende  
    * Call BAPI
      call function 'BAPI_INCOMINGINVOICE_PARK'
        exporting
          headerdata       = it_headerdata
        importing
          invoicedocnumber = save-docnr
          fiscalyear       = save-gjahr
        tables
          itemdata         = it_itemdata
          glaccountdata    = it_accdata
          accountingdata   = it_accountdata
          taxdata          = it_taxdata
          return           = it_return.
    
      commit work.                                              
    
    * Processing depending on post status
      if save-docnr is initial.
    *   Get error messages
        save-idocst = '51'.
        loop at it_return where type eq 'E'.
          if sy-tabix eq 1.
            save-msgv3 = it_return-message.
          elseif sy-tabix eq 2.
            save-msgv4 = it_return-message.
          else.
            exit.
          endif.
        endloop.
      else.
    *   Determine FI number, could be different        "Start
        concatenate save-docnr save-gjahr into w_awkey.
        select single * from bkpf
          where bukrs eq save-bukrs
            and awkey eq w_awkey.                      "Ende  
        if not bkpf-belnr is initial.                  "Start 
          save-fidoc = bkpf-belnr.
        else.
          save-fidoc = save-docnr.
        endif.                                         "Ende  
    *   Start of local processing                      "Start
    *   =========================
        select single * from yasekgfunct
          where ybukrs     = save-bukrs
            and modulepool = 'LYAP_XIF01'
            and cust_fn_id = '003'.
        if sy-subrc = 0.
          it_headerdata-inv_ref_no = save-docnr.
          it_headerdata-inv_year   = save-gjahr.
          call function yasekgfunct-kgfunction
            tables
              t_itemdata      = it_itemdata
              t_glaccountdata = it_accdata
              t_accountdata   = it_accountdata
              t_taxdata       = it_taxdata
            changing
              c_headerdata    = it_headerdata.
        endif.
    *   End of local processing
    *   =======================                          "End 
      endif.
    
    endform.                    " prepare_bapi_invoice
    
    
    
    
    
    *&---------------------------------------------------------------------
    *& Func    : 
    *& Author  :*& Category: Update
    *& Title   Process inbound IDOC - Invoices (INVOIC)
    *&---------------------------------------------------------------------
    *& Note: Authority-check is not necessary here.
    *&---------------------------------------------------------------------
    *& Short description:
    *& This function will be called by IDOC-Inbound
    *& to load orders into SAP with IDOC-Processing
    *&---------------------------------------------------------------------*&---------------------------------------------------------------------
    function zidoc_input_invoic.
    *"----------------------------------------------------------------------
    *"*"Global Interface:
    *"  IMPORTING
    *"     VALUE(INPUT_METHOD) LIKE  BDWFAP_PAR-INPUTMETHD
    *"     VALUE(MASS_PROCESSING) LIKE  BDWFAP_PAR-MASS_PROC
    *"  EXPORTING
    *"     VALUE(WORKFLOW_RESULT) LIKE  BDWF_PARAM-RESULT
    *"     VALUE(APPLICATION_VARIABLE) LIKE  BDWF_PARAM-APPL_VAR
    *"     VALUE(IN_UPDATE_TASK) LIKE  BDWFAP_PAR-UPDATETASK
    *"     VALUE(CALL_TRANSACTION_DONE) LIKE  BDWFAP_PAR-CALLTRANS
    *"  TABLES
    *"      IDOC_CONTRL STRUCTURE  EDIDC
    *"      IDOC_DATA STRUCTURE  EDIDD
    *"      IDOC_STATUS STRUCTURE  BDIDOCSTAT
    *"      RETURN_VARIABLES STRUCTURE  BDWFRETVAR
    *"      SERIALIZATION_INFO STRUCTURE  BDI_SER
    *"  EXCEPTIONS
    *"      WRONG_FUNCTION_CALLED
    *"----------------------------------------------------------------------
    
      loop at idoc_contrl.
    
    *   Initial workfields and internal table
        clear: save.
        refresh: xekpo, it_cond.
        free:    xekpo, it_cond.
    
    *   Get IDOC-Fields into workfields and internal table
        loop at idoc_data where docnum eq idoc_contrl-docnum.
          perform fill_data_invoic.
        endloop.
    
    *--------------------------------------------------"Start
    *   if save-bukrs eq '5400'                        "Start 
    *   or save-bukrs eq '1500'                              "
    *   or save-bukrs eq '1900'                              "
    *   or save-bukrs eq '3000'.                             "
    **    fill IDOC_Status
    *     idoc_status-docnum = idoc_contrl-docnum.
    *     idoc_status-status = '68'.
    *     append idoc_status.
    *   else.                                            "
    **    Write invoice with BAPI
    *     perform prepare_bapi_invoice.
    **    fill IDOC_Status
    *     if save-docnr is initial.
    **      Set IDOC status
    *       idoc_status-docnum = idoc_contrl-docnum.
    *       idoc_status-status = save-idocst.
    *       idoc_status-msgv1  = 'Invoice not posted'.
    *       idoc_status-msgv2  = save-msgv2.
    *       idoc_status-msgv3  = save-msgv3.
    *       idoc_status-msgv4  = save-msgv4.
    *       append idoc_status.
    *     else.
    **      Set IDOC status
    *       idoc_status-docnum = idoc_contrl-docnum.
    *       idoc_status-status = '53'.
    *       idoc_status-msgv1  = 'Inovice posted'.
    *       idoc_status-msgv2  = save-docnr.
    *       append idoc_status.
    **      Create document links (IDOC/Attachments)
    *       perform document_links.
    *     endif.
    *   endif.                                               "
    *--------------------------------------------------"Ende  
    
    *--------------------------------------------------"Start 
    *   Get control information for company code
        select single * from yapxiinvctrl
          where bukrs eq save-bukrs
            and lifnr eq save-lifnr.
    
        w_arch_sp = yapxiinvctrl-langu.
        w_arch_id = yapxiinvctrl-archivid.
    
        clear w_xiinterf.                                    "Ins 
    *--------------------------------------------------"Start
    ** { UC Insert                                              
    *    l_string = idoc_contrl-arckey+20(16).
    *    call function 'HR_KR_STRING_TO_XSTRING'
    *      exporting
    *        codepage_to    = '4110'          "UTF-8 "UC 
    *        unicode_string = l_string
    *      importing
    *        xstring_stream = l_xstring.
    *    w_ximessid-x   = l_xstring.
    *    w_ximessid-c   = idoc_contrl-arckey+36(32).
    *    w_ximessid-c25 = idoc_contrl-arckey+68(2).
    ** } UC Insert                                                
    *
    **   Holen Interfacename aus XI
    *    concatenate idoc_contrl-sndpor+3(3) '200EXCH'        "Ins MB11112009
    *      into w_remote_system.                              "Ins MB11112009
    *
    *    call function 'YAP_CHECK_ADS_MESSAGES'
    *      destination w_remote_system
    *      exporting
    *        messageid      = w_ximessid
    *      importing
    *        interface_name = w_xiinterf.
    *
    **   Check if the content repository is ready           "
    *    if w_xiinterf cs 'ADS'.
    *      select single arc_doc_id from toa01 into w_arch_docid
    *        where archiv_id eq w_arch_id.
    *      call function 'ARCHIVOBJECT_STATUS'
    *        exporting
    *          archiv_doc_id            = w_arch_docid
    *          archiv_id                = w_arch_id
    *        importing
    *          archiv_object_status     = w_object_status
    *        exceptions
    *          error_archiv             = 1
    *          error_communicationtable = 2
    *          error_kernel             = 3
    *          others                   = 4.
    *      call function 'SCMS_HTTP_SERVER_INFO'
    *        exporting
    *          crep_id               = w_arch_id
    *        importing
    *          contrep_status        = w_contrep_status
    *        exceptions
    *          bad_request           = 1
    *          internal_server_error = 2
    *          error_http            = 3
    *          error_url             = 4
    *          error_signature       = 5
    *          contrep_not_found     = 6
    *          others                = 7.
    *      if sy-subrc > 0.
    *        idoc_status-docnum = idoc_contrl-docnum.
    *        idoc_status-status = '51'.
    *        idoc_status-msgv1  = 'Document not posted'.
    *        idoc_status-msgv2  = 'Archive not ready'.
    *        append idoc_status.
    *        continue.
    *      endif.
    *    endif.
    *--------------------------------------------------"Ende Del 
    
    
    *   Processing depending on control table
        case yapxiinvctrl-process.
    
          when '0'.                                         "Do nothing (set status=68)
    
            idoc_status-docnum = idoc_contrl-docnum.
            idoc_status-status = '68'.
            idoc_status-msgv1  = 'Document not posted'.
            idoc_status-msgv2 = 'No action required'.
            append idoc_status.
    
          when '1'.                                         "Post regular (BAPI_INCOMINGINVOICE_PARK)
    
    *--------------------------------------------------"Start
    **       Check if non ADS invoice must be posted
    *        if  yapxiinvctrl-ads eq 'X'
    *        and w_xiinterf ns 'ADS'.
    *          idoc_status-docnum = idoc_contrl-docnum.
    *          idoc_status-status = '68'.
    *          idoc_status-msgv1  = 'Invoice not posted'.
    *          idoc_status-msgv2 = 'Not ADS invoice, no action required'.
    *          append idoc_status.
    *          continue.
    *        endif.
    *--------------------------------------------------"Ende
    
    *       Check if document already posted
            select single * from rbkp
              where xblnr eq save-refnr
                and lifnr eq save-lifnr
                and gjahr eq sy-datum(4)
                and rbstat ne '2'.
            if sy-subrc = 0.
              idoc_status-docnum = idoc_contrl-docnum.
              idoc_status-status = '68'.
              idoc_status-msgv1  = 'Invoice not posted'.
              idoc_status-msgv2  = 'Invoice with same Reference number already exists'.
              append idoc_status.
              continue.
            endif.
    
    *       Post invoice with BAPI
            perform prepare_bapi_invoice.
    
            if save-docnr is initial.
              idoc_status-docnum = idoc_contrl-docnum.
              idoc_status-status = save-idocst.
              idoc_status-msgv1  = 'Invoice not posted'.
              idoc_status-msgv2  = 'Error in BAPI'.
              idoc_status-msgv2  = save-msgv2.
              idoc_status-msgv3  = save-msgv3.
              idoc_status-msgv4  = save-msgv4.
              append idoc_status.
            else.
              idoc_status-docnum = idoc_contrl-docnum.
              idoc_status-status = '53'.
              idoc_status-msgv1  = 'Invoice posted'.
              idoc_status-msgv2  = save-docnr.
              append idoc_status.
    
    *         Create document links
              perform document_links.
    
            endif.
    
          when '2'.                                           "Will be posted by Readsoft (deactivated )
    
    *--------------------------------------------------"Start 
            idoc_status-docnum = idoc_contrl-docnum.
            idoc_status-status = '68'.
            idoc_status-msgv1  = 'Document not posted'.
            idoc_status-msgv2 = 'No action required'.
            append idoc_status.
    *--------------------------------------------------"Ende 
    *--------------------------------------------------"Start
    *        call function '/COCKPIT/EDI_IDOC_TRANSFORM'
    *          exporting
    *            input_method          = input_method
    *            mass_processing       = mass_processing
    *          importing
    *            workflow_result       = workflow_result
    *            application_variable  = application_variable
    *            in_update_task        = in_update_task
    *            call_transaction_done = call_transaction_done
    *          tables
    *            idoc_contrl           = idoc_contrl
    *            idoc_data             = idoc_data
    *            idoc_status           = idoc_status
    *            return_variables      = return_variables
    *            serialization_info    = serialization_info.
    *--------------------------------------------------"Ende Del
    
        endcase.
    *--------------------------------------------------"Ende  
    
      endloop.
    
    endfunction.
  • 相关阅读:
    Sails v1.0使用指南
    sails0.12相关命令
    vs code 快捷键
    nodejs相关框架
    sails 相关软件下载地址及命令
    UltraISO安装windows10时0x8007000D错误解决办法
    C# HtmlElement的GetAttribute("class") return ""
    Android如何实现TCP和UDP传输
    android 获取view在屏幕中的位置
    八款Android 开发者必备的小工具
  • 原文地址:https://www.cnblogs.com/JackeyLove/p/13298759.html
Copyright © 2020-2023  润新知