lunes, 1 de diciembre de 2014

Performance Tablas internas

TRATAMIENTO DE DATOS CON TABLAS INTERNAS USANDO WORK-AREA Y FIELD-SYMBOLS.
USO DEL 'RH_DYNAMIC_WHERE_BUILD'




LOOP AT <fs> ASSIGNING <ls>. 0.70300
LOOP AT it ASSIGNING wa. 0.57800
LOOP AT it ASSIGNING <fs>. 0.50000 Mejor uso. 




DATAlv_flag TYPE flag,
      lv_sta_time 
TYPE timestampl,
      lv_end_time 
TYPE timestampl,
      lv_diff_w   
TYPE DECIMALS 5.


TYPESBEGIN OF tybseg,
  belnr 
TYPE belnr_d,
  augdt 
TYPE augdt,
  bukrs 
TYPE bukrs,
  buzei 
TYPE buzei,
  
END OF tybseg.

*********************IT <>

FIELD-SYMBOLS TYPE STANDARD TABLE,
                
TYPE bkpf.
FIELD-SYMBOLS TYPE STANDARD TABLE,
                
TYPE bseg,
                
TYPE tybseg .

FIELD-SYMBOLS:   TYPE STANDARD TABLE.

DATAit_tab  TYPE REF TO data.
DATAit_pos  TYPE REF TO data.
DATAit_out  TYPE REF TO data.
DATAit_out2  TYPE REF TO data.

DATA r_where TYPE STANDARD TABLE OF hrcond,
       s_where 
LIKE hrcond.

TYPESBEGIN OF ty_s_clause,
line TYPE char72.
TYPESEND OF ty_s_clause.
DATA cond_where TYPE STANDARD TABLE OF ty_s_clause WITH DEFAULT KEY.

CREATE DATA it_tab TYPE STANDARD TABLE OF bkpf.
ASSIGN it_tab->TO .
CREATE DATA it_pos TYPE STANDARD TABLE OF bseg.
ASSIGN it_pos->TO .

CREATE DATA it_out TYPE TABLE OF tybseg.
ASSIGN it_out->TO .
CREATE DATA it_out TYPE tybseg.
ASSIGN it_out->TO .

*********************IT <>

*********************WORK AREA normal
DATA it TYPE TABLE OF bkpf.
DATA wa LIKE LINE OF it.
DATA pos TYPE TABLE OF bseg.
DATA wapos LIKE LINE OF pos.
DATA wapos2 TYPE tybseg.
DATA out TYPE TABLE OF tybseg.
*********************WORK AREA normal


*********************WORK AREA FIELD-SYMBOLS
FIELD-SYMBOLS  TYPE bkpf.
FIELD-SYMBOLS  TYPE bseg.
FIELD-SYMBOLS  TYPE tybseg.
DATA out2 TYPE TABLE OF tybseg.

CREATE DATA it_out2 TYPE tybseg.
ASSIGN it_out2->TO .

*********************WORK AREA FIELD-SYMBOLS


SELECT FROM bkpf INTO TABLE 
  
WHERE gjahr '2014'.

SELECT FROM bseg
  
INTO TABLE 
  
FOR ALL ENTRIES IN 
  
WHERE ('BUKRS = -BUKRS')
  
AND ('BELNR = -BELNR')
  
AND ('GJAHR = -GJAHR').


SELECT FROM bkpf INTO TABLE
  it 
WHERE gjahr '2014'.

SELECT FROM bseg
  
INTO TABLE pos
  
FOR ALL ENTRIES IN it
  
WHERE belnr it-belnr AND bukrs it-bukrs
  
AND gjahr it-gjahr.


*Inicia tiempo de tratamiento tabla 
GET TIME STAMP FIELD lv_sta_time.

LOOP AT  ASSIGNING .
  
REFRESHr_where,cond_where.
  
PERFORM add_where USING 'BELNR' 'EQ' -belnr ''.
  
LOOP AT  ASSIGNING  WHERE (cond_where).

    
MOVE-CORRESPONDING  TO .

    
READ TABLE  WITH KEY ('BELNR') = -belnr TRANSPORTING NO FIELDS.
    
IF sy-subrc 0.
      
APPEND  TO .
    
ENDIF.
    
CLEAR.
  
ENDLOOP.

  
REFRESHr_where,cond_where.

  
PERFORM add_where USING 'BELNR' 'EQ' -belnr ''.
  
PERFORM add_where USING 'BUZEI' 'EQ' '002' ''.
  
DELETE  WHERE (cond_where).
  
CLEAR ,.
ENDLOOP.

*Finaliza tiempo de tratamiento tabla 
GET TIME STAMP FIELD lv_end_time.
lv_diff_w 
lv_end_time lv_sta_time.


WRITE'De una tabla  a Work Area '.
WRITE/ lv_diff_w.
WRITE.


CLEARlv_diff_wlv_end_timelv_sta_time.

*Inicia tiempo de tratamiento tabla normal
GET TIME STAMP FIELD lv_sta_time.


LOOP AT it INTO wa.
  
LOOP AT pos INTO wapos WHERE belnr wa-belnr.

    
MOVE-CORRESPONDING wapos TO wapos2.

    
READ TABLE it WITH KEY belnr wapos2-belnr TRANSPORTING NO FIELDS.
    
IF sy-subrc 0.
      
APPEND wapos2 TO out.
    
ENDIF.
    
CLEARwaposwapos2.
  
ENDLOOP.

  
DELETE out WHERE belnr EQ wa-belnr AND buzei EQ '002'.
  
CLEARwa ,wapos2.
ENDLOOP.

*Inicia tiempo de tratamiento tabla normal
GET TIME STAMP FIELD lv_end_time.
lv_diff_w 
lv_end_time lv_sta_time.


WRITE'De una tabla normal a Work Area normal'.
WRITE/ lv_diff_w.
WRITE.


CLEARlv_diff_wlv_end_timelv_sta_time.

*Inicia tiempo de tratamiento tabla normal con work area
GET TIME STAMP FIELD lv_sta_time.


LOOP AT it ASSIGNING .
  
LOOP AT pos ASSIGNING  WHERE belnr -belnr.

    
MOVE-CORRESPONDING  TO .

    
READ TABLE it WITH KEY belnr -belnr TRANSPORTING NO FIELDS.
    
IF sy-subrc 0.
      
APPEND  TO out2.
    
ENDIF.
    
CLEAR.
  
ENDLOOP.

  
DELETE out2 WHERE belnr EQ -belnr AND buzei EQ '002'.
  
CLEAR ,.
ENDLOOP.

*Finaliza tiempo de tratamiento tabla normal con work area 
GET TIME STAMP FIELD lv_end_time.
lv_diff_w 
lv_end_time lv_sta_time.


WRITE'De una tabla normal a un Work Area '.
WRITE/ lv_diff_w.
WRITE.



*&---------------------------------------------------------------------*
*&      Form  ADD_WHERE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_FIELD  text
*      -->P_OPERA  text
*      -->P_LOW  text
*      -->P_HIGH  text
*----------------------------------------------------------------------*
FORM add_where  USING    p_field
                         p_opera
                         p_low
                         p_high
.


  
CLEAR s_where.
  s_where
-field p_field.
  s_where
-opera p_opera.
  s_where
-low p_low.
  s_where
-high =   p_high.
  
APPEND s_where TO  r_where.


  
CALL FUNCTION 'RH_DYNAMIC_WHERE_BUILD'
    
EXPORTING
      dbtable         
space " can be empty
    
TABLES
      condtab         
r_where
      where_clause    
cond_where
    
EXCEPTIONS
      empty_condtab   
01
      no_db_field     
02
      unknown_db      
03
      wrong_condition 
04.


ENDFORM.                    " ADD_WHERE

No hay comentarios:

Publicar un comentario