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

martes, 12 de agosto de 2014

Programa ABAP con clases y evento.

Este programa controla la cantidad de galones que gasta X vehículo, si gasta mas de lo permitido lo manda a tanquear con 3 galones.





REPORT zhamlet_class.


*----------------------------------------------------------------------*
*       CLASS Z_CARRO DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS z_carro DEFINITION.

  PUBLIC SECTION.

    EVENTS parar .

    METHODS constructor
     IMPORTING
       i_modelo TYPE string.

    METHODS rodar
    IMPORTING
      i_galon TYPE .

    METHODS tanquear
      IMPORTING
        i_galon TYPE .

    METHODS get_msg
      RETURNING
        value(r_msgTYPE msg .

    METHODS get_modelo
      RETURNING
        value(r_modeloTYPE msg .

  PRIVATE SECTION.

    DATA modelo TYPE msg .
    DATA galon TYPE .
    CONSTANTS galon_min TYPE VALUE 1.
    CONSTANTS galon_max TYPE VALUE 5.

ENDCLASS.                    "Z_CARRO DEFINITION

*----------------------------------------------------------------------*
*       CLASS Z_OIL DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS z_oil DEFINITION.

  PUBLIC SECTION.

    METHODS stop
      FOR EVENT parar OF z_carro
      IMPORTING
        sender.

ENDCLASS.                    "Z_OIL DEFINITION


*----------------------------------------------------------------------*
*       CLASS Z_CARRO IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS z_carro IMPLEMENTATION.

  METHOD constructor.
*Constructor de modelo del carro y galon
    modelo i_modelo.
    galon 5.  "Inicia con 5 galones
  ENDMETHOD.                    "CONSTRUCTOR

  METHOD rodar.

    DATA galon_real TYPE i.
    galon_real galon i_galon.

    IF galon_real < galon_min.
      galon galon_min.
      RAISE EVENT parar.
    ELSE.
      galon galon_real.
    ENDIF.

  ENDMETHOD.                    "rodar

  METHOD tanquear.

    DATA galon_real TYPE i.
    galon_real galon + i_galon.

    IF galon_real > galon_max.
      galon galon_max.
    ELSE.
      galon galon_real.
    ENDIF.

  ENDMETHOD.                    "tanquear

  METHOD get_msg.

    DATA galon_msg TYPE LENGTH 2.

    WRITE galon TO galon_msg.
    CONCATENATE modelo 'Tiene:' galon_msg 'Galones' INTO r_msg SEPARATED BY space.

  ENDMETHOD.                    "GET_msg

  METHOD get_modelo.

    r_modelo modelo.

  ENDMETHOD.                    "GET_modelo
ENDCLASS.                    "Z_CARRO IMPLEMENTATION


*----------------------------------------------------------------------*
*       CLASS Z_OIL IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS z_oil IMPLEMENTATION.

  METHOD stop.

    DATAmsg TYPE msg,
    modelo_msg TYPE msg,
    gas TYPE VALUE 3,
    s_gas .

    sender->tanqueargas ).
    modelo_msg sender->get_modelo).

    s_gas gas.
    CONCATENATE  modelo_msg 'TANQUEO' s_gas 'GALONES'  INTO msg SEPARATED BY ' '.

    WRITE,msg .


  ENDMETHOD.                    "stop

ENDCLASS.                    "Z_OIL IMPLEMENTATION


INITIALIZATION.

  DATAvolvo1  TYPE REF TO z_carro,
        volvo2  TYPE REF TO z_carro,
        oil TYPE REF TO z_oil,

        estado  TYPE msg.

*Modelos de carros
  PARAMETERS carro1 TYPE string DEFAULT 'Volvo XC90'.
  PARAMETERS carro2 TYPE string DEFAULT 'Volvo S80'.

  PARAMETERS c1_gast1 TYPE DEFAULT 3"gasto de gasolina 1
  PARAMETERS c2_gast1 TYPE DEFAULT 4.

  PARAMETERS c1_gast2 TYPE DEFAULT 4.
  PARAMETERS c2_gast2 TYPE DEFAULT 2.

START-OF-SELECTION.

*Crea al objeto 1 segun Constructor
  CREATE OBJECT volvo1
    EXPORTING
      i_modelo carro1.
*Crea al objeto 2 segun Constructor
  CREATE OBJECT volvo2
    EXPORTING
      i_modelo carro2.

  CREATE OBJECT oil.
  SET HANDLER oil->stop FOR ALL INSTANCES.


  WRITE 'MAXIMO DE GALONES 5 Y MINIMO 1'.
  WRITE /.

  WRITE/,carro1'TIENE 5 GALONES Y GASTA 'c1_gast1.

  CALL METHOD volvo1->rodar
    EXPORTING
      i_galon c1_gast1.

  CALL METHOD volvo1->get_msg
    RECEIVING
      r_msg estado.

  WRITE/,estado.

  WRITE/,carro2'TIENE 5 GALONES Y GASTA 'c2_gast1.
  volvo2->rodarc1_gast2 ).
  estado volvo2->get_msg).
  WRITE/,estado.


  WRITE/,carro1'TANQUEA 4 GALONES'.

  CALL METHOD volvo1->tanquear
    EXPORTING
      i_galon 4"tanquea 4 galones

  CALL METHOD volvo1->get_msg
    RECEIVING
      r_msg estado.

  WRITE/,estado.


  WRITE/,carro2'GASTA 'c2_gast2'GALONES'.
  volvo2->rodarc2_gast2 )."gasta 5 galones
  estado volvo2->get_msg).
  WRITE/,estado.





martes, 5 de agosto de 2014

Variables Dinamicas (Tiempo de ejecución)


DATA:   my_ref TYPE p,"COLOCAR CUALQUIER TIPO
        descr_ref 
TYPE REF TO cl_abap_typedescr."CLASE CONOCER DESCRIP

DATAv_dinami TYPE REF TO data."MI DINAMICA

DATAerror   TYPE REF TO cx_root.
DATA v_mensage TYPE string.

*ASIGNAR VARIABLE
descr_ref 
cl_abap_typedescr=>describe_by_datamy_ref ).

TRY.

    
CASE descr_ref->type_kind.
      
WHEN 'D' OR 'T'  OR 'I' OR 'F' OR 'STRING' OR  'XSTRING'.
        
CREATE DATA v_dinami TYPE (descr_ref->type_kind).

      
WHEN 'C' OR 'N' OR 'X'.
        
CREATE DATA v_dinami TYPE (descr_ref->type_kindLENGTH descr_ref->length.

      
WHEN 'P'.
        
CREATE DATA v_dinami TYPE p LENGTH descr_ref->length DECIMALS descr_ref->decimals.
    
ENDCASE.

    
WRITE'Tipo  :'descr_ref->absolute_name.
    
WRITE'Tipo  :'descr_ref->type_kind.
    
WRITE'Tamaño:'descr_ref->length.
    
WRITE'Decimales:'descr_ref->decimals.

  
CATCH cx_root INTO error.
    v_mensage 
error->get_text( ).
*    v_mensage = error->get_longtext( ).
    
WRITE v_mensage.
ENDTRY.


Salida Error.



Salida ok







Tabla interna Dinamica

Crear una tabla dinámica según selección.


DATAit_dinami TYPE REF TO data."MI TABLA DINAMICA
DATAerror   TYPE REF TO cx_root.
DATA v_mensage TYPE string.
DATA object TYPE trobjtype.
DATAgr_table TYPE REF TO cl_salv_table.
FIELD-SYMBOLS TYPE ANY TABLE .


*ingresando X tabla se visualiza sus datos.


PARAMETERS z(20TYPE c.

SELECT SINGLE object INTO object FROM tadir
  WHERE object 'TABL' AND obj_name z.

IF sy-subrc NE 0.
  MESSAGE 'Tabla no existe' TYPE 'I'.
  STOP.
ENDIF.

TRY.
    CREATE DATA it_dinami TYPE STANDARD TABLE OF (z).
  CATCH cx_root INTO error.
    v_mensage error->get_text).
*    v_mensage = error->get_longtext( ).
    WRITE v_mensage.
ENDTRY.

ASSIGN it_dinami->TO .

SELECT FROM (zINTO TABLE  UP TO 10 ROWS.

cl_salv_table=>factory(
IMPORTING r_salv_table gr_table
CHANGING t_table [] ).

gr_table->display).

miércoles, 7 de mayo de 2014

Actualizar EIKP / UPDATE EIKP


  SELECT FROM eikp
           INTO CORRESPONDING FIELDS OF TABLE i_eikp
           WHERE exnum EQ ekko-exnum AND
                 refnr EQ ekko-ebeln.



  LOOP AT it_eikp.
    MOVE-CORRESPONDING it_eikp TO fxeikp.
    fxeikp-text1 = 'Prueba'.

    fxeikp-pronu = '152514'.
    fxeikp-proda = '20130101'.
    fxeikp-updkz 'U'.
    APPEND fxeikp.
  ENDLOOP.


  CALL FUNCTION 'EXPIMP_POSTING' IN UPDATE TASK
    TABLES
      fxeikp fxeikp
      fxeipo fxeipo.



Ver por ME23N.

 

lunes, 2 de septiembre de 2013

'MESSAGES_INITIALIZE' 'MESSAGE_STORE' 'MESSAGES_SHOW'

      LOOP AT gt_return.
        CONCATENATE gt_return-message INTO gt_return-message SEPARATED BY space.
        MODIFY gt_return TRANSPORTING message.
        APPEND LINES OF gt_return TO mensaje.
      ENDLOOP.



  CALL FUNCTION 'MESSAGES_INITIALIZE'.

  LOOP AT mensaje.
    CALL FUNCTION 'MESSAGE_STORE'
      EXPORTING
        arbgb 'Inf'
        msgty mensaje-type
        msgv1 mensaje-message(47)
        msgv2 mensaje-message+47(47)
        msgv3 mensaje-message+94
        txtnr mensaje-number.
  ENDLOOP.


  CALL FUNCTION 'MESSAGES_SHOW'
    EXPORTING
*     corrections_option  = 'X'
      show_linno          space
      object              'Log de mensajes'
      i_use_grid          'X'
      show_linno_text_len 3
    EXCEPTIONS
      inconsistent_range  1
      no_messages         2
      OTHERS              3.



 
 

'REUSE_ALV_POPUP_TO_SELECT' con icono

DATA: BEGIN OF ita OCCURS 0,
    ty(4TYPE  c,
    ms(220)     TYPE c,
    END OF ita.
    

TYPES: t_fieldcat         TYPE slis_fieldcat_alv.
data: i_fieldcat         TYPE STANDARD TABLE OF t_fieldcat,
 w_fieldcat         TYPE t_fieldcat.



*iconos

      LOOP AT gt_return.
        CLEAR ita-ms.
        CONCATENATE gt_return-message into ita-ms SEPARATED BY space.
        IF gt_return-type 'S'.
          ita-ty icon_green_light.
        ELSEIF gt_return-type 'E'.
          ita-ty icon_red_light.
        ELSEIF gt_return-type 'W'.
          ita-ty icon_yellow_light.
        ENDIF.
        APPEND ita.
      ENDLOOP.




  CLEAR w_fieldcat.
  w_fieldcat-fieldname 'TY'.
  w_fieldcat-tabname   'ITA'.
  w_fieldcat-seltext_m 'Tipo'.
  w_fieldcat-icon 'X'.
  APPEND w_fieldcat TO i_fieldcat.
  CLEAR w_fieldcat.

  CLEAR w_fieldcat.
  w_fieldcat-fieldname 'MS'.
  w_fieldcat-tabname   'ITA'.
  w_fieldcat-seltext_m 'Mensaje'.
  APPEND w_fieldcat TO i_fieldcat.
  CLEAR w_fieldcat.

 

CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
      EXPORTING
        i_title               'Mensajes '
        i_zebra               'X'
        i_screen_start_column 1
        i_screen_start_line   1
        i_screen_end_column   150
        i_screen_end_line     15
        i_tabname             'ITA'
        it_fieldcat           i_fieldcat
        is_private            is_private
      TABLES
        t_outtab              ita
      EXCEPTIONS
        program_error         1
        OTHERS                2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.