quarta-feira, 29 de janeiro de 2020

Alteração IVA - código de imposto no pedido de transferência - atualização de cálculo

Solução definitiva.

Utilizando exit de pedido de compra e configuração do standard.

Debugando o programa quando cria a remessa, vi que a rotina para buscar o código de imposto SD no caso de processo de transferência STO tem uma tratativa que pode ser usado, não fomos a fundo se existe uma configuração standard em MM para que ao criar o pedido de compra isso funcione. Enfim o processo foi montado da seguinte forma.

J1BTAX
Na tela de "atualização de imposto MM" tem o código de imposto chave, na linha do imposto no final tem 2 campos: 
- Código de imposto de entrada
- Código de imposto SD

Durante o processo de transferência entre centros esses 2 campos são usados.

- Quando é criado o pedido de transferência o código de imposto não aparece para preencher, então especialmente para esse caso de pedido de transferência, coloquei uma rotina na exit de pedido de compra.
MM06E005 

Exit ao salvar EXIT_SAPMM06E_012

Apenas para tipo de pedido de transferência - 
- Nesse ponto deve entrar com o código de imposto de entrada de acordo com a J1BTAX
    "Verifica se é transferência
    SELECT COUNT( * )
      FROM t161
     WHERE bsart EQ i_ekko-bsart
       AND brefn EQ 'UBF'.

  FIELD-SYMBOLS <lt_ekpo> TYPE mmpur_bekpo.

  ASSIGN ('(SAPLMEPO)POT[]') TO <lt_ekpo>.

  IF sy-subrc = 0.

    LOOP AT <lt_ekpo> ASSIGNING FIELD-SYMBOL(<ls_ekpo>).
        <ls_ekpo>-mwskz = 'ZZ'
      ELSE.
        CLEAR <ls_ekpo>-mwskz.
    ENDLOOP.

  ENDIF.

Ao criar a remessa automaticamente o standard vai pegar esse código de imposto e converter para o código de imposto de SD na remessa.



IDOC - WPUBON - Implementação geraçao de doc de faturamento

Código para geração de doc. de faturamento utilizando o IDOC WPUBON.

Obs: mantive a rotina incompleta, apenas o caminho das pedras...


     CLEAR ls_e1wpb01.
      ls_e1wpb01-poskreis    = <perfil determninado no customizing>.
      ls_e1wpb01-kassid      = <CÓDIGO DO CAIXA>.
      ls_e1wpb01-vorgdatum   = sy-datum.
      ls_e1wpb01-vorgzeit    = sy-uzeit.
      ls_e1wpb01-kundnr      = <CLIENTE>.
      ls_e1wpb01-belegwaers  = 'BRL'.

      APPEND INITIAL LINE TO lt_idoc_data ASSIGNING FIELD-SYMBOL(<ls_idoc_data>).
      <ls_idoc_data>-sdata  = ls_e1wpb01.
      <ls_idoc_data>-mandt  = sy-mandt.
      <ls_idoc_data>-segnam = 'E1WPB01'.

      LOOP AT lt_zsdt_0082 ASSIGNING FIELD-SYMBOL(<ls_item>).

        CLEAR ls_e1wpb02.
        ls_e1wpb02-vorgangart = <TIPO DO FATURAMENTO>.
        ls_e1wpb02-qualartnr  = 'ARTN'.
        ls_e1wpb02-artnr      = <MATERIAL>.
        ls_e1wpb02-seriennr   = ''.
        ls_e1wpb02-vorzeichen = '-'.
        ls_e1wpb02-menge      = <QUANTIDADE>.
        ls_e1wpb02-artnr_long = <MATERIAL>.

        APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
        <ls_idoc_data>-sdata  = ls_e1wpb02.
        <ls_idoc_data>-mandt  = sy-mandt.
        <ls_idoc_data>-segnam = 'E1WPB02'.

        CLEAR ls_e1wpb03.
        ls_e1wpb03-vorzeichen = '+'.
        ls_e1wpb03-kondition  = <CONDIÇÃO DE PREÇO(customizing)>.
        ls_e1wpb03-kondvalue  = <VALOR TO ITEM>.

        APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
        <ls_idoc_data>-sdata  = ls_e1wpb03.
        <ls_idoc_data>-mandt  = sy-mandt.
        <ls_idoc_data>-segnam = 'E1WPB03'.

        "Campos adicionais do cabeçalho
        "Verificar implementação função exit EXIT_SAPLWPUE_106
        APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
        ls_e1wxx01-fldgrp  = 'HEAD'.
        ls_e1wxx01-fldname = 'ZTERM'.
        ls_e1wxx01-fldval  = <CONDICAO DE PAGAMENTO>.
        <ls_idoc_data>-sdata  = ls_e1wxx01.
        <ls_idoc_data>-mandt  = sy-mandt.
        <ls_idoc_data>-segnam = 'E1WXX01'.

        "Campo STAFO - elimina verificação estatistica ao gerar faturamento
        "Se estiver preenchido um  DUMP acontece
        APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
        ls_e1wxx01-fldgrp  = 'HEAD'.
        ls_e1wxx01-fldname = 'STAFO'.
        ls_e1wxx01-fldval  = ''.
        <ls_idoc_data>-sdata  = ls_e1wxx01.
        <ls_idoc_data>-mandt  = sy-mandt.
        <ls_idoc_data>-segnam = 'E1WXX01'.

        APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
        ls_e1wxx01-fldgrp  = 'HEAD'.
        ls_e1wxx01-fldname = 'KUNWE'.
        ls_e1wxx01-fldval  = <RECEBEDOR DA MERCADORIA>.
        <ls_idoc_data>-sdata  = ls_e1wxx01.
        <ls_idoc_data>-mandt  = sy-mandt.
        <ls_idoc_data>-segnam = 'E1WXX01'.

        "Forma de pagamento
        APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
        ls_e1wxx01-fldgrp  = 'HEAD'.
        ls_e1wxx01-fldname = 'ZLSCH'.

        CASE ls_zsdt_0081-tppag.
          WHEN gc_pag_vista.
            ls_e1wxx01-fldval  = 'E'.
          WHEN gc_pag_prazo.
            ls_e1wxx01-fldval  = 'A'.
          WHEN gc_pag_ccc.
            ls_e1wxx01-fldval  = 'L'.
          WHEN gc_pag_folha.
            ls_e1wxx01-fldval  = 'I'.
        ENDCASE.

        <ls_idoc_data>-sdata  = ls_e1wxx01.
        <ls_idoc_data>-mandt  = sy-mandt.
        <ls_idoc_data>-segnam = 'E1WXX01'.

        APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
        ls_e1wxx01-fldgrp  = 'MSEG'.
        ls_e1wxx01-fldname = 'CHARG'.
        ls_e1wxx01-fldval  = <ls_item>-charg.
        <ls_idoc_data>-sdata  = ls_e1wxx01.
        <ls_idoc_data>-mandt  = sy-mandt.
        <ls_idoc_data>-segnam = 'E1WXX01'.


      ENDLOOP.

      APPEND INITIAL LINE TO lt_idoc_data ASSIGNING <ls_idoc_data>.
      ls_e1wpb06-vorzeichen = '-'.
      ls_e1wpb06-zahlart = '----'.
      <ls_idoc_data>-sdata  = ls_e1wpb06.
      <ls_idoc_data>-mandt  = sy-mandt.
      <ls_idoc_data>-segnam = 'E1WPB06'.



      CALL FUNCTION 'IDOC_WRITE_AND_START_INBOUND'
        EXPORTING
          i_edidc        = ls_idoc_control
          do_commit      = ''
        IMPORTING
          docnum         = ls_idoc_control-docnum
        TABLES
          i_edidd        = lt_idoc_data
        EXCEPTIONS
          idoc_not_saved = 1
          OTHERS         = 2.



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

Customizing 

Perfil:

Config. dados pagamento


TEM MAIS CONFIG, MAS TÁ DANDO MUITO TRABALHO



Leitura de tabela interna - Categoria de tabela - sem estrutura

Lembrete:

Categoria de tabelas que não tem estrutura mas somente um elemento de dados.

Ex:

Tipo tabela:  MATNR_TTY
a categoria de linha é somente o campo MATNR

Como não tem campo estruturado na tabela, acrescentar o campo TABLE_LINE


DATA: LT_MATNR TYPE MATNR_TTY

SELECT *
     FROM XXX
      FOR ALL ENTRIES IN  LT_MATNR
WHERE MATNR EQ LT_MATNR-TABLE_LINE

XXXXXXXXXXXXXXXXXXXXXXXX

READ TABLE LT_MATNR WITH KEY TABLE_LINE = XXX

quarta-feira, 13 de novembro de 2019

F4IF_INT_TABLE_VALUE_REQUEST - Retorno de mais de um valor - ADENDO com CALLBACK METHOD

Copiado do SAP SDN

https://answers.sap.com/questions/5445798/f4ifinttablevaluerequest---return-more-than-1-fiel.html

PARAMETERS:
  a TYPE char10,
  b TYPE char10,
  c TYPE char10.


DATA:
  BEGIN OF tab OCCURS 0,
    field1 TYPE char10,
    field2 TYPE char10,
    field3 TYPE char10,
  END OF tab,
  wa LIKE LINE OF tab,
  DYNPFLD_MAPPING TYPE STANDARD TABLE OF DSELC,
  dyn_wa TYPE DSELC,
  lt_return TYPE TABLE OF DDSHRETVAL,
  lwa_return TYPE ddshretval.

INITIALIZATION.
  wa-field1 = 'aaaaa'.
  wa-field2 = 'bbbbb'.
  wa-field3 = 'ccccc'.
  APPEND wa to tab.

  wa-field1 = 'aaaaa'.
  wa-field2 = 'bbccc'.
  wa-field3 = 'ddddd'.
  APPEND wa to tab.

  wa-field1 = 'aaaab'.
  wa-field2 = 'bbccc'.
  wa-field3 = 'eeeee'.
  APPEND wa to tab.

AT SELECTION-SCREEN on VALUE-REQUEST FOR a.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE         = ' '
      retfield               = 'FIELD1'
*     PVALKEY                = ' '
      DYNPPROG               = sy-cprog
      DYNPNR                 = '1000'
      DYNPROFIELD            = 'A'
*     STEPL                  = 0
*     WINDOW_TITLE           = WINDOW_TITLE
*     VALUE                  = ' '
      VALUE_ORG              = 'S'
*     MULTIPLE_CHOICE        = ' '
*     DISPLAY                = ' '
     CALLBACK_PROGRAM       = sy-cprog
     CALLBACK_FORM          = 'CALLBACK_F4'
*     MARK_TAB               = MARK_TAB
*   IMPORTING
*     USER_RESET             = USER_RESET
    TABLES
      value_tab              = tab
*     FIELD_TAB              = FIELD_TAB
      RETURN_TAB             = lt_return
*      DYNPFLD_MAPPING        = DYNPFLD_MAPPING
*   EXCEPTIONS
*     PARAMETER_ERROR        = 1
*     NO_VALUES_FOUND        = 2
*     OTHERS                 = 3
            .
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


form callback_f4 TABLES record_tab STRUCTURE seahlpres
            CHANGING shlp TYPE shlp_descr
                     callcontrol LIKE ddshf4ctrl.
  DATA:
    ls_intf     LIKE LINE OF shlp-interface,
  ls_prop     LIKE LINE OF shlp-fieldprop.
*Hide unwanted fields
  CLEAR: ls_prop-shlpselpos,
         ls_prop-shlplispos.
*  MODIFY shlp-fieldprop FROM ls_prop
*    TRANSPORTING shlpselpos shlplispos
*  WHERE ( fieldname NE 'F0001'  AND
*          fieldname NE 'F0002'  AND
*          fieldname NE 'F0003' ).
*  " Overwrite selectable fields on search help
  REFRESH: shlp-interface.
  ls_intf-shlpfield = 'F0001'.
  ls_intf-valfield  = 'A'.
  ls_intf-f4field   = 'X'.
  APPEND ls_intf TO shlp-interface.
  ls_intf-shlpfield = 'F0002'.
  ls_intf-valfield  = 'B'.
  ls_intf-f4field   = 'X'.
  APPEND ls_intf TO shlp-interface.
  ls_intf-shlpfield = 'F0003'.
  ls_intf-valfield  = 'C'.
  ls_intf-f4field   = 'X'.
  APPEND ls_intf TO shlp-interface.
ENDFORM.
============= CHAMADA POR CALLBACK METHOD
    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'BANKL'
       dynpprog        = sy-repid
       dynpnr          = '0100'
       dynprofield     = 'TELA1-COD_AGENCIA'
        value_org       = 'S'
        callback_method = o_prog_local
      TABLES
        value_tab       = lt_but0bk
*        field_tab       = lt_fields
        return_tab      = lt_retval
      EXCEPTIONS
        parameter_error = 1
        no_values_found = 2
        OTHERS          = 3.
Declaração na classe local.
CLASS LCL_PROG_LOCAL DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_f4callback_value_request.
    ALIASES f4_call_callback FOR if_f4callback_value_request~f4_call_callback.
IMPLEMENTAÇÃO DO MÉTODO.
CLASS lcl_PROG_LOCAL IMPLEMENTATION.

  METHOD f4_call_callback.

   BREAK-POINT.
    cs_shlp-interface = VALUE #( ( shlpfield = 'F0001'
                     valfield  = 'TELA1-COD_AG'
                     f4field   = 'X' )
                     ( shlpfield = 'F0002'
                     valfield  = 'TELA1-CONTA_COR'
                     f4field   = 'X' )  ).

  ENDMETHOD.


quarta-feira, 30 de outubro de 2019

SAP NFCe contingência - DIGEST VALUE

Conforme post anterior, eu fiz um código para pegar o digest value do XML, ainda não testei no processo de contingência, se não funcionar, vou ter q procurar outra forma.

FORM f_digest_value USING fu_active TYPE j_1bnfe_active
                  CHANGING fc_digval TYPE string.

  DATA: lo_download       TYPE REF TO cl_j_1bnfe_xml_download,
        lo_ixml           TYPE REF TO if_ixml,
        lo_stream_factory TYPE REF TO if_ixml_stream_factory,
        lo_doc            TYPE REF TO if_ixml_document,
        lo_node_col       TYPE REF TO if_ixml_node_collection,
        lo_node           TYPE REF TO if_ixml_node.

  DATA: l_rfcdest    TYPE rfcdest,
        l_xnfeactive TYPE j_1bxnfeactive,
        l_xml        TYPE xstring,
        l_key        TYPE j_1b_nfe_access_key,
        l_key44      TYPE j_1b_nfe_access_key_dtel44,
        l_xml_cont   TYPE j_1b_nfe_xml_content.

  CONSTANTS lc_model_nfe  TYPE j_1b_nfe_doctype VALUE 'NFE'.
  "CONSTANTS lc_direct_in  TYPE j_1b_nfe_direction VALUE 'INBD'.
  CONSTANTS lc_direct_out TYPE j_1b_nfe_direction VALUE 'OUTB'.

  CLEAR fc_digval.

  MOVE-CORRESPONDING fu_active TO l_key.

  l_key44 = l_key.

  SELECT SINGLE ext_event, seqnum
    INTO @DATA(ls_event)
    FROM j_1bnfe_event
   WHERE docnum EQ @fu_active-docnum.

  CALL FUNCTION 'J_1B_NFE_CHECK_RFC_DESTINATION'
    EXPORTING
      i_bukrs      = fu_active-bukrs
      i_branch     = fu_active-branch
      i_model      = fu_active-model
    IMPORTING
      e_rfcdest    = l_rfcdest
      e_xnfeactive = l_xnfeactive
    EXCEPTIONS
      rfc_error    = 1
      OTHERS       = 2.

  CREATE OBJECT lo_download
    EXPORTING
      iv_xml_key = l_key44
      iv_rfc     = l_rfcdest.

  CALL METHOD lo_download->load_xml_content
    EXPORTING
      iv_docnum       = fu_active-docnum
      iv_event_type   = ls_event-ext_event
      iv_event_seqnum = ls_event-seqnum
      iv_direction    = lc_direct_out
      iv_doctype      = lc_model_nfe.

  l_xml_cont = lo_download->get_xml_content( ).

*--------------------------------------------------------------------*
* Get DigestValue from lf_signature XML
*---------|----------------------------------------------------------*
  lo_ixml = cl_ixml=>create( ).
  lo_stream_factory = lo_ixml->create_stream_factory( ).
  lo_doc = lo_ixml->create_document( ).

  IF lo_ixml->create_parser(
    document = lo_doc
    stream_factory = lo_stream_factory
    istream = lo_stream_factory->create_istream_xstring( string = l_xml_cont )
    )->parse( ) <> 0.
    RETURN.
  ENDIF.

  lo_node_col = lo_doc->get_elements_by_tag_name( name = 'DigestValue' ).
  IF lo_node_col->get_length( ) > 0.
    lo_node = lo_node_col->get_item( 0 ).
    fc_digval = lo_node->get_value( ).
  ENDIF.

ENDFORM.