Archive for Octubre, 2006

TRY-CATCH en ABAP

Como mucho sabes, el TRY-CATCH es muy utilizado en Java, para el manejo de errores y excepciones.
Lo que quizás no sabían, es que también podemos utilizarlo en ABAP. Gracias a esto, podemos evitarnos muchos molestos Short Dumps -;)
Veamos un ejemplo sencillo…

DATA: RESULT TYPE P DECIMALS 3,
NUMBER TYPE I VALUE 11.

CATCH SYSTEM-EXCEPTIONS ARITHMETIC_ERRORS = 5.
DO.
NUMBER = NUMBER - 1.
RESULT = 1 / NUMBER.
WRITE: / NUMBER, RESULT.
ENDDO.
ENDCATCH.

SKIP.

IF SY-SUBRC = 5.
WRITE / ‘Division por cero!’.
ENDIF.

El resultado de ejecutar este código sería…

10 0.100
9 0.111
8 0.125
7 0.143
6 0.167
5 0.200
4 0.250
3 0.333
2 0.500
1 1.000

Division por cero!

Como pueden ver…Obtenemos un mensaje, en vez del Short Dump correspondiente -:)

Saludos,

Blag.

Comentarios

Restar horas a una fecha???

Muchas veces, en los proyectos, nos van a pedir restar una cantidad de días, meses o años a una determinada fecha…Pero alguna vez les han pedido que resten horas a una fecha???
Bueno, si alguna vez se ven en ese problema, esta pequeña función puede ayudarles -;)

FUNCTION Z_CALCULATE_DATE_FROM_TIME.
*”——————————————————-
*”*”Interfase local
*” IMPORTING
*” REFERENCE(DATE) TYPE D
*” REFERENCE(TIME) TYPE T
*” REFERENCE(HOURS) TYPE T
*” REFERENCE(OPERATION) TYPE CHAR1
*” EXPORTING
*” REFERENCE(NEW_DATE) TYPE D
*” REFERENCE(NEW_TIME) TYPE T
*” EXCEPTIONS
*” FORBIDDEN_OPERATION
*”——————————————————-

DATA: DAYS TYPE I,
MONTHS LIKE T5A4A-DLYMO,
YEARS LIKE T5A4A-DLYYR.

IF OPERATION EQ ‘S’.
NEW_TIME = TIME + HOURS.

IF TIME LE ‘240000′ AND NEW_TIME LT TIME.
CALL FUNCTION ‘RP_CALC_DATE_IN_INTERVAL’
EXPORTING
DATE = DATE
DAYS = ‘01′
MONTHS = MONTHS
SIGNUM = ‘+’
YEARS = YEARS
IMPORTING
CALC_DATE = NEW_DATE.
ELSE.
NEW_DATE = DATE.
ENDIF.

ELSEIF OPERATION EQ ‘R’.
NEW_TIME = TIME - HOURS.

IF TIME GE ‘000000′ AND NEW_TIME GT TIME.
CALL FUNCTION ‘RP_CALC_DATE_IN_INTERVAL’
EXPORTING
DATE = DATE
DAYS = ‘01′
MONTHS = MONTHS
SIGNUM = ‘-’
YEARS = YEARS
IMPORTING
CALC_DATE = NEW_DATE.
ELSE.
NEW_DATE = DATE.
ENDIF.

ELSE.
RAISE FORBIDDEN_OPERATION.
ENDIF.

ENDFUNCTION.

Saludos,

Blag.

Comentarios

Archivos planos y ABAP

Muchas veces tenemos que hacer programas de integración, en los cuales debemos descargar muchas tablas en archivos planos. Lo que se hacía antes era crear un GUI_DOWNLOAD por cada archivo…Pero que pasa si tenemos que crear 5,6 o 7 archivos planos? Pues muy simple, creamos una tabla interna dinámica y un solo GUI_DOWNLOAD que descargue todas las tablas. Aquí está el código -;)

*————————————————————*
* DECLARACION DE VARIABLES *
*————————————————————*
DATA: DESCR_STRUCT_REF TYPE REF TO CL_ABAP_STRUCTDESCR,
DATAREF TYPE REF TO DATA,
WA_FCAT TYPE LVC_S_FCAT,
IT_FIELDCATALOG TYPE LVC_T_FCAT,
TABNAME TYPE DD02L-TABNAME,
NEW_LINE TYPE REF TO DATA,
FILE_TAB TYPE STRING,
LONG TYPE I.

*&———————————————————–*
*& Form CREATE_TABLE *
*&———————————————————–*
* Creamos una tabla interna dinámica *
*————————————————————*
FORM CREATE_TABLE USING MY_TAB.

CREATE DATA DATAREF TYPE (MY_TAB).

ASSIGN DATAREF->* TO <FS>.

DESCR_STRUCT_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( <FS> ).

LOOP AT DESCR_STRUCT_REF->COMPONENTS ASSIGNING <COMPONENT>.
WA_FCAT-FIELDNAME = <COMPONENT>-NAME.
WA_FCAT-REF_TABLE = MY_TAB.
WA_FCAT-REF_FIELD = <COMPONENT>-NAME.
APPEND WA_FCAT TO IT_FIELDCATALOG.
ENDLOOP.

CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IT_FIELDCATALOG
IMPORTING
EP_TABLE = DATAREF
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.

ASSIGN DATAREF->* TO <DYN_TABLE>.

CREATE DATA NEW_LINE LIKE LINE OF <DYN_TABLE>.
ASSIGN NEW_LINE->* TO <DYN_WA>.

ENDFORM. “CREATE_TABLE

*&———————————————————–*
*& Form DESCARGAR_TABLA *
*&———————————————————–*
* Descargamos la tabla interna a un archivo plano *
*————————————————————*
FORM DESCARGAR_TABLA TABLES P_TABLA.

LOOP AT P_TABLA ASSIGNING <LINE>.
G_LINES = <LINE>.
ASSIGN <DYN_WA> TO <TABLE>.
<TABLE> = G_LINES.
APPEND <DYN_WA> TO <DYN_TABLE>.
ENDLOOP.

FILE_TAB = P_FILE.

CALL FUNCTION ‘GUI_DOWNLOAD’
EXPORTING
FILENAME = FILE_TAB
FILETYPE = ‘ASC’
IMPORTING
FILELENGTH = LONG
TABLES
DATA_TAB = <DYN_TABLE>
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.

ENDFORM. “DESCARGAR_TABLA

La forma de utilizar el código sería la siguiente:

DATA: T_MARA TYPE STANDARD TABLE OF MARA
      WITH HEADER LINE.
 
      TABNAME = 'T_MARA'.
      PERFORM CREATE_TABLE USING TABNAME.
      PERFORM DESCARGAR_TABLA TABLES T_MARA.
 

Saludos,

Blag.

Comentarios

Cerrar
E-mail It