PDA

Ver la Versión Completa : Contenido orden de spool a Excel


playa82
31/10/12, 15:03:36
Hola a tod@s!

Tengo un report que genera un ALV. Si lo lanzo en fondo, se genera una orden de spool con el contenido de dicho ALV. Hasta ahí bien.
Tengo que pasar el contenido de la orden de spool a Excel y lo que he hecho ha sido lo siguiente: he ejecutado la función 'RSPO_RETURN_SPOOLJOB' con el ID de la orden de spool, y luego me he bajado la tabla interna que devuelve con 'GUI_DOWNLOAD'.
Pero me surgen dos problemas:
1) Se me genera un archivo .xls, pero me viene toda la información en bloque, plana, tal y como se ve en la orden de spool. Es decir, no me ajusta las columnas del ALV a las columnas del archivo excel.
2) Si el ALV tiene muchas columnas, la orden de spool no me muestra el ALV completo y de rebote, el excel que se me genera tampoco está completo.

¿Alguna idea? Pq me estoy desesperando y por internet no encuentro nada que me sirva...

Gracias de antemano! :D

caeco67
02/11/12, 21:07:42
Hola, nunca lo he usado pero deberías probar con la función RSPO_DOWNLOAD_SPOOLJOB a ver si te funciona

Saludos.

playa82
05/11/12, 07:20:23
Hola!

Gracias por responder. Esa función ya la había probado y tb me lo baja en bloque (todo me lo mete en una única columna de excel).
También probé a hacer los mismos pasos que cuando desde la SP01 bajas una orden a excel, pero no funciona la sentencia estándar "SYSTEM-CALL LOAD LISTLEVEL-STACK INTO STACK." (no rellena la variable STACK), así que ya no se qué mas hacer.

He optado por crearme una tabla interna dinámica con el contenido de la orden, pero mi problema actual es que si el ALV es muy largo y no salen todas las columnas en la orden de spool, en mi excel tp :(
Alguna idea?

ballan
05/11/12, 09:32:02
Para crear el excel formateado y que no te lo meta todo en una columna creo que habria 3 posibles caminos

Bueno, lo primero voy a suponer que en tu programa en algun momento tendras una tabla interna con los datos que quieres volcar en el excel

1.- Puedes ir recorriendo cada linea de la tabla y a su vez cada campo y mediante objetos OLE ir metiendo cada valor en una celda del excel, hay muchos ejemplos de manejo de objetos excel mediante OLE pero es complicado

2.- Otra cosa que podria probar es lo siguiente, tienes que implementar el codigo necesario para recorrer la linea y a su vez cada campo de la linea, ir concatenando los valores de los campos en una variable string separandolos mediante un tabulador y asi obtener una tabla en la que cada linea sera un string que tiene todos los valores concatenados y separados por tabulador, despues esa tabla la podrias descargar a fichero mediante la GUI_DOWNLOAD, prueba a bajarlo como ASC y ponerle extension .xls al nombre del fichero, te dejo un codigo de prueba para que te hagas a la idea de lo que quiero decir

data: lv_string type string.
data: lt_string type table of string.
field-symbols: <campo> type any.

loop at tabla into linea.

clear: lv_string.

do.

assign component sy-index of structure linea to <campo>.

if sy-subrc is initial.

concatenate lv_string CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB <campo> into lv_string.

else.
exit.
endif.

append lv_string to lt_string.

enddo.

endloop.

Con esto al final tendrias una tabla con todos los campos concatenados y separados por tabulador

3.- La ultima opcion seria descargarte la tabla a fichero igual que lo haces ahora, y te lo deja en un excel pero todo metido en una columna, lo que harias en tu programa en que despues de descargar el fichero a excel ejecutarias una macro que seria la que te formatearia el excel y convertiria lo que hay en una columna a varias columnas

Para ejecutar una macro de excel el codigo mas o menos seria

INCLUDE OLE2INCL.

data: go_Excel type ole2_object.

CREATE OBJECT go_Excel 'EXCEL.APPLICATION'.

CALL METHOD OF go_Excel 'RUN'
EXPORTING #1 = "NombredelaMacro".

La macro tendrias que crearla en el libro de macros personales para que este disponible en todos los libros de excel

Para la grabacion de la macro tendrias que utilizar la utilidad de texto a columnas de excel

playa82
08/11/12, 09:41:42
Es que el problema que tengo es que no parto de una tabla interna completa.
Si el ALV tiene muchas columnas (es muy ancho) en la spool no sale, y al leer su contenido mi tabla interna está también incompleta :(

vanesamacri
08/11/12, 10:21:40
Es que el problema que tengo es que no parto de una tabla interna completa.
Si el ALV tiene muchas columnas (es muy ancho) en la spool no sale, y al leer su contenido mi tabla interna está también incompleta :(

Al lanzar procesos de fondo, es posible setear la lontigud del spool de salida para que su contenido no aparezca truncado. ¿De qué manera lo estás ejecutando?

manu_lolo27
08/11/12, 12:47:36
Hola, creo q lo primero es tener la tabla interna con todas sus columnas, no se porque en la orden spool no te muestra todas las columnas.

Una cosa q se me ocurre es, porque no directamente del report te bajas el excel (aunq luego genere una orden spool cuando lo lanzas en fondo???

con la funcion GUI_DOWNLOAD puedes bajarte el excel perfectamente.

dime tu correo o escribeme a No anotar correos privados, generan flood y spam en los foros; favor contactar via PV y te envio un ejemplo simple de como bajarte el excel (yo veo facil solucion, espero q sea asi :D

saludos

manu_lolo27
08/11/12, 12:59:28
Ahy dejo el ejemplo, ojala te pueda ayudar en algo

playa82
12/11/12, 07:39:37
Hola a todos, gracias por responder!

La cosa es que tengo que hacer un "programa lanzador de otros programas". Yo desde mi "programa lanzador" lanzo en fondo otro programa que genera un ALV, de manera que se me genera una orden de spool con dicho ALV.
Luego leo esa orden de spool y el usuario puede elegir entre pasar su contenido a PDF o a excel, por eso estoy obligada a leer del spool.

Sin más lo que hago es llamar al report que quiero lanzar en fondo mediante un job, pasándole la variante con la que quiero q se lance:

SUBMIT (p_report)
USING SELECTION-SET p_varna
TO SAP-SPOOL
SPOOL PARAMETERS pri_params
WITHOUT SPOOL DYNPRO
VIA JOB gd_jobname NUMBER gd_jobcount
AND RETURN.

Y los parámetros de impresión de spool que le paso los obtengo mediante la función GET_PRINT_PARAMETERS:

CALL FUNCTION 'GET_PRINT_PARAMETERS'
EXPORTING
in_parameters = pri_params
mode = 'CURRENT'
no_dialog = 'X'
IMPORTING
out_parameters = pri_params
EXCEPTIONS
invalid_print_params = 1
invalid_archive_params = 2
OTHERS = 3.
IF pri_params-pdest IS INITIAL.
pri_params-pdest = 'LP01'.
pri_params-primm = pri_params-prnew = 'X'.
ENDIF.

¿Alguna idea para que la spool me recoja todo el ALV y no me lo deje a falta de columnas?

vanesamacri
12/11/12, 14:32:23
¿Alguna idea para que la spool me recoja todo el ALV y no me lo deje a falta de columnas?

Revisá los siguientes parámetros de la función GET_PRINT_PARAMETERS: line_count, line_size, layout y default_spool_size. Mediante ellos se pueden setear propiedades de tamaño del spool.

ballan
13/11/12, 07:13:07
Dependiendo del numero de columnas que tenga el ALV puede ser que ni aumentando el numero de columnas de la impresion te sirva porque la tabla ocupa mas

Que programa estas ejecutando?¿

Lo ideal seria que modifiques el programa que estas ejecutando y esa tabla interna la mandes o bien a una tabla de BBDD, a una shared memory o algun otro sitio que puedas recuperar la tabla directamente, no leer la orden de spool

playa82
14/11/12, 06:49:27
Hola, gracias por contestar.

Quieren que sea mediante spool, así que no me queda otra...

Vanesamacri, sobre lo que me has comentado de los parámetros de la función GET_PRINT_PARAMETERS: he probado varias combinaciones y no he conseguido nada, la anchura no ha variado, el spool veo que tiene las mismas columnas que sin usar dichos parámetros.

Gracias a todos! Seguiré trasteando aunque ya no se me ocurre nada la verdad :(

ballan
14/11/12, 10:21:02
No se si el report que lanzas (el que genera la orden de spool) es estandar o puedes modificarlo

Si lo puedes modificar en la sentencia REPORT de dicho programa (deberia de ser la primera linea que aparece en el programa) puedes añadirle la clausula line-size XXX e indicarle el numero de caracteres por linea, por ejemplo

REPORT nombre_programa line-size 255.

Creo que SAP por defecto ponia 72 que sera lo que te sale en el spool, con esta clausula podras aumentarlo pero tampoco te deja ampliarlo muchisimo mas, creo que el maximo es 255 asi que si tus datos ocupan mas de esa longitud tendras que pintarlos de otra manera para poder recogerlos completamente en la orden de spool

PD: No tengo acceso a sap por lo que a lo mejor la sintaxis que puse no es exacta del todo

playa82
15/11/12, 09:18:33
Hola de nuevo!

Acabo de probar eso q me comentas (pq los programas que llamo en fondo son mios y los puedo modificar, pero no me sirve tampoco! Me sale igual que siempre.

Gracias.

MarioMoralesG
21/08/14, 17:56:17
Hola a todos,

Yo tenía el problema de que la lista abap que tenía que exportar a excel estaba hecha toda con la sentencia WRITE, por ende cuando el programa se corría en línea no tenía ningún problema al exportarlo a excel porque este lo obtenía tabulado correctamente.

El inconveniente era que a veces este programa se corría en fondo y se quería exportar la misma lista abap desde la spool y daba como resultado un excel sin tabulación y todo agrupado a una sola columna.

Quiero compartir con usted como solucione este tema,
1. Realice una copia de la función LIST_DOWNLOAD a una función z, en este quite el tema de escoger en que formato se desea descargar y la descarga inmediata (funciones POPUP_TO_DECIDE_LIST y LIST_CONVERT_TO_DAT).

2. La función nueva ZLIST_DOWNLOAD utiliza 4 tablas claves para la descarga estas son list[] fmbs[] fmbx[] fsel[], por ende dentro de la misma realice una exportación to database de cada línea de estas tablas.

3. En un nuevo programa zaux, realice la importación de las 4 tablas exportadas a database, e invoque a la función LIST_CONVERT_TO_DAT con las 4 tablas.

4. Cuando el programa que genera la lista se corra en fondo invoco a la función ZLIST_DOWNLOAD antes de finalizarlo.

El proceso que le indique al usuario, fue que apenas termine de ejecutar el proceso de fondo ejecutara el programa zaux para descargar el excel.

Sé que esto se puede mejorar mucho, restringiéndolo por usuario y entre otras cosas, pero a mí me sacó de un apuro. Espero les sirva :)