quarta-feira, 27 de novembro de 2013

Evento para SM34 - Cluster de visão


- Situação: validar campos na inclusão de valores em visão de atualização adicionada há um cluster de visão na SE54.

- Entrar na transação SE54 - Cluster de visão.
 - colocar a visão.
- Clicar em Hora Momento







- Selecionar o evento desejado (no meu caso usei o CK - na entrada de valores ou modificação) , esse evento seria o apropriado para checagem de valores.
- No meu caso coloquei um nome para o FORM CHECK_TESTE

 - Ao dar o <ENTER> aparecerá a tela abaixo.
- O sistema pede para criar um programa onde a rotina (no meu caso CHECK_TESTE) será inserida.
- Coloque um nome 
- A verificação abaixo é bem importante pois indica qual o tipo de programa q vc deve criar. É mais informativo, apenas continue.


- Como vai ser um programa só de rotinas simples eu descartei o include TOP.
- Aparecerá a janela com as características do programa e nesse momento vc tem q escolher o tipo de programa conforme a mensagem anterior. Na minha opinião o mais correto seria um POOL de subrotinas.
- Continuando ele entra no programa, conforme abaixo.
==============================================================
 Abaixo um código que fiz para validação no evento da SE34, não é para mesma tabela q criei as telas acima, que apenas criei para demonstrar o passo a passo.

- O include  lsvcmcod, é bom manter para obter alguns valores globais do programa standard.
- No meu código abaixo as 2 visões do cluster são a ZXX_V_LTG_CAB e a ZCC_V_LTG_ITEM
- A variável VCL_ACTION - indica se é uma inclusão ou alteração

*&---------------------------------------------------------------------*
*& Pool subrotinas   ZXX_R_LTG_VIEW_EVENT
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

PROGRAM  ZXX_r_ltg_view_event.

INCLUDE lsvcmcod.

*&---------------------------------------------------------------------*
*&      Form  check_view_ltg_ck
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM check_view_ltg_ck.

  DATA: l_viewname TYPE vclstruc-object,
        l_error_flag TYPE vcl_flag_type,
        lw_header TYPE vimdesc,
        lw_total(1000) TYPE c,
        lw_extract(1000) TYPE c,
        lw_ltg_cab TYPE ZXX_v_ltg_cab,
        lw_ltg_item TYPE ZXX_v_ltg_item.

  FIELD-SYMBOLS: <lfs_view>    TYPE ANY,
                 <lfs_view_x>  TYPE x,
                 <lfs_ent_x>   TYPE x,
                 <lfs_viewkey> TYPE x.

  " assign data of current view to global field symbols (<vcl_total>, <vcl_extract> etc.)
  l_viewname = vcl_akt_view.

  PERFORM vcl_set_table_access_for_obj USING  l_viewname
                                       CHANGING l_error_flag.

  " get view name (if you`ll use several views to make it dynamic)
  READ TABLE <vcl_header> INTO lw_header INDEX 1.


  " assign field symbols
*  ASSIGN: lw_total                    TO <lfs_view>    CASTING TYPE (lw_header-maintview),
  ASSIGN: vcl_object_area         TO <lfs_view>    CASTING TYPE (lw_header-maintview),
          <lfs_view>                  TO <lfs_view_x>  CASTING,
          <lfs_view_x>(lw_header-keylen) TO <lfs_viewkey>.

  CASE vcl_akt_view.
    WHEN 'ZXX_V_LTG_CAB'.

      lw_ltg_cab = <lfs_view>.

      IF vcl_action = 'I'.

        SELECT COUNT( * )
          FROM ZXX_tltg_cab
         WHERE matnr   EQ lw_ltg_cab-matnr
           AND werks   EQ lw_ltg_cab-werks
           AND ltgvers EQ lw_ltg_cab-ltgvers
           AND bdatu   EQ lw_ltg_cab-bdatu.

        IF sy-subrc = 0.

          MESSAGE i010(ZXX_ltg)
             WITH lw_ltg_cab-matnr lw_ltg_cab-werks
                  lw_ltg_cab-ltgvers lw_ltg_cab-bdatu
                  RAISING invalid_key.
        ENDIF.

      ENDIF.

    WHEN 'ZXX_V_LTG_ITEM'.
      lw_ltg_item = <lfs_view>.

      IF vcl_action = 'I'.

        SELECT COUNT( * )
          FROM ZXX_tltg_item
         WHERE stlnr EQ lw_ltg_item-stlnr
           AND idnrk EQ lw_ltg_item-idnrk.

        IF sy-subrc = 0.
          MESSAGE i011(ZXX_ltg)
             WITH lw_ltg_item-idnrk
                  RAISING invalid_key.
        ENDIF.

      ENDIF.

  ENDCASE.

  IF vcl_action = 'U'.
  ENDIF.

ENDFORM.                    "check_view_ltg_ck









2 comentários: