PDA

Ver la Versión Completa : Cargas masivas


jhon Cano
11/08/14, 20:29:53
buenas tardes para todos

cree un programa que permite cargar masiva-mente unos registros a una tabla Z, por call transaction y al cargar el txt, al consultar la tabla los datos aparecen desordenados y en un solo campo, que puede estar pasando?

estoy atento a sus comentarios, muchas gracias

MarioMoralesG
11/08/14, 21:32:49
Hola jhon Cano,

Adjunta tu código para poder ayudarte.

jhon Cano
12/08/14, 14:30:19
Hola Mario M.
este es el código

REPORT ZPRUEBA_BATCH_INPUT.

*----------------------------------------------------------------------*
* Declaracion de includes
*----------------------------------------------------------------------*
TYPE-POOLS: slis.

* Tabla del BI con la estructura de BDCDATA
DATA: BEGIN OF ti_bdc_data OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF ti_bdc_data.

* Estructura del BI
DATA: st_bdc_data TYPE bdcdata.

* Tabla de mensajes
DATA: BEGIN OF ti_messages OCCURS 0.
INCLUDE STRUCTURE bdcmsgcoll.
DATA: END OF ti_messages.

* Estructura de mensajes
DATA: st_messages TYPE bdcmsgcoll.

* Tabla de usuarios
DATA: ti_archivo TYPE STANDARD TABLE OF ztabla_cliente,
st_archivo LIKE LINE OF ti_archivo.

* Tabla de errores
DATA: BEGIN OF ti_errores OCCURS 0,
dni_cedula TYPE z_dni,
descripcion(100) TYPE c,
END OF ti_errores.

* Estructura de errores
DATA: st_errores LIKE LINE OF ti_errores.

* Variables
DATA: v_mensaje(100) TYPE c,
v_error(1) TYPE c,
v_cod_trans(4) TYPE c VALUE 'SM30',
v_modo(1) TYPE c,
v_update(1) TYPE c,
v_titulo LIKE sy-title,
v_campo(35) TYPE c,
v_indice(2) TYPE c,
v_repid LIKE sy-repid,
v_msg_id LIKE t100-arbgb,
v_msg_no LIKE t100-msgnr,
v_msg_v1 LIKE balm-msgv1,
v_msg_v2 LIKE balm-msgv2,
v_msg_v3 LIKE balm-msgv3,
v_msg_v4 LIKE balm-msgv4,
v_procesados_ok TYPE i,
v_procesados_error TYPE i,
v_procesados TYPE i,
v_reg(10) TYPE c,
v_dni LIKE ztabla_cliente-dni_cedula.

* Tablas y estructuras del ALV
DATA: st_layout TYPE slis_layout_alv,
ti_fieldcat TYPE slis_t_fieldcat_alv,
st_fieldcat TYPE slis_fieldcat_alv,
ti_header TYPE slis_t_listheader,
st_header TYPE slis_listheader.

*--------------------------------------------------------------------*
* Pantalla de selección
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK z1 WITH FRAME TITLE text-007.
* Archivo de entrada
PARAMETERS: p_path LIKE rlgrap-filename.

SELECTION-SCREEN BEGIN OF BLOCK z2 WITH FRAME TITLE text-008.
* Modo procesamiento BI
PARAMETER: p_a RADIOBUTTON GROUP rb2,
p_n RADIOBUTTON GROUP rb2.
SELECTION-SCREEN END OF BLOCK z2.

SELECTION-SCREEN BEGIN OF BLOCK z3 WITH FRAME TITLE text-008.
* Modo Actualización BI
PARAMETER: p_asin RADIOBUTTON GROUP rb3,
p_sin RADIOBUTTON GROUP rb3.
SELECTION-SCREEN END OF BLOCK z3.

SELECTION-SCREEN END OF BLOCK z1.

*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
*--------------------------------------------------------------------*
* Abrir ventana de archivos
PERFORM abrir_ventana_archivos.

*--------------------------------------------------------------------*
START-OF-SELECTION.
*--------------------------------------------------------------------*
* Levanto el archivo de entrada
PERFORM levantar_archivo_entrada.

* Procesamiento de los datos
PERFORM procesamiento_datos.

*--------------------------------------------------------------------*
END-OF-SELECTION.
*--------------------------------------------------------------------*
* Listado de errores si los hay
PERFORM listado_errores.


*&---------------------------------------------------------------------*
*& Form bdc_field
*&---------------------------------------------------------------------*
FORM bdc_field USING dyn_begin TYPE c
campo1
campo2.
CLEAR st_bdc_data.

IF dyn_begin = 'X'.
st_bdc_data-program = campo1.
st_bdc_data-dynpro = campo2.
st_bdc_data-dynbegin = dyn_begin.
ELSE.
st_bdc_data-fnam = campo1.
st_bdc_data-fval = campo2.
ENDIF.

APPEND st_bdc_data TO ti_bdc_data.

ENDFORM. " bdc_field
*&---------------------------------------------------------------------*
*& Form LEVANTAR_ARCHIVO_ENTRADA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM levantar_archivo_entrada .

DATA: vl_file TYPE string.

IF p_path IS INITIAL.
MESSAGE s000(z_prueba) WITH text-003.
ELSE.

vl_file = p_path.

* Se abre el archivo de entrada para lectura
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = vl_file
filetype = 'ASC'
has_field_separator = ''
CHANGING
data_tab = ti_archivo[]
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
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19.

IF sy-subrc NE 0.
MESSAGE e000(z_prueba) WITH text-004.
ENDIF.

IF ti_archivo[] IS INITIAL.
MESSAGE s000(z_prueba) WITH text-005.
ENDIF.

ENDIF.

ENDFORM. " LEVANTAR_ARCHIVO_ENTRADA
*&---------------------------------------------------------------------*
*& Form CARGO_TABLA_BDCDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM cargo_tabla_bdcdata .

CLEAR: ti_bdc_data, ti_messages.
REFRESH: ti_bdc_data, ti_messages.

* Ingreso a la Primer pantalla y presiono boton de mantenimiento
PERFORM bdc_field USING 'X' 'SAPMSVMA' '0100'.
PERFORM bdc_field USING ' ' 'VIEWNAME' 'ZTABLA_CLIENTE'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=UPD'.

* Presiono boton de nuevas entradas
PERFORM bdc_field USING 'X' 'SAPLZTABLA_CLIENTE' '0001'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=NEWL'.

ADD 1 TO v_indice.
PERFORM completo_ceros_izq.

* Cargo datos del usuario
PERFORM bdc_field USING 'X' 'SAPLZTABLA_CLIENTE' '0001'.

CLEAR v_campo.
CONCATENATE 'ZTABLA_CLIENTE-DNI_CEDULA(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-dni_cedula.

CLEAR v_campo.
CONCATENATE 'ZTABLA_CLIENTE-NOMBRE_A(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-nombre_a.

CLEAR v_campo.
CONCATENATE 'ZTABLA_CLIENTE-NOMBRE_EMPRESA(' v_indice ')'INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-nombre_empresa.

CLEAR v_campo.
CONCATENATE 'ZTABLA_CLIENTE-DIRECCION(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-direccion.

CLEAR v_campo.
CONCATENATE 'ZTABLA_CLIENTE-CIUDAD_A(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-ciudad_a.

CLEAR v_campo.
CONCATENATE 'ZTABLA_CLIENTE-PAIS(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-pais.

* Grabo los Registros
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=SAVE'.

* Cierro la segunda pantalla
PERFORM bdc_field USING 'X' 'SAPLZTABLA_CLIENTE' '0001'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=ENDE'.

* Cierro la primer pantalla
PERFORM bdc_field USING 'X' 'SAPMSVMA' '0100'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '/EENDE'.
ENDFORM. " CARGO_TABLA_BDCDATA
*&---------------------------------------------------------------------*
*& Form ABRIR_VENTANA_ARCHIVOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM abrir_ventana_archivos .

DATA: tl_filetable TYPE filetable,
stl_file_table TYPE file_table,
vl_rc TYPE i.

CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
default_filename = '*'
CHANGING
rc = vl_rc
file_table = tl_filetable.

READ TABLE tl_filetable INDEX 1 INTO stl_file_table.

IF sy-subrc EQ 0.
MOVE stl_file_table TO p_path.
ENDIF.

ENDFORM. " ABRIR_VENTANA_ARCHIVOS
*&---------------------------------------------------------------------*
*& Form PROCESAMIENTO_DATOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM procesamiento_datos.

IF NOT ti_archivo[] IS INITIAL.

CLEAR: v_procesados_error,
v_procesados_ok.

LOOP AT ti_archivo INTO st_archivo.

* Verificamos si es registro a insertar ya existe en la tabla, si es
* asi continuamos con el siguiente
CLEAR v_dni.
SELECT SINGLE dni_cedula
FROM ztabla_cliente
INTO v_dni
WHERE dni_cedula EQ st_archivo-dni_cedula.

IF sy-subrc EQ 0.

CLEAR st_errores.
st_errores-dni_cedula = st_archivo-dni_cedula.
CONCATENATE 'El DNI'
st_archivo-dni_cedula'ya existe en ZTABLA_USUARIOS '
INTO st_errores-descripcion.
APPEND st_errores TO ti_errores.

* Continuamos con el proximo registro de TI_ARCHIVO
CONTINUE.

ENDIF.

* Carga de la tabla BDCDATA
PERFORM cargo_tabla_bdcdata.

* Realizo el Call transaction a la SM30
PERFORM call_sm30.

IF v_error IS INITIAL.

ADD 1 TO v_procesados_ok.

ELSE.

* Recupero los mensajes de error
READ TABLE ti_messages INDEX 1 INTO st_messages.

CLEAR: ti_errores, st_errores.
st_errores-descripcion = text-002.

IF sy-subrc = 0.
v_msg_id = st_messages-msgid .
v_msg_no = st_messages-msgnr.
v_msg_v1 = st_messages-msgv1.
v_msg_v2 = st_messages-msgv2.
v_msg_v3 = st_messages-msgv3.
v_msg_v4 = st_messages-msgv4.

CALL FUNCTION 'MESSAGE_PREPARE'
EXPORTING
msg_id = v_msg_id
msg_no = v_msg_no
msg_var1 = v_msg_v1
msg_var2 = v_msg_v2
msg_var3 = v_msg_v3
msg_var4 = v_msg_v4
IMPORTING
msg_text = v_mensaje
EXCEPTIONS
function_not_completed = 1
message_not_found = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

CLEAR st_errores.
st_errores-descripcion = v_mensaje.

ENDIF.

st_errores-dni_cedula = st_archivo-dni_cedula.
APPEND st_errores TO ti_errores.

ENDIF.

ENDLOOP.

ENDIF.

ENDFORM. " PROCESAMIENTO_DATOS
*&---------------------------------------------------------------------*
*& Form CALL_SM30
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM call_sm30 .

CLEAR: ti_messages, v_error.
REFRESH ti_messages.

* Modo de procesamiento
IF p_a = 'X'.
v_modo = 'A'.
ELSE.
v_modo = 'N'.
ENDIF.

* Modo de actualización
IF p_asin = 'X'.
v_update = 'A'.
ELSE.
v_update = 'N'.
ENDIF.

* Call transaction
CALL TRANSACTION v_cod_trans USING ti_bdc_data MODE v_modo UPDATE
v_update
MESSAGES INTO ti_messages.

IF NOT sy-subrc IS INITIAL.
v_error = 'X'.
ENDIF.

ENDFORM. " CALL_SM30
*&---------------------------------------------------------------------*
*& Form LISTADO_ERRORES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM listado_errores .

* Seteo del layout de salida del listado.
PERFORM layout_alv.

* Seteo de las columnas a mostrar
PERFORM fieldcat_alv.

* Impresión de los comentarios en la cabecera
PERFORM cabecera_alv.

v_repid = sy-repid.

* ALV Grid
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = v_repid
i_callback_top_of_page = 'TOP_OF_PAGE'
i_structure_name = 'TI_ERRORES'
is_layout = st_layout
it_fieldcat = ti_fieldcat[]
TABLES
t_outtab = ti_errores
EXCEPTIONS
program_error = 1
OTHERS = 2.

IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " LISTADO_ERRORES
*&---------------------------------------------------------------------*
*& Form LAYOUT_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM layout_alv .

* Seteo de la Visualización.
st_layout-zebra = 'X'. " Rayado de lineas
st_layout-no_min_linesize = 060. " Tamaño líneas en la página.
st_layout-min_linesize = sy-linsz. " Mínima long de la linea.
st_layout-max_linesize = sy-linsz. " Máxima long de la linea.

ENDFORM. " LAYOUT_ALV
*&---------------------------------------------------------------------*
*& Form FIELDCAT_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fieldcat_alv .

* Dni
CLEAR st_fieldcat.
st_fieldcat-fieldname = 'DNI'.
st_fieldcat-tabname = 'TI_ERRORES'.
st_fieldcat-seltext_l = 'DNI'.
st_fieldcat-seltext_m = 'DNI'.
st_fieldcat-seltext_s = 'DNI'.
st_fieldcat-outputlen = 10.
APPEND st_fieldcat TO ti_fieldcat.

* Descripcion
CLEAR st_fieldcat.
st_fieldcat-fieldname = 'DESCRIPCION'.
st_fieldcat-tabname = 'TI_ERRORES'.
st_fieldcat-seltext_l = 'DESCRIPCION'.
st_fieldcat-seltext_m = 'DESCRIPCION'.
st_fieldcat-seltext_s = 'DESCRIPCION'.
st_fieldcat-outputlen = 40.
APPEND st_fieldcat TO ti_fieldcat.

ENDFORM. " FIELDCAT_ALV
*&---------------------------------------------------------------------*
*& Form CABECERA_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM cabecera_alv .

* Impresión stantandar para los títulos y comentarios
v_titulo = text-030.
REFRESH ti_header.

* Impresión del Título de la lista - 'H'.
CLEAR st_header.
st_header-typ = 'H'.
st_header-info = v_titulo.
APPEND st_header TO ti_header.

* Registros procesados
CLEAR st_header.
st_header-typ = 'S'.

CLEAR: v_procesados, v_reg.
DESCRIBE TABLE ti_archivo LINES v_procesados.

v_reg = v_procesados.
CONCATENATE 'CANTIDAD DE REGISTROS PROCESADOS: ' v_reg
INTO st_header-info.

CONDENSE st_header-info.
APPEND st_header TO ti_header.

* Registros procesados OK
CLEAR st_header.
st_header-typ = 'S'.

CLEAR v_reg.
v_reg = v_procesados_ok.
CONCATENATE 'CANTIDAD DE REGISTROS PROCESADOS OK: ' v_reg
INTO st_header-info.

CONDENSE st_header-info.
APPEND st_header TO ti_header.

* Registros Erroneos
CLEAR st_header.
st_header-typ = 'S'.

CLEAR v_procesados_error.
DESCRIBE TABLE ti_errores LINES v_procesados_error.

v_reg = v_procesados_error.
CONCATENATE 'CANTIDAD DE REGISTROS PROCEDADOS CON ERROR: ' v_reg
INTO st_header-info.

CONDENSE st_header-info.
APPEND st_header TO ti_header.

ENDFORM. " CABECERA_ALV
*&---------------------------------------------------------------------*
*& Form COMPLETO_CEROS_IZQ
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM completo_ceros_izq .

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = v_indice
IMPORTING
output = v_indice.

ENDFORM. " COMPLETO_CEROS_IZQ
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM top_of_page.

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = ti_header.

ENDFORM. "top_of_page

MarioMoralesG
13/08/14, 21:23:50
Hola jhon Cano,

Una consulta porque utilizas la técnica de batch input y no un insert directo a la tabla z.

jhon Cano
21/08/14, 20:23:18
Hola Mario

estoy realizando una prueba con batch input, y aun no manejo la tecnica de insert directo a la tabla z.