Insertar registros a Tabla Z importando un Excel

Hola amigos Abapers,

Tengo una curiosidad, quisiera crear un programa el cual lea un archivo excel y esos datos guardarlos en una tabla interna, luego de ello me llame a la transacción SM30 (hay una función, no recuerdo el nombre, se los agradecería si alguien lo sabe), al llamar a la SM30 me posicione en Entradas nuevas, y automáticamente se inserten mis datos de la tabla interna a la transacción y de ahi el usuario pueda Guardar.

¿alguien tiene una idea de como poder realizar esta inserción masiva ? .

Saludos.

1 me gusta

me apunto a este tema.
son cosas recurrentes aqui con nosotros esas, y los consultores han pasado de largo con esplicarnos.

Mas adelante pedire yo si existe alguna manera de poder imprimir en modo underground, ya que todas las impresiones mandan a fuerza la ventana de windows o el equivalente en sap y pues eso ya nos lo estan pidiendo a gritos quitarlo sin nostros tener conocimiento :disappointed: :sleepy:

espero te puedan ayudar, y claro me ayudarian igual :hand:

saludos.

1 me gusta

Que tal Wleuyacc, me da la impresión que necesitas leer la utilización de la transacción LSMW, básicamente cubre lo que necesitas hacer. Uno de nuestros amigos del foro @Alvan1 elaboró un tutorial muy bien explicado desde inicio a fin. Lo único que debes de considerar es la creación de tu tabla “Z” la cual quieres alimentar.

http://foros.consultoria-sap.com/t/uso-de-lsmw-legacy-system-migration-workbench/2331/9

Revisalo y me cuentas si logre ayudarte en algo.

3 Me gusta

Hola @Wleuyacc, también otra forma en la que podrías hacer lo que necesitas pero igual y te lleva un poco mas de tiempo o tal vez menos que el LSMW sería crear una grabación en la SM35 haciendo referencia a la SM30 y esa grabación llevarla a código ABAP y ahí hacerle el LOOP a la grabación.

Otra opcion podria ser esta: crear tu propia transacción en la SE93 con los siguientes parámetros


Y crearle la grabación a tu transaccion Z que en este caso es “ZPRB”; y la grabación de la SM35 seria mas directa referenciandola a tu transaccion “Z”.

De igual forma tendrías que hacer tu código ABAP para que funcione al momento de poblarla masivamente.

Ya tienes ahora un par de soluciones, cualquier duda déjanos saber.

-Nota si vas a insertar datos a una tabla transparente ''Z" aclaro solo a una tabla “Z” pues no hay nada mejor que hacerle un insert directo.

1.Subir archivo delimitado con comas desde tu programa ABAP
2.El archivo lo lees y lo separas con el SPLIT y lo metes dentro de una Tabla Interna
3.Lees tu tabla interna y mientras haces el LOOP realizas la sentencia INSERT
4.Y listo con esto quedaría tu actualización de datos

Saludos.

4 Me gusta

Hola @Alvan1 , gracias por tu apoyo, pues si realizare la grabación y lo llevare a código ABAP, apenas tenga el código lo publicare para un apoyo futuro.

Saludos.

2 Me gusta

Disculpa, yo también requiero crear un programa Z, que me lea un doc de excel, para que lo procese y me actualice un campo, Actualmente el usuario lo hace directamente desde la LSMW, pero la intensión es quitarle ese permiso y lo haga desde un Z. Disculpa las molestias y saludos.

Saludos,

Considero que con una LSMW resuelves eso sin ningún inconveniente.

En este curso https://www.udemy.com/paso-a-paso-con-sap-1ra-edicion/ se incluye una explicación detallada de como funciona tanto la LSMW como un sin número de utilidades más dentro de SAP.

2 Me gusta

Hola que tal…si entiendo que es mucho mas facil usar la LSMW, pero en mi caso al usuario se le quitaran los permisos a su rol, por eso requiero de un programa abap que me lea un excel y darle tratamiento a los datos.

Saludos y gracias

No necesariamente se le deben de quitar los permisos, pueden dar autorización solo al proyecto del LSMW que requiere. //Solo como sugerencia.

Lo consideraré, muchisimas gracias…¡¡¡
saludos

Saludos Wleuyacc,Si deseas realizar un proceso masivo en BACKGROUND (El usuario solo ejecutara un botón del proceso y veras el Log respectivo, mas no tendrá la posibilidad de ver,modificar y de darle guardar como indicas, eso se realiza en modo DIALOGO) de insertar registros en la tabla Z, las propuestas de LSMW o BATCH a la SM30 que brindan los compañeros es adecuado.( Ahora en DIALOGO estas opciones tendrías que estar en ejecución de modo visualización lo cual implicaría dar ENTER, ENTER para la opción de BATCH y ver pasar la inserción y guardado cuando usas el LSMW por cada registro del Excel, ademas que se guardara en la tabla Z, a no ser que tenga opciones el LSMW o BATCH para realizar en modo invisible y mostrar en modo visualización la SM30 hasta el ultimo registro a insertar SIN HABER REALIZADO LA OPCIÓN DE GUARDAR que es lo que entiendo que deseas) , pero si es en DIALOGO dado que quieres estar en la SM30 ( por que tiene acceso a visualizar y poder modificar si consideras necesario antes de dar a guardar ) puedes ir por un un ALV con las opciones de CRUD y un botón de Importar data del Excel ( Importas y realizas un Refresh al ALV ) para que el usuario pueda visualizar y modificar si lo considera y guardar finalmente algo equivalente a la SE16N.

Considero que el modo BACKGROUND es acertado, me inclino a que puedas creas un programa de captura de datos del excel y realizas un INSERT masivo a la tabla Z o MODIFY. ahora si tomamos las opciones de los compañeros me voy por el BATCH para temas masivos para usuarios finales, creando un programa Z con permisos pertinentes con las ventajas y desventajas propuestas.El LSMW, lo usa mas el área de tecnologías para cargas iniciales masivas, de cara al usuario estos tienen que ser especializados debido al grado de complejidad, por otro lado es gestionar las autorizaciones al usuario a una transacción critica como lo es el mismo. La opción DIALOGO, un ALV como indique anteriormente.

3 Me gusta

Amigos tengo un codigo Abap, donde se carga un EXCEL y llena una tabla interna, como lo que busca @Wleuyacc …por si les interesa diganme y lo subo como tema


Aquí el aporte: Importar excel - Tratamiento de Datos

4 Me gusta

Saludos Estimado,

Considero que sí le sería de ayuda. Si está dentro de sus posibilidades puedes crear un gist que es pegarlo en esta dirección Gist y luego compartir el enlace en una publicación :slightly_smiling:

1 me gusta

@Wleuyacc, ¿como resulto este tema? ¿ya tienes una solución?

2 Me gusta

Hola amigo, yo realice algo como esto en un desarrollo abap, el detalle que yo en un loop use una BAPI para actualizar un campo de materiales SAP.

Gracias amigos por sus comentarios, llegue armar un Programa ABAP, importe el excel y una serie de validaciones a los registros importados, es bueno ver la unión que hay en el grupo , sigamos creciendo ! :slight_smile: .

Saludos.

3 Me gusta

@Wleuyacc, genial, te invito a marcar la opción que mas te ayudo como solución.

O incluso a ofrecer la solución que encontraste del tema.

Saludos.

2 Me gusta

Hola a todos, la forma en que yo cargo datos desde excel a tablas internas es la siguiente, lo dejo por aca por si alguien le interesa utilizar:

START-OF-SELECTION.
    PERFORM procesa_planilla.
    PERFORM graba_datos_tabla_interna.

FORM procesa_planilla.
IF H_APPL-HEADER = SPACE OR H_APPL-HANDLE = -1.
    CREATE OBJECT H_APPL 'EXCEL.APPLICATION'.
    IF SY-SUBRC NE 0. MESSAGE I002(SY) WITH SY-MSGLI. ENDIF.
    SET PROPERTY OF H_APPL  'VISIBLE' = 0.
  ENDIF.

  CALL METHOD OF H_APPL 'WORKBOOKS' = H_WORK.
  CALL METHOD OF H_WORK 'OPEN' EXPORTING #1 = P_ARCHI.

  PERFORM CAPTURAR_DATOS.

  CALL METHOD OF H_APPL 'QUIT'.
  FREE OBJECT H_APPL.
  H_APPL-HANDLE = -1.

  DELETE tbxls WHERE ( line = 1 ).

  SORT TBXLS BY LINE COLN.
  REFRESH TABXLS.
  CLEAR TABXLS.
  LOOP AT TBXLS.
    AT NEW LINE.
      CLEAR TABXLS.
      MOVE '@0A@' TO TABXLS-icon.
    ENDAT.
    IF ( TBXLS-COLN = 1 ).
      MOVE TBXLS-STRING TO TABPOSOC-ORDEN.
    ELSEIF ( TBXLS-COLN = 2 ).
      MOVE TBXLS-STRING TO TABPOSOC-POS.
    ELSEIF ( TBXLS-COLN = 3 ).
      MOVE TBXLS-STRING TO TABPOSOC-FECHAPROY.
    ENDIF.
    AT END OF LINE.
      APPEND TABPOSOC.
    ENDAT.
  ENDLOOP.
ENDFORM. 


FORM CAPTURAR_DATOS.
  DATA: EXCEL_LINE LIKE SY-INDEX,
        EXCEL_COLN LIKE SY-INDEX,
        CELL_VALUE(132) TYPE C.
  DO P_NLINE TIMES.
    EXCEL_LINE = SY-INDEX.

    DO P_NCOLN TIMES.
      EXCEL_COLN = SY-INDEX.

      CALL METHOD OF H_APPL 'CELLS' = H_CELL
        EXPORTING #1 = EXCEL_LINE
        #2 = EXCEL_COLN.
      GET PROPERTY OF  H_CELL 'VALUE'      = CELL_VALUE.
      CLEAR: TBXLS.
      TBXLS-LINE   = EXCEL_LINE.
      TBXLS-COLN   = EXCEL_COLN.
      TBXLS-STRING = CELL_VALUE.
      APPEND TBXLS.
    ENDDO.
  ENDDO.
ENDFORM.

FORM graba_datos_tabla_interna.
  LOOP AT TABPOSOC.

    CONDENSE TABPOSOC-ORDEN     NO-GAPS.
    CONDENSE TABPOSOC-POS       NO-GAPS.
    CONDENSE TABPOSOC-FECHAPROY NO-GAPS.

CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
      EXPORTING
        DATE_EXTERNAL = TABPOSOC-FECHAPROY
      IMPORTING
        DATE_INTERNAL = TABPOSOC-FECHAPROY.

    UPDATE EKPO SET ZZFECHAP = TABPOSOC-FECHAPROY
    WHERE EBELN = TABPOSOC-ORDEN AND EBELP = TABPOSOC-POS.

    COMMIT WORK AND WAIT.

  ENDLOOP.
ENDFORM.
7 Me gusta

Yo he utilizado una funcion llamada ‘ALSM_EXCEL_TO_INTERNAL_TABLE’

*PASAMOS EL ARCHIVO DE EXCEL A LA TABLA INTERNA
CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE’
EXPORTING
filename                = P_FILE
*COLUMNA DONDE SE EMPIEZA A BUSCAR DATOS
i_begin_col             = 1
*RENGLÓN DONDE SE EMPIEZA A BUSCAR DATOS
i_begin_row             = 1
*COLUMNA DONDE TERMINA DE BUSCAR DATOS
i_end_col               = 3
*RENGLÓN DONDE TERMINA DE BUSCAR DATOS
i_end_row               = 10
TABLES
*TABLA INTERNA DONDE ME REGRESA LOS DATOS
intern                  = it_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole              = 2
OTHERS                  = 3.

Ya solo basta usar alguna función para buscar el archivo en el ordenador, o si esta dentro de algún servidor remoto, habrá que ingresar las funciones que requieras

2 Me gusta

Gracias por tu aporte @Ricardo_Lira tendré que hacer un ejercicio usando tu ejemplo…¡¡¡
saludos