quarta-feira, 10 de julho de 2019

Novas característica ABAP 7.40

  Copiado de outro site.

https://zbap.net/abap-7-4-new-features-4eb4cde1a622

segunda-feira, 8 de julho de 2019

Incluindo execução programa RV80HGEN VOFM no tranporte

Ver nota  598475 - XPRA RV80HGEN when transporting VOFM objects


Solution

Implement the following modification in your system.
This ensures that the XPRA RV80HGEN is automatically attached in a new order when a VOFM object is created. If an existing VOFM is changed, you must still insert the RV80HGEN manually into the transport request.

quinta-feira, 4 de julho de 2019

Envio de boleto por email - solução por BTE

Solução de envio por email utilizando o programa RFFOBR_D.

Utilizar BTE  processo 2040

Marcar "controle de impressão" - > editar avisos
Informar formulário de impressao.

Na BTE

    TYPESBEGIN OF tp_chect ,        "vornumerierte Schecks: zum
             zbukr TYPE reguh-zbukr,    "Zahlungsbeleg gehörende Schecknr
             vblnr TYPE reguh-vblnr,    "prenumbered checks: check number
             chect TYPE regud-chect,    "of a payment documents
           END OF tp_chect.

    DATAlt_chect TYPE TABLE OF tp_chect.

    DATAls_regup_aux TYPE regup.

    FIELD-SYMBOLS<lfss_regup> TYPE regup,
                   <lfss_regud> TYPE regud,
                   <lfst_chect> TYPE ANY TABLE.

    ASSIGN ('(RFFOBR_D)REGUP'TO <lfss_regup>.
    CHECK sy-subrc 0.
    ASSIGN ('(RFFOBR_D)REGUD'TO <lfss_regud>.
    CHECK sy-subrc 0.
    ASSIGN ('(RFFOBR_D)tab_schecks[]'TO <lfst_chect>.
    CHECK sy-subrc 0.

    lt_chect[] <lfst_chect>.

    SELECT SINGLE *
      INTO ls_regup_aux
      FROM regup
     WHERE laufd EQ is_reguh-laufd
       AND laufi EQ is_reguh-laufi
       AND xvorl EQ is_reguh-xvorl
       AND zbukr EQ is_reguh-zbukr
       AND lifnr EQ is_reguh-lifnr
       AND kunnr EQ is_reguh-kunnr
       AND empfg EQ is_reguh-empfg
       AND vblnr EQ is_reguh-vblnr.

    <lfss_regup>-zfbdt ls_regup_aux-zfbdt.
    <lfss_regup>-zbd1t ls_regup_aux-zbd1t.
    <lfss_regup>-zbd2t ls_regup_aux-zbd2t.
    <lfss_regup>-zbd3t ls_regup_aux-zbd3t.
    <lfss_regup>-bldat ls_regup_aux-bldat.

    CALL FUNCTION 'J_1B_FI_NETDUE'
      EXPORTING
        zfbdt   <lfss_regup>-zfbdt
        zbd1t   <lfss_regup>-zbd1t
        zbd2t   <lfss_regup>-zbd2t
        zbd3t   <lfss_regup>-zbd3t
      IMPORTING
        duedate <lfss_regud>-ausft.

    DATAlt_regup_br TYPE TABLE OF regup.

    APPEND <lfss_regup> TO lt_regup_br.

    CLEAR <lfss_regud>-chect.

    READ TABLE lt_chect INTO DATA(ls_chect)
                                 WITH KEY zbukr is_reguh-zbukr
                                          vblnr is_reguh-vblnr.

    IF sy-subrc 0.
      <lfss_regud>-chect ls_chect-chect.
    ENDIF.

    CALL FUNCTION 'BOLETO_DATA'
      EXPORTING
        line_reguh is_reguh
      TABLES
        itab_regup lt_regup_br
      CHANGING
        line_regud <lfss_regud>.

    SELECT SINGLE fornr
      INTO @DATA(l_fornr)
      FROM zfi_cfg
     WHERE bukrs EQ @is_reguh-zbukr
       AND hbkid EQ @is_reguh-hbkid.

    IF sy-subrc 0.
      cs_finaa-fornr l_fornr. "Formulário por banco
    ENDIF.

    SELECT prsnradrnr
      INTO TABLE @DATA(lt_addr)
      FROM kna1 AS a INNER JOIN
           knvk AS b
           ON a~kunnr EQ b~kunnr
     WHERE a~kunnr EQ @is_reguh-kunnr
       AND abtnr   EQ '0009'.

    IF lt_addr[] IS NOT INITIAL.

      SELECT adr6~smtp_addr,
             adrt~remark
        FROM adr6
        INNER JOIN adrt
         ON adrt~addrnumber EQ adr6~addrnumber
        AND adrt~persnumber EQ adr6~persnumber
        AND adrt~consnumber EQ adr6~consnumber
        INTO TABLE @DATA(lt_email)
        FOR ALL ENTRIES IN @lt_addr
      WHERE adr6~addrnumber EQ @lt_addr-adrnr
        AND adrt~comm_type  EQ 'INT'
        AND adrt~persnumber EQ @lt_addr-prsnr.

      DATA(ls_emaillt_email[ remark 'BOLETO' ].

      IF sy-subrc <> OR
         sy-subrc AND ls_email-smtp_addr IS INITIAL ).
        ls_email lt_email[ remark 'NFE' ].

        IF sy-subrc <> OR
           sy-subrc AND ls_email-smtp_addr IS INITIAL ).
          ls_email lt_email[ ].
        ENDIF.

      ENDIF.

      IF sy-subrc AND ls_email-smtp_addr IS NOT INITIAL.
        cs_finaa-intad ls_email-smtp_addr.
      ENDIF.

    ENDIF.

    SELECT SINGLE low
      INTO @DATA(l_low)
      FROM tvarvc
     WHERE name EQ 'ZFI_EMAIL_FI_DEPT'
       AND type EQ 'P'.
        

    "Email com cópia para financeiro
    IF sy-subrc AND l_low IS NOT INITIAL.
      cs_finaa-intad_cc l_low.
    ENDIF.

    cs_finaa-nacha 'I'.

segunda-feira, 1 de julho de 2019

Enviar anexo email

*&---------------------------------------------------------------------*
*&      Form  ENVIA_EMAIL
*&---------------------------------------------------------------------*
FORM envia_email .

  DATA: cl_send_request       TYPE REF TO cl_bcs,
        cl_document           TYPE REF TO cl_document_bcs,
        cl_sender             TYPE REF TO cl_sapuser_bcs,
        cl_recipient          TYPE REF TO if_recipient_bcs,
        cl_bcs_exception      TYPE REF TO cx_bcs.

  DATA: li_text               TYPE bcsy_text,
        li_bin_cont           TYPE solix_tab.

  DATA: lv_sent_to_all        TYPE os_boolean,
        lv_filename  TYPE string,
        lv_texto     TYPE string,
        lv_texto_aux TYPE string,
        lv_length    TYPE sood-objlen,
        lv_size      TYPE so_obj_len,
        lv_title     TYPE sood-objdes.

  CHECK p_email = 'X'.

  TRY.
*     -------- create persistent send request ------------------------
      cl_send_request = cl_bcs=>create_persistent( ).

      lv_title = text-005.
*     -------- create and set document -------------------------------
      APPEND text-006 TO li_text.
      lv_length = STRLEN( text-006 ).
      cl_document = cl_document_bcs=>create_document(
                      i_type    = 'RAW'
                      i_text    = li_text
                      i_length  = lv_length
                      i_subject = lv_title ).

      LOOP AT it_files INTO wa_files.

        REFRESH li_text.

        CLEAR: lv_length, li_bin_cont, lv_texto.

        OPEN DATASET wa_files-fullname FOR INPUT
                     IN TEXT MODE ENCODING NON-UNICODE.

        DO.

          READ DATASET wa_files-fullname INTO lv_texto_aux.
          IF sy-subrc = 0.
            IF lv_texto IS INITIAL.
              CONCATENATE lv_texto_aux cl_bcs_convert=>gc_crlf INTO lv_texto.
            ELSE.
              CONCATENATE lv_texto lv_texto_aux cl_bcs_convert=>gc_crlf
                          INTO lv_texto.
            ENDIF.
          ELSE.
            EXIT.
          ENDIF.

        ENDDO.

        CLOSE DATASET wa_files-fullname.

        TRY.
            cl_bcs_convert=>string_to_solix(
              EXPORTING
                iv_string   = lv_texto
                iv_codepage = '4103'  "suitable for MS Excel, leave empty
                iv_add_bom  = 'X'     "for other doc types
              IMPORTING
                et_solix  = li_bin_cont
                ev_size   = lv_length ).

          CATCH cx_bcs.
            MESSAGE e445(so).
        ENDTRY.



        lv_title = wa_files-filename.

        CALL METHOD cl_document->add_attachment
          EXPORTING
            i_attachment_type    = 'CSV'
            i_attachment_subject = lv_title
            i_attachment_size    = lv_length
            i_att_content_hex    = li_bin_cont.

      ENDLOOP.

      CALL METHOD cl_send_request->set_document( cl_document ).
*     --------- set sender -------------------------------------------
*     note: this is necessary only if you want to set the sender
*           different from actual user (SY-UNAME). Otherwise sender is
*           set automatically with actual user.

      cl_sender = cl_sapuser_bcs=>create( sy-uname ).
      CALL METHOD cl_send_request->set_sender
        EXPORTING
          i_sender = cl_sender.

*     --------- add recipient (e-mail address) -----------------------
*     create recipient - please replace e-mail address !!!

      DATA: lv_email TYPE ad_smtpadr.

      LOOP AT s_email.

        lv_email =  s_email-low.

        cl_recipient = cl_cam_address_bcs=>create_internet_address(
                                          lv_email ).

*     add recipient with its respective attributes to send request
        CALL METHOD cl_send_request->add_recipient
          EXPORTING
            i_recipient = cl_recipient
            i_express   = 'X'.

      ENDLOOP.

      cl_send_request->send_request->set_link_to_outbox( 'X' ).

*     ---------- send document ---------------------------------------
      CALL METHOD cl_send_request->send(
        EXPORTING
          i_with_error_screen = 'X'
        RECEIVING
          result              = lv_sent_to_all ).
      IF lv_sent_to_all = 'X'.
        WRITE text-009.

        "Elimino arquivo do diretório se foi enviado corretamente
        DELETE DATASET wa_files-fullname.

      ENDIF.

      COMMIT WORK.

* -----------------------------------------------------------
* *                     exception handling
* -----------------------------------------------------------
* * replace this very rudimentary exception handling
* * with your own one !!!
* -----------------------------------------------------------
    CATCH cx_bcs INTO cl_bcs_exception.
      WRITE: text-007.
      WRITE: text-008, cl_bcs_exception->error_type.
      EXIT.

  ENDTRY.

ENDFORM.                    " ENVIA_EMAIL

quarta-feira, 19 de junho de 2019

Só ALV

Somente para informações sobre ALV.

Usando mesmo event_handler para vários ALVs no mesmo programa

Nos eventos tem o parâmetro oculto sender para todos os eventos, utilizá-lo para definir qual objeto ALV está sendo utilizado para um evento compartilhado.

Ex.:

      handle_alv_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
        IMPORTING
            e_row_id
            e_column_id
            es_row_no
            sender,




O SENDER define o objeto ALV sendo executadoo naquele momento.

Para conseguir saber qual está sendo executado existem várias maneiras, eu fazia lendo qual container estava sendo utilizado, mas achei uma maneira mais fácil de um exemplo no SDN.

Primeiro define um nome para o objeto ALV utilizando o metodo SET_NAME.

Ex: go_alv_adi_nf->set_name('ADI_NF').

Quanto é executado dentro do evento, utilizar o método para pegar o nome do ALV definido.

Ex.: 
FORM handle_alv_hotspot_click USING iv_row_id    TYPE lvc_s_row
                                    is_column_id TYPE  lvc_s_col
                                    is_row_no    TYPE lvc_s_roid
                                    io_sender TYPE REF TO cl_gui_alv_grid.

  DATA lv_name TYPE string.

  CALL METHOD io_sender->cur_event->event_src->get_name
    RECEIVING
      name lv_name.

  IF lv_name 'ADI_NF'.

 ELSE.
 ENDIF.


========================================================================



segunda-feira, 3 de junho de 2019

ES_J_1BNF_ADD_DATA - NF WRITER

Opa.. essa ADD_DATA não tava passando quando é uma NF writer. Tem uma nota que explica como funciona, mas pelo blog abaixo fica mais fácil de entender.

Outro detalhe.. nessa caso ele tem um método especifico para J1B1N

ADD_DATA_J1B1N


https://blogs.sap.com/2016/09/08/badi-nova-chamada-automaticamente-na-nf-writer-j1b1nj1b2n/

sexta-feira, 10 de maio de 2019

Liberar tabelas customizing J1BTAX em QA e PRD

  Para ficar guardado na gaveta;

- É normal os funcionais solicitarem para abrir as tabelas da J1BTAX para modificação no QA ou PRD. Me bati um monte pq o que encontrei no google foi o básico que seria modificar na SOBJ a visão marcando o flag de "Opção em curso"/"Current setting", mas o diabo não funcionou..
 Teve um colega que acabou me ajudando, acho q deve ter diversas outras formas, mas enfim essa achei sem muito impacto, e sem mexer na customização do mandante SCC4.

Coisa simples na verdade.

A idéia é ir na SE54 no objeto da visão e alterar a opção "indicação para transporte de dados do diálogo".

O padrão é estar no "Rotina de registro standard".
Alterar para "Rotina de registro individual/nenhuma".