Batch Input (cargar archivo txt tipo DAT)

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • apeso
    Junior Member
    • mar
    • 3

    #1

    Batch Input (cargar archivo txt tipo DAT)

    Buen día tengan consultores SAP ABAP,

    Tengo el siguiente esqueleto de Batch input para cargar registros a la SM30 mediante la técnica de Call Transaction.

    El detalle creo que está en la subrutina "LEVANTAR_ARCHIVO_ENTRADA" que sólo me permite levantar archivos de tipo ASC, pero si le cambio el parámetro a FILETYPE = 'DAT' y cargo un archivo .txt con texto delimitado por tabulaciones el programa se detiene.

    Ojalá me puedan aconsejar para modificarlo y levantar tipos DAT. Un cordial saludo.

    *&---------------------------------------------------------------------*
    *& Report ZPRUEBA_ABAP_7_4
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*
    REPORT zprueba_abap_7_4.

    *----------------------------------------------------------------------*
    * 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_usuarios,
    st_archivo LIKE LINE OF ti_archivo.

    * Tabla de errores
    DATA: BEGIN OF ti_errores OCCURS 0,
    dni 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_usuarios-dni.

    * 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 = 'DAT'
    * 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_USUARIOS'.
    PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=UPD'.

    * Presiono boton de nuevas entradas
    PERFORM bdc_field USING 'X' 'SAPLZTABLA_USUARIOS' '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_USUARIOS' '0001'.

    CLEAR v_campo.
    CONCATENATE 'ZTABLA_USUARIOS-DNI(' v_indice ')' INTO v_campo.
    PERFORM bdc_field USING ' ' v_campo st_archivo-dni.

    CLEAR v_campo.
    CONCATENATE 'ZTABLA_USUARIOS-NOMBRE_APE(' v_indice ')' INTO v_campo.
    PERFORM bdc_field USING ' ' v_campo st_archivo-nombre_ape.

    CLEAR v_campo.
    CONCATENATE 'ZTABLA_USUARIOS-ESTADO_USU(' v_indice ')' INTO v_campo.
    PERFORM bdc_field USING ' ' v_campo st_archivo-estado_usu.

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

    CLEAR v_campo.
    CONCATENATE 'ZTABLA_USUARIOS-FECHA_NAC(' v_indice ')' INTO v_campo.
    PERFORM bdc_field USING ' ' v_campo st_archivo-fecha_nac.

    CLEAR v_campo.
    CONCATENATE 'ZTABLA_USUARIOS-ESTADO_CIVIL(' v_indice ')' INTO v_campo.
    PERFORM bdc_field USING ' ' v_campo st_archivo-estado_civil.

    CLEAR v_campo.
    CONCATENATE 'ZTABLA_USUARIOS-CODIGO_POSTAL(' v_indice ')' INTO v_campo.
    PERFORM bdc_field USING ' ' v_campo st_archivo-codigo_postal.


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

    * Cierro la segunda pantalla
    PERFORM bdc_field USING 'X' 'SAPLZTABLA_USUARIOS' '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 el registro a insertar ya existe en la tabla, si es
    * asi continuamos con el siguiente
    CLEAR v_dni.
    SELECT SINGLE dni
    FROM ztabla_usuarios
    INTO v_dni
    WHERE dni EQ st_archivo-dni.

    IF sy-subrc EQ 0.

    CLEAR st_errores.
    st_errores-dni = st_archivo-dni.
    CONCATENATE 'El DNI ' st_archivo-dni ' 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 = st_archivo-dni.
    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
    "Lo que haces en la vida, hace eco en la eternidad"
    -Gladiador
Trabajando...