Cargas masivas

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jhon Cano
    Junior Member
    • ago
    • 5

    #1

    Cargas masivas

    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
    Junior Member
    • ago
    • 10

    #2
    Ayuda

    Hola jhon Cano,

    Adjunta tu código para poder ayudarte.
    Saludos Cordiales

    Comentario

    • jhon Cano
      Junior Member
      • ago
      • 5

      #3
      código

      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

      Comentario

      • MarioMoralesG
        Junior Member
        • ago
        • 10

        #4
        Ayuda

        Hola jhon Cano,

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

        Comentario

        • jhon Cano
          Junior Member
          • ago
          • 5

          #5
          Hola Mario

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

          Comentario

          Trabajando...