Etiquetas

20111220

ABAP: Ejemplo de Batch Input con resumen en ALV

Un ejemplo para hacer copy/paste de un Batch Input con salida en LVC, donde hubo que hacer un split a la tabla ya que la misma función de carga GUI_UPLOAD no estaba separando los valores.






*&---------------------------------------------------------------------*
*& Report ZHR_LIMITAR_POSICIONES
*&
*&---------------------------------------------------------------------*
REPORT zhr_limitar_posiciones
NO STANDARD PAGE HEADING.

**********************************************************************
*DECLARACION DATOS
**********************************************************************
INCLUDE <icon>.

************************************************************************
*INCLUDE BDCRECX1.
************************************************************************
TABLES t100.
DATA bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.

************************************************************************
* DATOS BI y ALV
************************************************************************
DATA: l_mstring(480).
DATA: l_subrc LIKE sy-subrc.

TYPES: BEGIN OF st_data,
plans(8), "posicion
endda(10), "fecha limite.
END OF st_data.

TYPES: BEGIN OF st_salida,
plans TYPE plans,
plstx TYPE plstx,
endda TYPE endda,

icon(4),
message TYPE string,
END OF st_salida.

DATA ti_data TYPE TABLE OF st_data WITH HEADER LINE.
DATA ti_salida TYPE TABLE OF st_salida.
DATA st_salida TYPE st_salida.

DATA inicio TYPE i.

CONSTANTS c_ok TYPE string VALUE 'OK'.


************************************************************************
* ALV *
************************************************************************
DATA:
gs_layout TYPE lvc_s_layo,
gs_fieldcat TYPE lvc_t_fcat,
g_exit_caused_by_caller,
gs_exit_caused_by_user TYPE slis_exit_by_user,
g_repid LIKE sy-repid.
*Variants
DATA: gs_variant LIKE disvariant,
g_save.
*"Callback
DATA:
gt_events TYPE slis_t_event,
gt_list_top_of_page TYPE slis_t_listheader.


**********************************************************************
*PANTALLA SELECCION y EVENTOS
**********************************************************************
*** Pantalla
* p_file: Archivo
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY.

SELECTION-SCREEN BEGIN OF LINE.
* text-c01: ¿Archivo tiene linea de cabecera?
SELECTION-SCREEN COMMENT (33) text-c01 FOR FIELD p_header.
PARAMETERS p_header AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
*p_sep: Separador de columnas
PARAMETERS p_sep DEFAULT ';'.

*** Eventos
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_FILE'
IMPORTING
file_name = p_file.


**********************************************************************
INITIALIZATION.
************************************************************************

**********************************************************************
START-OF-SELECTION.
************************************************************************

PERFORM upload_data TABLES ti_data
USING p_file.

LOOP AT ti_data.

PERFORM graba_registro USING ti_data.
PERFORM procesar_salida USING ti_data.

ENDLOOP.

**********************************************************************
END-OF-SELECTION.
**********************************************************************
PERFORM muestra_alv.

*&---------------------------------------------------------------------*
*& define LLENA_CEROS
*&---------------------------------------------------------------------*
DEFINE llena_ceros.

call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = &1
importing
output = &1.

END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
FORM upload_data TABLES p_ti_data STRUCTURE ti_data
USING p_file TYPE rlgrap-filename.

DATA: ti_str TYPE string OCCURS 0 WITH HEADER LINE,
file TYPE string.

MOVE p_file TO file.

CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = file
has_field_separator = 'X'
TABLES
data_tab = ti_str
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
WRITE / sy-subrc.
EXIT.
ENDIF.

IF p_header IS INITIAL.
inicio = 1.
ELSE.
inicio = 2.
ENDIF.

LOOP AT ti_str FROM inicio.
SPLIT ti_str AT p_sep INTO
p_ti_data-plans
p_ti_data-endda.

llena_ceros: p_ti_data-plans.

APPEND p_ti_data.
ENDLOOP.


ENDFORM. " UPLOAD_DATA

*&---------------------------------------------------------------------*
*& Form PROCESAR_SALIDA
*&---------------------------------------------------------------------*
FORM procesar_salida USING p_ti_data STRUCTURE ti_data.
DATA plstx TYPE stext.

LOOP AT messtab.
MOVE-CORRESPONDING p_ti_data TO st_salida.

CONCATENATE p_ti_data-endda+6(4) p_ti_data-endda+3(2) p_ti_data-endda+0(2)
INTO st_salida-endda.

CALL FUNCTION 'HRWPC_RFC_PLANS_TEXT_GET'
EXPORTING
plans = st_salida-plans
begda = st_salida-endda
endda = st_salida-endda
IMPORTING
plans_text2 = plstx.

st_salida-plstx = plstx.

IF messtab-msgid = 'F2' AND messtab-msgnr = '174'.
WRITE '@08@' TO st_salida-icon AS ICON. "OK
ELSE.
WRITE '@0A@' TO st_salida-icon AS ICON. "Error
ENDIF.

PERFORM procesa_mensaje USING messtab
CHANGING st_salida-message.

APPEND st_salida TO ti_salida.
ENDLOOP.

ENDFORM. " PROCESAR_SALIDA

*&---------------------------------------------------------------------*
*& Form PROCESA_ERROR
*&---------------------------------------------------------------------*
FORM procesa_mensaje USING messtab TYPE bdcmsgcoll
CHANGING message TYPE string.
DATA: l_mstring(480).
free message.

* LOOP AT messtab.
SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra
AND arbgb = messtab-msgid
AND msgnr = messtab-msgnr.
IF sy-subrc = 0.
l_mstring = t100-text.
IF l_mstring CS '&1'.
REPLACE '&1' WITH messtab-msgv1 INTO l_mstring.
REPLACE '&2' WITH messtab-msgv2 INTO l_mstring.
REPLACE '&3' WITH messtab-msgv3 INTO l_mstring.
REPLACE '&4' WITH messtab-msgv4 INTO l_mstring.
ELSE.
REPLACE '&' WITH messtab-msgv1 INTO l_mstring.
REPLACE '&' WITH messtab-msgv2 INTO l_mstring.
REPLACE '&' WITH messtab-msgv3 INTO l_mstring.
REPLACE '&' WITH messtab-msgv4 INTO l_mstring.
ENDIF.
CONDENSE l_mstring.
CONCATENATE message l_mstring(250) INTO message SEPARATED BY space.
ELSE.
l_mstring = messtab-msgv1.
MOVE l_mstring TO message.
ENDIF.
* ENDLOOP.

ENDFORM. " PROCESA_ERROR

*&---------------------------------------------------------------------*
*& Form GRABA_REGISTRO
*&---------------------------------------------------------------------*

FORM graba_registro USING ti_data STRUCTURE ti_data.

PERFORM bdc_dynpro USING 'RHGRENZ0' '1000'.
PERFORM bdc_field USING 'BDC_CURSOR'
'TEST'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ONLI'.
PERFORM bdc_field USING 'PCHPLVAR'
'01'.
PERFORM bdc_field USING 'PCHOTYPE'
'S'.
PERFORM bdc_field USING 'PCHOBJID-LOW'
ti_data-plans.
PERFORM bdc_field USING 'PCHZTR_A'
'X'.
PERFORM bdc_field USING 'G_DAT'
ti_data-endda.
PERFORM bdc_field USING 'ENQ'
'X'.
PERFORM bdc_field USING 'ANZEIGE'
'X'.
PERFORM bdc_field USING 'TEST'
''.
PERFORM bdc_dynpro USING 'SAPMSSY0' '0120'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=&F03'.
PERFORM bdc_dynpro USING 'RHGRENZ0' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/EE'.
PERFORM bdc_field USING 'BDC_CURSOR'
'PCHPLVAR'.
PERFORM bdc_transaction USING 'RE_RHGRENZ0'.

ENDFORM. " GRABA_REGISTRO


*&---------------------------------------------------------------------*
*& Form muestra_alv
*&---------------------------------------------------------------------*
FORM muestra_alv.
DATA: gr_table TYPE REF TO cl_salv_table.

cl_salv_table=>factory( IMPORTING r_salv_table = gr_table
CHANGING t_table = ti_salida
).

PERFORM alv_functions USING gr_table.
PERFORM alv_display USING gr_table.
PERFORM alv_columns USING gr_table.
* PERFORM alv_sort USING gr_table.

gr_table->display( ).

ENDFORM. "muestra_alv

*&---------------------------------------------------------------------*
*& Form ALV_FUNCTIONS
*&---------------------------------------------------------------------*
FORM alv_functions USING p_gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions.

gr_functions = p_gr_table->get_functions( ).
gr_functions->set_all( abap_true ).
ENDFORM. " ALV_FUNCTIONS

*&---------------------------------------------------------------------*
*& Form ALV_DISPLAY
*&---------------------------------------------------------------------*
FORM alv_display USING p_gr_table TYPE REF TO cl_salv_table.
DATA: gr_display TYPE REF TO cl_salv_display_settings.

gr_display = p_gr_table->get_display_settings( ).
gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
* gr_display->set_list_header( ).

ENDFORM. " ALV_DISPLAY

*&---------------------------------------------------------------------*
*& Form ALV_COLUMNS
*&---------------------------------------------------------------------*
FORM alv_columns USING p_gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

gr_columns = p_gr_table->get_columns( ).
gr_columns->set_optimize( abap_true ).


gr_column ?= gr_columns->get_column( 'PLANS' ).
gr_column->set_key( 'X' ).


ENDFORM. " ALV_COLUMNS

*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM. "BDC_DYNPRO

*&---------------------------------------------------------------------*
*& Form BDC_FIELD
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
DATA nodata VALUE '/'.

IF fval <> nodata.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDIF.
ENDFORM. "BDC_FIELD

*&---------------------------------------------------------------------*
*& Form BDC_TRANSACTION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->TCODE text
*----------------------------------------------------------------------*
FORM bdc_transaction USING tcode.
DATA ctumode LIKE ctu_params-dismode VALUE 'N'.
DATA ctu VALUE 'X'.
DATA cupdate LIKE ctu_params-updmode VALUE 'L'.

DATA l_messtab TYPE bdcmsgcoll.

* batch input session
REFRESH messtab.
CALL TRANSACTION tcode USING bdcdata
MODE ctumode
UPDATE cupdate
MESSAGES INTO messtab.
l_subrc = sy-subrc.

IF messtab[] IS INITIAL.
l_messtab-msgid = 'F2'.
l_messtab-msgnr = '174'.
l_messtab-msgv1 = 'Registro actualizado o ya limitado'.
APPEND l_messtab TO messtab.
ENDIF.

REFRESH bdcdata.
ENDFORM. "BDC_TRANSACTION

No hay comentarios:

Publicar un comentario