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
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.
Compartelo
edgar fernandez Said,
Abril 3, 2007 @ 1:11 pm
Me puede enviar el codigo gracias