segunda-feira, 2 de março de 2015

ALV - Evento com mais de um objeto ALV selecionado.

 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-METHODSon_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'.
    DATAlo_cc_obj TYPE REF TO cl_gui_custom_container.
    DATAl_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.

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'



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.