Archive for Octubre, 2006

Video Entrevista con Andre Labahn

Gracias a Björn Schotte podemos ver una excelente video entrevista con mi amigo Andre Labahn. Pueden verla aquí Video Interview with Andre Labahn.

Si les gustan los Lenguajes Script y SAP no pueden perderse esta entrevista -;)

Saludos,

Blag.

Comentarios

ALV List Display dinámico!

Comentarios

Tiempo de ejecución en ABAP

Muchas veces, queremos saber si un SELECT va a ejecutar más rápido utilizando SELECT o INNER JOIN…O simplemente queremos saber que condiciones en el WHRE nos va a ayudar a mejorar el performance…Con este código podemos hacer pruebas de RunTime y determinar la mejor opción.

REPORT Z_TEST_RUNTIME.

DATA: T1 TYPE I,
T2 TYPE I,
T TYPE P DECIMALS 2,
N TYPE I VALUE 1000.

DATA: NUM TYPE I.

NUM = 10.
T = 0.

DO N TIMES.
GET RUN TIME FIELD T1.
*—–Inicio código a validar—–*
WHILE NUM GT 0.
WRITE:/ NUM.
NUM = NUM - 1.
ENDWHILE.
*—–Fín código a validar—–*
GET RUN TIME FIELD T2.
T2 = T2 - T1.
T = T + T2 / N.
ENDDO.

SKIP 1.
WRITE:/ ‘Tiempo de Ejecución: ‘, T, ‘microsegundos’.

El resultado en mi sistema…

10
9
8
7
6
5
4
3
2
1

Tiempo de Ejecución: 0.17 microsegundos

Saludos,

Blag.

Comentarios

Reloj de Progreso en ABAP

Si bien este es un código muy simple, mucha gente nunca lo ha utilizado. Supongamos que tienen un programa que ejecuta muchos procesos, y por ende…Es un poco lento.
Definitivamente, al cliente no le va a gustar esperar a que nuestro programa termine de hacer lo que necesita hacer…Por lo tanto, poner un reloj de progreso es una excelente manera de mostrar en que porcentaje de ejecución va nuestro programa.
Veamos el código…

REPORT Z_PROGRESS_CLOCK.

DATA: A LIKE SY-UCOMM.

DO 100 TIMES.
DO 300 TIMES.
GET TIME.
ENDDO.

A(3) = SY-INDEX.A+3 = ‘%’.

CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
EXPORTING
PERCENTAGE = SY-INDEX
TEXT = A.
ENDDO.

Saludos,

Blag.

Comentarios

Backup de Programas en ABAP

Este pequeño programa, nos permite grabar el código fuente, includes y elementos de texto de cualquier programa -:) Es bastante simple, solamente nos pide el nombre del programa y una ruta donde guardarlo -;)

**************************************************************
* Programa : Z_PROGRAMS_DOWNLOAD. *
* Módulo : BC - Basis. *
* Consultor ABAP : Alvaro Tejada Galindo. *
* February 14, 2006 12:33:22 PM *
**************************************************************

REPORT Z_DUMMY_ATG NO STANDARD PAGE HEADING.

*=============================================================
* VARIABLES
*=============================================================
DATA: FULLNAME(30) TYPE C,
ONE LIKE PCFILE-DRIVE,
TWO LIKE PCFILE-PATH,
FILEPATH(128) TYPE C.

DATA: APP_NAME TYPE STRING,
DDTEXT_NAME TYPE STRING,
DUMMY TYPE STRING,
INCLUDE_NAME TYPE STRING.

*=============================================================
* TABLAS INTERNAS
*=============================================================
DATA: BEGIN OF SOURCE_TABLE OCCURS 0,
LINEA(150) TYPE C.
DATA: END OF SOURCE_TABLE.

DATA: BEGIN OF INCLUDE_TABLE OCCURS 0,
LINEA(150) TYPE C.
DATA: END OF INCLUDE_TABLE.

DATA: BEGIN OF DYNPRO_TABLE OCCURS 0,
LINEA(250) TYPE C.
DATA: END OF DYNPRO_TABLE.

DATA: BEGIN OF T_TRDIR OCCURS 0,
NAME LIKE TRDIR-NAME,
END OF T_TRDIR.

DATA: BEGIN OF T_LOG OCCURS 0,
ERROR TYPE STRING,
END OF T_LOG.

DATA: DATA_DDTEXT TYPE STANDARD TABLE OF TEXTPOOL
WITH HEADER LINE.

*=============================================================
* SELECTION-SCREEN
*=============================================================
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
PRGNAME LIKE TRDIR-NAME,
LISTNAME LIKE RLGRAP-FILENAME.
SELECTION-SCREEN END OF BLOCK TEST.

*=============================================================
* AT SELECTION-SCREEN
*=============================================================
AT SELECTION-SCREEN ON VALUE-REQUEST FOR LISTNAME.
PERFORM GET_FILENAME CHANGING LISTNAME.

*=============================================================
* START-OF-SELECTION
*=============================================================
START-OF-SELECTION.
PERFORM LOAD_DATA.

IF NOT T_LOG[] IS INITIAL.
WRITE: ‘Se encontraron los siguientes errores: ‘.
ENDIF.

ULINE.
SKIP 1.

LOOP AT T_LOG.
WRITE:/ T_LOG-ERROR.
ENDLOOP.

*———————————————————–*
* FORM GET_FILENAME *
*———————————————————–*
FORM GET_FILENAME CHANGING LISTNAME.

CALL FUNCTION ‘WS_FILENAME_GET’
EXPORTING
DEF_FILENAME = LISTNAME
DEF_PATH = ‘C:\downloads\lista’
MASK = ‘,*.*,*.*. ‘
MODE = ‘S’
TITLE = ‘Guardar en’
IMPORTING
FILENAME = LISTNAME
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
ENDFORM. “GET_FILENAME

*———————————————————–*
* FORM LOAD_DATA *
*———————————————————–*
FORM LOAD_DATA.
DATA: W_FILE LIKE PCFILE-PATH.
W_FILE = LISTNAME.
CALL FUNCTION ‘PC_SPLIT_COMPLETE_FILENAME’
EXPORTING
COMPLETE_FILENAME = W_FILE
IMPORTING
DRIVE = ONE
PATH = TWO
EXCEPTIONS
INVALID_DRIVE = 1
INVALID_EXTENSION = 2
INVALID_NAME = 3
INVALID_PATH = 4
OTHERS = 5.
CONCATENATE ONE ‘:’ TWO INTO FILEPATH.

CONCATENATE PRGNAME ‘%’ INTO FULLNAME.

SELECT NAME
INTO TABLE T_TRDIR
FROM TRDIR
WHERE NAME LIKE FULLNAME.

IF SY-SUBRC EQ 0.
PERFORM FILL_LIST.

PERFORM DOWNLOAD_APPS.
ENDIF.

ENDFORM. “LOAD_DATA

*———————————————————–*
* FORM FILL_LIST *
*———————————————————–*
FORM FILL_LIST.
CALL FUNCTION ‘WS_DOWNLOAD’
EXPORTING
FILENAME = FILEPATH
FILETYPE = ‘ASC’
TABLES
DATA_TAB = T_TRDIR
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 02
INVALID_FILESIZE = 03
INVALID_TABLE_WIDTH = 04
INVALID_TYPE = 05
NO_BATCH = 06
UNKNOWN_ERROR = 07.
ENDFORM. “FILL_LIST

*———————————————————–*
* FORM FILL_LIST *
*———————————————————–*
FORM FILL_LIST_INCLUDE.

CONCATENATE FILEPATH ‘Includes.txt’ INTO LISTNAME.

CALL FUNCTION ‘WS_DOWNLOAD’
EXPORTING
FILENAME = LISTNAME
FILETYPE = ‘ASC’
MODE = ‘A’
TABLES
DATA_TAB = INCLUDE_TABLE
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 02
INVALID_FILESIZE = 03
INVALID_TABLE_WIDTH = 04
INVALID_TYPE = 05
NO_BATCH = 06
UNKNOWN_ERROR = 07.
ENDFORM. “FILL_LIST_INCLUDE

*&———————————————————-*
*& Form DOWNLOAD_APPS *
*&———————————————————-*
FORM DOWNLOAD_APPS.

LOOP AT T_TRDIR.
CLEAR: APP_NAME, INCLUDE_NAME.

REFRESH: SOURCE_TABLE.
CLEAR: SOURCE_TABLE.

READ REPORT T_TRDIR-NAME INTO SOURCE_TABLE.
READ TEXTPOOL T_TRDIR-NAME INTO DATA_DDTEXT LANGUAGE SY-LANGU.

CONCATENATE FILEPATH T_TRDIR-NAME ‘.abp’ INTO APP_NAME.
CONCATENATE FILEPATH T_TRDIR-NAME ‘_DDTEXT.txt’
INTO DDTEXT_NAME.

PERFORM DOWNLOAD_FORM USING APP_NAME.
PERFORM DOWNLOAD_DDTEXT USING DDTEXT_NAME.

LOOP AT SOURCE_TABLE.
SEARCH SOURCE_TABLE-LINEA FOR ‘INCLUDE’.
IF SY-SUBRC EQ 0.

IF SOURCE_TABLE-LINEA+0(8) NE ‘INCLUDE’.
CONTINUE.
ENDIF.

CLEAR INCLUDE_NAME.

SPLIT SOURCE_TABLE-LINEA AT SPACE
INTO DUMMY INCLUDE_NAME.
SPLIT INCLUDE_NAME AT ‘.’
INTO INCLUDE_NAME DUMMY.

REFRESH: SOURCE_TABLE.
CLEAR: SOURCE_TABLE.

MOVE INCLUDE_NAME TO INCLUDE_TABLE.
READ TABLE INCLUDE_TABLE WITH KEY LINEA = INCLUDE_TABLE.
IF SY-SUBRC NE 0.
APPEND INCLUDE_TABLE.
ENDIF.

READ REPORT INCLUDE_TABLE INTO SOURCE_TABLE.

IF SY-SUBRC EQ 0.
CONCATENATE FILEPATH INCLUDE_NAME ‘.abp’
INTO INCLUDE_NAME.
PERFORM DOWNLOAD_FORM USING INCLUDE_NAME.
PERFORM FILL_LIST_INCLUDE.
ENDIF.

ENDIF.
ENDLOOP.

ENDLOOP.

ENDFORM. “DOWNLOAD_APPS

*———————————————————–*
* FORM DOWNLOAD_FORM *
*———————————————————–*
FORM DOWNLOAD_FORM USING APP_NAME.

CALL FUNCTION ‘GUI_DOWNLOAD’
EXPORTING
FILENAME = APP_NAME
FILETYPE = ‘ASC’
TABLES
DATA_TAB = SOURCE_TABLE
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
FILE_NOT_FOUND = 19
OTHERS = 22.

IF SY-SUBRC NE 0.
T_LOG-ERROR = APP_NAME.
APPEND T_LOG.
ENDIF.
ENDFORM. “DOWNLOAD_FORM

*———————————————————–*
* FORM DOWNLOAD_DDTEXT *
*———————————————————–*
FORM DOWNLOAD_DDTEXT USING DDTEXT_NAME.

CALL FUNCTION ‘GUI_DOWNLOAD’
EXPORTING
FILENAME = DDTEXT_NAME
FILETYPE = ‘ASC’
TABLES
DATA_TAB = DATA_DDTEXT
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
FILE_NOT_FOUND = 19
OTHERS = 22.

IF SY-SUBRC NE 0.
T_LOG-ERROR = DDTEXT_NAME.
APPEND T_LOG.
ENDIF.
ENDFORM. “DOWNLOAD_DDTEXT

Saludos,

Blag.

Comentarios

Cantidad de ocurrencias en un texto

Alguna vez han necesitado saber cuantas veces se repite un caracter o un texto dentro de otros texto? Por ejemplo, cuantas veces se repite la letra A en Alvaro Tejada Galindo…Pues como ya he dicho en posts anteriores, el ABAP no es precisamente bueno para este tipo de manejo de Strings, así que este pequeño código, puede ser de utilidad.

*&———————————————————–*
*& Form OCURRENCIAS_TEXTO *
*&———————————————————–*
* Encuentra la cantidad de occurencias de un texto *
*————————————————————*
FORM OCURRENCIA_TEXTO USING L_TEXTO CHAR_OCCUR
CHANGING L_OCURRENCIAS.

DATA: L_TEXT TYPE STRING.
L_TEXT = L_TEXTO.

FLAG = ‘X’.

LONG = STRLEN( L_TEXT ).

WHILE FLAG EQ ‘X’.
SEARCH L_TEXT FOR CHAR_OCCUR.
IF SY-SUBRC NE 0.
FLAG = ”.
ELSE.
COUNTER = COUNTER + 1.
POS = SY-FDPOS + 1.
NEW_POS = LONG - POS.
LONG = NEW_POS.
L_TEXT = L_TEXT+POS(NEW_POS).
ENDIF.
ENDWHILE.

L_OCURRENCIAS = COUNTER.

ENDFORM. “OCURRENCIA_TEXTO

Saludos,

Blag.

Comentarios

Decimal a Romanos en ABAP

Esto de las conversiones, me ha gustado -:) Así que después de mi post de “Decimal a Romanos en Ruby”, decidí hacer la misma implementación en ABAP.

REPORT Z_DECIMAL_TO_ROMAN.

DATA: BEGIN OF T_ROMAN_TABLE OCCURS 0,
KEY TYPE I,
VALUE TYPE STRING,
END OF T_ROMAN_TABLE.

DATA: RESULTADO TYPE STRING.

SELECTION-SCREEN BEGIN OF BLOCK TEST.
PARAMETERS:
DEC_NUM TYPE I.
SELECTION-SCREEN END OF BLOCK TEST.

T_ROMAN_TABLE-KEY = 1000.
T_ROMAN_TABLE-VALUE = ‘M’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 900.
T_ROMAN_TABLE-VALUE = ‘CM’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 500.
T_ROMAN_TABLE-VALUE = ‘D’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 400.
T_ROMAN_TABLE-VALUE = ‘CD’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 100.
T_ROMAN_TABLE-VALUE = ‘C’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 90.
T_ROMAN_TABLE-VALUE = ‘XC’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 50.
T_ROMAN_TABLE-VALUE = ‘L’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 40.
T_ROMAN_TABLE-VALUE = ‘XL’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 10.
T_ROMAN_TABLE-VALUE = ‘X’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 9.
T_ROMAN_TABLE-VALUE = ‘IX’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 5.
T_ROMAN_TABLE-VALUE = ‘V’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 4.
T_ROMAN_TABLE-VALUE = ‘IV’.
APPEND T_ROMAN_TABLE.
T_ROMAN_TABLE-KEY = 1.
T_ROMAN_TABLE-VALUE = ‘I’.
APPEND T_ROMAN_TABLE.

WHILE DEC_NUM GT 0.
LOOP AT T_ROMAN_TABLE.
IF DEC_NUM GE T_ROMAN_TABLE-KEY.
CONCATENATE RESULTADO T_ROMAN_TABLE-VALUE INTO RESULTADO.
DEC_NUM = DEC_NUM - T_ROMAN_TABLE-KEY.
EXIT.
ENDIF.
ENDLOOP.
ENDWHILE.

WRITE:/ ‘El número en Romanos es: ‘, RESULTADO.

Saludos,

Blag.

Comentarios

Textos en Infotipos

Si bien leer los textos de los infotipos, es bastante sencillo, la mayoría de personas no saben como hacerlo, y se pasan horas o días buscando una solución…Este código aliviará mucho su trabajo.

REPORT Z_ATG_DUMMY.

DATA: BEGIN OF PSKEY OCCURS 1.
INCLUDE STRUCTURE PSKEY.
DATA: END OF PSKEY.

DATA: INFOTYPE_TEXT LIKE HRWPC_S_INFOTYPE_TEXT
OCCURS 0 WITH HEADER LINE.

PSKEY-PERNR = ‘00000003′.
PSKEY-INFTY = ‘0001′.
PSKEY-BEGDA = ‘20050201′.
PSKEY-ENDDA = ‘99991231′.

CALL FUNCTION ‘HRWPC_RFC_IT0XXX_TEXT_GET’
EXPORTING
PSKEY = PSKEY
TABLES
INFOTYPE_TEXT = INFOTYPE_TEXT.

LOOP AT INFOTYPE_TEXT.
WRITE:/ INFOTYPE_TEXT-TEXTLINE.
ENDLOOP.

Saludos,

Blag.

Comentarios (1)

Crear PDF en ABAP

Esto si es algo que puede serles muy útil…Por lo menos a mi me ha servido de mucho -:)
Supongamos que tienen que hacer un formulario SapScript y tienen que enviarlo por correo…¿Cómo lo hacen? Muy simple -;) Lo convierten en PDF.
Esta función, pide solamente una ruta donde generar el PDF, y toma los datos de la última orden de Spool que hayamos creado.

*”———————————————————-
*”*”Interfase local
*” IMPORTING
*” REFERENCE(FILENAME) TYPE STRING
*”———————————————————-

SELECT RQIDENT
INTO (T_TSP01-RQIDENT)
FROM TSP01
WHERE RQOWNER EQ SY-UNAME
AND RQCLIENT EQ SY-MANDT.
APPEND T_TSP01.
ENDSELECT.

SORT T_TSP01 DESCENDING.

CALL FUNCTION ‘CONVERT_OTFSPOOLJOB_2_PDF’
EXPORTING
SRC_SPOOLID = T_TSP01-RQIDENT
NO_DIALOG = ”
IMPORTING
PDF_BYTECOUNT = NUMBYTES
PDF_SPOOLID = PDFSPOOLID
BTC_JOBNAME = JOBNAME
BTC_JOBCOUNT = JOBCOUNT
TABLES
PDF = PDF
EXCEPTIONS
ERR_NO_OTF_SPOOLJOB = 1
ERR_NO_SPOOLJOB = 2
ERR_NO_PERMISSION = 3
ERR_CONV_NOT_POSSIBLE = 4
ERR_BAD_DSTDEVICE = 5
USER_CANCELLED = 6
ERR_SPOOLERROR = 7
ERR_TEMSEERROR = 8
ERR_BTCJOB_OPEN_FAILED = 9
ERR_BTCJOB_SUBMIT_FAILED = 10
ERR_BTCJOB_CLOSE_FAILED = 11
OTHERS = 12.

IF SY-SUBRC EQ 0.

CALL FUNCTION ‘GUI_DOWNLOAD’
EXPORTING
BIN_FILESIZE = NUMBYTES
FILENAME = FILENAME
FILETYPE = ‘BIN’
TABLES
DATA_TAB = PDF
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6.

IF SY-SUBRC EQ 0.
DELETE FROM TSP01 WHERE RQIDENT EQ T_TSP01-RQIDENT.
ENDIF.

ENDIF.

ENDFUNCTION.

Saludos,

Blag.

Comentarios

Decimal a Binario en ABAP

Continuando con los programas sin mucho sentido…Que les parece un Decimal a Binario en ABAP…Dudo mucho que alguna vez lo necesiten, pero bueno, un pequeño código nunca está de más -;)

REPORT ZDECIMAL_A_BINARIO.

DATA: SUMA TYPE I,
EXPONENTE TYPE I,
DIGITO TYPE I,
SUMA_TEXT(50) TYPE C.

SELECTION-SCREEN BEGIN OF BLOCK DEC_TO_BIN WITH FRAME.
PARAMETERS:
P_NUMERO TYPE I.
SELECTION-SCREEN END OF BLOCK DEC_TO_BIN.

START-OF-SELECTION.

SUMA = 0.
EXPONENTE = 1.

CATCH SYSTEM-EXCEPTIONS ARITHMETIC_ERRORS = 5.
WHILE P_NUMERO GT 0.
DIGITO = P_NUMERO MOD 2.
P_NUMERO = P_NUMERO DIV 2.
SUMA = SUMA + DIGITO * EXPONENTE.
EXPONENTE = EXPONENTE * 10.
ENDWHILE.
ENDCATCH.

IF SY-SUBRC = 5.
WRITE / ‘Número demasiado grande!’.
ELSE.
SUMA_TEXT = SUMA.
REPLACE ‘.’ WITH SPACE INTO SUMA_TEXT.
REPLACE ‘,’ WITH SPACE INTO SUMA_TEXT.
CONDENSE SUMA_TEXT NO-GAPS.

WRITE: ‘El numero binario es: ‘, SUMA_TEXT.
ENDIF.

Saludos,

Blag.

Comentarios

Cerrar
E-mail It