Archive for Diciembre, 2006

Inner Join Dinámico

Este es el código para un FM que genera un Inner Join Dinámico

FUNCTION zdynamic_inner_join.
*”———————————————————————-
*”*”Interfase local
*” IMPORTING
*” VALUE(TAB1) TYPE DD02L-TABNAME
*” VALUE(TAB2) TYPE DD02L-TABNAME
*” TABLES
*” FILTER STRUCTURE RFC_DB_OPT
*” WHERE_TABLE STRUCTURE RFC_DB_OPT
*” DATA STRUCTURE TAB512
*” EXCEPTIONS
*” NOT_TABLE
*”———————————————————————-

DATA: descr_struct_ref TYPE REF TO cl_abap_structdescr,
wa_fcat TYPE lvc_s_fcat,
it_fieldcatalog TYPE lvc_t_fcat,
dataref TYPE REF TO data,
my_tab LIKE dd02l-tabname,
tabname TYPE dd03l-tabname,
fieldname TYPE dd03l-fieldname,
position TYPE dd03l-position,
inttype TYPE dd03l-inttype,
tab_one TYPE string,
tab_two TYPE string,
campos TYPE string,
inner_field TYPE string,
where_condition TYPE string,
where_string TYPE string,
condition_one TYPE string,
condition_two TYPE string,
field TYPE string,
l_date_extern(30) TYPE c,
w_tabix TYPE sy-tabix,
field_one TYPE string,
field_two TYPE string,
field_three TYPE string.

DATA: BEGIN OF fields OCCURS 0,
field TYPE dd03l-fieldname,
END OF fields.

DATA: BEGIN OF fields_box OCCURS 0,
field TYPE dd03l-fieldname,
END OF fields_box.

DATA: BEGIN OF global_fields OCCURS 0,
field TYPE dd03l-fieldname,
END OF global_fields.

DATA: fieldsym TYPE TABLE OF rfieldlist WITH HEADER LINE,
fieldlist TYPE TABLE OF rstrucinfo WITH HEADER LINE.

TYPES: BEGIN OF type_data,
data TYPE crmch4000,
END OF type_data.

DATA: data_line TYPE type_data.

DATA: fieldnames LIKE fieldlist-compname,
l_type.

FIELD-SYMBOLS: TYPE ANY TABLE,
TYPE LINE OF lvc_t_fcat,

TYPE STANDARD TABLE,
TYPE STANDARD TABLE,
TYPE abap_compdescr,
TYPE ANY,
TYPE ANY.CREATE DATA dataref TYPE char3000.

IF tab1 EQ space.
RAISE not_table.
ENDIF.

tab_one = tab1.
TRANSLATE tab_one TO UPPER CASE.

SELECT tabname fieldname position inttype
INTO (tabname,fieldname,position,inttype)
FROM dd03l
WHERE tabname EQ tab_one
ORDER BY position.
wa_fcat-fieldname = fieldname.
wa_fcat-ref_table = tabname.
wa_fcat-ref_field = fieldname.
wa_fcat-inttype = inttype.
fields_box-field = fieldname.
APPEND wa_fcat TO it_fieldcatalog.
APPEND fields_box.
ENDSELECT.

IF tab2 EQ space.
RAISE not_table.
ENDIF.

tab_two = tab2.
TRANSLATE tab_two TO UPPER CASE.

SELECT tabname fieldname position inttype
INTO (tabname,fieldname,position,inttype)
FROM dd03l
WHERE tabname EQ tab_two
ORDER BY position.
wa_fcat-fieldname = fieldname.
wa_fcat-ref_table = tabname.
wa_fcat-ref_field = fieldname.
wa_fcat-inttype = inttype.
READ TABLE it_fieldcatalog WITH KEY fieldname = wa_fcat-fieldname
ASSIGNING .
IF sy-subrc EQ 0.
fields-field = wa_fcat-fieldname.
APPEND fields.
ELSE.
fields_box-field = fieldname.
APPEND wa_fcat TO it_fieldcatalog.
APPEND fields_box.
ENDIF.
ENDSELECT.

IF NOT filter[] IS INITIAL.
LOOP AT fields_box.
w_tabix = sy-tabix.
READ TABLE filter WITH KEY text = fields_box-field.
IF sy-subrc NE 0.
DELETE fields_box INDEX w_tabix.
ENDIF.
ENDLOOP.
ENDIF.

global_fields[] = fields_box[].

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 .

LOOP AT fields.
DELETE fields_box WHERE field EQ fields-field.
CONCATENATE tab_one ‘~’ fields-field
INTO inner_field.
CONCATENATE campos inner_field
INTO campos SEPARATED BY space.
ENDLOOP.

LOOP AT fields_box.
CONCATENATE campos fields_box-field
INTO campos SEPARATED BY space.
ENDLOOP.

CONCATENATE ‘(’ tab1 ‘inner join’ tab2 ‘ON’
INTO where_condition SEPARATED BY space.

LOOP AT fields.
CONCATENATE tab_one ‘~’ fields-field
INTO condition_one.
CONCATENATE tab_two ‘~’ fields-field
INTO condition_two.
CONCATENATE where_condition condition_one ‘EQ’
condition_two ‘AND’ INTO where_condition
SEPARATED BY space.
ENDLOOP.

SHIFT where_condition RIGHT DELETING TRAILING ‘AND’.
CONDENSE where_condition.

CONCATENATE where_condition ‘)’
INTO where_condition
SEPARATED BY space.

IF NOT where_table[] IS INITIAL.
LOOP AT where_table.
SPLIT where_table-text AT space
INTO field_one field_two field_three.
READ TABLE fields WITH KEY field = field_one.
IF sy-subrc EQ 0.
CONCATENATE tab1 ‘~’ where_table-text
INTO where_table-text.
ENDIF.
CONCATENATE where_string where_table-text ‘AND’
INTO where_string SEPARATED BY space.
ENDLOOP.
ENDIF.
SHIFT where_string RIGHT DELETING TRAILING ‘AND’.
CONDENSE where_string.

IF where_string NE space.
SELECT (campos)
INTO CORRESPONDING FIELDS OF TABLE
FROM (where_condition)
WHERE (where_string).
ELSE.
SELECT (campos)
INTO CORRESPONDING FIELDS OF TABLE
FROM (where_condition).
ENDIF.

ASSIGN TO

.LOOP AT
ASSIGNING .LOOP AT global_fields.
fieldnames = global_fields-field.
ASSIGN COMPONENT fieldnames OF STRUCTURE TO .
DESCRIBE FIELD TYPE l_type.
IF l_type EQ ‘I’ OR l_type EQ ‘b’.
field = .
CONCATENATE data_line field INTO data_line
SEPARATED BY ‘/’.
ELSEIF l_type EQ ‘P’.
WRITE TO l_date_extern.
CONCATENATE data_line l_date_extern INTO data_line
SEPARATED BY ‘/’.
ELSEIF l_type EQ ‘D’.
CALL FUNCTION ‘CONVERT_DATE_TO_EXTERNAL’
EXPORTING
date_internal =
IMPORTING
date_external = l_date_extern
EXCEPTIONS
OTHERS = 4.
IF sy-subrc EQ 0.
CONCATENATE data_line l_date_extern INTO data_line
SEPARATED BY ‘/’.
ENDIF.
ELSE.
CONCATENATE data_line INTO data_line
SEPARATED BY ‘/’.
ENDIF.
SHIFT data_line LEFT DELETING LEADING ‘/’.
SHIFT data_line RIGHT DELETING TRAILING ‘/’.
ENDLOOP.
APPEND data_line TO data.
CLEAR data_line.

ENDLOOP.

ENDFUNCTION.

Gracias especiales a Abapito, puesto que la idea fué suya.

Saludos,
Blag.

Comentarios (1)

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.

Comentarios (3)

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.

Comentarios (4)

5 Things you (probably) didn’t know about me

My good friend Nigel James has tagged me -:P So this is the first post in English on my personal blog -;)

1.- I listen to Punk music since I was 14 years old…I’m now 29 so…It have been 15 years of Sex Pistols, Dead Kennedys, Rancid, NOFX, Misfits and a lot more -:D

2.- I have written many freeware games and applications using VB 6.0, C++, Java, Euphoria, Spanish Viking and QBasic. SinglePath games design

3.- I quit university after two years, take a Sabbatical Programming year and the move to a Technical Institute where I finished my studies.

4.- I dyed my hair Purple, Yellow and Red…I got a Mohawk too…But only for a few day (I looked kinda scary)…Also I got a tattoo and a cigarette scar on my left arm.

5.- I’m a big fan of Tomb Raider (Movies, Games and Lara Croft)…I’m also a big fan of The Fairy Odd Parents and of course The Simpsons

Piers your tagged now! -:D

Greetings,

Blag.

Comentarios

SAP PHP based Framework

Este es un pequeño proyecto que que iniciado en el SDN. La idea es generar un Framework de integración de PHP con SAP, en el cual, todos emuladores de transacciones que hemos creado yo y mis amigos del SDN Scripting Community estarán disponibles en un solo lugar…Digamos, un R/3 hecho en PHP -:D

SAP PHP based Framework

Saludos,

Blag.

Comentarios (1)

ST22 con PHP y SAP

Algunas vez has querido ver los Short Dumps desde una interfaz web? Esta es tu oportunidad -:D

Tasting the mix of PHP and SAP - Volume 8

Saludos,

Blag.

Comentarios

Mis libros de cabecera…

Como todo buen programador, tengo algunos libros a los que siempre recurro cuando tengo alguna duda, o simplemente cuando quiero reforzar mis conocimientos -;)


Saludos,

Blag.

Comentarios

El Arte de Programar - SAP R/3

Finalmente y después de mucho, he publicado mi primer libro El Arte de Programar - SAP R/3


Pueden comprarlo en Alvaro Tejada Galindo’s StoreFront, ya sea como libro impreso o como PDF.

El libro cubre todos los aspectos básicos de la programación en ABAP e incluye temas poco abordados como integración PHP-SAP, Ruby-SAP y programación en ALV’s.

Saludos,

Blag.

Comentarios

Cerrar
E-mail It