W Pub: ABAP Rut Loader

  1. REPORT z58_int_prg_bi_loader.
  2.  
  3. TABLES: t000.
  4.  
  5. SELECT-OPTIONS: p_mandt FOR sy-mandt,
  6.                 p_user  FOR sy-uname,
  7.                 p_fecha FOR sy-datum.
  8. SELECTION-SCREEN SKIP 1.
  9. PARAMETERS: p_save AS CHECKBOX DEFAULT ' '. "<-- Save to DB
  10.  
  11. DATA: p_name TYPE z58_int_de_bi_name.
  12.  
  13. DATA: ess      LIKE apqi OCCURS 0 WITH HEADER LINE,
  14.       esp      LIKE apqi OCCURS 0 WITH HEADER LINE,
  15.       eax      LIKE bdcdata OCCURS 0 WITH HEADER LINE,
  16.       ah(20),
  17.       al(20),
  18.       ebx(60),
  19.       ecx(2)   TYPE n,
  20.       edx(2)   TYPE n,
  21.       edi(255),
  22.       esi      LIKE eax.
  23.  
  24. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  25. *--[ IECI:INI 20200519 Ejemplo de USO
  26. * Ini : BAT-BI v 1.3 ----------------- 07.01.2005
  27. DEFINE bi_create.
  28.   DATA: bi_tab LIKE bdcdata OCCURS 0 WITH HEADER LINE,
  29.         bi_err LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE,
  30.         bi_mod(1) VALUE 'N',
  31.         bi_upd(1) VALUE 'S',
  32.         bi_wt100      LIKE t100,
  33.         bi_tt LIKE tline OCCURS 0 WITH HEADER LINE,
  34.         bi_tout(255) OCCURS 0 WITH HEADER LINE,
  35.         bi_amp TYPE x VALUE 80. "Truco
  36.   FIELD-SYMBOLS: <bi_fs>.
  37. END-OF-DEFINITION.
  38.  
  39. DEFINE bi_clear.
  40.   CLEAR: bi_tab, bi_err, bi_tt, bi_tout.
  41.   REFRESH: bi_tab, bi_err, bi_tt, bi_tout.
  42. END-OF-DEFINITION.
  43.  
  44. DEFINE bi_add.
  45.   CLEAR bi_tab.
  46.   IF NOT &1 IS INITIAL.
  47.      bi_tab-program  = &2.
  48.      bi_tab-dynpro   = &3.
  49.      bi_tab-dynbegin = 'X'.
  50.      IF &1 NE 'X'.
  51.         APPEND bi_tab.
  52.         CLEAR bi_tab.
  53.         bi_tab-fnam = 'BDC_OKCODE'.
  54.         bi_tab-fval = &1.
  55.      ENDIF.
  56.   ELSE.
  57.      bi_tab-fnam     = &2.
  58.      bi_tab-fval     = &3.
  59.   ENDIF.
  60.   APPEND bi_tab.
  61. END-OF-DEFINITION.
  62.  
  63. DEFINE bi_call.
  64.   CALL TRANSACTION &1 USING bi_tab MODE bi_mod UPDATE bi_upd
  65.                    MESSAGES INTO bi_err.
  66. END-OF-DEFINITION.
  67.  
  68. DEFINE bi_error.
  69.   REFRESH bi_tt.
  70.   DESCRIBE TABLE bi_err LINES sy-pexpi.
  71.   CHECK sy-pexpi GT 0.
  72.   SORT bi_err.
  73.   DELETE ADJACENT DUPLICATES FROM bi_err.
  74. * Se subrimen los mensajes de tipo 'S' num: 402:"Campo tranf. a visu" y
  75. *                                      num: 432:"Sistema ha ejecutado c.
  76.   DELETE bi_err WHERE msgtyp = 'S'
  77.                    AND ( msgnr = '402' OR msgnr = '432'
  78.                            OR msgnr = '000' ).
  79.   LOOP AT bi_err.
  80.     CLEAR bi_wt100.
  81.     SELECT SINGLE text INTO bi_wt100-text FROM t100
  82.                   WHERE sprsl = sy-langu     AND
  83.                         arbgb = bi_err-msgid AND
  84.                         msgnr = bi_err-msgnr.
  85.     IF sy-subrc = 0 AND NOT bi_wt100-text IS INITIAL.
  86. *      d_len = strlen( bi_err-msgv1 ).
  87.       CLEAR sy-pexpi.
  88.       TRANSLATE bi_wt100-text USING ' ~'.
  89.       SPLIT bi_wt100-text AT bi_amp INTO TABLE bi_tout.
  90.       CLEAR bi_wt100-text.
  91.       LOOP AT bi_tout.
  92.         CHECK NOT bi_tout IS INITIAL.
  93.         ADD 1 TO sy-pexpi.
  94.         IF sy-pexpi < 5.
  95.            CONCATENATE 'bi_err-msgv' sy-pexpi INTO sy-repi2.
  96.            ASSIGN (sy-repi2) TO <bi_fs>.
  97.         ENDIF.
  98.         CONCATENATE bi_wt100-text bi_tout <bi_fs> INTO bi_wt100-text.
  99.         CONDENSE bi_wt100-text NO-GAPS.
  100.       ENDLOOP.
  101.       CONDENSE bi_wt100-text NO-GAPS.
  102.       TRANSLATE bi_wt100-text USING '~ '.
  103.       bi_tt-tdline = bi_wt100-text.
  104.       APPEND bi_tt.
  105.     ENDIF.
  106.   ENDLOOP.
  107.   DESCRIBE TABLE  bi_tt LINES sy-pexpi.
  108.   CHECK sy-pexpi > 0.
  109. * Si contiene errores.se muestran en una ventana.
  110.   CALL FUNCTION 'COPO_POPUP_TO_DISPLAY_TEXTLIST'
  111.   EXPORTING task       = 'DISPLAY'
  112.             titel      = 'Errores en transaccin'
  113.   TABLES    text_table = bi_tt.
  114. END-OF-DEFINITION.
  115. * Fin : BAT-BI v 1.3 ----------------- 07.01.2005
  116.  
  117. **Ejemplo
  118. *end-of-selection.
  119. *   bi_create.
  120. *   bi_clear.
  121. *   bi_add: 'X' 'SAPLWBABAP' '0100',
  122. *           ' ' 'BDC_OKCODE' '=BACK'.
  123. *   bi_call 'SE38'.
  124. *--[ IECI:FIN 20200519 Ejemplo de USO
  125. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  126.  
  127. START-OF-SELECTION.
  128.   PERFORM data_bi_get.
  129.   PERFORM data_bi_list.
  130.  
  131. FORM data_bi_to_db_clipboard.
  132.  
  133.   TYPES:
  134.     BEGIN OF ty_clipdata,
  135.       data TYPE c LENGTH 500,
  136.     END   OF ty_clipdata.
  137.  
  138.   DATA: lt_clipdata TYPE STANDARD TABLE OF ty_clipdata.
  139.   DATA: ls_clipdata LIKE LINE OF lt_clipdata.
  140.  
  141.   CALL FUNCTION 'BDC_OBJECT_READ'
  142.     EXPORTING
  143.       queue_id         = ess-qid
  144.     TABLES
  145.       dynprotab        = eax
  146.     EXCEPTIONS
  147.       not_found        = 1
  148.       system_failure   = 2
  149.       invalid_datatype = 3
  150.       OTHERS           = 4.
  151. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  152. *--[  Grabamos en tabla
  153.   IF NOT p_save  IS INITIAL." AND NOT p_name IS INITIAL.
  154.  
  155.     TYPES: BEGIN OF ty_100,
  156.              mandt       TYPE mandt,
  157.              bi_name     TYPE c LENGTH 20,
  158.              bi_cont     TYPE n LENGTH 4,
  159.              bi_no_actiu TYPE xfeld,
  160.              bi_dynbegin TYPE bdc_start,
  161.              bi_program  TYPE bdc_prog,
  162.              bi_dynpro   TYPE bdc_dynr,
  163.              bi_fnam     TYPE fnam_____4,
  164.              bi_fval     TYPE bdc_fval,
  165.              bi_desc     TYPE c LENGTH 60,
  166.            END OF ty_100.
  167.  
  168.     DATA: l_100 TYPE z58_int_tb_100. "<-- BD Tabla como la ty_100
  169.     l_100-bi_name = p_name.
  170.     l_100-bi_cont = 0.
  171. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  172. *--[ Borramos la tabla de BI
  173.     DATA: t_sval   TYPE STANDARD TABLE OF sval,
  174.           l_sval   TYPE sval,
  175.           l_return TYPE c.
  176.  
  177.     l_sval-tabname = 'Z58_INT_TB_100'.
  178.     l_sval-fieldname = 'BI_NAME'.
  179.     l_sval-value     = ess-groupid.
  180.     l_sval-field_obl = 'X'.
  181.     APPEND l_sval TO t_sval.
  182. *FIELD_ATTR
  183. *FIELD_OBL
  184. *COMP_CODE
  185. *FIELDTEXT
  186. *COMP_TAB
  187. *COMP_FIELD
  188. *NOVALUEHLP
  189.  
  190.     CALL FUNCTION 'POPUP_GET_VALUES'
  191.       EXPORTING
  192. *       NO_VALUE_CHECK  = ' '
  193.         popup_title     = 'Nom del BI'
  194.         start_column    = '45'
  195.         start_row       = '8'
  196.       IMPORTING
  197.         returncode      = l_return
  198.       TABLES
  199.         fields          = t_sval
  200.       EXCEPTIONS
  201.         error_in_fields = 1
  202.         OTHERS          = 2.
  203.     READ TABLE t_sval INTO l_sval INDEX 1.
  204.     p_name = l_sval-value.
  205.  
  206.  
  207.     DELETE FROM z58_int_tb_100 WHERE bi_name = p_name.
  208.     LOOP AT eax.
  209.       ADD 10 TO l_100-bi_cont.
  210.       l_100-bi_dynbegin = eax-dynbegin.
  211.       l_100-bi_program  = eax-program.
  212.       l_100-bi_dynpro   = eax-dynpro.
  213.       l_100-bi_fnam     = eax-fnam.
  214.       l_100-bi_fval     = eax-fval.
  215.       l_100-bi_desc = ''.
  216.       CLEAR edi.
  217.       IF NOT eax-program IS INITIAL.
  218.         PERFORM descrip_dynp.
  219.       ELSE.
  220.         IF eax-fnam CA '-'. PERFORM descrip_field. ENDIF.
  221.         IF eax-dynbegin = 'T'.
  222.           esi = l_100-bi_fnam.
  223.           PERFORM descrip_tran.
  224.         ENDIF.
  225.       ENDIF.
  226.       l_100-bi_desc = edi.
  227.       SHIFT l_100-bi_desc LEFT DELETING LEADING '"'.
  228.       SHIFT l_100-bi_desc LEFT DELETING LEADING ' '.
  229. *--[ Insertamos en tabla
  230.       INSERT z58_int_tb_100 FROM l_100. "<-- BD tabla como la ty_100
  231.     ENDLOOP.
  232.   ENDIF.
  233.  
  234. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  235. *--[ Volcamos en salida
  236.   LOOP AT eax.
  237.     IF eax-dynbegin = 'T'.
  238.       CONCATENATE 'bi_call ''' esi-fnam '''.' INTO edi.
  239.       CONDENSE edi.
  240.       PERFORM descrip_tran.
  241.       esi = eax.
  242.       IF sy-tabix NE 1.
  243. *        WRITE: / edi.
  244.         ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
  245. *        SKIP 1.
  246.       ENDIF.
  247.       IF sy-tabix = 1. "WRITE: / 'bi_create.'.
  248.         ls_clipdata = 'bi_create.'. APPEND ls_clipdata TO lt_clipdata.
  249.       ENDIF.
  250. *      WRITE: / 'bi_clear.', / 'bi_add:'.
  251.       ls_clipdata = 'bi_clear. bi_add:'. APPEND ls_clipdata TO lt_clipdata.
  252.       CONTINUE.
  253.     ENDIF.
  254.     IF NOT eax-program IS INITIAL.
  255.       CONCATENATE  '''X'' ''' eax-program ''' ''' eax-dynpro
  256.                    ''',' INTO edi.
  257.       CONDENSE edi.
  258.       PERFORM descrip_dynp.
  259.     ELSE.
  260.       edx = 0.
  261.       ecx = strlen( eax-fval ).
  262.       IF ecx NE 0.
  263.         TRANSLATE eax-fval+edx(ecx) USING ' ~'.
  264.       ENDIF.
  265.       IF eax-fnam NP 'BDC*SCR'.
  266.         CONCATENATE ''' '' ''' eax-fnam ''' ''' eax-fval ''''
  267.                     ',' INTO edi.
  268.       ELSE.
  269.         CONCATENATE ''' '' ''' eax-fnam ''''  INTO edi.
  270.       ENDIF.
  271.       CONDENSE edi.
  272.       TRANSLATE edi USING '~ '.
  273.       IF eax-fnam CP 'BDC*SOR'.
  274.         IF edi NA '()'. CONTINUE. ENDIF.
  275.       ENDIF.
  276.       IF eax-fnam CA '-'. PERFORM descrip_field. ENDIF.
  277.     ENDIF.
  278. *    WRITE: /9 edi. ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
  279.     IF eax-fnam CP 'BDC*SCR'.
  280.       CONCATENATE '''' eax-fval ''',' INTO edi. CONDENSE edi.
  281.       TRANSLATE edi USING '~ '.
  282. *      WRITE /9 edi.
  283.       ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
  284.     ENDIF.
  285.   ENDLOOP.
  286.   CONCATENATE 'bi_call ''' esi-fnam '''.' INTO edi. CONDENSE edi.
  287.   PERFORM descrip_tran.
  288. *  WRITE: / edi.
  289.   ls_clipdata = edi. APPEND ls_clipdata TO lt_clipdata.
  290.   LOOP AT lt_clipdata INTO ls_clipdata WHERE data CP '''*'.
  291.     CONCATENATE '         '  ls_clipdata-data INTO ls_clipdata-data RESPECTING BLANKS.
  292.     MODIFY lt_clipdata INDEX sy-tabix FROM ls_clipdata.
  293.   ENDLOOP.
  294.   DATA: lv_rc TYPE i.
  295.   cl_gui_frontend_services=>clipboard_export(
  296.     IMPORTING
  297.       data                 = lt_clipdata
  298.     CHANGING
  299.       rc                   = lv_rc
  300.     EXCEPTIONS
  301.       cntl_error           = 1
  302.       error_no_gui         = 2
  303.       not_supported_by_gui = 3
  304.       no_authority         = 4
  305.       OTHERS               = 5 )
  306.           .
  307.   MESSAGE s398(00) WITH 'BI copiado al clipboard'.
  308. ENDFORM.
  309.  
  310. FORM descrip_tran.
  311.   SELECT SINGLE ttext INTO ebx FROM tstct WHERE sprsl = sy-langu
  312.                                             AND tcode = esi-fnam.
  313.   CONCATENATE edi ' "' ebx INTO edi.
  314. ENDFORM.
  315.  
  316. FORM descrip_dynp.
  317.   SELECT SINGLE dtxt INTO ebx FROM d020t WHERE prog = eax-program
  318.                                            AND dynr = eax-dynpro
  319.                                            AND lang = sy-langu.
  320.   CONCATENATE edi ' "' ebx INTO edi.
  321. ENDFORM.
  322.  
  323. FORM descrip_field.
  324.   SPLIT eax-fnam AT '-' INTO ah al.
  325.   CHECK NOT ah IS INITIAL AND NOT al IS INITIAL.
  326.   SEARCH al FOR '('.
  327.   IF sy-subrc EQ 0.
  328.     sy-index = 0.
  329.     al = al+sy-index(sy-fdpos).
  330.   ENDIF.
  331.   SELECT SINGLE rollname INTO ebx FROM dd03l WHERE tabname = ah
  332.                                             AND fieldname  = al.
  333.   CHECK sy-subrc EQ 0.
  334.   SELECT SINGLE ddtext INTO ebx FROM dd04t WHERE rollname = ebx
  335.                                            AND ddlanguage = sy-langu.
  336.   CHECK sy-subrc EQ 0.
  337.   CONCATENATE edi ' "'  ebx INTO edi.
  338. ENDFORM.
  339.  
  340. FORM data_bi_list.
  341.   DATA bess LIKE ess.
  342.  
  343.  
  344.   SORT ess BY credate DESCENDING cretime DESCENDING groupid userid.
  345.  
  346.   DATA: lt_fieldcat TYPE slis_t_fieldcat_alv,
  347.         ls_fieldcat TYPE slis_fieldcat_alv,
  348.         ls_selfield TYPE slis_selfield,
  349.         l_exit(1)   TYPE c.
  350.  
  351.   CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  352.     EXPORTING
  353.       i_structure_name       = 'APQI'
  354.     CHANGING
  355.       ct_fieldcat            = lt_fieldcat
  356.     EXCEPTIONS
  357.       inconsistent_interface = 1
  358.       program_error          = 2
  359.       OTHERS                 = 3.
  360.  
  361.   LOOP AT lt_fieldcat INTO DATA(lf).
  362.     CASE lf-fieldname.
  363.       WHEN 'USERID' OR 'GROUPID' OR 'CREDATE' OR 'CRETIME'." or 'QID'.
  364.         CLEAR sy-subrc.
  365.       WHEN OTHERS.
  366.         lf-no_out = 'X'.
  367.         lf-tech   = 'X'.
  368.     ENDCASE.
  369.     MODIFY lt_fieldcat INDEX sy-tabix FROM lf.
  370.   ENDLOOP.
  371.  
  372.   CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
  373.     EXPORTING
  374.       i_title       = 'Selecciona'
  375.       i_selection   = 'X'
  376.       i_zebra       = 'X'
  377. *     i_checkbox_fieldname = 'FLAG'
  378.       i_tabname     = 'APQI'
  379.       it_fieldcat   = lt_fieldcat
  380.     IMPORTING
  381.       es_selfield   = ls_selfield
  382.       e_exit        = l_exit
  383.     TABLES
  384.       t_outtab      = ess
  385.     EXCEPTIONS
  386.       program_error = 1
  387.       OTHERS        = 2.
  388.  
  389.   IF sy-subrc EQ 0 AND ls_selfield-tabindex > 0.
  390.     READ TABLE ess INDEX ls_selfield-tabindex.
  391.     IF sy-subrc EQ 0.
  392.       PERFORM data_bi_to_db_clipboard.
  393.     ENDIF.
  394.   ELSE.
  395.     CLEAR ess.
  396.   ENDIF.
  397.  
  398. ENDFORM.
  399.  
  400. FORM data_bi_get.
  401.   CLEAR ess. REFRESH ess.
  402.   SELECT * FROM t000 WHERE cccategory = 'C'.
  403.     CLEAR esp. REFRESH esp.
  404.     CALL FUNCTION 'BDC_OBJECT_SELECT'
  405.       EXPORTING
  406.         name             = '*'
  407.         datatype         = '%BDC'
  408.         client           = t000-mandt
  409.       TABLES
  410.         apqitab          = esp
  411.       EXCEPTIONS
  412.         invalid_datatype = 1
  413.         OTHERS           = 2.
  414.     APPEND LINES OF esp TO ess.
  415.   ENDSELECT.
  416. ENDFORM.
  417.  
  418. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  419. *--[ Rutinas de soporte para ser llamadas desde fuera
  420. FORM bi_100_save USING p_name
  421.                        p_bi_tab TYPE bdcdata_tab.
  422.   DATA: bi_100 TYPE z58_int_tb_100  .
  423.   CLEAR bi_100.
  424.  
  425.   SELECT SINGLE * FROM z58_int_tb_100
  426.     INTO CORRESPONDING FIELDS OF bi_100
  427.      WHERE bi_name = p_name.
  428.  
  429.   CHECK sy-subrc NE 0.
  430.  
  431.   bi_100-bi_name = p_name.
  432.   bi_100-bi_cont = 0.
  433.  
  434.   LOOP AT p_bi_tab INTO DATA(l_tab).
  435.     ADD 10 TO bi_100-bi_cont.
  436.  
  437.     bi_100-bi_program  = l_tab-program.
  438.     bi_100-bi_dynpro   = l_tab-dynpro.
  439.     bi_100-bi_dynbegin = l_tab-dynbegin.
  440.     bi_100-bi_fnam     = l_tab-fnam.
  441.     bi_100-bi_fval     = l_tab-fval.
  442.  
  443.     INSERT z58_int_tb_100 FROM bi_100.
  444.   ENDLOOP.
  445.  
  446. ENDFORM.
  447.  
  448. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  449. *--[ Carga un BI
  450. FORM bi_100_load USING p_name
  451.                  CHANGING p_bi_tab TYPE bdcdata_tab.
  452.   DATA: bi_100 TYPE z58_int_tb_100  .
  453.   SELECT SINGLE * FROM z58_int_tb_100
  454.     INTO CORRESPONDING FIELDS OF bi_100
  455.      WHERE bi_name = p_name.
  456.   CHECK sy-subrc EQ 0.
  457.   REFRESH p_bi_tab.
  458.   SELECT bi_program AS program
  459.          bi_dynpro  AS dynpro
  460.          bi_dynbegin AS dynbegin
  461.          bi_fnam     AS fnam
  462.          bi_fval     AS fval
  463.     FROM z58_int_tb_100
  464.     INTO CORRESPONDING FIELDS OF TABLE p_bi_tab
  465.      WHERE bi_name = p_name AND
  466.            bi_no_actiu NE 'X' AND
  467.            bi_dynbegin NE 'T'. "<-- La transacción no hay que traerla
  468.  
  469. ENDFORM.
  470.  
  471.  
  472. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  473. *--[ Modifica valores de todos los campos del BI
  474. FORM bi_100_fill USING p_field
  475.                        p_value
  476.                        p_bi_tab TYPE bdcdata_tab.
  477.  
  478.   LOOP AT p_bi_tab INTO DATA(l_tab).
  479.     CHECK ( p_field CA '*' AND l_tab-fnam CP  p_field ) OR
  480.          ( l_tab-fnam = p_field ).
  481.     l_tab-fval = p_value.
  482.     MODIFY p_bi_tab INDEX sy-tabix FROM l_tab.
  483.   ENDLOOP.
  484.  
  485. ENDFORM.
  486.  
  487.  
  488. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  489. *--[ Modifica la clave de un BI
  490. FORM bi_100_fill_key USING p_field
  491.                            p_value
  492.                            p_bi_tab TYPE bdcdata_tab.
  493.  
  494.   LOOP AT p_bi_tab INTO DATA(l_tab).
  495.     CHECK ( p_field CA '*' AND l_tab-fnam CP  p_field ) OR
  496.          ( l_tab-fnam = p_field ).
  497.     l_tab-fnam = p_value.
  498.     MODIFY p_bi_tab INDEX sy-tabix FROM l_tab.
  499.   ENDLOOP.
  500.  
  501. ENDFORM.