SAP: ZSD012 Send Billing Document to Customer with PDF Attachment

ProgramZSDR012

T-code: ZSD012

 

可以后台手动运行,每天发送billing document To customer

1、  界面上输入什么日期,发送前一天的 billing document

2、  ZSDBill 表中必须有数据

 

*&---------------------------------------------------------------------*
*& Progarm      :  ZSDR012                        Author : Jimmy Wong
*& Created      :  28 Nov 2012                    App    : SD
*& Title        :  Send Billing Document to Customer with PDF Attachment
*& Description  :  Send Billing Document to Customer with PDF Attachment
*&---------------------------------------------------------------------*
*&  Version       Author      Date        description
*&                Jimmy       28 Nov 2012  the first version
*&M1              Jimmy       25 Jan 2013  Manual invoice maintenance Item
*&  the last update time  2013.01.29 09:00
*&---------------------------------------------------------------------*

report  zsdr012 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables:vbrk,adr6.
constants:gc_x    type char1 value 'X',
          gc_u    type char1 value 'U',
          gc_nosend type char20 value 'NO SEND', "NO SEND a
          gc_resend type char20 value 'RE SEND', "RE SEND b
          gc_sended type char20 value 'SENDT'. "SENDT c

data: begin of gt_vbrk occurs 0,
      vbeln like vbrk-vbeln,  "billing No.
      fkart like vbrk-fkart,  "billing type
      vkorg like vbrk-vkorg,  "sales org
      fkdat like vbrk-fkdat,  "billing date
      kunnr like vbrk-kunrg,  "customer
      zemta type char1,
      aubel like vbrp-aubel,
      aupos like vbrp-aupos,
      message type length 255,
      end of gt_vbrk.
data: gt_vbrk1 like gt_vbrk occurs with header line.
data: begin of gt_vbeln occurs 0,
     vbeln like vbrk-vbeln,  "billing No.
     end of gt_vbeln.
data: begin of gt_errorlog occurs 0,
      vbeln type vbrk-vbeln,                        "billing No.
      kunnr type vbrk-kunrg,                        "customer
      msgds type string,                            "message
      end of gt_errorlog.
data:begin of it_kna1 occurs 0,
      kunnr like kna1-kunnr,
      adrnr like kna1-adrnr,
    end of it_kna1.
data:begin of it_kunnr occurs 0,
      kunnr like kna1-kunnr,
      cust type c ,
    end of it_kunnr.
data:lt_errorlog like standard table of zmailerror_bill with header line ,
     i_pdf type tline occurs 10 with header line.
data: begin of i_reclist occurs 100,
      receiver type  adr6-smtp_addr,
      end of i_reclist.
data: begin of it_pdf occurs 0,
      vbeln type vbrk-vbeln,
      pdf_xstring type xstring,
      end of it_pdf.
data: begin of it_vbkd occurs 0,                            "M1 add
      vbeln like vbkd-vbeln,
      posnr like vbkd-posnr,
      mrnkz like vbkd-mrnkz,
      end of it_vbkd.

type-pools: slis.
data: fc_hier type slis_t_fieldcat_alv,
      wa_hier type slis_fieldcat_alv .
data: gv_lag        type char1,
      pdf_size type i,
      pdf_xstring type xstring.
*----------------------------------------------------------------------*
*  Parameter & Select-Options                                          *
*----------------------------------------------------------------------*
selection-screen begin of block block1 with frame title text-001.
select-options: s_fkdat for vbrk-fkdat default sy-datum.
select-options: s_vbeln for vbrk-vbeln,                    "Billing NO.
                s_kunrg for vbrk-kunrg,                    "Customer
*                s_fkdat for vbrk-fkdat,                    "Billing Date
                s_fkart for vbrk-fkart,                    "Billing Type
                v_mail for adr6-smtp_addr no intervals.
selection-screen skip.
parameters: p_kschl like nast-kschl default 'ZRD0'.
selection-screen end of block block1 .
*selection-screen begin of block b2 with frame title text-002 no intervals.
*parameters: p_no radiobutton group rad default 'X',
*            p_sent radiobutton group rad,
*            p_all radiobutton group rad.
*selection-screen end of block b2.

selection-screen begin of block b3 with frame title text-003 no intervals.
parameters: p_alv radiobutton group r2 default 'X',
            p_email radiobutton group r2.
selection-screen end of block b3.

initialization.
  clear gv_lag.

start-of-selection.
  perform get_period.
  perform get_data.
  if p_alv 'X'.
    if gt_vbrk[] is initial.
      message i003(zmm).
      exit.
    endif.
    perform check_data.
    perform build_fieldcat.
    perform print_out.
  else.
    if gt_vbrk[] is initial.
      write:'No Billing Document was found!'.
      exit.
    endif.
    perform email_process.
  endif.
  perform insert_message.
*&---------------------------------------------------------------------*
*&      Form  INSERT_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form insert_message .
  if  gt_errorlog[] is not initial.
    loop at gt_errorlog.
      move-corresponding gt_errorlog to lt_errorlog.
      lt_errorlog-bldat sy-datum.
      lt_errorlog-aezet sy-uzeit.
      append lt_errorlog.
    endloop.
    sort lt_errorlog by vbeln bldat aezet.
    delete adjacent duplicates from lt_errorlog[] comparing vbeln bldat aezet.

    modify zmailerror_bill from table lt_errorlog[].
    free: lt_errorlog,i_pdf,it_kunnr,it_kna1,gt_errorlog,gt_vbrk.
  endif.
endform.                    " INSERT_MESSAGE
*&---------------------------------------------------------------------*
*&      Form  GET_PERIOD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_period .
  if s_fkdat[] is initial.
    s_fkdat-sign 'I'.
    s_fkdat-option 'EQ'.
    s_fkdat-low sy-datum 1.
    append s_fkdat.
  else.
    loop at s_fkdat.
      if s_fkdat-low is not initial.
        s_fkdat-low s_fkdat-low 1.
      endif.
      if s_fkdat-high is not initial.
        s_fkdat-high s_fkdat-high 1.
      endif.
      modify s_fkdat .
    endloop.
  endif.

endform.                    " GET_PERIOD

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_data .

  select distinct a~vbeln a~fkart a~vkorg a~fkdat a~kunrg as kunnr b~zemta
        c~aubel c~aupos
    into corresponding fields of table gt_vbrk
    from vbrk as a inner join zsdbill as on a~vbeln b~vbeln
    inner join vbrp as on a~vbeln c~vbeln and b~posnr c~posnr
*    inner join vbkd as d  on c~aubel = d~vbeln and d~posnr = '000000' "M1
    where a~vbeln in s_vbeln
      and a~kunrg in s_kunrg
      and a~fkdat in s_fkdat
      and a~fkart in s_fkart
      and a~fksto ne 'X'
      and b~zemta ''
      and a~fkart not in ('RE','S1').
*      and d~mrnkz ne 'X'.

  if gt_vbrk[] is not initial.
*M1 add
    " check SO item mrnkz 只要存在mrnkz = ‘X’ 则Invoice 不发送
    select vbeln posnr mrnkz
      into corresponding fields of table it_vbkd
      from vbkd
      for all entries in  gt_vbrk
      where vbeln gt_vbrk-aubel
        and posnr =  gt_vbrk-aupos .

    select vbeln posnr mrnkz
      appending corresponding fields of table it_vbkd
      from vbkd
      for all entries in  gt_vbrk
      where vbeln gt_vbrk-aubel
        and posnr '000000' .

    sort  it_vbkd by vbeln posnr.
    loop at  gt_vbrk.
      read table it_vbkd with key vbeln gt_vbrk-aubel posnr gt_vbrk-aupos binary search.
      if sy-subrc eq 0.
        read table it_vbkd with key vbeln gt_vbrk-aubel posnr gt_vbrk-aupos mrnkz 'X'.
        if sy-subrc eq 0.
          gt_vbeln-vbeln gt_vbrk-vbeln.
          collect gt_vbeln.
          clear: gt_vbeln.
        endif.
      else.
        read table it_vbkd with key vbeln gt_vbrk-aubel posnr '000000' mrnkz 'X' .
        if sy-subrc eq 0.
          gt_vbeln-vbeln gt_vbrk-vbeln.
          collect gt_vbeln.
          clear: gt_vbeln.
        endif.
      endif.
    endloop.

    gt_vbrk1[] gt_vbrk[].
    clear:gt_vbrk,gt_vbrk[].
    sort gt_vbeln by vbeln.
    loop at gt_vbrk1.
      move-corresponding gt_vbrk1 to gt_vbrk.
      read table gt_vbeln with  key vbeln gt_vbrk-vbeln binary search.
      if sy-subrc ne 0.
        clear: gt_vbrk-aubel,gt_vbrk-aupos.
        collect gt_vbrk.
        clear: gt_vbrk.
      endif.
    endloop.
*M1 End
    if gt_vbrk[] is not initial.
      select kunnr adrnr
        into corresponding fields of table it_kna1
        from kna1
        for all entries in gt_vbrk
        where kunnr gt_vbrk-kunnr.

      loop at gt_vbrk.
        move-corresponding gt_vbrk to it_kunnr.
        it_kunnr-cust 'X' .
        collect it_kunnr.
        clear: it_kunnr.
      endloop.
      sort it_kunnr by kunnr.
      sort it_kna1 by kunnr.
      sort gt_vbrk by kunnr vbeln.
    endif.
  endif.
  free:  gt_vbrk1,it_vbkd,gt_vbeln.
endform.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  EMAIL_PROCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form email_process .
  clear gv_lag.
  refresh gt_errorlog.
  if p_email 'X'.
    loop at it_kunnr .
      clear gv_lag.
*     get customer address
      perform get_email_address.
      if gv_lag gc_x.
        continue.
      endif.

      if it_kunnr-cust 'X'.
        loop at gt_vbrk where kunnr it_kunnr-kunnr .
          clear gv_lag.

*     Conversion PDF
          perform convert_pdf using gt_vbrk-vbeln.
          if gv_lag gc_x.
            continue.
          endif.
        endloop.
*     Send email
        if it_pdf[] is not initial.
          perform send_email using it_kunnr-cust.
        else.
          clear:i_reclist[],i_reclist.
        endif.
      else.
        loop at gt_vbrk where kunnr it_kunnr-kunnr .
          clear gv_lag.

*     Conversion PDF
          perform convert_pdf using gt_vbrk-vbeln.
          if gv_lag gc_x.
            continue.
          endif.

*     Send email
          perform send_email using it_kunnr-cust.

          clear:it_pdf[],it_pdf.
        endloop.
      endif.
      clear:it_pdf[],it_pdf,i_reclist[],i_reclist.
    endloop.
  endif.
endform.                    " EMAIL_PROCESS
*&---------------------------------------------------------------------*
*&      Form  GET_EMAIL_ADDRESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_email_address .
  data lv_adrnr type adrnr.
  data: begin of lt_adr6 occurs 0,
          smtp_addr type adr6-smtp_addr,
        end of lt_adr6.

* Get Vendor Email Address
  clear lv_adrnr.
  if it_kunnr-kunnr is not initial.
    read table it_kna1 with key kunnr =  it_kunnr-kunnr binary search.
    if sy-subrc 0.
      select smtp_addr into  table lt_adr6
        from adr6
        where persnumber space
          and addrnumber it_kna1-adrnr.
      if sy-subrc 0.
        loop at lt_adr6.
          if lt_adr6-smtp_addr is not initial.
            clear i_reclist.
            i_reclist-receiver lt_adr6-smtp_addr.
            translate i_reclist-receiver to upper case.
            append i_reclist.
          endif.
        endloop.
        if i_reclist[] is initial.
          gv_lag            gc_x.
          gt_errorlog-vbeln '' .
          gt_errorlog-kunnr gt_vbrk-kunnr.
          gt_errorlog-msgds 'Billing-mail address of the Customer is empty, the message was not sent.'.
          append gt_errorlog.
          exit.
        endif.
      else.
        gv_lag            gc_x.
        gt_errorlog-vbeln '' .
        gt_errorlog-kunnr gt_vbrk-kunnr.
        gt_errorlog-msgds 'No maintenance the Billing Customer-mail address, the message is not sent.'.
        append gt_errorlog.
        " EXIT.
      endif.
    else.
      gv_lag            gc_x.
      gt_errorlog-vbeln '' .
      gt_errorlog-kunnr gt_vbrk-kunnr.
      gt_errorlog-msgds 'No maintenance the Billing Customer-mail address, the message is not sent.'.
      append gt_errorlog.
    endif.
  else.
    gv_lag            gc_x.
    gt_errorlog-vbeln '' .
    gt_errorlog-kunnr gt_vbrk-kunnr.
    gt_errorlog-msgds 'Billing Customer, the message was not sent.'.
    append gt_errorlog.
  endif.

endform.                    " GET_EMAIL_ADDRESS
*&---------------------------------------------------------------------*
*&      Form  CONVERT_PDF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0211   text
*----------------------------------------------------------------------*
form convert_pdf  using  p_vbeln.
  data: w_nast like nast.
  data: it_otf like table of itcoo with header line.

  data: control_parameters type ssfctrlop,
        output_options     type ssfcompop.

  select single from nast into w_nast
    where objky p_vbeln
      and kappl 'V3'
      and kschl p_kschl
      and spras sy-langu.
  if sy-subrc ne 0.
    gv_lag            gc_x.
    gt_errorlog-vbeln gt_vbrk-vbeln.
    gt_errorlog-kunnr gt_vbrk-kunnr.
    gt_errorlog-msgds 'No message maintained for Billing.'.
    append gt_errorlog.
  else.
    perform entry_neu_email(zyrlb_invoice3)
            tables it_otf using w_nast.
    if it_otf[] is initial.
      gv_lag            gc_x.
      gt_errorlog-vbeln gt_vbrk-vbeln.
      gt_errorlog-kunnr gt_vbrk-kunnr.
      gt_errorlog-msgds 'Smartform not called for Billing.'.
      append gt_errorlog.
    else.
      call function 'CONVERT_OTF'
        exporting
          format                'PDF'
        importing
          bin_filesize          pdf_size
          bin_file              pdf_xstring
        tables
          otf                   it_otf
          lines                 i_pdf
        exceptions
          err_max_linewidth     1
          err_format            2
          err_conv_not_possible 3
          err_bad_otf           4
          others                5.
      if sy-subrc <> 0.
        gv_lag            gc_x.
        gt_errorlog-vbeln gt_vbrk-vbeln.
        gt_errorlog-kunnr gt_vbrk-kunnr.
        gt_errorlog-msgds 'Convert OTF data to PDF failed for Billing.'.
        append gt_errorlog.
      else.
        it_pdf-vbeln gt_vbrk-vbeln.
        it_pdf-pdf_xstring  pdf_xstring.
        append it_pdf.
      endif.
    endif.
  endif.

endform.                    " CONVERT_PDF
*&---------------------------------------------------------------------*
*&      Form  SEND_EMAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form send_email using p_cust .
  data: t_subrc like sy-subrc.


  perform send_mail_via_bcs using  p_cust changing t_subrc.

  if t_subrc 0.
    loop at it_pdf.
*     Update email status
      update zsdbill  set zemta gc_x
                           aenam   sy-uname
                           laeda   sy-datum
                           aezet   sy-uzeit
                     where vbeln   it_pdf-vbeln.
      if sy-subrc <> 0.
        rollback work.
      else.
*    Update gt_vbrk email status
        gt_vbrk-zemta gc_x.
        modify  gt_vbrk transporting zemta where vbeln it_pdf-vbeln   .
      endif.
    endloop.
  else.
    loop at it_pdf.
      gt_errorlog-vbeln it_pdf-vbeln.
      gt_errorlog-kunnr it_kunnr-kunnr.
      gt_errorlog-msgds 'Email has not been sent to Customer.'.
      append gt_errorlog.
    endloop.
  endif.
endform.                    " SEND_EMAIL
*&---------------------------------------------------------------------*
*&      Form  SEND_MAIL_VIA_BCS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_T_SUBRC  text
*----------------------------------------------------------------------*
form send_mail_via_bcs using  p_cust  changing p_subrc.
  data  send_request       type ref to cl_bcs.
  data  text               type bcsy_text.
  data  subject            type sood-objdes.
  data  subject_title      type sood-objdes.
  data  pdf_content        type solix_tab.
  data  lp_pdf_size        type so_obj_len.
  data  document           type ref to cl_document_bcs.
  data  lo_sender         type ref to if_sender_bcs.
  data  lv_send           type ad_smtpadr value 'cms-fax@vtech.com '.
  data  mailto             type adr6-smtp_addr.
  data  recipient          type ref to if_recipient_bcs.
  data  bcs_exception      type ref to cx_bcs.
  data  sent_to_all        type os_boolean.

  p_subrc 4.
  if p_cust 'X'.
    subject_title 'Billing documents FROM VTECH' .
  else.
    concatenate 'Billing document ' gt_vbrk-vbeln 'FROM VTECH' into subject_title separated by space.
  endif.
  append 'Attention: Account Department' to text.
  "append initial line to text.
  append '  Enclosed invoices for your attention and information.' to text.
  "append initial line to text.
  append '  Should there be any problem with regard to invoices, please feel free to contact us immediately and will reponse to your request promptly.' to text.
  append initial line to text.
  append 'Thanks and regards' to text.
  append 'CMS/LOGISTIC' to text.

  try.
*   ---------- create persistent send request ----------------------
      send_request cl_bcs=>create_persistent).

*   ---------- add document ----------------------------------------
*   get PDF xstring and convert it to BCS format

      document cl_document_bcs=>create_document(
            i_type    'RAW'
            i_text    text
            i_subject subject_title ).

      loop at it_pdf.

        concatenate 'Billing document' it_pdf-vbeln into subject separated by space.

        lp_pdf_size xstrlenit_pdf-pdf_xstring ).

        pdf_content cl_document_bcs=>xstring_to_solix(
            ip_xstring it_pdf-pdf_xstring ).


        document->add_attachment(
              i_attachment_type 'PDF'
              i_attachment_subject subject
              i_att_content_hex pdf_content ).

      endloop.
*   add document to send request
      send_request->set_documentdocument ).
*   add seng (e-mail address)
*-Sender(v_address = You can have static EMAIL Address for  sender or different EMAIL addresses )
      "gv_send = 'cms-fax@vtech.com '.
      lo_sender cl_cam_address_bcs=>create_internet_addresslv_send ).
      "Set sender
      send_request->set_senderlo_sender ).
*   ---------- add recipient (e-mail address) ----------------------
      if v_mail[] is not initial.
        loop at v_mail.
          i_reclist-receiver v_mail-low.
          translate i_reclist-receiver to upper case.
          collect i_reclist.
          clear:i_reclist.
        endloop.
      endif.
      loop at i_reclist.
        mailto i_reclist-receiver.
        recipient cl_cam_address_bcs=>create_internet_address(
            i_address_string mailto ).
*       ADD recipient TO send REQUEST
        send_request->add_recipienti_recipient recipient ).
      endloop.

*   ---------- send document ---------------------------------------
      sent_to_all send_request->send(
          i_with_error_screen 'X' ).

      if sent_to_all 'X'.
        p_subrc 0.
      endif.

*   ---------- explicit 'commit work' is mandatory! ----------------
      commit work.

* ------------------------------------------------------------------
* *            exception handling
* ------------------------------------------------------------------
* * replace this very rudimentary exception handling
* * with your own one !!!
* ------------------------------------------------------------------
    catch cx_bcs into bcs_exception.
      if p_email 'X'.
        loop at it_pdf.
          gt_errorlog-vbeln it_pdf-vbeln.
          gt_errorlog-kunnr it_kunnr-kunnr.
          gt_errorlog-msgds bcs_exception->error_type.
          append gt_errorlog.
        endloop.
      else.
        message s000(oowith bcs_exception->error_type.
      endif.
      exit.
  endtry.
endform.                    " SEND_MAIL_VIA_BCS
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form build_fieldcat .
  define alv_field.
    clear:wa_hier.
    wa_hier-fieldname &1.
    wa_hier-seltext_m &2.
    wa_hier-seltext_l &3.
    wa_hier-outputlen &4.
    wa_hier-just &5.
    wa_hier-ref_tabname &6 .
    wa_hier-ref_fieldname &7 .
    append wa_hier to fc_hier.
  end-of-definition.

  refresh fc_hier.
  alv_field  'VBELN' '' '' '15' ''  'VBRK'  'VBELN' .
  alv_field  'FKART' '' '' '10'  '' 'VBRK'  'FKART' .
  alv_field  'VKORG' '' '' '6'  '' 'VBRK'   'VKORG' .
  alv_field  'FKDAT' '' '' '10'  '' 'VBRK'   'FKDAT' .
  alv_field  'KUNNR' '' '' '10'  ''  'KNA1' 'KUNNR' .
  alv_field  'ZEMTA' '' 'Mail Mark' ''  '' '' ''   .
  alv_field  'MESSAGE' '' 'Message' '50'  '' '' ''   .
endform.                    " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  PRINT_OUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form print_out .
  sort gt_vbrk by fkdat kunnr vbeln.
  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program      sy-repid
      it_fieldcat             fc_hier[]
      i_save                  'A'
      i_callback_user_command 'ALV_USER_COMMAND'
    tables
      t_outtab                gt_vbrk[]
    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.                    " PRINT_OUT
*&---------------------------------------------------------------------*
*&      Form  ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
form alv_user_command using r_ucomm like sy-ucomm
                  rs_selfield type slis_selfield. "响应ALV点击自定义按钮之后的事件
  data:lv_matnr like mara-matnr.
  case r_ucomm.
    when '&IC1'.
      if rs_selfield-fieldname ='VBELN' and rs_selfield-value <>''.
        set parameter id :'VF' field rs_selfield-value .
        call transaction 'VF03'  and skip first screen .
      endif.
  endcase.
endform.                    "alv_user_command
*&---------------------------------------------------------------------*
*&      Form  CHECK_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form check_data .
  data:lv_tabix like sy-tabix.
  data: begin of lt_adr occurs 0,
        smtp_addr type adr6-smtp_addr,
      end of lt_adr.
  data: w_nast like nast.
  data: it_otf like table of itcoo with header line.

  data: control_parameters type ssfctrlop,
        output_options     type ssfcompop.

  loop at gt_vbrk.
    lv_tabix sy-tabix.

    "Email Address.
    if gt_vbrk-kunnr is not initial.
      read table it_kna1 with key kunnr =  gt_vbrk-kunnr binary search.
      if sy-subrc 0.
        select smtp_addr into  table lt_adr
          from adr6
          where persnumber space
            and addrnumber it_kna1-adrnr.
        if sy-subrc ne 0.
          concatenate gt_vbrk-message 'No maintenance the Billing Customer-mail address, the message is not sent.'
              into gt_vbrk-message separated by space.
        endif.
      else.
        concatenate gt_vbrk-message 'No maintenance the Billing Customer-mail address, the message is not sent.'
            into gt_vbrk-message separated by space.
      endif.
    else.
      concatenate gt_vbrk-message 'Billing Customer, the message was not sent.'
            into gt_vbrk-message separated by space.
    endif.

    "Convent PDF
    select single from nast into w_nast
      where objky gt_vbrk-vbeln
        and kappl 'V3'
        and kschl p_kschl
        and spras sy-langu.
    if sy-subrc ne 0.
      concatenate gt_vbrk-message 'No message maintained for Billing.'
          into gt_vbrk-message separated by space.
*    else.
*      perform entry_neu_email(zyrlb_invoice3)
*              tables it_otf using w_nast.
*      if it_otf[] is initial.
*        concatenate gt_vbrk-message 'Smartform not called for Billing.'
*            into gt_vbrk-message separated by space.
*      else.
*        call function 'CONVERT_OTF'
*          exporting
*            format                = 'PDF'
*          importing
*            bin_filesize          = pdf_size
*            bin_file              = pdf_xstring
*          tables
*            otf                   = it_otf
*            lines                 = i_pdf
*          exceptions
*            err_max_linewidth     = 1
*            err_format            = 2
*            err_conv_not_possible = 3
*            err_bad_otf           = 4
*            others                = 5.
*        if sy-subrc <> 0.
*          concatenate gt_vbrk-message 'Convert OTF data to PDF failed for Billing.'
*              into gt_vbrk-message separated by space.
*        endif.
*      endif.
    endif.

    modify gt_vbrk index lv_tabix  transporting message.
  endloop.
endform.                    " CHECK_DATA

*----------------------------------------------------------------------*
*      Print of a invoice by SAPscript SMART FORMS               *
*----------------------------------------------------------------------*

REPORT zyrlb_invoice3.

* declaration of data
INCLUDE ZRLB_INVOICE_DATA_DECLARE.
*INCLUDE rlb_invoice_data_declare.
* definition of forms
INCLUDE ZRLB_INVOICE_FORM01.
*INCLUDE rlb_invoice_form01.
INCLUDE ZRLB_PRINT_FORMS.
*INCLUDE rlb_print_forms.

*---------------------------------------------------------------------*
*       FORM ENTRY
*---------------------------------------------------------------------*
FORM entry USING return_code us_screen.

  DATA: lf_retcode TYPE sy-subrc.
  CLEAR retcode.
  xscreen us_screen.
  PERFORM processing USING us_screen
                     CHANGING lf_retcode.
  IF lf_retcode NE 0.
    return_code 1.
  ELSE.
    return_code 0.
  ENDIF.

ENDFORM.                    "ENTRY
*---------------------------------------------------------------------*
*       FORM PROCESSING                                               *
*---------------------------------------------------------------------*
FORM processing USING proc_screen
                CHANGING cf_retcode.

  DATA: ls_print_data_to_read TYPE lbbil_print_data_to_read.
  DATA: ls_bil_invoice TYPE lbbil_invoice.
  DATA: lf_fm_name            TYPE rs38l_fnam.
  DATA: ls_control_param      TYPE ssfctrlop.
  DATA: ls_composer_param     TYPE ssfcompop.
  DATA: ls_recipient          TYPE swotobjid.
  DATA: ls_sender             TYPE swotobjid.
  DATA: lf_formname           TYPE tdsfname.
  DATA: ls_addr_key           LIKE addr_key.
  DATA: ls_dlv-land           LIKE vbrk-land1.
  DATA: ls_job_info           TYPE ssfcrescl.
  DATA: IT_ERRORLIST          type TSFERROR.

* SmartForm from customizing table TNAPR
  lf_formname tnapr-sform.

* determine print data
  PERFORM set_print_data_to_read USING    lf_formname
                                 CHANGING ls_print_data_to_read
                                 cf_retcode.

  IF cf_retcode 0.
* select print data
    PERFORM get_data USING    ls_print_data_to_read
                     CHANGING ls_addr_key
                              ls_dlv-land
                              ls_bil_invoice
                              cf_retcode.
  ENDIF.

  IF cf_retcode 0.
    PERFORM set_print_param USING    ls_addr_key
                                     ls_dlv-land
                            CHANGING ls_control_param
                                     ls_composer_param
                                     ls_recipient
                                     ls_sender
                                     cf_retcode.
  ENDIF.

  IF cf_retcode 0.
* determine smartform function module for invoice
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
         EXPORTING  formname           lf_formname
*                 variant            = ' '
*                 direct_call        = ' '
         IMPORTING  fm_name            lf_fm_name
         EXCEPTIONS no_form            1
                    no_function_module 2
                    OTHERS             3.
    IF sy-subrc <> 0.
*   error handling
      cf_retcode sy-subrc.
      PERFORM protocol_update.
    ENDIF.
  ENDIF.

  IF cf_retcode 0.
    PERFORM check_repeat.
    IF ls_composer_param-tdcopies EQ 0.
      nast_anzal 1.
    ELSE.
      nast_anzal ls_composer_param-tdcopies.
    ENDIF.
    ls_composer_param-tdcopies 1.
* BEGIN: Country specific extension for Hungary
  DATA: lv_ccnum TYPE IDHUCCNUM.

* If a valid entry exists for the form in customizing view
* IDHUBILLINGOUT then the localized output shall be used.
  SELECT SINGLE ccnum INTO lv_ccnum FROM IDHUBILLINGOUT WHERE
    kschl nast-kschl.

  IF sy-subrc EQ 0.
    IF lv_ccnum IS INITIAL.
      lv_ccnum 1.
    ENDIF.
  ELSE.
    CLEAR lv_ccnum.
  ENDIF.
* END: Country specific extension for Hungary
    DO nast_anzal TIMES.
* In case of repetition only one time archiving
      IF sy-index AND nast-tdarmod 3.
        nast_tdarmod nast-tdarmod.
        nast-tdarmod 1.
        ls_composer_param-tdarmod 1.
      ENDIF.
      IF sy-index NE AND repeat IS INITIAL.
        repeat 'X'.
      ENDIF.
* BEGIN: Country specific extension for Hungary
    IF lv_ccnum IS NOT INITIAL.
      IF nast-repid IS INITIAL.
        nast-repid 1.
      ELSE.
        nast-repid nast-repid + 1.
      ENDIF.
      nast-pfld1 lv_ccnum.
    ENDIF.
* END: Country specific extension for Hungary
* call smartform invoice
      CALL FUNCTION lf_fm_name
           EXPORTING
                      archive_index        toa_dara
                      archive_parameters   arc_params
                      control_parameters   ls_control_param
*                 mail_appl_obj        =
                      mail_recipient       ls_recipient
                      mail_sender          ls_sender
                      output_options       ls_composer_param
                      user_settings        space
                      is_bil_invoice       ls_bil_invoice
                      is_nast              nast
                      is_repeat            repeat
           importing  job_output_info      ls_job_info
*                     document_output_info =
*                     job_output_options   =
           EXCEPTIONS formatting_error     1
                      internal_error       2
                      send_error           3
                      user_canceled        4
                      OTHERS               5.
      IF sy-subrc <> 0.
*   error handling
        cf_retcode sy-subrc.
        PERFORM protocol_update.
* get SmartForm protocoll and store it in the NAST protocoll
        PERFORM add_smfrm_prot.
        CALL FUNCTION 'SSF_READ_ERRORS'
            IMPORTING
                 ERRORTAB IT_ERRORLIST.

      ENDIF.
    ENDDO.
* get SmartForm spoolid and store it in the NAST protocoll
    DATA ls_spoolid LIKE LINE OF ls_job_info-spoolids.
    LOOP AT ls_job_info-spoolids INTO ls_spoolid.
      IF ls_spoolid NE space.
        PERFORM protocol_update_spool USING '342' ls_spoolid
                                            space space space.
      ENDIF.
    ENDLOOP.
    ls_composer_param-tdcopies nast_anzal.
    IF NOT nast_tdarmod IS INITIAL.
      nast-tdarmod nast_tdarmod.
      CLEAR nast_tdarmod.
    ENDIF.

  ENDIF.

* get SmartForm protocoll and store it in the NAST protocoll
* PERFORM ADD_SMFRM_PROT.

ENDFORM.                    "PROCESSING
*&---------------------------------------------------------------------*
*&      Form  entry_neu_email
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_OTF      text
*      -->P_NAST     text
*----------------------------------------------------------------------*
form entry_neu_email tables p_otf structure itcoo
                     using p_nast structure nast.

  data: ls_print_data_to_read type lbbil_print_data_to_read.
  data: ls_bil_invoice type lbbil_invoice.
  data: lf_fm_name            type rs38l_fnam.
  data: lf_formname           type tdsfname.
  data: ls_addr_key           like addr_key.
  data: ls_dlv-land           like vbrk-land1.
  data: ls_job_info           type ssfcrescl.
  data: cf_retcode type sy-subrc.
  data: l_op type ssfcompop.
  data: l_c type ssfctrlop.
  data: l_user_settings.

* SmartForm from customizing table TNAPR
  lf_formname 'ZWLB_INVOICE3'.
  nast p_nast.
* determine print data
  perform set_print_data_to_read using    lf_formname
                                 changing ls_print_data_to_read
                                 cf_retcode.

  if cf_retcode 0.
* select print data
    perform get_data using    ls_print_data_to_read
                     changing ls_addr_key
                              ls_dlv-land
                              ls_bil_invoice
                              cf_retcode.
  endif.

  if cf_retcode 0.
* determine smartform function module for invoice
    call function 'SSF_FUNCTION_MODULE_NAME'
      exporting
        formname           lf_formname
*       variant            = ' '
*       direct_call        = ' '
      importing
        fm_name            lf_fm_name
      exceptions
        no_form            1
        no_function_module 2
        others             3.
    if sy-subrc <> 0.
      cf_retcode sy-subrc.
    endif.
  endif.

  if cf_retcode 0.
    l_c-no_dialog 'X'.
    l_c-getotf 'X'.
    if l_c-device is initial .
      l_c-device 'PRINTER'.
    endif.
*
    l_op-tdnoprev 'X'.
    if l_op-tddest is initial.
      l_op-tddest 'LP01'.
    endif.
    l_op-tdimmed 'X'.
    l_op-tdnewid 'X'.  "new request

    call function lf_fm_name
      exporting
        control_parameters l_c
        output_options     l_op
        user_settings      l_user_settings
        is_bil_invoice     ls_bil_invoice
        is_nast            nast
        is_repeat          repeat
      importing
        job_output_info    ls_job_info
      exceptions
        formatting_error   1
        internal_error     2
        send_error         3
        user_canceled      4
        others             5.
    if sy-subrc <> 0.
    else.
      p_otf[] ls_job_info-otfdata[].
    endif.
  endif.
  clear:nast.
endform.                    "entry_neu_email
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值