MUNDOSAP

Regresar   MUNDOSAP > DESARROLLO > Programación ABAP IV
Nombre de Usuario
Contraseña
Home Descargas Registrar FAQ Miembros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




 
Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Viejo 06/01/10, 12:57:18
PabloLiasco PabloLiasco is offline
Member
 
Fecha de Ingreso: ago 2008
Mensajes: 46
Problema SAP-EXCEL-OLE

Hola, agradecería me den algunas ayudas para resolver este problema.
Necesito descargar una tabla interna a EXCEL, y una vez hecho esto, conectarme al archivo generado, y darle un formato especial utilizando OLE.
Por ahora estoy usando la función WS_DOWNLOAD para descargar el archivo al disco, pero cuando me quiero conectar al archivo y formatearlo, los cambios no se llevan a cabo.
Les dejo el código de mi programa...

CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = lv_arch "Ruta del archivo
filetype = 'DAT'
mode = space
TABLES
data_tab = lt_tabla

CREATE OBJECT excel 'EXCEL.APPLICATION'.

SET PROPERTY OF excel 'VISIBLE' = 1.

CALL METHOD OF excel 'WORKBOOKS' = libros_trabajo.

CALL METHOD OF libros_trabajo 'Open' = libro EXPORTING
#1 = pvi_arch.

CALL METHOD OF libro 'Worksheets' = ole_sheets.

CALL METHOD OF ole_datasheet 'Copy'.

GET PROPERTY OF excel 'ACTIVESHEET' = ole_sheet.

CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'A1' #2 = 'Q1'.

* Se formatea el ancho de columna
SET PROPERTY OF rango 'COLUMNWIDTH' = 21.

FREE OBJECT rango.

CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'A1'.

CALL METHOD OF rango 'ENTIREROW' = row.

CALL METHOD OF row 'INSERT'.

FREE OBJECT rango.

FREE OBJECT row.

CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'A1'.

CALL METHOD OF rango 'ENTIREROW' = row.

SET PROPERTY OF row 'ROWHEIGHT' = '21.75'.

*Combina las celdas
CALL METHOD OF row 'SELECT'.

SET PROPERTY OF row 'MERGECELLS' = 1.


*Centrar el título (?????) "Esto no funciona
GET PROPERTY OF row 'HORIZONTALALIGNMENT' = pos.

SET PROPERTY OF pos 'xlCenter' = 1.

GET PROPERTY OF row 'VERTICALALIGNMENT' = pos.

SET PROPERTY OF pos 'xlCenter' = 1.


*Seteo el tipo, negrita, y tamaño de letra
CALL METHOD OF row 'FONT'.

GET PROPERTY OF row 'FONT' = fuente.

SET PROPERTY OF fuente 'BOLD' = 1.

SET PROPERTY OF fuente 'NAME' = 'ARIAL'.

SET PROPERTY OF fuente 'SIZE' = 20.

*Escribe el título
CALL METHOD OF row 'SELECT'.

SET PROPERTY OF row 'FORMULAR1C1' = 'Anexo A'.

*Dejo 1 línea vacía entre el título y los encabezados
FREE OBJECT rango.

FREE OBJECT row.

CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
#1 = 'A2'.

CALL METHOD OF rango 'ENTIREROW' = row.

CALL METHOD OF row 'INSERT'.

CALL METHOD OF excel 'SAVEAS'
EXPORTING
#1 = pvi_arch.


CALL METHOD OF excel 'QUIT'.

CALL METHOD OF excel 'CLOSE'.

FREE OBJECT excel.
Responder Con Cita
  #2  
Viejo 06/01/10, 15:45:38
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Mi experiencia me dice que el tratamiento de objetos OLE desde SAP es un autentico infierno, yo utilizo dos caminos para solucionar estos temas

1.- Si el reporte que queremos generar en un excel formateado va a tener siempre la misma estructura se crear una plantilla excel que se depositara en el servidor y cuando queramos descargar los datos de la tabla simplemente haremos una copia del excel ya formateado y volcaremos los datos en el

2.- Si el formateo tiene que tener una logica algo complicada lo mejor es crearse una macro en el excel (esta macro se debe crear en el libro de macros personal para que este disponible en todos los excel) y desde SAP cargar los datos en el fichero y posteriormente invocar a dicha macro, es mucho mejor hacer las macros en el VBA de Excel porque te proporciona mucha ayuda, sin embargo en SAP puede ser que te estes confundiendo en una mayuscula o que te falte un punto en algun sitio y ya no funcione nada, como SAP no tiene ayuda nativa de OLE puedes tardar dias en descubrir el error, para invocar una macro desde SAP seria algo mas o menos asi

INCLUDE OLE2INCL.

data: go_Excel type ole2_object. "Este es tu objeto aplicacion de excel

CREATE OBJECT go_Excel 'EXCEL.APPLICATION'. "si ya esta instanciado esto "no te hace falta

CALL METHOD OF go_Excel 'RUN' "Aqui es donde ejecutas tu macro
EXPORTING #1 = "MACRO_FORMATEAR".
Responder Con Cita
  #3  
Viejo 06/01/10, 16:40:04
PabloLiasco PabloLiasco is offline
Member
 
Fecha de Ingreso: ago 2008
Mensajes: 46
El problema es que yo estoy usando la función WS_DOWNLOAD para descargar la tabla interna a EXCEL. Cuando me conecto a ese archivo, es como que me lo duplica, porque la función me genera un archivo separado por tabs.
Responder Con Cita
  #4  
Viejo 06/01/10, 17:26:37
PabloLiasco PabloLiasco is offline
Member
 
Fecha de Ingreso: ago 2008
Mensajes: 46
Lo que veo que pasa es esto: Leí por ahí que se puede usar esta función EXCEL_OLE_STANDARD_DAT, el tema es que cuando hago el CREATE OBJECT excel 'EXCEL.APPLICATION', y el CALL METHOD 'Open', con la ruta del archivo que descargué con la función antes mencionada, quedan 2 archivos abiertos con el mismo nombre. Debería cerrar antes de conectarme al EXCEL el archivo antes generado, y como hacerlo?
Muchas gracias
Responder Con Cita
  #5  
Viejo 07/01/10, 11:43:54
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Ya entiendo lo que dices, te digo lo que yo haria

Lo primero es probar a poner la instruccion

CL_GUI_CFW=>flush( ).

Para ver si asi te cierra el excel y lo puedes abrir

Si lo anterior no funcionara lo segundo que haria es probar a utilizar otras funciones para descargar el fichero en lugar de la WS_DOWNLOAD, dispones de la funcion GUI_DOWNLOAD y el metodo GUI_DOWNLOAD de la clase CL_GUI_FRONTEND_SERVICES que realizan la misma funcion que la WS_DOWNLOAD pero son mas modernas por lo que quiza puedan descargar el fichero y no dejar abierta la aplicacion

Si no funcionara nada de eso, la solucion que se me ocurre seria ir a nivel de procesos, hacer un pequeño script que leyera la lista de procesos, determinara el ID del proceso que tiene abierto el excel y cerrarlo, este script podrias crearlo en la tx SM49 y luego ejecutarlo con una funcion cuyo nombre no recuerdo exactamente (no tengo SAP delante) pero era algo asi como SXGP_COMMAND_EXECUTE

Para poder hacer el script en windows dispones de las siguientes instrucciones

tasklist : muestra un listado de los procesos (cada proceso tendra un ID unico)
taskkill : finaliza un proceso
Responder Con Cita
  #6  
Viejo 07/01/10, 12:21:09
PabloLiasco PabloLiasco is offline
Member
 
Fecha de Ingreso: ago 2008
Mensajes: 46
Muchas gracias por contestar.
Voy a probar lo que decís, gracias de nuevo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Reglas de Mensajes
no puedes crear nuevos temas
no puedes responder temas
no puedes adjuntar archivos
no puedes editar tus mensajes

El código vB está On
Las caritas están On
Código [IMG] está On
Código HTML está Off
Saltar a Foro


Husos Horarios son GMT. La hora en este momento es 07:10:56.


www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web