quinta-feira, 17 de janeiro de 2019

Execução ALV (CL_GUI_ALV_GRID) em background

  A função REUSE_ALV_GRID_DISPLAY faz a listagem dos dados no spool sem problema, utilizando a classe CL_GUI_ALV_GRID, por causa do container, dá um DUMP.  Andei procurando e achei a solução, utilizando um outro objeto base para a criação do objeto ALV.

Solução abaixo.

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

DATAo_alv         TYPE REF TO cl_gui_alv_grid,
      o_cc_alv      TYPE REF TO cl_gui_custom_container,
      o_ctr_alv_job TYPE REF TO cl_gui_docking_container.


  IF sy-batch IS INITIAL.
    CREATE OBJECT o_cc_alv
      EXPORTING
        container_name 'CC_ALV'.

    CREATE OBJECT o_alv
      EXPORTING
        i_parent o_cc_alv.

  ELSE.
    CREATE OBJECT o_alv
      EXPORTING
        i_parent o_ctr_alv_job.

  ENDIF.


=========================================
Em vez do sy-batch tem um método que tambem determina se o alv está em job ou não.

IF cl_gui_alv_grid=>offline( ) IS INITIAL.

ENDIF.

sexta-feira, 16 de novembro de 2018

Webservice - Erros e notas correção

  Geralmente dá uns erros loucos, no webservice que a gente tem que ficar chutando para acertar, esse tópico é exclusivo para os casos de erros que tem acontecido e que com muita dificuldade foi encontrado a solução.

- o erro mais chato é o de autenticação do certificado digital.  Geralmente para testar o ideal é criar uma conexão primeiro na SM59 e testar para ver se tem o retorno OK ou não.
Quando dá erro o problema pode ser no STRUST, na maioria dos casos e pq não foi incluído o certificado digital do site que está sendo enviado.
Outro erro comum é um erro na configuração da RZ10.  a solução está na nota 510007

- Quando vc faz um teste na SM59 e a conexão dá OK, quer dizer que pelo menos está sendo autenticado correto, daí o problema é mesmo na configuração do webservice no soamanager. Recentemente tive um problema que o soamanager me retornava um erro quando conectava no servidor do sefaz, pelo erro achei a nota 1361688 que tem uma configuração que tem q ser alterado no soamanager para funcionar.

Por enquanto  é isso, adicionarei outras correções conforme os erros/correções forem aparecendo.

terça-feira, 2 de outubro de 2018

SAP HANA Criando AMDP com input parameters

  Agora entrando no mundo HANA, tive minha primeira experiência desenvolvendo uma Calc view um pouco mais complexa utilizando os objetos do HANA no eclipse e criando uma função AMDP com input parameters, na chamada do método incluindo parãmetros SELECT-OPTIONS.

Vou colocar apenas o código do AMDP e da chamada do método no programa.

Observações:
- INTERFACE IF_AMDP_MARKER_HDB é obrigatorio.
- Criei a calculation view ZV_GUIAS
- Os PLACEHOLDERS são os input parameters: P_DTINI e P_DTFIM
- O parâmetro IV_WHERE é um SQL dinâmico que crio no programa de chamada
- Não tentem colocar * no select que dá merda.
- De preferência criem tipos especificos para retorno do SELECT

*==============================

CLASS zcl_teste_guias DEFINITION

 PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.

    TYPES:

      BEGIN OF ty_guias,
        empresa   TYPE zv_guias-empresa,
        filial    TYPE zv_guias-filial,
        nf_id     TYPE zv_guias-nf_id,
        dt_lancto TYPE zv_guias-dt_lancto,
      END OF ty_guias,

      tyt_guias TYPE STANDARD TABLE OF ty_guias.

    DATA:
          tt_guias TYPE tyt_guias.

***********************************************************************
* Get Company details  based on input parameters                      *
***********************************************************************
    CLASS-METHODSget_guias
      IMPORTING
        VALUE(iv_clientTYPE mandt
        VALUE(iv_bukrs)  TYPE bukrs
        VALUE(iv_where)  TYPE string
        VALUE(iv_dtini)  TYPE dats
        VALUE(iv_dtfin)  TYPE dats
      EXPORTING
        VALUE(et_guias)  TYPE tyt_guias.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_teste_guias IMPLEMENTATION.
  METHOD get_guias BY DATABASE PROCEDURE
                          FOR HDB
                          LANGUAGE SQLSCRIPT
                          OPTIONS  READ-ONLY
                          USING  zv_guias.
***********************************************************************
* Get Company details  based on input parameters                      *
***********************************************************************

    tt_guias SELECT empresafilialnf_iddt_lancto
             from "ZV_GUIAS"
               PLACEHOLDER."$$P_DTINI$$"=> :i_dtini,
                 PLACEHOLDER."$$P_DTFIM$$"=> :i_dtfin )
             where MANDT  IV_CLIENT
               AND EMPRESA IV_BUKRS;

    et_guias apply_filter(:tt_guias:iv_where ;

  ENDMETHOD.

ENDCLASS.


*=====================================================

Chamada do AMDP no programa.

Observações:
- S_BUDAT e um parâmetro tipo select-options
- No retorno do metodo DATA(t_guias) não precisa declarar no programa, mas essa variável fica alocado na memória apenas na execução do form onde está.

* ============================================


  DATA(lv_wherecl_shdb_seltab=>combine_seltabs(
  it_named_seltabs VALUE #(
  name  'DT_LANCTO' dref REF #s_budat[] ).


  zcl_teste_guias=>get_guias(
  EXPORTING iv_bukrs p_bukrs
            iv_client p_mandt
            iv_where lv_where
            iv_dtini '20140101'
            iv_dtfin '99991231'
    IMPORTING
      et_guias DATA(t_guias).

  cl_demo_output=>display_datavalue t_guias ).

quarta-feira, 8 de agosto de 2018

Webservice sem montar estrutura WSDL

  A experiência faz toda diferença..   Eu coloquei alguns posts referente ao envio de arquivo para o SEFAZ do estado do ES e PE, onde montei um WSDL para ser importado no SAP e assim criar as estruturas automaticamente, basicamente no programa era só colocar os valores nos campos da estrutura criada.  EIS QUE.

  Tem um problema nesse esquema, que no começo funcionou, mas tive problema com alguns clientes. Como a estrutura era standard na montagem do XML para envio o SAP automaticamente coloca o namespace nas tags  e isso em alguns casos começaram a dar erro.  Quebrei a cabeça por um bom tempo e percebi que eu poderia manter o WSDL original do SEFAZ e montar manualmente o XML antes de enviar o proxy. No caso do ES eu tive que fazer uma modificação no WSDL para poder funcionar, mas sem criar campos. 

Falando na prática.

no WSDL no exemplo abaixo. o duaEmissao é a tag principal e abaixo vai as outras tags de valores, quando eu fiz a primeira vez criei todos os campos manualmente no WSDL, no caso abaixo ficou com um elemento <S:ANY>. Quando importado esse WSDL esse elemento é criado no SAP com typo RAWSTRING.

      <s:element name="duaEmissao">
        <s:complexType mixed="true">
            <s:sequence>
                <s:any />
            </s:sequence>
        </s:complexType>
      </s:element>

No programa. criei um campo tipo string e concatenei todo o meu XML.

DATA: l_xml TYPE string.

      CONCATENATE
           '<duaDadosMsg xmlns="http://www.sefaz.es.gov.br/duae">'
           '<emisDua versao="1.01">'
           '<tpAmb>1</tpAmb>'
           '<cnpjEmi>07592315000114</cnpjEmi>'
           '<cnpjOrg>27080571000130</cnpjOrg>'
           '<cArea>4</cArea>'
           '<cServ>1384</cServ>'
           '<cnpjPes>28614242000194</cnpjPes>'
           '<dRef>2018-08</dRef>'
           '<dVen>2018-09-30</dVen>'
           '<dPag>2018-09-30</dPag>'
           '<cMun>57053</cMun>'
           '<xInf>teste</xInf>'
           '<vRec>119.06</vRec>'
           '<qtde>1</qtde>'
           '</emisDua>'
           '</duaDadosMsg>'
           INTO l_xml.


 converto para uma variável tipo XTRING.

   DATAl_xstr TYPE xstring.

      CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
        EXPORTING
          text   l_xml
        IMPORTING
          buffer l_xstr
        EXCEPTIONS
          failed 1
          OTHERS 2.

Atribuo esse valor convertido ao meu campo ANY.

lw_emi_in-any l_xstr.

E chamo proxy.

      CALL METHOD lo_proxy->dua_emissao
        EXPORTING
          input  lw_emi_in
        IMPORTING
          output lw_emi_out.


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

Para ver como ficou montado o XML, pode usar a função abaixo, q convert o xtring em uma tabela XML. Eu utilizo para verificar o retorno que para mim também vem com um campo tipo RAWSTRING.

      CALL FUNCTION 'SMUM_XML_PARSE'
        EXPORTING
          xml_input l_xstr
        TABLES
          xml_table lt_xml
          return    t_ret.

quarta-feira, 9 de maio de 2018

Função para trazer a transação real executada

  Começou a ter um problema para verificar a variável TCODE para saber a transação executada, isso acontece quando a transação é referenciado por objeto e não por report, durante o programa o SY-TCODE fica com "OS_APPLICATION".

  Achei no google a função abaixo que traz a transação executada.

Data  <var > type sy-tcode.

CALL 'GET_PARAM_TCOD' ID 'PTCOD' FIELD <VAR>

quinta-feira, 11 de janeiro de 2018

SM30 Visão de atualização - botão expandir/comprimir - Dependência de relação de tempo

Hoje tive um problema e a solução estava na documentação da SAP, como não é um problema muito comum, resolvi relatar a solução para documentação pessoal.

Enfim, tinha criado uma tabela com os campos de data de validade, criei uma visão de atualização, testei e tal, e quando criava uma validade diferente para  o mesmo item, o bendito não aparecia na visão, mas na tabela estava gravado, eis que vi que apareceu na visão de atualização um botão de comprimir/expandir, e quando seleciona a linha e clicava no botão o outro item criado aparecia. Só que não queria q acontecesse assim e fui procurar uma ajuda no Help(google).

O botão em si é esse carinha abaixo

Na documentação da SAP é bem explicito o seguinte, se vc tem campos de data como chave com os seguintes elementos atribuídos.
  • Data element BEGDATUM or
  • Data element VIM_BEGDA or
  • Data element BEGDA

Automaticamente é criado a dependência de tempo e o botão aparece na SM30. Para resolver o problema é só criar ou escolher um outro elemento que tenha um outro nome diferente desses acima com o mesmo tipo (data).

segunda-feira, 13 de novembro de 2017

Coisinhas da SPAU

Esse post é só um memo também, mas as vezes pode ser que alguém passe por esse problema. Tem um erro que dá em alguns objetos logo depois da verificação da SPAU, isso depois de um upgrade, etc. Já tinha ocorrido comigo, mas não me lembrava como tinha arrumado, então depois de muita luta descobri e resolvei deixar postado para futuras atualizações de sistema. O erro que acontece é que vc tenta abrir um objeto standard para modificação (no meu caso uma macro do SPED), e dá uma mensagem que o objeto ainda está bloqueado na SPAU,SPDD,SE95 e pede para ser liberado. Quando vc entra nessas transações vc não acha nada do objeto. Nesse caso descobri que tem uma tabela q mostra os objetos que foram modificados durante o upgrade na correção da SPAU. Tabela SMODILOG, coloquei o objeto lá e tem o status do objeto, e tem um campo que tem a request que está o objeto bloqueado. No meu caso vi que eram notas, selecionei todas as notas e fui na SPAU processar, apesar do status da nota estar como não implementável, é necessário executar a nota para que fique setado como nota ajustada. Depois de resolvido isso a objeto abriu.