MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Problemas bloqueando celda excel con OLE (foro/showthread.php?t=46437)

NKZero 04/11/11 07:15:41

Problemas bloqueando celda excel con OLE
 
Hola a todos,
os comento mi problema a ver si podéis echarme un cable.
Tengo que bloquear (hacer no editables) todas las celdas de un excel a excepción de unas cuantas que podrá rellenar el usuario. Para ello estoy usando objetos OLE de la siguiente forma:

* Crear el excel
CREATE OBJECT excel 'EXCEL.APPLICATION'.
SET PROPERTY OF excel 'VISIBLE' = 1.
CALL METHOD OF excel 'WORKBOOKS' = workbook.
CALL METHOD OF workbook 'ADD'.
CALL METHOD OF excel 'WORKSHEETS' = sheet
EXPORTING #1 = 1.
CALL METHOD OF sheet 'ACTIVATE'.

* Por cada celda a insertar, creo la referencia, doy un formato y la
* desbloqueo para que sea editable
CALL METHOD OF sheet 'CELLS' = cell
EXPORTING
#1 = gv_row
#2 = p_j.
SET PROPERTY OF cell 'LOCKED' = 0. "Unprotect cell

* Una vez creado el excel.
* Guardo en la ruta deseada
CALL METHOD OF sheet 'SAVEAS'
EXPORTING
#1 = lv_fullpath
#2 = 1.
* Protejo la hoja.
SET PROPERTY OF gv_sheet 'PROTECT' = 1.
CALL METHOD OF application 'QUIT'.

Ahora los problemas:
1 - Necesito que el procesado se haga en fondo pero si lo hago así, el excel se genera pero no se bloquean las celdas
2 - Si no lo hago en fondo, se bloquean las celdas que necesito pero al salir del excel, si no guardo (con el botón guardar del excel), al abrir de nuevo el excel las celdas no están bloqueadas.
3 - Si pongo SET PROPERTY OF gv_sheet 'PROTECT' = 1. antes de guardar con el método 'SAVEAS' me da error al guardar el archivo y no lo genera.
4 - Por último cuando protejo las celdas, las que contienen campos desplegables que no están bloqueadas se me ven mal (me salen todos en una línea).

Bueno, espero que alguien pueda ayudarme,
Un saludo.

PD: No se si esto va en este subforo, si no, siento la equivocación.

EDIT: He observado que si no protejo la hoja, las celdas tienen las propiedades correctamente puestas en el excel (marcadas como bloqueadas unicamente las que deben estar). Por lo tanto el problema es con el SET PROPERTY OF gv_sheet 'PROTECT' = 1. Sabéis alguna otra forma de Proteger una hoja de excel con abap? (opción proteger dentro de la pestaña Revisar en Excel2007).
Gracias de nuevo.

EDIT2: He encontrado la solución, justo antes de guardar con el metodo 'SAVEAS', en vez de usar:
SET PROPERTY OF gv_sheet 'PROTECT' = 1.
Usando
CALL METHOD OF gv_sheet 'PROTECT'
EXPORTING #1 = ''.
Se solucionan todos los problemas que tenía.
Además he ido marcando y desmarcando las celdas que quería proteger y las que no mientras las insertaba (OJO, marcar la propiedad de todas tanto las que si como las que no, así te aseguras que las celdas tienen la opción que quieres y no dependes del por defecto).
IF p_unlock IS INITIAL.
SET PROPERTY OF cell 'LOCKED' = 1. "Desproteger Celda
ELSE.
SET PROPERTY OF cell 'LOCKED' = 0. "Proteger Celda
ENDIF.

Un saludo.

Cristiana 12/12/11 20:31:08

Saludos
 
Hola, pudiste resolver el problema que tenia de bloquear celdas, yo necesito hacer lo mismo, me podrias ayudar a hacerlo o decir como lo solucionaste,

Gracias y Saludos.

NKZero 13/12/11 06:54:30

Hola Cristiana, te comento un poco el proceso a rasgos generales:
Cada celda de excel tiene un check que indica si está bloqueada o no (Boton derecho encima de la celda, Formato de celdas, Pestaña proteger).
Aunque este flag esté marcado, hasta que no se protege la hoja (Menú Revisar, Proteger Hoja) no se hace efectivo dicho bloqueo.

Por defecto el flag bloqueado viene marcado para todas las celdas (si creas un excel en blanco podrás comprobarlo), por tanto el concepto de bloquear sería a la inversa, tendríamos que desbloquear aquellas celdas que queremos que sean editables.

Todo esto es en excel, una vez compredido los pasos a realizar en excel hay que trasladarlos a SAP (hago un poco copy paste de lo que puse antes XD).

1 - Crear Excel:

* Crear el excel
CREATE OBJECT excel 'EXCEL.APPLICATION'.
SET PROPERTY OF excel 'VISIBLE' = 1. " Lo puedes poner a 0 si quieres que sea un proceso e fondo.

* Se crea el libro
CALL METHOD OF excel 'WORKBOOKS' = workbook.

* Se añade el libro
CALL METHOD OF workbook 'ADD'.

* Se selecciona la Hoja
CALL METHOD OF excel 'WORKSHEETS' = sheet
EXPORTING #1 = 1. " Este es el número de la hoja que seleccionamos

* Se pone como activa la hoja (es como hacer clic en la pestaña de la hoja que tienes seleccionada en Sheet).
CALL METHOD OF sheet 'ACTIVATE'.


2 - Seleccionar Celda con Objetos OLE y bloquear / desbloquear:

* Se selecciona la celda que queremos de la hoja
CALL METHOD OF sheet 'CELLS' = cell
EXPORTING
#1 = gv_row "FILA
#2 = p_j. "Columna (en número)

* Marcamos o desmarcamos el flag de protegido (0 - Desmarcar | 1 - Marcar)
SET PROPERTY OF cell 'LOCKED' = 0. "Unprotect cell

3 - Proteger la hoja (esto hará que las celdas protegidas no sean editables):
Justo antes de guardar los cambios en la hoja (despues de rellenar todas las celdas y demás).

* Protejemos la hoja con este método.
CALL METHOD OF gv_sheet 'PROTECT'
EXPORTING #1 = ''. " Si no se quiere password se deja vacío (ojo son 2 comillas simples).

* Se guarda el excel donde queramos
CALL METHOD OF sheet 'SAVEAS'
EXPORTING
#1 = lv_fullpath " Ruta
#2 = 1.


Tras realizar esto, todas las celdas que tengan activo el flag Bloqueado quedarán bloqueadas.

Consejo: Trata todas las celdas que rellenes con datos o formen parte de la tabla de salida, de esta forma te garantizas que cada una de ellas tiene el formato que deseas. Recorre las celdas una a una y ve marcando si la celda debe ser bloqueada o no (independientemente de como venga por defecto así siempre tendrás controlado cuales se van a desbloquear y cuales no).

Espero que te ayude, si tienes alguna duda más, tan solo tienes que decirlo.
Un saludo.


Husos Horarios son GMT. La hora en este momento es 10:24:23.

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