quinta-feira, 15 de maio de 2014

Erro de DUMP genérico DBIF_RSQL_SQL_ERROR - diagnóstico de erro

 Me deparei com um problema interessante esses dias, onde em uma determinada tabela estava dando DUMP no momento de inserir dados em uma tabela.. a principio imaginei que fosse a capacidade da tabela nas configurações técnicas da SE11 já que realmente o volume de dados já havia ultrapassado o limite que havia adicionado.. mas não deu certo.. sendo assim  para variar atribui o erro ao basis, onde o mesmo checou e analisou o banco de dados q seria o mais provável, imaginando que minha atualização nas configurações técnicas não havia refletido no banco de dados. Eis q um dia q peguei para analisar com o basis junto, resolvi ler o DUMP na ST22 até o final só para ver e descobri q o erro era em um dos registros q estava inserindo na tabela do BD..  e foi um erro de overflow, geralmente existe um dump especifico para isso, mas no caso deu erro de overflow dentro do BD.

O erro gerado no final do dump

----------------------------------------------------------------------------------
    Informações da interface banco dados

    C    1    ERROR: -1 in function ExeNormalModify (execute) [line 21986] [dbsyb.c#23623]
    C    1    (247) [ZZZZZ] [Sybase][ODBC Driver][Adaptive Server Enterprise]Arithmetic overflow during impl
    C    1    icit conversion of NUMERIC value '31423481848.129280' to a DECIMAL field . [dbsyb.c#32095]
---------------------------------------------------------------------------------------

Minha dica é.. sempre olhem o DUMP até o final.. nunca se sabe o q vai encontrar.

Eliminar característica de uma classe de material na força bruta (CT04)

  Problema recorrente em característica.. depois de uma característica criada, é um verdadeiro saco ficar achando um motivo porque a transação standard não deixa eliminar, devido a muitos problemas com isso, achei 2 pontos no programa para burlar a checagem no  momento de eliminar a característica.

Colocar o break-point nesses 2 pontos do programa da CT04 conforme as telas abaixo..
limpar os campos USAGE e  USAGE_FORCE e deixa rodar, vai cair no próximo break e faz o mesmo.. e voalá..




quarta-feira, 14 de maio de 2014

Atualização de tela com campos de tela e ALV OO

Eu tive um problema numa tela ALV onde eu tenho uma tela com alguns campos de tela e um container com ALV. 
Criei um ALV editável e um evento para o botão copiar, onde seria criado uma nova linha com cópia de onde o cursor está com a mesmas características da linha posicionada. Nessa linha eu tenho um campo quantidade, e nessa mesma tela eu tenho um campo de tela como se fosse um contador da quantidade, ou seja se tivesse a quantidade 100 e eu copiasse a linha esse meu campo de tela ficaria 200 e assim por diante. Qual o problema.. o evento da ALV não conversa com a tela, ou seja, quando eu clico num botão do ALV ele não volta para o PBO para atualizar o campo em tela. Procurando no google SDN, achei a solução colocando uma chamada de um método após o evento executado, quando chama o método, ele reinicializa a tela.

      CALL METHOD cl_gui_cfw=>set_new_ok_code
        EXPORTING
          new_code 'REFRESH'.




No meu caso coloquei em 2 eventos no user_command e no changed_data.

  METHOD handle_data_changed.
    PERFORM handle_data_changed USING er_data_changed e_ucomm.

    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code 'REFRESH'.
  ENDMETHOD.                    "handle_data_changed
 

segunda-feira, 12 de maio de 2014

Agrupamento de itens de doc. de mercadoria MKPF no doc. contábil

  Esse é interessante, não é uma coisa muito comum, é mais funcional q abap, mas como gosto de ficar debugando e descobrindo as coisas sem funcional aí está..

Quando é gerado uma movimentação pela MB1C que gera um documento contábil, existe uma opção no FI onde ele pode agrupar de acordo com alguns campos os itens do doc. do material em apenas um item no FI.

a lógica todas está na função FI_DOCUMENT_PROJECT que é chamada dinamicamente na criação do doc. contábil..
no Form document_proj.

tem uma tabela TTYPV transação OBCY que tem os campos que serão desconsiderados para o agrupamento, ou seja se eu coloco o campo nessa tabela o programa desconsidera o campo no agrupamento..


Ex.. se eu coloco o campo no operador de referência MKPF tabela/campo BSEG/MATNR na configuração a rotina pega esse campo e se tiver preenchido, ele limpa, dessa forma no momento do COLLECT o programa considera que todos os itens tem o material em branco agrupando os itens.







quinta-feira, 8 de maio de 2014

Erro no arquivo na exportação para arquivo no ALV

Eu passei por um problema estranho esses dias em q perdi 1 dia analisando pq estava dando errado.

Criei um ALV OO, e inclui um campo no catálogo de campos na saída do ALV. quando eu utilizava o botão de exportar dados da tela para um arquivo, qqr q fosse, planilha eletrônica, não convertido, a porcaria do arquivo me mostrava uma quebra na linha, em vez de mostra 1 linha só no arquivo, me mostrava 2 para cada registro.

Fucei e percebi q a coluna que tinha colocado no catálogo estava sem título na coluna, foi só colocar um título q o problema se resolveu.

LVC_S_FCAT- COLTEXT

perdi um dia só por causa desse cara.


Visão de atualização, validação de campos e inclusão de contador manul de itens

Isso aqui é mais pessoal do que para ajudar. O velho problema  de validar itens na SM30 e nesse casos inclui um contador de item que alimenta automático.




***INCLUDE LZTMM_0019F01 .
*----------------------------------------------------------------------*
FORM adiciona_item.
  "Vinculado ao evento '05'
  PERFORM check_dados USING 'I'.
ENDFORM.                    "adiciona_item

*&---------------------------------------------------------------------*
*&      Form  VALIDA_INTERVALO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM valida_intervalo.
  "Adicionado dentro do módulo de tela
  PERFORM check_dados USING 'U'.
ENDFORM.                    "VALIDA_INTERVALO


*&---------------------------------------------------------------------*
*&      Module  VALIDA_INTERVALO  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE valida_intervalo INPUT.
  PERFORM valida_intervalo.
ENDMODULE.                 " VALIDA_INTERVALO  INPUT

*&---------------------------------------------------------------------*
*&      Form  CHECK_DADOS
*&---------------------------------------------------------------------*
FORM check_dados USING f_tipo TYPE char1.

  FIELD-SYMBOLS<lfs_valor> TYPE any,
                 <lfs_posnr> TYPE any.

  DATAl_werks   TYPE werks_d,
        l_matnr   TYPE matnr,
        l_kunnr   TYPE kunnr,
        l_carac   TYPE zze_carac_cl,
        l_count   TYPE i,
        l_intde   TYPE ztmm_0019-intde,
        l_intat   TYPE ztmm_0019-intat,
        l_begda   TYPE ztmm_0019-begda,
        l_endda   TYPE ztmm_0019-endda,
        l_intde_x TYPE ztmm_0019-intde,
        l_intat_x TYPE ztmm_0019-intat,
        l_begda_x TYPE ztmm_0019-begda,
        l_endda_x TYPE ztmm_0019-endda.

*  BREAK-POINT.

  ASSIGN COMPONENT 'WERKS' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_werks <lfs_valor>.
  ENDIF.

  ASSIGN COMPONENT 'MATNR' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_matnr <lfs_valor>.
  ENDIF.

  ASSIGN COMPONENT 'KUNNR' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_kunnr <lfs_valor>.
  ENDIF.

  ASSIGN COMPONENT 'CARAC' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_carac <lfs_valor>.
  ENDIF.

  ASSIGN COMPONENT 'INTDE' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_intde <lfs_valor>.
  ENDIF.

  ASSIGN COMPONENT 'INTAT' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_intat <lfs_valor>.
  ENDIF.

  ASSIGN COMPONENT 'BEGDA' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_begda <lfs_valor>.
  ENDIF.

  ASSIGN COMPONENT 'ENDDA' OF STRUCTURE <table1> TO <lfs_valor>.
  IF sy-subrc 0.
    l_endda <lfs_valor>.
  ENDIF.

  IF l_begda IS NOT INITIAL AND
     l_endda IS NOT INITIAL AND
     l_begda > l_endda.
    MESSAGE e000(zmm001)
    WITH 'Data de validade inicial não pode ser maior que final'.
  ENDIF.


  IF l_intde > l_intat.
    MESSAGE e000(zmm001)
    WITH 'Intervalo (De) não pode ser maior que (Até).'.
  ENDIF.

  ASSIGN COMPONENT 'POSNR' OF STRUCTURE <table1> TO <lfs_posnr>.

  IF total[] IS NOT INITIAL.
*    BREAK-POINT.
    LOOP AT total.

      CHECK <action> <> 'D'.

      ASSIGN COMPONENT 'WERKS' OF STRUCTURE <vim_total_struc>
                                            TO <lfs_valor>.
      IF sy-subrc 0.
        CHECK <lfs_valor> l_werks.
      ENDIF.

      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <vim_total_struc>
                                            TO <lfs_valor>.
      IF sy-subrc 0.
        CHECK <lfs_valor> l_matnr.
      ENDIF.

      ASSIGN COMPONENT 'KUNNR' OF STRUCTURE <vim_total_struc>
                                            TO <lfs_valor>.
      IF sy-subrc 0.
        CHECK <lfs_valor> l_kunnr.
      ENDIF.

      ASSIGN COMPONENT 'CARAC' OF STRUCTURE <vim_total_struc>
                                            TO <lfs_valor>.
      IF sy-subrc 0.
        CHECK <lfs_valor> l_carac.
      ENDIF.

      ASSIGN COMPONENT 'INTDE' OF STRUCTURE <vim_total_struc>
                                            TO <lfs_valor>.
      IF sy-subrc 0.
        l_intde_x <lfs_valor>.
      ENDIF.

      ASSIGN COMPONENT 'INTAT' OF STRUCTURE <vim_total_struc>
                                            TO <lfs_valor>.
      IF sy-subrc 0.
        l_intat_x <lfs_valor>.
      ENDIF.

      ASSIGN COMPONENT 'BEGDA' OF STRUCTURE <vim_total_struc>
                                           TO <lfs_valor>.
      IF sy-subrc 0.
        l_begda_x <lfs_valor>.
      ENDIF.

      ASSIGN COMPONENT 'ENDDA' OF STRUCTURE <vim_total_struc>
                                            TO <lfs_valor>.
      IF sy-subrc 0.
        l_endda_x <lfs_valor>.
      ENDIF.

      IF f_tipo 'U'.

        ASSIGN COMPONENT 'POSNR' OF STRUCTURE <vim_total_struc>
                                             TO <lfs_valor>.
        IF sy-subrc 0.
          CHECK <lfs_valor> <> <lfs_posnr>.
        ENDIF.

      ENDIF.

      IF l_intde >= l_intde_x AND l_intde <= l_intat_x OR
         l_intat >= l_intde_x AND l_intat <= l_intat_x AND
         l_begda l_begda_x AND l_endda l_endda_x.
        MESSAGE e000(zmm001WITH 'Intervalo Incorreto'.
      ENDIF.

      ADD TO l_count.

    ENDLOOP.

  ENDIF.

  IF f_tipo 'I'.

    IF <lfs_posnr> IS ASSIGNED.
      <lfs_posnr> l_count + 1.
    ENDIF.

  ENDIF.

ENDFORM.                    " CHECK_DADOS

sábado, 22 de março de 2014

Relatório ALV Hierárquico com estrutura dinâmica

Muito interessante o código abaixo, bem diferente dos códigos conhecidos e acho q dá para trabalhar bastante em cima da estrutura. Achei q valia a pena compartilhar.



   DATA lcl_hier_tab TYPE REF TO cl_salv_hierseq_table.

   DATAlt_binding TYPE salv_t_hierseq_binding.

   DATAlw_binding TYPE salv_s_hierseq_binding.

   FIELD-SYMBOLS<lfsw_str>.

   IF gt_zsmm_0006_save[] IS NOT INITIAL.
     ASSIGN ('GT_ZSMM_0006_SAVE'TO <g_dyn_tab_save>.
   ENDIF.

   IF <g_dyn_tab_save> IS INITIAL.
     MESSAGE i053(zmm001).
     EXIT.
   ENDIF.

   lw_binding-master 'MATNR'.
   lw_binding-slave 'MATNR'.
   APPEND lw_binding TO lt_binding.
   lw_binding-master 'LICHN'.
   lw_binding-slave 'LICHN'.
   APPEND lw_binding TO lt_binding.

   cl_salv_hierseq_table=>factory(
   EXPORTING t_binding_level1_level2 lt_binding
     IMPORTING r_hierseq lcl_hier_tab
       CHANGING
       t_table_level1 gt_itens_rc
       t_table_level2 <g_dyn_tab_save> ).

   lcl_hier_tab->display).


Link útil.

http://wiki.scn.sap.com/wiki/display/ABAP/ALV+Grid+Report+-+with+Object+Oriented+SALV+Classes