Thursday, November 30, 2006

Ocultar Selection-Screens


Más de una vez (Yo incluído), me ha preguntado como hacer para ocultar o mostrar un Selection-Screen...Tal como hacen algunas transacciones de SAP...La respuesta es más sencilla de lo que parece -;)

**************************************************************
* Programa: ZDUMMY_TEST. *
* Consultor ABAP: Alvaro Tejada Galindo *
**************************************************************
REPORT ZPRUEBA_ATG.

DATA: FLAG TYPE C VALUE 'X',
COUNTER TYPE I.

SELECTION-SCREEN BEGIN OF BLOCK B1.
SELECTION-SCREEN PUSHBUTTON 1(10) BUTTON USER-COMMAND GOCFG.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-T01.
PARAMETERS:
CARRID TYPE SPFLI-CARRID MODIF ID SC1,
CONNID TYPE SPFLI-CONNID MODIF ID SC1,
CITYFROM TYPE SPFLI-CITYFROM MODIF ID SC1.
SELECTION-SCREEN END OF BLOCK B2.

*&-----------------------------------------------------------&*
*& START-OF-SELECTION &*
*&-----------------------------------------------------------&*
START-OF-SELECTION.

AT SELECTION-SCREEN OUTPUT.

LOOP AT SCREEN.
IF SCREEN-GROUP1 = 'SC1' AND FLAG EQ 'X'.
COUNTER = COUNTER + 1.
WRITE 'Ocultar' TO BUTTON.
SCREEN-ACTIVE = '1'.
MODIFY SCREEN.
IF COUNTER EQ 6.
CLEAR COUNTER.
FLAG = SPACE.
ENDIF.
CONTINUE.
ELSEIF SCREEN-GROUP1 = 'SC1' AND FLAG EQ SPACE.
COUNTER = COUNTER + 1.
WRITE 'Mostrar' TO BUTTON.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.
IF COUNTER EQ 6.
CLEAR COUNTER.
FLAG = 'X'.
ENDIF.
CONTINUE.
ENDIF.
ENDLOOP.




Saludos,

Blag.

Tuesday, November 21, 2006

Cumpleaños de BLAG!!!


Así como lo leen -;) Mañana, 22 de Noviembre es mi cumpleaños -:D

Si quieren saludarme, solo agreguen un comentario a este post -:P

Por lástima, toda la mañana y la tarde las voy a pasar trabajando, pero en la noche comeré torta y tomaré unos traguillos junto con Milly -:)

Saludos,

Blag.

Más de 3,000 visitas en el Blog!


Me parece increíble, pero el blog ha cruzado la línea que separa a las páginas webs comunes, de las páginas con éxito...Y es sobre pasar las 3,000 visitas es algo muy bueno para un blog dedicado a tecnologías.

Como siempre, gracias a todos por el apoyo constante que recibo todos los días -:D

Saludos,

Blag.

Friday, November 17, 2006

Repensando a Web com Rails


Fabio Akita acaba de lanzar su libro Repensando a Web com Rails con el apoyo del genial Piers Harding (Creados de los conectores Ruby, Perl y Python con SAP).

Pueden leer más sobre el libro en el sitio oficial Balance on Rails.

Desde aquí, un fuerte abrazo y muchas felicitaciones para Fabio y Piers! -;)
Saludos,

Blag.

Monday, November 13, 2006

Enviar Logs al SPOOL


Más de un vez no has pedido que nuestros programas, generes Log de proceso o Log de errores...Estos Logs son luego impresos.
Que pasa si el usuario quiere mantener un registro histórico de esos Logs, sin tener que usar una tabla interna? Muy fácil, podemos mandar nuestros Logs de frente al Spool...Donde quedarán almacenados hasta que los impriminan o decidan eliminarlos.

REPORT Z_DUMMY_ATG NO STANDARD PAGE HEADING.

NEW-PAGE PRINT ON NO DIALOG KEEP IN SPOOL 'X'.

WRITE:/ 'Fecha: ', SY-DATUM.
WRITE:/ 'Hora: ', SY-UZEIT.
WRITE:/ 'Mandante: ', SY-MANDT.
WRITE:/ 'Usuario: ', SY-UNAME.
WRITE:/ 'Transacción: ', SY-TCODE.

NEW-PAGE PRINT OFF.

Saludos,

Blag.

Friday, November 10, 2006

Segundo puesto de America Latina en el SDN!


Gracias a las nuevas actualizaciones del SDN, ahora podemos hacer un filtro por países, fechas y áreas dentro del SDN, para conocer el TopTen de contribuciones a la comunidad.
Bueno, cuento con un honroso segundo puesto, superado por Patricio Garcia con unos 200 puntos más que yo...


Espero dentro de poco poder quedar en primer puesto -:D Y de paso quiero, como siempre, invitar a todos a ser parte de esta gran comunidad.

Saludos,

Blag.

Monday, November 06, 2006

Cargar imagenes en Dynpros


Muchas personas se preguntan como pueden hacer esto...Cargar imagenes para que sus dynpros se vean más atractivos...O quizás simplemente para impresionar a los clientes...Utilizando ABAP Objects, esto es más fácil de lo que parece...Además, podemos cargar cualquier gráfico que hayamos subido al R/3 vía la transacción SE78.


Veamos el código (Para esto necesitamos crear un Custom Control en un Dynpro, y llamarlo PICTURE).

**************************************************************
* Programa: ZDUMMY_TEST. *
* Consultor ABAP: Alvaro Tejada Galindo *
**************************************************************
REPORT ZPRUEBA_ATG.

TYPES: PICT_LINE(256) TYPE C.
DATA: PICT_TAB TYPE TABLE OF PICT_LINE,
URL(255) TYPE C.

DATA: CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
PICTURE TYPE REF TO CL_GUI_PICTURE.

DATA: L_BYTECOUNT TYPE I,
L_TDBTYPE LIKE STXBITMAPS-TDBTYPE,
L_CONTENT TYPE STANDARD TABLE OF BAPICONTEN
INITIAL SIZE 0.

DATA: GRAPHIC_SIZE TYPE I.

DATA: BEGIN OF GRAPHIC_TABLE OCCURS 0,
LINE(255) TYPE X,
END OF GRAPHIC_TABLE.

*&-----------------------------------------------------------&*
*& START-OF-SELECTION &*
*&-----------------------------------------------------------&*
START-OF-SELECTION.
CALL SCREEN 100.

*&-----------------------------------------------------------*
*& Module STATUS_0100 OUTPUT *
*&-----------------------------------------------------------*
* PBO *
*------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
PERFORM LOAD_IMAGE.
ENDMODULE. " STATUS_0100 OUTPUT

*------------------------------------------------------------*
* FORM LOAD_IMAGE *
*------------------------------------------------------------*
* Cargamos la imagen *
*------------------------------------------------------------*
FORM LOAD_IMAGE.

CREATE OBJECT: CONTAINER1 EXPORTING CONTAINER_NAME = 'PICTURE',
PICTURE EXPORTING PARENT = CONTAINER1.

CALL FUNCTION 'SAPSCRIPT_GET_GRAPHIC_BDS'
EXPORTING
I_OBJECT = 'GRAPHICS'
I_NAME = 'ENJOY'
I_ID = 'BMAP'
I_BTYPE = 'BCOL'
IMPORTING
E_BYTECOUNT = L_BYTECOUNT
TABLES
CONTENT = L_CONTENT
EXCEPTIONS
NOT_FOUND = 1
BDS_GET_FAILED = 2
BDS_NO_CONTENT = 3
OTHERS = 4.

CALL FUNCTION 'SAPSCRIPT_CONVERT_BITMAP'
EXPORTING
OLD_FORMAT = 'BDS'
NEW_FORMAT = 'BMP'
BITMAP_FILE_BYTECOUNT_IN = L_BYTECOUNT
IMPORTING
BITMAP_FILE_BYTECOUNT = GRAPHIC_SIZE
TABLES
BDS_BITMAP_FILE = L_CONTENT
BITMAP_FILE = GRAPHIC_TABLE
EXCEPTIONS
OTHERS = 1.

CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
TYPE = 'IMAGE'
SUBTYPE = 'BMP'
TABLES
DATA = GRAPHIC_TABLE
CHANGING
URL = URL.


CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL EXPORTING URL = URL.
CALL METHOD PICTURE->SET_DISPLAY_MODE
EXPORTING DISPLAY_MODE = PICTURE->DISPLAY_MODE_FIT_CENTER.

ENDFORM.

Saludos,

Blag.

Problemas con el listado de archivos...


Seguramente, alguna vez habrán utilizado la función TMP_GUI_DIRECTORY_LIST_FILES para listar todos los archivos que hay en una carpeta, y se habrán dado cuenta de que la función no toma el cuenta el filtro que utilicemos...
Aquí les dejo un pequeño programa para resolver este problema de una manera muy simple...

REPORT Z_DUMMY_ATG_3 NO STANDARD PAGE HEADING.

DATA: FILTER(3) TYPE C,
TEMP_EXT TYPE STRING,
LONG TYPE I,
W_TABIX TYPE SY-TABIX,
DIR(200) TYPE C.

DATA: T_FILE_TABLE TYPE STANDARD TABLE OF SDOKPATH
WITH HEADER LINE,
T_DIR_TABLE TYPE STANDARD TABLE OF SDOKPATH
WITH HEADER LINE.

FILTER = 'txt'.
DIR = 'C:\'.

CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
EXPORTING
DIRECTORY = DIR
TABLES
FILE_TABLE = T_FILE_TABLE
DIR_TABLE = T_DIR_TABLE
EXCEPTIONS
CNTL_ERROR = 1
OTHERS = 2.

LOOP AT T_FILE_TABLE.
LONG = STRLEN( T_FILE_TABLE-PATHNAME ).
LONG = LONG - 3.
TEMP_EXT = T_FILE_TABLE-PATHNAME+LONG(3).
IF TEMP_EXT NE FILTER.
W_TABIX = SY-TABIX.
DELETE T_FILE_TABLE INDEX SY-TABIX.
ELSE.
WRITE:/ T_FILE_TABLE-PATHNAME.
ENDIF.
ENDLOOP.

Saludos,

Blag.

Thursday, November 02, 2006

FOR ALL ENTRIES vs. INNER JOIN


Mucha gente se pregunta...Que es más rápido de ejecutar...Un FOR ALL ENTRIES o un INNER JOIN? Pues bueno, para que queden dudas, he hecho un pequeño programa para medir el tiempo de ejecución entre dos tablas BKPF y BSAK.

REPORT Z_DUMMY_ATG NO STANDARD PAGE HEADING.

TABLES: BKPF, BSEG.

DATA: T_BKPF TYPE STANDARD TABLE OF BKPF
WITH HEADER LINE,
T_BSAK TYPE STANDARD TABLE OF BSAK
WITH HEADER LINE.

DATA: RT_STR TYPE I,
RT_END TYPE I,
RUN_TIME1 TYPE P DECIMALS 2,
RUN_TIME2 TYPE P DECIMALS 2.

SELECT *
INTO TABLE T_BKPF
FROM BKPF.

IF NOT T_BKPF[] IS INITIAL.
GET RUN TIME FIELD RT_STR.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE T_BSAK
FROM BSAK
FOR ALL ENTRIES IN T_BKPF
WHERE BELNR EQ T_BKPF-BELNR.
GET RUN TIME FIELD RT_END.
RUN_TIME1 = ( RT_END - RT_STR ) / 1000000 .
ENDIF.

WRITE: 'Runtime para FOR ALL ENTRIES', RUN_TIME1.

CLEAR: T_BKPF,T_BSAK.
REFRESH: T_BKPF,T_BSAK.

GET RUN TIME FIELD RT_STR.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE T_BSAK
FROM ( BKPF INNER JOIN BSAK
ON BKPF~BELNR = BSAK~BELNR ).

GET RUN TIME FIELD RT_END.
RUN_TIME2 = ( RT_END - RT_STR ) / 1000000 .

WRITE:/ 'Runtime para JOIN', RUN_TIME2.

Analicemos los resultados...

Prueba 1:
---------
Runtime para FOR ALL ENTRIES 0.12
Runtime para JOIN 0.02

Prueba 2:
---------
Runtime para FOR ALL ENTRIES 0.10
Runtime para JOIN 0.01

Prueba 3:
---------
Runtime para FOR ALL ENTRIES 0.11
Runtime para JOIN 0.02

Claramente, el INNER JOIN supera al FOR ALL ENTRIES...Y por mucho...
Saludos,

Blag.

Wednesday, November 01, 2006

Más de 2,000 visitas en el Blog!

Me alegra decir que en tan poco tiempo, he superado las 2,000 visitas!!! -:D Casi dos semanas después de haber pasado las 1,000 visitas.

Gracias a todos por el apoyo -;) Y espero poder seguir escribiendo posts que sean útiles para alguien -:)

Saludos,

Blag.