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.

  DATAlo_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.

  DATAl_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_eventseqnum
    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_xstringstring l_xml_cont )
    )->parse<> 0.
    RETURN.
  ENDIF.

  lo_node_col lo_doc->get_elements_by_tag_namename 'DigestValue' ).
  IF lo_node_col->get_length0.
    lo_node lo_node_col->get_item).
    fc_digval lo_node->get_value).
  ENDIF.

ENDFORM.

SAP NFCe - Montagem QRCODE

PARA OS DESAVIDADOS PELO MENOS ATÉ HOJE 10/2019 A SAP NÃO TEM UMA SOLUÇÃO PARA NFCE, O MODELO 65 TEM Q SER ADICIONADO NO DOMINIO, ENHANCEMENTS SÃO NECESSÁRIOS PARA VISUALIZAR O XML, E NA FUNÇÃO DE SAIDA DO XML ATÉ TEM A ESTRUTURA COMO PARÂMETRO, MAS PRECISA DE UM ENHANCEMENT PARA PREECHER OS DADOS DO QRCODE SÓ PARA O MODELO 65. 


Nesse caso tem uma TVARV q guardo os parâmetros por depender do estado e do tipo do ambiente. 
Na minha TVARV eu tenho alguns parâmetros separados por "|"
- REGIO - Número da região da J_1BNFE_ACTIVE
- TOKEN - É o número da sequência do CSC( Código de Segurança do Contribuinte ), onde a empresa tem cadastro no SEFAZ do seu estado
- CSC - é o código  Código de Segurança do Contribuinte que vem do SEFAZ do estado
- URL de consulta - É o endereço para consulta do QRCODE
- URL - a outra URL é para utilizar na função /XNFE/OUTNFE_CREATE_400, no parâmetro IS_NFESUPL.

Verificar como é montado o hash e como ele vai na estrutura do XML do QRCODE.

Para montar o código HASH , usar a função abaixo.

  CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
    EXPORTING
      data           fu_chave
    IMPORTING
      hash           fc_hash
    EXCEPTIONS
      unknown_alg    1
      param_error    2
      internal_error 3
      OTHERS         4.




- CONTINGÊNCIA
  Para esses caso são adicionados alguns campos a mais. Acho q o mais complicado é pegar o DIGEST VALUE
  eu criei uma rotina para pegar o xml e pegar o valor da tag no XML, vou deixa em outro post


  DATA l_nfe_key TYPE string.
  DATAl_qrcode_ver TYPE string.
  DATAl_tpamb TYPE string.
  DATAl_url_cons TYPE string.
  DATAl_geral TYPE string.
  DATAl_hash      TYPE hash160,
        l_vlr_total TYPE j_1bnfdoc-nftot,
        l_valor_c   TYPE char15,
        l_dig_value TYPE string.

  SELECT SINGLE *
    INTO @DATA(ls_active)
    FROM j_1bnfe_active
   WHERE docnum EQ @i_docnum.

  l_nfe_key =   ls_active-regio &&
               ls_active-nfyear &&
               ls_active-nfmonth &&
               ls_active-stcd1 &&
               ls_active-model &&
               ls_active-serie &&
               ls_active-nfnum9 &&
               ls_active-docnum9 &&
               ls_active-cdv.

  l_qrcode_ver '2'.
  l_tpamb ls_active-tpamb.

  SELECT low
    INTO TABLE @DATA(lt_low)
    FROM tvarvc
   WHERE name EQ 'ZSD_QRCODE_UF_CSC'
     AND type EQ 'S'.

  LOOP AT lt_low INTO DATA(ls_low).

    SPLIT ls_low AT '|' INTODATA(l_regioDATA(l_token)
                              DATA(l_cscDATA(l_url_cons_qrDATA(l_url).

    CASE l_regio.
      WHEN ls_active-regio.
        TRANSLATE l_url_cons_qr TO LOWER CASE.
        TRANSLATE l_url TO LOWER CASE.
        e_url      l_url.
        EXIT.

      WHEN OTHERS.

    ENDCASE.

  ENDLOOP.

  CHECK l_csc IS NOT INITIAL.


  "CONTINGÊNCIA
  IF ls_active-tpemis '2' OR
     ls_active-tpemis '3' OR
     ls_active-tpemis '4' OR
     ls_active-tpemis '5'.

    SELECT SINGLE *
      INTO @DATA(ls_nfdoc)
      FROM j_1bnfdoc
     WHERE docnum EQ @i_docnum.

    CHECK sy-subrc 0.

    IF i_vlr_total <= 0.

      LOOP AT it_binlin INTO DATA(ls_binlin).
        ADD ls_binlin-nfnet TO l_vlr_total.
      ENDLOOP.

    ELSE.
      l_vlr_total i_vlr_total.
    ENDIF.

    l_valor_c l_vlr_total.

    PERFORM f_digest_value USING ls_active
                         CHANGING l_dig_value.

    l_geral l_nfe_key && '|' && l_qrcode_ver && '|' && ls_active-tpamb &&
              '|' && ls_nfdoc-docdat+6(2&& '|' && l_valor_c && l_dig_value &&
              '|' && l_token && l_csc.

    PERFORM f_conv_hash USING l_geral
                       CHANGING l_hash.

    IF sy-subrc 0.
      e_qrcode_key l_url_cons_qr && l_nfe_key && '|' && l_qrcode_ver &&
                     '|' && ls_active-tpamb && '|' && l_dig_value &&
                     '|' && l_token && '|' && l_hash.
    ENDIF.

  ELSE.  "Nota normal.

    l_geral l_nfe_key && '|' && l_qrcode_ver && '|' && ls_active-tpamb &&
              '|' && l_token && l_csc.

    PERFORM f_conv_hash USING l_geral
                       CHANGING l_hash.

    IF sy-subrc 0.
      e_qrcode_key l_url_cons_qr && l_nfe_key && '|' && l_qrcode_ver &&
                     '|' && ls_active-tpamb && '|' && l_token && '|' && l_hash.
    ENDIF.

  ENDIF.

ENDFUNCTION.

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