REPORT z58_int_prg_bi_loader.
TABLES: t000.
SELECT-OPTIONS: p_mandt FOR sy-mandt,
p_user FOR sy-uname,
p_fecha FOR sy-datum.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_save AS CHECKBOX DEFAULT ' '. "<-- Save to DB
DATA: p_name TYPE z58_int_de_bi_name.
DATA: ess LIKE apqi OCCURS 0 WITH HEADER LINE,
esp LIKE apqi OCCURS 0 WITH HEADER LINE,
eax LIKE bdcdata OCCURS 0 WITH HEADER LINE,
ah(20),
al(20),
ebx(60),
ecx(2) TYPE n,
edx(2) TYPE n,
edi(255),
esi LIKE eax.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ IECI:INI 20200519 Ejemplo de USO
* Ini : BAT-BI v 1.3 ----------------- 07.01.2005
DEFINE bi_create.
DATA: bi_tab LIKE bdcdata OCCURS 0 WITH HEADER LINE,
bi_err LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE,
bi_mod(1) VALUE 'N',
bi_upd(1) VALUE 'S',
bi_wt100 LIKE t100,
bi_tt LIKE tline OCCURS 0 WITH HEADER LINE,
bi_tout(255) OCCURS 0 WITH HEADER LINE,
bi_amp TYPE x VALUE 80. "Truco
FIELD-SYMBOLS: <bi_fs>.
END-OF-DEFINITION.
DEFINE bi_clear.
CLEAR: bi_tab, bi_err, bi_tt, bi_tout.
REFRESH: bi_tab, bi_err, bi_tt, bi_tout.
END-OF-DEFINITION.
DEFINE bi_add.
CLEAR bi_tab.
IF NOT &1 IS INITIAL.
bi_tab-program = &2.
bi_tab-dynpro = &3.
bi_tab-dynbegin = 'X'.
IF &1 NE 'X'.
APPEND bi_tab.
CLEAR bi_tab.
bi_tab-fnam = 'BDC_OKCODE'.
bi_tab-fval = &1.
ENDIF.
ELSE.
bi_tab-fnam = &2.
bi_tab-fval = &3.
ENDIF.
APPEND bi_tab.
END-OF-DEFINITION.
DEFINE bi_call.
CALL TRANSACTION &1 USING bi_tab MODE bi_mod UPDATE bi_upd
MESSAGES INTO bi_err.
END-OF-DEFINITION.
DEFINE bi_error.
REFRESH bi_tt.
DESCRIBE TABLE bi_err LINES sy-pexpi.
CHECK sy-pexpi GT 0.
SORT bi_err.
DELETE ADJACENT DUPLICATES FROM bi_err.
* Se subrimen los mensajes de tipo 'S' num: 402:"Campo tranf. a visu" y
* num: 432:"Sistema ha ejecutado c.
DELETE bi_err WHERE msgtyp = 'S'
AND ( msgnr = '402' OR msgnr = '432'
OR msgnr = '000' ).
LOOP AT bi_err.
CLEAR bi_wt100.
SELECT SINGLE text INTO bi_wt100-text FROM t100
WHERE sprsl = sy-langu AND
arbgb = bi_err-msgid AND
msgnr = bi_err-msgnr.
IF sy-subrc = 0 AND NOT bi_wt100-text IS INITIAL.
* d_len = strlen( bi_err-msgv1 ).
CLEAR sy-pexpi.
TRANSLATE bi_wt100-text USING ' ~'.
SPLIT bi_wt100-text AT bi_amp INTO TABLE bi_tout.
CLEAR bi_wt100-text.
LOOP AT bi_tout.
CHECK NOT bi_tout IS INITIAL.
ADD 1 TO sy-pexpi.
IF sy-pexpi < 5.
CONCATENATE 'bi_err-msgv' sy-pexpi INTO sy-repi2.
ASSIGN (sy-repi2) TO <bi_fs>.
ENDIF.
CONCATENATE bi_wt100-text bi_tout <bi_fs> INTO bi_wt100-text.
CONDENSE bi_wt100-text NO-GAPS.
ENDLOOP.
CONDENSE bi_wt100-text NO-GAPS.
TRANSLATE bi_wt100-text USING '~ '.
bi_tt-tdline = bi_wt100-text.
APPEND bi_tt.
ENDIF.
ENDLOOP.
DESCRIBE TABLE bi_tt LINES sy-pexpi.
CHECK sy-pexpi > 0.
* Si contiene errores.se muestran en una ventana.
CALL FUNCTION 'COPO_POPUP_TO_DISPLAY_TEXTLIST'
EXPORTING task = 'DISPLAY'
titel = 'Errores en transaccin'
TABLES text_table = bi_tt.
END-OF-DEFINITION.
* Fin : BAT-BI v 1.3 ----------------- 07.01.2005
**Ejemplo
*end-of-selection.
* bi_create.
* bi_clear.
* bi_add: 'X' 'SAPLWBABAP' '0100',
* ' ' 'BDC_OKCODE' '=BACK'.
* bi_call 'SE38'.
*--[ IECI:FIN 20200519 Ejemplo de USO
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
START-OF-SELECTION.
PERFORM data_bi_get.
PERFORM data_bi_list.
FORM data_bi_to_db_clipboard.
TYPES:
BEGIN OF ty_clipdata,
data TYPE c LENGTH 500,
END OF ty_clipdata.
DATA: lt_clipdata TYPE STANDARD TABLE OF ty_clipdata.
DATA: ls_clipdata LIKE LINE OF lt_clipdata.
CALL FUNCTION 'BDC_OBJECT_READ'
EXPORTING
queue_id = ess-qid
TABLES
dynprotab = eax
EXCEPTIONS
not_found = 1
system_failure = 2
invalid_datatype = 3
OTHERS = 4.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Grabamos en tabla
IF NOT p_save IS INITIAL." AND NOT p_name IS INITIAL.
TYPES: BEGIN OF ty_100,
mandt TYPE mandt,
bi_name TYPE c LENGTH 20,
bi_cont TYPE n LENGTH 4,
bi_no_actiu TYPE xfeld,
bi_dynbegin TYPE bdc_start,
bi_program TYPE bdc_prog,
bi_dynpro TYPE bdc_dynr,
bi_fnam TYPE fnam_____4,
bi_fval TYPE bdc_fval,
bi_desc TYPE c LENGTH 60,
END OF ty_100.
DATA: l_100 TYPE z58_int_tb_100. "<-- BD Tabla como la ty_100
l_100-bi_name = p_name.
l_100-bi_cont = 0.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Borramos la tabla de BI
DATA: t_sval TYPE STANDARD TABLE OF sval,
l_sval TYPE sval,
l_return TYPE c.
l_sval-tabname = 'Z58_INT_TB_100'.
l_sval-fieldname = 'BI_NAME'.
l_sval-value = ess-groupid.
l_sval-field_obl = 'X'.
APPEND l_sval TO t_sval.
*FIELD_ATTR
*FIELD_OBL
*COMP_CODE
*FIELDTEXT
*COMP_TAB
*COMP_FIELD
*NOVALUEHLP
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
* NO_VALUE_CHECK = ' '
popup_title = 'Nom del BI'
start_column = '45'
start_row = '8'
IMPORTING
returncode = l_return
TABLES
fields = t_sval
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
READ TABLE t_sval INTO l_sval INDEX 1.
p_name = l_sval-value.
DELETE FROM z58_int_tb_100 WHERE bi_name = p_name.
LOOP AT eax.
ADD 10 TO l_100-bi_cont.
l_100-bi_dynbegin = eax-dynbegin.
l_100-bi_program = eax-program.
l_100-bi_dynpro = eax-dynpro.
l_100-bi_fnam = eax-fnam.
l_100-bi_fval = eax-fval.
l_100-bi_desc = ''.
CLEAR edi.
IF NOT eax-program IS INITIAL.
PERFORM descrip_dynp.
ELSE.
IF eax-fnam CA '-'. PERFORM descrip_field. ENDIF.
IF eax-dynbegin = 'T'.
esi = l_100-bi_fnam.
PERFORM descrip_tran.
ENDIF.
ENDIF.
l_100-bi_desc = edi.
SHIFT l_100-bi_desc LEFT DELETING LEADING '"'.
SHIFT l_100-bi_desc LEFT DELETING LEADING ' '.
*--[ Insertamos en tabla
INSERT z58_int_tb_100 FROM l_100. "<-- BD tabla como la ty_100
ENDLOOP.
ENDIF.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Volcamos en salida
LOOP AT eax.
IF eax-dynbegin = 'T'.
CONCATENATE 'bi_call ''' esi-fnam '''.' INTO edi.
CONDENSE edi.
PERFORM descrip_tran.
esi = eax.
IF sy-tabix NE 1.
* WRITE: / edi.
ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
* SKIP 1.
ENDIF.
IF sy-tabix = 1. "WRITE: / 'bi_create.'.
ls_clipdata = 'bi_create.'. APPEND ls_clipdata TO lt_clipdata.
ENDIF.
* WRITE: / 'bi_clear.', / 'bi_add:'.
ls_clipdata = 'bi_clear. bi_add:'. APPEND ls_clipdata TO lt_clipdata.
CONTINUE.
ENDIF.
IF NOT eax-program IS INITIAL.
CONCATENATE '''X'' ''' eax-program ''' ''' eax-dynpro
''',' INTO edi.
CONDENSE edi.
PERFORM descrip_dynp.
ELSE.
edx = 0.
ecx = strlen( eax-fval ).
IF ecx NE 0.
TRANSLATE eax-fval+edx(ecx) USING ' ~'.
ENDIF.
IF eax-fnam NP 'BDC*SCR'.
CONCATENATE ''' '' ''' eax-fnam ''' ''' eax-fval ''''
',' INTO edi.
ELSE.
CONCATENATE ''' '' ''' eax-fnam '''' INTO edi.
ENDIF.
CONDENSE edi.
TRANSLATE edi USING '~ '.
IF eax-fnam CP 'BDC*SOR'.
IF edi NA '()'. CONTINUE. ENDIF.
ENDIF.
IF eax-fnam CA '-'. PERFORM descrip_field. ENDIF.
ENDIF.
* WRITE: /9 edi. ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
IF eax-fnam CP 'BDC*SCR'.
CONCATENATE '''' eax-fval ''',' INTO edi. CONDENSE edi.
TRANSLATE edi USING '~ '.
* WRITE /9 edi.
ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
ENDIF.
ENDLOOP.
CONCATENATE 'bi_call ''' esi-fnam '''.' INTO edi. CONDENSE edi.
PERFORM descrip_tran.
* WRITE: / edi.
ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
LOOP AT lt_clipdata INTO ls_clipdata WHERE data CP '''*'.
CONCATENATE ' ' ls_clipdata-data INTO ls_clipdata-data RESPECTING BLANKS.
MODIFY lt_clipdata INDEX sy-tabix FROM ls_clipdata.
ENDLOOP.
DATA: lv_rc TYPE i.
cl_gui_frontend_services=>clipboard_export(
IMPORTING
data = lt_clipdata
CHANGING
rc = lv_rc
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
no_authority = 4
OTHERS = 5 )
.
MESSAGE s398(00) WITH 'BI copiado al clipboard'.
ENDFORM.
FORM descrip_tran.
SELECT SINGLE ttext INTO ebx FROM tstct WHERE sprsl = sy-langu
AND tcode = esi-fnam.
CONCATENATE edi ' "' ebx INTO edi.
ENDFORM.
FORM descrip_dynp.
SELECT SINGLE dtxt INTO ebx FROM d020t WHERE prog = eax-program
AND dynr = eax-dynpro
AND lang = sy-langu.
CONCATENATE edi ' "' ebx INTO edi.
ENDFORM.
FORM descrip_field.
SPLIT eax-fnam AT '-' INTO ah al.
CHECK NOT ah IS INITIAL AND NOT al IS INITIAL.
SEARCH al FOR '('.
IF sy-subrc EQ 0.
sy-index = 0.
al = al+sy-index(sy-fdpos).
ENDIF.
SELECT SINGLE rollname INTO ebx FROM dd03l WHERE tabname = ah
AND fieldname = al.
CHECK sy-subrc EQ 0.
SELECT SINGLE ddtext INTO ebx FROM dd04t WHERE rollname = ebx
AND ddlanguage = sy-langu.
CHECK sy-subrc EQ 0.
CONCATENATE edi ' "' ebx INTO edi.
ENDFORM.
FORM data_bi_list.
DATA bess LIKE ess.
SORT ess BY credate DESCENDING cretime DESCENDING groupid userid.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv,
ls_fieldcat TYPE slis_fieldcat_alv,
ls_selfield TYPE slis_selfield,
l_exit(1) TYPE c.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'APQI'
CHANGING
ct_fieldcat = lt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
LOOP AT lt_fieldcat INTO DATA(lf).
CASE lf-fieldname.
WHEN 'USERID' OR 'GROUPID' OR 'CREDATE' OR 'CRETIME'." or 'QID'.
CLEAR sy-subrc.
WHEN OTHERS.
lf-no_out = 'X'.
lf-tech = 'X'.
ENDCASE.
MODIFY lt_fieldcat INDEX sy-tabix FROM lf.
ENDLOOP.
CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = 'Selecciona'
i_selection = 'X'
i_zebra = 'X'
* i_checkbox_fieldname = 'FLAG'
i_tabname = 'APQI'
it_fieldcat = lt_fieldcat
IMPORTING
es_selfield = ls_selfield
e_exit = l_exit
TABLES
t_outtab = ess
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc EQ 0 AND ls_selfield-tabindex > 0.
READ TABLE ess INDEX ls_selfield-tabindex.
IF sy-subrc EQ 0.
PERFORM data_bi_to_db_clipboard.
ENDIF.
ELSE.
CLEAR ess.
ENDIF.
ENDFORM.
FORM data_bi_get.
CLEAR ess. REFRESH ess.
SELECT * FROM t000 WHERE cccategory = 'C'.
CLEAR esp. REFRESH esp.
CALL FUNCTION 'BDC_OBJECT_SELECT'
EXPORTING
name = '*'
datatype = '%BDC'
client = t000-mandt
TABLES
apqitab = esp
EXCEPTIONS
invalid_datatype = 1
OTHERS = 2.
APPEND LINES OF esp TO ess.
ENDSELECT.
ENDFORM.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Rutinas de soporte para ser llamadas desde fuera
FORM bi_100_save USING p_name
p_bi_tab TYPE bdcdata_tab.
DATA: bi_100 TYPE z58_int_tb_100 .
CLEAR bi_100.
SELECT SINGLE * FROM z58_int_tb_100
INTO CORRESPONDING FIELDS OF bi_100
WHERE bi_name = p_name.
CHECK sy-subrc NE 0.
bi_100-bi_name = p_name.
bi_100-bi_cont = 0.
LOOP AT p_bi_tab INTO DATA(l_tab).
ADD 10 TO bi_100-bi_cont.
bi_100-bi_program = l_tab-program.
bi_100-bi_dynpro = l_tab-dynpro.
bi_100-bi_dynbegin = l_tab-dynbegin.
bi_100-bi_fnam = l_tab-fnam.
bi_100-bi_fval = l_tab-fval.
INSERT z58_int_tb_100 FROM bi_100.
ENDLOOP.
ENDFORM.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Carga un BI
FORM bi_100_load USING p_name
CHANGING p_bi_tab TYPE bdcdata_tab.
DATA: bi_100 TYPE z58_int_tb_100 .
SELECT SINGLE * FROM z58_int_tb_100
INTO CORRESPONDING FIELDS OF bi_100
WHERE bi_name = p_name.
CHECK sy-subrc EQ 0.
REFRESH p_bi_tab.
SELECT bi_program AS program
bi_dynpro AS dynpro
bi_dynbegin AS dynbegin
bi_fnam AS fnam
bi_fval AS fval
FROM z58_int_tb_100
INTO CORRESPONDING FIELDS OF TABLE p_bi_tab
WHERE bi_name = p_name AND
bi_no_actiu NE 'X' AND
bi_dynbegin NE 'T'. "<-- La transacción no hay que traerla
ENDFORM.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Modifica valores de todos los campos del BI
FORM bi_100_fill USING p_field
p_value
p_bi_tab TYPE bdcdata_tab.
LOOP AT p_bi_tab INTO DATA(l_tab).
CHECK ( p_field CA '*' AND l_tab-fnam CP p_field ) OR
( l_tab-fnam = p_field ).
l_tab-fval = p_value.
MODIFY p_bi_tab INDEX sy-tabix FROM l_tab.
ENDLOOP.
ENDFORM.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Modifica la clave de un BI
FORM bi_100_fill_key USING p_field
p_value
p_bi_tab TYPE bdcdata_tab.
LOOP AT p_bi_tab INTO DATA(l_tab).
CHECK ( p_field CA '*' AND l_tab-fnam CP p_field ) OR
( l_tab-fnam = p_field ).
l_tab-fnam = p_value.
MODIFY p_bi_tab INDEX sy-tabix FROM l_tab.
ENDLOOP.
ENDFORM.