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.
quinta-feira, 15 de maio de 2014
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á..
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
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.
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.
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.
DATA: l_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(zmm001) WITH 'Intervalo Incorreto'.
ENDIF.
ADD 1 TO l_count.
ENDLOOP.
ENDIF.
IF f_tipo = 'I'.
IF <lfs_posnr> IS ASSIGNED.
<lfs_posnr> = l_count + 1.
ENDIF.
ENDIF.
ENDFORM. " CHECK_DADOS
***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.
DATA: l_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(zmm001) WITH 'Intervalo Incorreto'.
ENDIF.
ADD 1 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.
DATA: lt_binding TYPE salv_t_hierseq_binding.
DATA: lw_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
DATA lcl_hier_tab TYPE REF TO cl_salv_hierseq_table.
DATA: lt_binding TYPE salv_t_hierseq_binding.
DATA: lw_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
Assinar:
Postagens (Atom)

