PW.TP - Nota 004533

Módulo: GERAL

Funcionalidade: Atualização SYSID

Data/Hora da Publicação: 27/08/2007 00:00:00

Data/Hora Última Alteração: 16/02/2011 10:03:05

Descrição da Nota: ATUALIZ. SYSID GERAÇÃO POR BLOCOS

Sintoma

Quando a tabela possui muitos registros o programa apresenta erro de tempo de execução.

 

 

Solução

Atualização para que o processamento seja executado em blocos de 100.000 registros.

 

Versões Tratadas

Não Usar - 2.00.0000


Pré-Requisitos

Produto:

Nota

Descrição

EXITS PARA TRATAMENTO DE AUTORIZAÇÃO

Informações Complementares

----------------------------------------------------------------------------------------------------

Nota Número 04533 Data: 27/08/2007 Hora: 15:28:52

----------------------------------------------------------------------------------------------------

 

----------------------------------------------------------------------------------------------------

Nota Número              : 04533

Categoria                : Erro de Programa

Prioridade               : Alta

Versão PW.TP             : 2.0

Pacote                   : 00026

Agrupamento              : 00010

----------------------------------------------------------------------------------------------------

Referência às notas relacionadas:

Número - Ordem - Versão - Pacote - Descrição Breve

 

04398  - 00001 - 2.0    - 00026  - EXITS PARA TRATAMENTO DE AUTORIZAÇÃO

----------------------------------------------------------------------------------------------------

ATUALIZ. SYSID GERAÇÃO POR BLOCOS

----------------------------------------------------------------------------------------------------

Palavras Chave:

ATUALIZ. SYSID GERAÇÃO POR BLOCOS

 

----------------------------------------------------------------------------------------------------

Objetos da nota:

REPS /PWS/ZYTPR036

 

----------------------------------------------------------------------------------------------------

Modificações efetuadas em REPS /PWS/ZYTPR036

 

REPORT /pws/zytpr036 MESSAGE-ID /pws/zytpm.

TABLES: dd03l.

DATA: itab_tabela LIKE dd03l-tabname OCCURS 0 WITH HEADER LINE,

      v_resp(1) TYPE c,

      v_text_1(50) TYPE c,

      v_text_2(50) TYPE c,

      v_file TYPE string,

      v_tot LIKE sy-tabix,

      v_lin LIKE sy-tabix,

      v_tipo TYPE REF TO data,

* >> Início da exclusão:

      v_queb LIKE sy-tabix VALUE 10000,

* << Fim da exclusão

* >> Início da inclusão:

      v_queb LIKE sy-tabix VALUE 100000,

* << Fim da inclusão

      v_mens(255) TYPE c,

      v_perc TYPE i,

      v_tam TYPE i,

      v_result,

      v_msg(91),

      v_ans_aux.

DATA:

      BEGIN OF t_exec OCCURS 0                       ,

        tabname LIKE dd02t-tabname                   ,

        dir     LIKE rlgrap-filename                 ,

...

 

...

            OTHERS                 = 3.

  IF sy-subrc EQ 0.

    CALL METHOD cl_alv_table_create=>create_dynamic_table

       EXPORTING

         it_fieldcatalog = t_fieldcat

       IMPORTING

         ep_table        = v_tipo.

  ENDIF.

ENDFORM.

FORM executa.

* >> Início da inclusão: FORM EXECUTA

  DATA: v_resto TYPE i,

        v_tipo_aux TYPE REF TO data,

        qtd_arq TYPE i,

        qtd_aux(10) TYPE c.

* << Fim da inclusão

  IF sy-batch IS INITIAL.

    CALL FUNCTION 'POPUP_TO_CONFIRM'

         EXPORTING

              titlebar              = text-003

              text_question         = text-002

              display_cancel_button = space

         IMPORTING

              answer                = v_resp.

    CHECK v_resp = '1'.

  ENDIF.

  v_tam = strlen( p_dir ) + 1.

  PERFORM selecao.

  DESCRIBE TABLE itab_tabela LINES v_tot.

  IF p_backup = 'X'.

    IF sy-batch IS INITIAL.

      CALL SCREEN '0002' STARTING AT 30 6.

    ENDIF.

    IF v_queb IS INITIAL.

* >> Início da exclusão: FORM EXECUTA

      v_queb = 10000.

* << Fim da exclusão

* >> Início da inclusão: FORM EXECUTA

      v_queb = 100000.

* << Fim da inclusão

    ENDIF.

  ENDIF.

  LOOP AT itab_tabela.

    v_perc = sy-tabix * 100 / v_tot.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'

         EXPORTING

              percentage = v_perc

              text       = itab_tabela.

    PERFORM criar_tipo USING itab_tabela CHANGING v_tipo.

* >> Início da exclusão: FORM EXECUTA

    ASSIGN  v_tipo->* TO: <itab_dados>.

    SELECT * FROM (itab_tabela)

    INTO TABLE <itab_dados> WHERE sysid <> p_dest.

* << Fim da exclusão

* >> Início da inclusão: FORM EXECUTA

    ASSIGN  v_tipo->* TO: <tab_aux>.

* << Fim da inclusão

* >> Início da exclusão: FORM EXECUTA

    IF sy-subrc = 0.

      v_lin = sy-dbcnt.

      PERFORM backup.

    ELSE.

      WRITE: / text-013 , itab_tabela.

    ENDIF.

  ENDLOOP.

ENDFORM.

FORM selecao.

  SELECT tabname FROM dd03l

   INTO TABLE itab_tabela

   WHERE tabname LIKE '/PWS/ZYTPT%' AND

   as4local = 'A' AND

   keyflag = 'X' AND

   rollname IN ('/PWS/ZYTPL181', 'SYSYSID').

  SORT itab_tabela.

ENDFORM.

FORM backup.

  DATA: v_resto TYPE i,

        v_inicio TYPE i,

        v_fim TYPE i,

        v_tipo_aux TYPE REF TO data,

        qtd_arq TYPE i,

        qtd_aux(10) TYPE c.

* << Fim da exclusão

* >> Início da inclusão: FORM BACKUP

    SELECT COUNT( * ) FROM (itab_tabela)

      INTO v_lin WHERE sysid <> p_dest.

* << Fim da inclusão

  IF v_lin > v_queb.

    v_resto = v_lin MOD v_queb.

    IF v_resto > 0.

      qtd_arq = ( v_lin DIV v_queb ) + 1.

    ELSE.

      qtd_arq = v_lin DIV v_queb.

    ENDIF.

  ELSE.

    qtd_arq = 1.

  ENDIF.

* >> Início da exclusão: FORM BACKUP

  v_inicio = 1.

  v_fim = v_queb.

* << Fim da exclusão

* >> Início da inclusão: FORM BACKUP

    WHILE sy-subrc EQ 0.

* << Fim da inclusão

* >> Início da exclusão: FORM BACKUP

  CREATE DATA v_tipo_aux LIKE <itab_dados>.

* << Fim da exclusão

* >> Início da inclusão: FORM BACKUP

      SELECT * FROM (itab_tabela) UP TO v_queb ROWS

        INTO TABLE <tab_aux> WHERE sysid <> p_dest.

* << Fim da inclusão

* >> Início da exclusão: FORM BACKUP

  ASSIGN v_tipo_aux->* TO <tab_aux>.

* << Fim da exclusão

* >> Início da inclusão: FORM BACKUP

      IF sy-subrc = 0.

* << Fim da inclusão

* >> Início da exclusão: FORM BACKUP

  DO qtd_arq TIMES.

* << Fim da exclusão

    qtd_arq_aux = sy-index.

    qtd_aux = qtd_arq.

    v_perc = sy-index * 100 / qtd_arq.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'

         EXPORTING

              percentage = v_perc

              text       = itab_tabela.

    SHIFT qtd_arq_aux LEFT DELETING LEADING space.

    SHIFT qtd_aux LEFT DELETING LEADING space.

* >> Início da exclusão: FORM BACKUP

    CLEAR <tab_aux>.

    REFRESH <tab_aux>.

    APPEND LINES OF <itab_dados>

      FROM v_inicio TO v_fim

      TO <tab_aux>.

* << Fim da exclusão

    IF p_backup = 'X'.

      IF NOT sy-batch IS INITIAL.

* >> Início da exclusão: FORM BACKUP

       CONCATENATE p_dir '/' itab_tabela+5 '_' qtd_arq_aux 'of' qtd_aux

* << Fim da exclusão

* >> Início da inclusão: FORM BACKUP

            CONCATENATE p_dir '/' itab_tabela+5 '_'

                        qtd_arq_aux 'of' qtd_aux

* << Fim da inclusão

               '.bkp_sysid' INTO v_file.

        PERFORM down_server.

      ELSE.

* >> Início da exclusão: FORM BACKUP

       CONCATENATE p_dir '\' itab_tabela+5 '_' qtd_arq_aux 'of' qtd_aux

* << Fim da exclusão

* >> Início da inclusão: FORM BACKUP

            CONCATENATE p_dir '\' itab_tabela+5 '_'

                        qtd_arq_aux 'of' qtd_aux

* << Fim da inclusão

               '.bkp_sysid' INTO v_file.

        PERFORM down_local.

      ENDIF.

    ENDIF.

* >> Início da inclusão: FORM BACKUP

        PERFORM atualizar_tabela.

      ELSE.

        IF sy-index EQ 1.

          WRITE: / text-013 , itab_tabela.

        ENDIF.

      ENDIF.

    ENDWHILE.

  ENDLOOP.

* << Fim da inclusão

* >> Início da exclusão: FORM BACKUP

    v_inicio = v_fim + 1.

    v_fim = v_inicio + v_queb - 1.

* << Fim da exclusão

* >> Início da inclusão: FORM BACKUP

ENDFORM.

FORM selecao.

  SELECT tabname FROM dd03l

   INTO TABLE itab_tabela

   WHERE tabname LIKE '/PWS/ZYTPT%' AND

   as4local = 'A' AND

   keyflag = 'X' AND

   rollname IN ('/PWS/ZYTPL181', 'SYSYSID').

  SORT itab_tabela.

ENDFORM.

* << Fim da inclusão

* >> Início da exclusão: FORM BACKUP

    PERFORM atualizar_tabela.

  ENDDO.

ENDFORM.

* << Fim da exclusão

FORM atualizar_tabela.

  DELETE (itab_tabela) FROM TABLE <tab_aux>.

  LOOP AT <tab_aux> ASSIGNING <wa_tabela>.

    ASSIGN COMPONENT 'SYSID' OF STRUCTURE <wa_tabela> TO <valor>.

    <valor> = p_dest.

    MODIFY <tab_aux> FROM <wa_tabela>.

  ENDLOOP.

  MODIFY (itab_tabela) FROM TABLE <tab_aux>.

  COMMIT WORK.

  IF sy-subrc = 0.

...