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


sexta-feira, 3 de maio de 2019

NFE NT 2018.005 - Erro no técnico responsável não passa na CL_NFE_PRINT

Talvez a SAP já tenha corrigido isso, mas quem implementou as notas para a NT 2018.005 que inclui o responsável técnico e umas outras funcionalidades.

Depois de implementado as notas parou de passar pela BADI CL_NFE_PRINT, no meu post anterior falei sobre a BADI ...ADD_DATA que marca o flag na J_1BFNDOC, eis que fui verificar e após aplicação das notas essa campo IND_BADI_CTRL da .j_1bnfdoc começou a ficar marcado, aí fui debugar e vi que mesmo não alterando nada na BADI ...ADD_DATA, a nota ficava como tivesse sido modificada na BADI marcando o campo.
Aí vi que após a ADD_DATA tem um método novo para o técnico responsável.(abaixo)

" Technical responsible has only the DocNum as Primary Key.
" Therefore it should be a structure during the badi fields editing (there will be only 1 entry per document)
    lo_nfe_persist_badi->tec_resp_move_str_to_table(        "2747190
      EXPORTING                                             "2747190
        is_tec_resp ls_tec_resp                           "2747190
      IMPORTING                                             "2747190
        et_tec_resp wnftec_resp[]                         "2747190
    ).                                                      "2747190

Dentro desse método mesmo que a estrutura LS_TEC_RESP estiver vazia ele grava em branco na tabela interna WNFTEC_RESP, aí fudeu !!!  logo depois qdo ele compara a estrutura.

   "Check if BAdI is active.                             "2112507
    CALL METHOD                                           "2112507
      lo_nfe_persist_badi->is_add_data_changed            "2112507
....
 p_tec_resp     wnftec_resp[]                    "2747190

Fica como se tivesse sido modificado pq tem uma linha em branco na tabela interna.

Acho q a SAP deve corrigir,  a principio coloquei um enhancement para resolver por hora.

  METHOD tec_resp_move_str_to_table.
ENHANCEMENT 1  ZSD_NFE_TEC_RESP.    "active version
    CHECK is_tec_resp IS NOT INITIAL.
ENDENHANCEMENT.
    " Method delivered by note 2747190
    CLEAR et_tec_resp[].
    APPEND is_tec_resp TO et_tec_resp.
  ENDMETHOD.

BADI CL_NFE_PRINT X ES_J_1BNF_ADD_DATA

Voltei a ativa e já peguei um pepino..

Li umas notas e tal sobre esse caso, foi bem porque eu tinha um método para modificar um XML na BADI NFE_PRINT e tinha um código nessa outra BADI  ADD_DATA, aí tava vendo uns blogs e tal e falaram que se uma estivesse implementada a outra não funcionaria, fui nessa direção querendo passar tudo que tava numa para outra, mas aí reparei que não é bem assim, as duas podem estar ativadas e só é desconsiderado a NFE_PRINT se alguma alteração na estrutura for feita na ADD_DATA, ou seja mesmo as 2 ativadas se não tiver alteração nenhuma na ADD_DATA vai passar pela NFE_PRINT.
Existe um código logo após a ADD_DATA que verifica se houve modificação nos dados do que entrou para o que saiu da BADI, quando isso acontece que é no momento de criar a nota, fica um flag na J_1BNFDOC campo IND_BADI_CTRL que fica marcado, e é esse flag que ele verifica quando vai criar o XML e passa na NFE_PRINT, se estiver vazio passa na BADI se estiver marcado ele ignora.

==> CÓDIGO QUE ESTÁ NO MOMENTO DO XML

  IF obj_ref IS BOUND AND                                 "2112507
     wk_header-ind_badi_ctrl 'X' AND                    "2112507
     wk_header-cnpj_bupla IS NOT INITIAL"transitional phase 1844621
    lo_obj_ref obj_ref.                                       "1844621
    CLEAR obj_ref.               "save for later use            "1844621
  ENDIF.              

==> CÓDIGO QUE ESTÁ NA CRIAÇÃO DA NF - LOGO APÓS PASSAR NA BADI ADD_DATA
METHOD is_add_data_changed.
  IF mr_header        <> p_header       OR
     mt_item[]        <> p_item[]       OR
     mt_transvol[]    <> p_transvol[]   OR
     mt_trailer[]     <> p_trailer[]    OR
     mt_tradenotes[]  <> p_tradenotes[] OR
     mt_refproc[]     <> p_refproc[]    OR
     mt_add_info[]    <> p_add_info[]   OR
     mt_sugarsuppl[]  <> p_sugarsuppl[] OR
     mt_sugardeduc[]  <> p_sugardeduc[] OR
     mt_pharmaceut[]  <> p_pharmaceut[] OR
     mt_vehicle[]     <> p_vehicle[]    OR
     mt_fuel[]        <> p_fuel[]       OR
     mt_export[]      <> p_export[]     OR
     mt_import_adi[]  <> p_import_adi[] OR
     mt_import_di[]   <> p_import_di[]  OR
     mt_nve[]         <> p_nve[]           OR             "2459713
     mt_traceability[] <> p_traceability[] OR             "2459713
     mt_pharma[]       <> p_pharma[]       OR             "2459713
     mt_payment[]      <> p_payment[]      OR             "2747190
     mt_tec_resp[]     <> p_tec_resp[].                   "2747190
                                                          "2459713
     rv_flag abap_true.                                 "2459713
  ENDIF.
ENDMETHOD.



==> RETORNO DO MÉTODO IS_ADD_DATA_CHANGED acima
.....
RECEIVING                                           "2112507
        rv_flag       wnfdoc-ind_badi_ctrl.             "2112507
.......

terça-feira, 26 de março de 2019

SQL error general error: <> Cannot compare NLocator and NLocator

 Tive um problema recentemente num cliente onde estava dando um DUMP no ambiente ECC/HANA, o dump se referia a uma calculation view específica.


Fiz um teste no eclipse dando um data preview na calculation view que deu o erro, e deu a mesma mensagem.


Primeiro tive q isolar o problema.

- Copiei a calculation view inteira para uma outra calculation view Z*
- Debaixo para cima comecei a executar o data preview para todas as caixinha e ver onde começava o erro.
- No meu caso o erro era numa aggregation, então tive que fazer várias ligações diferentes para saber qual a perna da aggregation que estava com problema.
- Quando encontrei a projection/union/aggregation com erro, comecei a isolar os campos e fazer 
testes.
- A dica nesse caso é que esse erro do NLOCATOR é por causa de campos textos, então mire diretamente nesses tipos de campos.
- Vi que no tinha um filtro na calculation fazendo uma comparação tipo ("TXT" != ' '), traduzindo o filtro seria pegar os registros onde o campo TXT estiver diferente de espaço.
- Se eu removesse o filtro não dava o erro, se deixasse o erro  aparecia. Eu poderia simplesmente deixar sem filtro que resolveria o meu problema, mas resolvi ir mais a fundo.
- Vimos que na tabela de origem dos dados, tinha um campo tipo STRING, e o problema era justamente isso, a calculation view dá pau quando tem uma condição considerando espaços em campo tipo STRING.
- Procurei uma nota referente a essa tabela, e no meu caso tinha uma divergência, pois a nota q achei criava a tabela com o campo com CHAR255, mas vi q na instalação do sistema o campo veio como STRING, tentei achar uma nota de correção com o erro mas não achei. Consultei a SAP e me informaram q o correto era o CHAR255, estou esperando  uma nota de correção ainda, nem sei se esses fillhos da mãe vão disponibilizar, mas corrigindo  o tipo do campo resolve o problema.

Fica a dica.

NOTA: então. fiquei na dúvida de uma coisa.. o cliente q estava com esse problema usa o HANA com o esquema de CROSS DATABASE. Andei dando uma vasculhada em algumas notas e nesse esquema de crossdb existe várias limitações.




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