sábado, 14 de agosto de 2010

Create_data (tabla creada por parametro)

Con este programa solo pido el nombre de una tabla y les brindo pa posibilidad de operarla sin importar que tabla se haya ingrasado por  parámetro. Luego de ingresar  la table te mostrare una lista del contenido de esa tabla.


*&---------------------------------------------------------------------*
*& Report  ZCREATE_DATA
*&---------------------------------------------------------------------*
*&Creo una tabla interna dinamicamente partiendo desde un parametro
*&Necesario trabajar con <fs>
*&---------------------------------------------------------------------*

REPORT  ZCREATE_DATA.

DATA gt_table TYPE REF TO data.

FIELD-SYMBOLS:
      <FST> TYPE ANY TABLE"PARA OPERAR LA TABLA
      <FS> TYPE ANY"TRABAJARA COMO WORKAREA
      <FS2> TYPE ANY."

PARAMETERS pa_table TYPE dd02l-tabname. "TIPO NOMBRE DE TABLA EN SAP

START-OF-SELECTION.

  " Creo una tabla dinamicamente y la asigno al field-symbol <FST>
  CREATE DATA gt_table TYPE STANDARD TABLE OF (pa_table) WITH NON-UNIQUE DEFAULT KEY.
  ASSIGN gt_table->* TO <FST>.
  " <FST> APUNTA A LA TABLA CREADA, SIENDO NECESARIA LA REFERANCIA
  " PARA USARLA EN EL SELECT.

*SELECT DE LA TABLA INGRESADA
  SELECT *
  FROM (pa_table)
  UP TO 100 ROWS
  INTO CORRESPONDING FIELDS OF TABLE <FST>.
* RECORRO LA TABLA CON EL LOOP.
* USO EL <FS> COMO WA DE LA TABLA
  LOOP AT <FST> ASSIGNING <FS>.
*RECORRO CADA (COLUMNA) DE LA TABLA ASIGNANDO CADA COMPONENTE
*DE LA ESTRUCTURA <FS> A <FS2>
    DO.
*SE TRADUCE: EL COMPONENTE NUMERO (INDEX) DE LA ESTRUCTURA LEIDA
*            ASIGNALO A EL <FS2>. HACIENDO QUE <FS2> TENGA EL VALOR
*            DE ESE COMPONENTE PARA ASI IMPRIMIRLO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <FS> TO <FS2>.
      IF sy-subrc <> 0.
        NEW-LINE.
        EXIT.
      ENDIF.
      WRITE <FS2>.
    ENDDO.
  ENDLOOP.

Workarea VS Field-Symbols

Acoto que en los casos que se pueda emplear los <FS> lo recomiendo plenamente
ya que podemos reducir la velocidad hasta 3 veces de la velocidad original
de un programa.

Les dejo una prueba que hice para comprobarlo.


Mis resultados Fueron.
WORKAREA:      0.42
FIELD-SYMBOLS: 0.14


*&---------------------------------------------------------------------*
*& Report  Z_WA_VS_FS
*&---------------------------------------------------------------------*
*&COMPRUEBA VELOCIDAD ENTRE UN WORKAREA Y UN FIELD SYMBOLS
*&SE PUEDE REDUCIR 3 VECES LA VELOCIDAD DE UN PROGRAMA USANDO <FS>
*&---------------------------------------------------------------------*
REPORT  Z_WA_VS_FS.
*TIPO ESTRUCTURA
TYPESBEGIN OF TY_S_DATA,
CADENA TYPE string,
END OF ty_S_DATA.

*TIPO TABLA
TYPES TY_DATA TYPE TABLE OF TY_S_DATA.

DATA: IT_DATA TYPE  TY_DATA, "TABLA INTERNA
      WA_DATA LIKE LINE OF IT_DATA."WORK AREA

*FIELD-SYMBOLS
FIELD-SYMBOLS: <FS> LIKE LINE OF IT_DATA. "SUPLANTARA EL WORKAREA

DATA: T_INI TYPE i"TIEMPO INICIAL
      T_FIN TYPE i"TIEMPO FINAL
      TIME_WA TYPE p DECIMALS 2"TIEMPO WORKAREA
      TIME_FS TYPE p DECIMALS 2"TIEMPO FIELD-SYMBOLS

DO 2000000 TIMES.
  WA_DATA-CADENA = SY-INDEX.
  APPEND wa_data TO it_data.
ENDDO.

"CALCULANDO PARA EL WORKAREA
GET RUN TIME FIELD T_INI.
LOOP AT IT_DATA INTO WA_DATA.
ENDLOOP.
GET RUN TIME FIELD T_FIN.
TIME_WA = ( T_FIN - T_INI ) / 1000000"TIEMPO EN MILISEGUNDOS


"CALCULANDO PARA EL FIELDSYMBOLS
GET RUN TIME FIELD T_INI.
LOOP AT IT_DATA ASSIGNING <FS>."USO EL ASSIGNING PARA INGRESAR LOS VALORES AL FS
ENDLOOP.
GET RUN TIME FIELD T_FIN.
TIME_FS = ( T_FIN - T_INI ) / 1000000 .

WRITE'TIEMPO DEL FIELD-SYMBOLS', TIME_FS.
SKIP.
WRITE'TIEMPO DEL WORKAREA', TIME_WA.




Programando con FIELD - SYMBOLS

Programa de lectura de una tabla por medio de Field-Symbols, Importante a la hora de reducir tiempo de ejecución en un programa, Normalmente usamos WORKAREA para leer tablas internas. Es importante descatar que con FIELD-SYMBOLS se reducen los tiempos en casi un 50%. Imagínate un programa de tres horas reducido a mas de la mitad.


*&---------------------------------------------------------------------*
*& Report  Field_symbols
*&---------------------------------------------------------------------*
*&Programa sencillo que carga datos de la EKKO una tabla interna,
*&luego la lee e imprime los datos por pantalla.
*&todo esto usando FIELD_SYMBOLS
*&---------------------------------------------------------------------*

REPORT  zfield_symbols.

*DECLARO TABLA INTERNA TIPO EKKO
DATA: it_tab TYPE TABLE OF ekko.

*DECLARO FIELD SYMBOLS PARA OPERAR LA TABLA
*&---------------------------------------------------------------------*
*& <fst> type ANY TABLE, FS PARA LA TABLA (OPTIONAL)
*& <fs2> like LINE OF ti_poheader. FS QUE SUPLANTA AL WA (MEJORA EL RENDIMIENTO)
*&---------------------------------------------------------------------*
FIELD-SYMBOLS: <fst> TYPE ANY TABLE,
               <fs2> LIKE LINE OF it_tab.

START-OF-SELECTION.

*ASIGNO LA TABLA AL FS TIPO TABLA
  ASSIGN it_tab TO <fst>.

*COMPRUEBO LA ASIGNACION DEL FS Y
*HAGO SELECT A LA TABLA EKKO ASIGNANDO
*EL RESULTADO A EL <FST>
  IF <fst> IS ASSIGNED.
    SELECT *
     FROM ekko
     INTO CORRESPONDING FIELDS OF TABLE <fst>.
  ENDIF.
  IF sy-subrc = 0 AND sy-dbcnt > 0.

*LEO LOS REGISTROS DE LA TABLA Y ASIGNO
*LOS VALORES A <FS2> QUE SUPLANTA A LA
*CONOCIDA WA.
    LOOP AT <fst> ASSIGNING <fs2>.
*LISTO LOS REGISTROS EBELN DE LA TABLA EKKO
      WRITE:/ <fs2>-ebeln.
    ENDLOOP.
  ELSE.
    MESSAGE text-001 TYPE 'S'.
  ENDIF.

END-OF-SELECTION.