Essa eu consegui no SDN pois não consegui fazer sozinho, postei no SDN e um cara me respondeu.
Problema:
eu tinha 2 ALV com mesmas características apenas com seleção de dados distintos mas com estruturas de saída iguais. Criei um evento hotspot que atendesse os 2 objetos e precisava de uma forma de identificar quando seria a chamada de um objeto e do outro.
Solução:
Existe um parâmetro oculto que não aparece nos eventos, mas q existe em todos os eventos. é o SENDER que é basicamente o objeto classe ALV que chamou o evento, dentro desse objeto tem as características do objetos onde é possível identificar o objeto chamado.
No meu caso eu fiz um casting com o objeto para classe CL_GUI_CUSTOM_CONTAINER identificando depois no método o container chamado e daí fazer a minha lógica.
Abaixo a classe declarada.
CLASS lcl_alv_event_det DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: on_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_column_id es_row_no sender.
ENDCLASS. "LCL_ALV_EVENT_BR DEFINITION
========================
CLASS lcl_alv_event_det IMPLEMENTATION.
METHOD on_hotspot_click.
* PERFORM on_hotspot_alv_br USING e_column_id es_row_no 'C'.
DATA: lo_cc_obj TYPE REF TO cl_gui_custom_container.
DATA: l_name TYPE string.
lo_cc_obj ?= sender->parent.
CALL METHOD lo_cc_obj->get_name
RECEIVING
name = l_name.
PERFORM on_hotspot_tbd USING e_column_id es_row_no l_name.
ENDMETHOD.
ENDCLASS.
Abaixo as chamada do evento nos 2 objetos.
CALL METHOD o_alv_100->set_table_for_first_display
EXPORTING
is_layout = lw_layout
i_save = 'A'
is_variant = lw_variant
CHANGING
it_outtab = t_alv100
it_fieldcatalog = t_fcat.
SET HANDLER lcl_alv_event_det=>on_hotspot_click FOR o_alv_100.
=======================================================
CALL METHOD o_alv_200->set_table_for_first_display
EXPORTING
is_layout = lw_layout
i_save = 'A'
is_variant = lw_variant
CHANGING
it_outtab = t_alv_200
it_fieldcatalog = t_fcat.
SET HANDLER lcl_alv_event_det=>on_hotspot_click FOR o_alv_200.
segunda-feira, 2 de março de 2015
Tabstrip texto de aba dinâmico
Para montar um tabstrip onde o título da da aba é variável.
Solução bem simples, sem muito segredo.
- Criar o objeto tabstrip na tela normalmente.
No meu exemplo coloquei o nome TB_TBD
e no meu caso tem 20 abas, não faz diferença para 1 ou mais.
O nome da aba no meu caso TBD01, deve estar marcado como texto de saída conforme flag no atributo do objeto.
Crie uma variável global com o mesmo nome no programa, como abaixo.
DATA: tbd01 TYPE screen-name,
Na seção PBO adicione o texto que vc quiser nessa variável e tudo se resolve.
TBD01 = 'TESTE'
Solução bem simples, sem muito segredo.
- Criar o objeto tabstrip na tela normalmente.
No meu exemplo coloquei o nome TB_TBD
e no meu caso tem 20 abas, não faz diferença para 1 ou mais.
O nome da aba no meu caso TBD01, deve estar marcado como texto de saída conforme flag no atributo do objeto.
Crie uma variável global com o mesmo nome no programa, como abaixo.
DATA: tbd01 TYPE screen-name,
Na seção PBO adicione o texto que vc quiser nessa variável e tudo se resolve.
TBD01 = 'TESTE'
Correção erro em loop de cancelamento BAPI_INCOMINGINVOICE_CANCEL - com NF
Eu tive um problema recente esses dias onde eu tinha um programa onde poderiam ser marcados mais de uma fatura (MM) para estorno (MR8M), para isso utilizando a BAPI BAPI_INCOMINGINVOICE_CANCEL, nesse meu processo além da fatura da MIRO eu tinha mais uma fatura MIRO tbm de nota de crédito e eliminação do pedido de compras. Essa nota de crédito sem NF e a fatura da MIRO ref. ao pedido de compras com NF.
No programa quando era marcado mais de um item para cancelamento, somente era processado o primeiro item selecionado, ou seja era estornado a MIRO de nota de crédito, a MIRO do pedido e o pedido de compra em si, a partir do segundo item ficava dando um erro de NF externo inválido, se saísse do programa e executasse novamente, somente a primeira linha selecionada era eliminado e o seguinte dava o erro.
Procurei alternativas de funções que limpassem o buffer, pois com certeza durante o processamento com o programa já carregado em memória, alguma coisa estava ficando para trás e não estava sendo limpo.. depois de algumas horas de DEBUG percebi que a estrutura NFHEADER do programa SAPLJ1BI continuava preenchido no segundo processamento com dados da NF estornada anterior, e além dessa estrutura a tabela interna X4_RSEG tbm, e essa tabela justamete possui o número do pedido relacionado a MIRO, dessa forma o programa sempre procurava o último pedido processado e não o pedido a ser cancelado.
Solução para o problema, foi apagar o BUFFER antes do processamento e tudo resolvido.
CALL FUNCTION 'J_1B_IM_NF_REFRESH'.
ASSIGN ('(SAPLJ1BI)NFHEADER') TO <lfsw_nfheader>.
IF sy-subrc = 0.
CLEAR <lfsw_nfheader>.
ENDIF.
ASSIGN ('(SAPLJ1BI)X4_RSEG[]') TO <lfst_rseg>.
IF sy-subrc = 0.
CLEAR <lfst_rseg>[].
ENDIF.
CALL FUNCTION 'BAPI_INCOMINGINVOICE_CANCEL'
EXPORTING
invoicedocnumber = lv_invoicedocnumber
fiscalyear = lv_fiscalyear
reasonreversal = '01'
IMPORTING
invoicedocnumber_reversal = lv_belnr
fiscalyear_reversal = lv_gjahr
TABLES
return = lt_return.
No programa quando era marcado mais de um item para cancelamento, somente era processado o primeiro item selecionado, ou seja era estornado a MIRO de nota de crédito, a MIRO do pedido e o pedido de compra em si, a partir do segundo item ficava dando um erro de NF externo inválido, se saísse do programa e executasse novamente, somente a primeira linha selecionada era eliminado e o seguinte dava o erro.
Procurei alternativas de funções que limpassem o buffer, pois com certeza durante o processamento com o programa já carregado em memória, alguma coisa estava ficando para trás e não estava sendo limpo.. depois de algumas horas de DEBUG percebi que a estrutura NFHEADER do programa SAPLJ1BI continuava preenchido no segundo processamento com dados da NF estornada anterior, e além dessa estrutura a tabela interna X4_RSEG tbm, e essa tabela justamete possui o número do pedido relacionado a MIRO, dessa forma o programa sempre procurava o último pedido processado e não o pedido a ser cancelado.
Solução para o problema, foi apagar o BUFFER antes do processamento e tudo resolvido.
CALL FUNCTION 'J_1B_IM_NF_REFRESH'.
ASSIGN ('(SAPLJ1BI)NFHEADER') TO <lfsw_nfheader>.
IF sy-subrc = 0.
CLEAR <lfsw_nfheader>.
ENDIF.
ASSIGN ('(SAPLJ1BI)X4_RSEG[]') TO <lfst_rseg>.
IF sy-subrc = 0.
CLEAR <lfst_rseg>[].
ENDIF.
CALL FUNCTION 'BAPI_INCOMINGINVOICE_CANCEL'
EXPORTING
invoicedocnumber = lv_invoicedocnumber
fiscalyear = lv_fiscalyear
reasonreversal = '01'
IMPORTING
invoicedocnumber_reversal = lv_belnr
fiscalyear_reversal = lv_gjahr
TABLES
return = lt_return.
Assinar:
Postagens (Atom)