Tuesday, February 19, 2008

SDN Blog Browser


Publiqué este blog SDN Blog Browser en el SDN y ha tenido bastante acogida, así que como no podía ser de otra forma...Lo posteo aquí también -;)

Basicamente, tenemos una carpeta llamada SDN_Blogs en donde tenermos carpetas con los nombre de los bloggers del SDN...Y dentro de esas carpetas tenemos...Blog! Que más ibamos a tener -:P

Simplemente, leemos las carpetas, creamos un ALV Tree para mostrar a los autores y sus blogs y al presionar en cada blog, podemos visualizarlo en un control HTML.




*&----------------------------------------------------------------*
*& Report ZBLOG_BROWSER *
*&----------------------------------------------------------------*
REPORT ZBLOG_BROWSER.

*&----------------------------------------------------------------*
*& CLASS LCL_EVENT_RECEIVER DEFINITION *
*&----------------------------------------------------------------*
CLASS cl_tree_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS: handle_double_click
FOR EVENT node_double_click OF cl_gui_alv_tree
IMPORTING node_key.
ENDCLASS.

*&----------------------------------------------------------------*
*& CLASS lcl_event_receiver IMPLEMENTATION *
*&----------------------------------------------------------------*
CLASS cl_tree_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
CHECK NOT node_key IS INITIAL.
PERFORM cargar_browser USING node_key.
ENDMETHOD.
ENDCLASS.

*&----------------------------------------------------------------*
*& TYPES *
*&----------------------------------------------------------------*
TYPES: BEGIN OF ty_authors,
name(255) TYPE c,
END OF ty_authors.

TYPES: BEGIN OF ty_weblogs,
name(30) TYPE c,
blog(255) TYPE c,
END OF ty_weblogs.

*&----------------------------------------------------------------*
*& DATA *
*&----------------------------------------------------------------*
DATA: tree_event_receiver TYPE REF TO cl_tree_event_receiver,
lt_events TYPE cntl_simple_events,
l_event TYPE cntl_simple_event,
edurl(2048),
directory(100) TYPE c,
author(100) TYPE c.

DATA: file_table TYPE STANDARD TABLE OF sdokpath,
dir_table TYPE STANDARD TABLE OF sdokpath,
t_authors TYPE STANDARD TABLE OF ty_authors,
t_weblogs TYPE STANDARD TABLE OF ty_weblogs,
t_tree TYPE STANDARD TABLE OF ty_weblogs with header line.

DATA: html_control TYPE REF TO cl_gui_html_viewer,
g_alv_tree TYPE REF TO cl_gui_alv_tree,
g_custom_tree_container TYPE REF TO cl_gui_custom_container,
g_custom_html_container TYPE REF TO cl_gui_custom_container,
gs_fieldcat TYPE lvc_s_fcat,
gt_fieldcat_tree TYPE lvc_t_fcat,
l_hierarchy_header TYPE treev_hhdr,
it_node_key TYPE lvc_t_nkey.

FIELD-SYMBOLS: <fs_file_table> LIKE LINE OF file_table,
<fs_dir_table> LIKE LINE OF dir_table,
<fs_authors> LIKE LINE OF t_authors,
<fs_blogs> LIKE LINE OF t_weblogs.

*&----------------------------------------------------------------*
*& START-OF-SELECTION *
*&----------------------------------------------------------------*
START-OF-SELECTION.
PERFORM cargar_datos.
PERFORM init_tree.

CALL SCREEN 0100.

*&----------------------------------------------------------------*
*& Form CARGAR_DATOS *
*&----------------------------------------------------------------*
FORM cargar_datos.

directory = 'C:\SDN_Blogs\'.

CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
EXPORTING
directory = directory
filter = '*.*'
TABLES
file_table = file_table
dir_table = dir_table
EXCEPTIONS
cntl_error = 1
OTHERS = 2.

IF sy-subrc EQ 0.
LOOP AT dir_table ASSIGNING <fs_dir_table>.
append initial line to t_authors
assigning <fs_authors>.
MOVE <fs_dir_table>-pathname TO <fs_authors>-name.
ENDLOOP.

IF NOT t_authors[] IS INITIAL.
LOOP AT t_authors ASSIGNING <fs_authors>.
CONCATENATE directory <fs_authors>-name '\'
INTO author.
CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
EXPORTING
directory = author
filter = '*.htm'
TABLES
file_table = file_table
dir_table = dir_table
EXCEPTIONS
cntl_error = 1
OTHERS = 2.
IF sy-subrc EQ 0.
LOOP AT file_table ASSIGNING <fs_file_table>.
append initial line to t_weblogs
assigning <fs_blogs>.
MOVE <fs_authors>-name TO <fs_blogs>-name.
MOVE <fs_file_table>-pathname TO <fs_blogs>-blog.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.

ENDFORM.

*&----------------------------------------------------------------*
*& FORM init_tree *
*&----------------------------------------------------------------*
FORM init_tree.

DATA: l_tree_container_name(30) TYPE c,
l_html_container_name(30) TYPE c.

l_tree_container_name = 'CUSTOM_TREE'.
l_html_container_name = 'CUSTOM_BROWSER'.

CREATE OBJECT tree_event_receiver.

CREATE OBJECT g_custom_tree_container
EXPORTING
container_name = l_tree_container_name
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.

CREATE OBJECT g_custom_html_container
EXPORTING
container_name = l_html_container_name
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.

CREATE OBJECT g_alv_tree
EXPORTING
parent = g_custom_tree_container
node_selection_mode =
cl_gui_column_tree=>node_sel_mode_single
item_selection = ''
no_html_header = 'X'
no_toolbar = ''
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
illegal_node_selection_mode = 5
failed = 6
illegal_column_name = 7.

CREATE OBJECT html_control
EXPORTING
parent = g_custom_html_container.

PERFORM fill_catalog_tree.
PERFORM build_hierarchy_header CHANGING l_hierarchy_header.

CALL METHOD g_alv_tree->set_table_for_first_display
EXPORTING
is_hierarchy_header = l_hierarchy_header
CHANGING
it_outtab = t_tree[]
it_fieldcatalog = gt_fieldcat_tree.

PERFORM create_hierarchy.

CLEAR l_event.
l_event-eventid = cl_gui_column_tree=>eventid_node_double_click.
l_event-appl_event = 'X'.
APPEND l_event TO lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_expand_no_children.
APPEND l_event TO lt_events.
CLEAR l_event.

CALL METHOD g_alv_tree->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.

SET HANDLER tree_event_receiver->handle_double_click FOR g_alv_tree.

CALL METHOD g_alv_tree->frontend_update.

ENDFORM.

*&----------------------------------------------------------------*
*& Form FILL_CATALOG_TREE *
*&----------------------------------------------------------------*
FORM fill_catalog_tree.

DATA: gs_fieldcat TYPE lvc_s_fcat.

CLEAR gs_fieldcat.
gs_fieldcat-col_pos = 1.
gs_fieldcat-fieldname = 'NAME'.
gs_fieldcat-scrtext_s = 'Autor'.
gs_fieldcat-tabname = 'T_WEBLOGS'.
gs_fieldcat-outputlen = '1'.
APPEND gs_fieldcat TO gt_fieldcat_tree.

CLEAR gs_fieldcat.
gs_fieldcat-col_pos = 2.
gs_fieldcat-fieldname = 'BLOG'.
gs_fieldcat-scrtext_s = 'Blog'.
gs_fieldcat-tabname = 'T_WEBLOGS'.
gs_fieldcat-outputlen = '40'.
APPEND gs_fieldcat TO gt_fieldcat_tree.

ENDFORM.

*&----------------------------------------------------------------*
*& FORM build_hierarchy_header *
*&----------------------------------------------------------------*
FORM build_hierarchy_header CHANGING
p_hierarchy_header TYPE treev_hhdr.

CLEAR p_hierarchy_header.
p_hierarchy_header-heading = 'Autor'.
p_hierarchy_header-width = 30.
p_hierarchy_header-width_pix = ' '.

ENDFORM. "BUILD_HIERARCHY_HEADER

*&----------------------------------------------------------------*
*& FORM create_hierarchy *
*&----------------------------------------------------------------*
FORM create_hierarchy.

DATA: l_root_key TYPE lvc_nkey,
l_next_key TYPE lvc_nkey,
l_last_key TYPE lvc_nkey,
header TYPE string,
w_menge_text(13) TYPE c.

CLEAR l_root_key.

LOOP AT t_authors ASSIGNING <fs_authors>.
READ TABLE t_weblogs WITH KEY name = <fs_authors>-name
ASSIGNING <fs_blogs>.
IF sy-subrc EQ 0.
header = <fs_blogs>-name.
ENDIF.
CLEAR l_root_key.
CLEAR l_next_key.
PERFORM add_node USING header l_root_key
CHANGING l_next_key.
LOOP AT t_weblogs ASSIGNING <fs_blogs>
WHERE name EQ <fs_authors>-name.

MOVE-CORRESPONDING <fs_blogs> TO t_tree.

PERFORM add_leaf USING t_tree l_next_key
CHANGING l_last_key.
ENDLOOP.
ENDLOOP.

ENDFORM.

*&----------------------------------------------------------------*
*& FORM ADD_NODE *
*&----------------------------------------------------------------*
FORM add_node USING l_name l_root_key
CHANGING l_next_key.

DATA: l_node_text TYPE lvc_value,
ls_tree TYPE ty_weblogs.

l_node_text = l_name.
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = l_root_key
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
is_outtab_line = ls_tree
IMPORTING
e_new_node_key = l_next_key.

ENDFORM. "ADD_NODE

*&----------------------------------------------------------------*
*& FORM ADD_LEAF *
*&----------------------------------------------------------------*
FORM add_leaf USING l_tree TYPE ty_weblogs
l_next_key
CHANGING l_last_key.

CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = l_next_key
i_relationship = cl_gui_column_tree=>relat_last_child
is_outtab_line = t_tree
IMPORTING
e_new_node_key = l_last_key.

ENDFORM. "ADD_LEAF

*---------------------------------------------------------------------*
* FORM cargar_browser *
*---------------------------------------------------------------------*
FORM cargar_browser USING l_index.

READ TABLE t_tree INDEX l_index.

CONCATENATE 'FILE:' directory t_tree-name '\' t_tree-blog
INTO edurl.

CALL METHOD html_control->show_url
EXPORTING
url = edurl
EXCEPTIONS
cnht_error_parameter = 1
OTHERS = 2.

ENDFORM.

*---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT *
*---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.

SET PF-STATUS 'BLOGS'.
SET TITLEBAR 'TITLE'.

ENDMODULE. " STATUS_0100 OUTPUT

*&--------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT *
*&--------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

IF sy-ucomm EQ 'BACK'.
LEAVE PROGRAM.
ENDIF.

ENDMODULE. " USER_COMMAND_0100 INPUT


Espero que les guste -:D

Saludos,

Blag.

Wednesday, February 13, 2008

ZTIC_TAC_TOE (Juego en ABAP)


Ayer estaba aburrido en la oficina, esperando una orden de transporte y que una tabla me devolviera algunos resultados...Entonces, me puse a pensar acerca de mi nuevo blog...Como ya he escrito tantas cosas, me es un poco dificil crear algo nuevo y extraño -;) Felizmente me acordé que hace algún tiempo hice un Tic-Tac-Toe (Michi o Gato) en Ruby, así que pensé que hacerlo en ABAP no sería muy díficil...Y no lo fué -;) Me tomó solamente 20 minutos hacer esto...

El juego tiene una pobre y limitada Inteligencia Artificial...Debemos ingresar un número del 1 al 9 y presionar Play! para que la computadora haga su jugada debemos presionar Play! nuevamente...






Ahora, el código fuente...


*&-----------------------------------------------------------*
*& Report ZTIC_TAC_TOE *
*&-----------------------------------------------------------*

REPORT ZTIC_TAC_TOE NO STANDARD PAGE HEADING.

TYPES: BEGIN OF TY_PLAYS,
PLAY TYPE C,
END OF TY_PLAYS.

DATA: T_PLAYS TYPE STANDARD TABLE OF TY_PLAYS.

FIELD-SYMBOLS: <FS_PLAYS> LIKE LINE OF T_PLAYS.

DATA: RANDOM TYPE REF TO CL_ABAP_RANDOM.

DATA: SEED TYPE I,
WIN_FLAG TYPE C,
FLAG_OK TYPE C,
W_LINES TYPE I,
FLAG TYPE C,
PLAYER_ONE TYPE C,
PLAYER_TWO TYPE C,
ONE TYPE C,
TWO TYPE C,
THREE TYPE C,
FOUR TYPE C,
FIVE TYPE C,
SIX TYPE C,
SEVEN TYPE C,
EIGHT TYPE C,
NINE TYPE C.

*-----------------------------------------------------------*
* START-OF-SELECTION *
*-----------------------------------------------------------*
START-OF-SELECTION.
FLAG = '1'.
SET PF-STATUS 'BAR'.
PERFORM BOARD USING '' '' ''.
PERFORM PLAYER_ONE.

*-----------------------------------------------------------*
* FORM PLAYER_ONE *
*-----------------------------------------------------------*
FORM PLAYER_ONE.
IF WIN_FLAG EQ SPACE.
WRITE:/ 'Player one: '.
FORMAT INPUT ON.
WRITE: PLAYER_ONE.
FORMAT INPUT OFF.
ENDIF.
ENDFORM. "player_one

*-----------------------------------------------------------*
* FORM PLAYER_TWO *
*-----------------------------------------------------------*
FORM PLAYER_TWO.
IF WIN_FLAG EQ SPACE.
WRITE:/ 'Player two: '.
FORMAT INPUT ON.
WRITE: PLAYER_TWO.
FORMAT INPUT OFF.
ENDIF.
ENDFORM. "player_two

*-----------------------------------------------------------*
* FORM BOARD *
*-----------------------------------------------------------*
FORM BOARD USING P_PLAYER P_NUMBER FLAG_OK.

IF P_PLAYER NE SPACE AND P_NUMBER NE SPACE.
READ TABLE T_PLAYS WITH KEY PLAY = P_NUMBER
ASSIGNING <FS_PLAYS>.
IF NOT <FS_PLAYS> IS ASSIGNED OR SY-SUBRC NE 0.
APPEND INITIAL LINE TO T_PLAYS
ASSIGNING <FS_PLAYS>.
<FS_PLAYS>-PLAY = P_NUMBER.
UNASSIGN <FS_PLAYS>.
FLAG_OK = 'X'.
ELSE.
WRITE:/ 'Please select another number!'.
CLEAR: P_NUMBER,FLAG_OK.
ENDIF.
ENDIF.

CASE P_NUMBER.
WHEN '1'.
IF P_PLAYER EQ '1'.
ONE = 'X'.
ELSE.
ONE = 'O'.
ENDIF.
WHEN '2'.
IF P_PLAYER EQ '1'.
TWO = 'X'.
ELSE.
TWO = 'O'.
ENDIF.
WHEN '3'.
IF P_PLAYER EQ '1'.
THREE = 'X'.
ELSE.
THREE = 'O'.
ENDIF.
WHEN '4'.
IF P_PLAYER EQ '1'.
FOUR = 'X'.
ELSE.
FOUR = 'O'.
ENDIF.
WHEN '5'.
IF P_PLAYER EQ '1'.
FIVE = 'X'.
ELSE.
FIVE = 'O'.
ENDIF.
WHEN '6'.
IF P_PLAYER EQ '1'.
SIX = 'X'.
ELSE.
SIX = 'O'.
ENDIF.
WHEN '7'.
IF P_PLAYER EQ '1'.
SEVEN = 'X'.
ELSE.
SEVEN = 'O'.
ENDIF.
WHEN '8'.
IF P_PLAYER EQ '1'.
EIGHT = 'X'.
ELSE.
EIGHT = 'O'.
ENDIF.
WHEN '9'.
IF P_PLAYER EQ '1'.
NINE = 'X'.
ELSE.
NINE = 'O'.
ENDIF.
ENDCASE.

PERFORM CHECK_WHO_WINS.
DESCRIBE TABLE T_PLAYS LINES W_LINES.

IF WIN_FLAG EQ SPACE AND W_LINES EQ 9.
WIN_FLAG = 'X'.
WRITE: 'It''s a tie!'.
ENDIF.

WRITE:/ ONE,'|',TWO,'|',THREE.
WRITE:/ '--+---+---'.
WRITE:/ FOUR,'|',FIVE,'|',SIX.
WRITE:/ '--+---+---'.
WRITE:/ SEVEN,'|',EIGHT,'|',NINE.

IF P_PLAYER EQ '2'.
PERFORM PLAYER_ONE.
ELSEIF P_PLAYER EQ '1'.
PERFORM PLAYER_TWO.
ENDIF.
ENDFORM. "board

*-----------------------------------------------------------*
* FORM check_who_wins *
*-----------------------------------------------------------*
FORM CHECK_WHO_WINS.
IF ONE EQ TWO AND TWO EQ THREE.
IF THREE EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF THREE EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF FOUR EQ FIVE AND FIVE EQ SIX.
IF SIX EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF SIX EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF SEVEN EQ EIGHT AND EIGHT EQ NINE.
IF NINE EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF NINE EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF ONE EQ FOUR AND FOUR EQ SEVEN.
IF SEVEN EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF SEVEN EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF TWO EQ FIVE AND FIVE EQ EIGHT.
IF EIGHT EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF EIGHT EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF THREE EQ SIX AND SIX EQ NINE.
IF NINE EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF NINE EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF ONE EQ FIVE AND FIVE EQ NINE.
IF NINE EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF NINE EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF SEVEN EQ FIVE AND FIVE EQ THREE.
IF THREE EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF THREE EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
IF FOUR EQ FIVE AND FIVE EQ SIX.
IF SIX EQ 'X'.
WRITE:/ 'Player 1 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ELSEIF SIX EQ 'O'.
WRITE:/ 'Player 2 Wins!'.
WIN_FLAG = 'X'.
SKIP 2.
ENDIF.
ENDIF.
ENDFORM. "check_who_wins

*-----------------------------------------------------------*
* AT USER-COMMAND *
*-----------------------------------------------------------*
AT USER-COMMAND.

IF SY-UCOMM EQ 'BACK'.
SET SCREEN 0.
LEAVE PROGRAM.
ELSE.
IF WIN_FLAG EQ SPACE.
IF FLAG = '1'.
PLAYER_ONE = SY-LISEL+12(1).
PERFORM BOARD USING FLAG PLAYER_ONE FLAG_OK.
IF FLAG_OK = 'X'.
FLAG = '2'.
ENDIF.
ELSE.
SEED = CL_ABAP_RANDOM=>SEED( ).
RANDOM = CL_ABAP_RANDOM=>CREATE( SEED ).
PLAYER_TWO = RANDOM->INTINRANGE( LOW = 1 HIGH = 9 ).
PERFORM BOARD USING FLAG PLAYER_TWO FLAG_OK.
IF FLAG_OK = 'X'.
FLAG = '1'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

Espero que les guste y si pueden, mejorenlo -:)

Saludos,

Blag.

Monday, February 11, 2008

Mis 3 libros favoritos de programación


El otro día estaba pensando sobre los libros de programación que he leído...Que son realmente bastantes...Y se me ocurrío que podía postear cuales eran los 3 libros que más me gustan y que puedo leer una y otra vez sin cansarme...

Sams Teach Yourself C++ in 21 Days, Third Edition de Jesse Liberty

Next Generation ABAP Development de Rich Heilman y Thomas Jung

Why's (Poignant) Guide to Ruby de why the lucky stiff

Saludos,

Blag.

Technorati Tags:

Wednesday, February 06, 2008

Mis Libros!!!


Después de una no muy larga espera...Recibí todos mis libros impresos! (Bueno...El de NetWeaver lo compro en un par de semanas).



La verdad es que es la primera que los puedo ver y leer en un formato que no sea Word o PDF -:) El resultado, no podía ser mejor -;)

Así que si animan por alguno, la dirección es Libros de Blag.

Saludos,

Blag.

Technorati Tags:

Monday, February 04, 2008

Campos repetidos en dos tablas...


Continuando con mis posts con programas simples pero útiles, ahora les traigo un que recibe dos tablas y devuelve todos los campos que comparten ambas tablas (Comparando los dominios y no los nombres claro está...)




REPORT ydummy_atg NO STANDARD PAGE HEADING.

TYPES: BEGIN OF ty_repeated,
fieldname TYPE dd03p-fieldname,
ddtext TYPE dd03p-ddtext,
END OF ty_repeated.

DATA: dd03p_table1 TYPE STANDARD TABLE OF dd03p,
dd03p_table2 TYPE STANDARD TABLE OF dd03p,
t_repeated TYPE STANDARD TABLE OF ty_repeated
WITH HEADER LINE.

DATA: long_1 TYPE i,
long_2 TYPE i,
w_title TYPE string.

FIELD-SYMBOLS: <fs_dd03p> LIKE LINE OF dd03p_table1,
<fs_dd03p_aux> LIKE LINE OF dd03p_table1,
<fs_repeated> LIKE LINE OF t_repeated.

SELECTION-SCREEN BEGIN OF BLOCK test.
PARAMETERS:
p_tab_1 TYPE dd17s-sqltab,
p_tab_2 TYPE dd17s-sqltab.
SELECTION-SCREEN END OF BLOCK test.

START-OF-SELECTION.

CONCATENATE p_tab_1 p_tab_2 INTO
w_title SEPARATED BY '-'.

sy-title = w_title.

CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = p_tab_1
state = 'A'
langu = sy-langu
TABLES
dd03p_tab = dd03p_table1
EXCEPTIONS
illegal_input = 1
OTHERS = 2.

DELETE dd03p_table1 WHERE rollname EQ space.

CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = p_tab_2
state = 'A'
langu = sy-langu
TABLES
dd03p_tab = dd03p_table2
EXCEPTIONS
illegal_input = 1
OTHERS = 2.

DELETE dd03p_table2 WHERE rollname EQ space.

DESCRIBE TABLE dd03p_table1 LINES long_1.
DESCRIBE TABLE dd03p_table2 LINES long_2.

IF long_1 GT long_2.
LOOP AT dd03p_table1 ASSIGNING <fs_dd03p>.
READ TABLE dd03p_table2 ASSIGNING <fs_dd03p_aux>
WITH KEY rollname = <fs_dd03p>-rollname.
IF sy-subrc EQ 0.
MOVE <fs_dd03p_aux>-fieldname TO t_repeated-fieldname.
MOVE <fs_dd03p_aux>-ddtext TO t_repeated-ddtext.
APPEND t_repeated.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT dd03p_table2 ASSIGNING <fs_dd03p>.
READ TABLE dd03p_table1 ASSIGNING <fs_dd03p_aux>
WITH KEY rollname = <fs_dd03p>-rollname.
IF sy-subrc EQ 0.
MOVE <fs_dd03p_aux>-fieldname TO t_repeated-fieldname.
MOVE <fs_dd03p_aux>-ddtext TO t_repeated-ddtext.
APPEND t_repeated.
ENDIF.
ENDLOOP.
ENDIF.

LOOP AT t_repeated ASSIGNING <fs_repeated>.
WRITE:/ <fs_repeated>-fieldname,<fs_repeated>-ddtext.
ENDLOOP.


Saludos,

Blag.

Friday, February 01, 2008

Indices de Tablas


Todos sabemos que los índices son muy importantes para poder optimizar los querys en ABAP...Y sabemos también que debemos ir a la transacción SE11, presionar el botón Índices y luego tenemos que revisar uno por uno para ver que campo los componen...Claro, en parte esto es porque a diferencia de mi, la mayoría no incluye los campos del índice en el nombre del índice (SAP incluido)...

Por eso, se me ocurrió un pequeño reporte, en donde pasamos el nombre de la tabla y obtenemos un resumen de los índices con los campos que lo componen...Bastante útil -:)




Este es el código...


REPORT ydummy_atg NO STANDARD PAGE HEADING.

TYPES: BEGIN OF ty_index,
sqltab TYPE dd17s-sqltab,
indexname TYPE dd17s-indexname,
fieldname TYPE dd17s-fieldname,
ddtext TYPE dd12t-ddtext,
END OF ty_index.

DATA: t_index TYPE STANDARD TABLE OF ty_index,
dd03p_tab TYPE STANDARD TABLE OF dd03p.

DATA: w_indexname TYPE dd17s-indexname.

FIELD-SYMBOLS: <fs_index> LIKE LINE OF t_index,
<fs_dd03p_tab> LIKE LINE OF dd03p_tab.

SELECTION-SCREEN BEGIN OF BLOCK test.
PARAMETERS:
p_tabnam TYPE dd17s-sqltab.
SELECTION-SCREEN END OF BLOCK test.

START-OF-SELECTION.

SELECT dd17s~sqltab dd17s~indexname fieldname ddtext
INTO TABLE t_index
FROM dd17s INNER JOIN dd12t
ON dd17s~sqltab EQ dd12t~sqltab
AND dd17s~indexname EQ dd12t~indexname
WHERE dd17s~sqltab EQ p_tabnam
AND ddlanguage EQ sy-langu.

CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = p_tabnam
state = 'A'
langu = sy-langu
TABLES
dd03p_tab = dd03p_tab
EXCEPTIONS
illegal_input = 1
OTHERS = 2.

sy-title = p_tabnam.

LOOP AT t_index ASSIGNING <fs_index>.
IF w_indexname NE <fs_index>-indexname.
SKIP 1.
w_indexname = <fs_index>-indexname.
WRITE:/ 'Indice: ', <fs_index>-indexname, <fs_index>-ddtext.
SKIP 1.
READ TABLE dd03p_tab ASSIGNING <fs_dd03p_tab>
WITH KEY tabname = p_tabnam
fieldname = <fs_index>-fieldname.
WRITE:/ <fs_index>-fieldname, <fs_dd03p_tab>-ddtext.
ELSE.
READ TABLE dd03p_tab ASSIGNING <fs_dd03p_tab>
WITH KEY fieldname = <fs_index>-fieldname.
WRITE:/ <fs_index>-fieldname, <fs_dd03p_tab>-ddtext.
ENDIF.
ENDLOOP.


Saludos,

Blag.