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).