Hola Eduardo...

Perdón a todos por usar las listas para comunicarme con Eduardo, pero creo
que puede ser de interés para más de uno...

Eduardo te he enviado dos correos con la respuesta a tu pregunta, pero me
regresa el siguiente error

***********************************************************
This is an automatically generated Delivery Status Notification

Delivery to the following recipient failed permanently:

    [EMAIL PROTECTED]

Technical details of permanent failure:
DNS Error: Domain name not found
***********************************************************

Así que te copio la pregunta y la respuesta en este mensaje:

Saludos a todos y perdón de nuevo...

Mauricio

-- 
_______________________________
Todo lo que no es dado es perdido


*****************************************************************
Saludos señor:

Sigo haciendo el micro manual, le voy avanzando. Ahora quiero mostrar lo
de la validación. Equivalente a cuando desde menú Datos eliges Validar..

La celda tiene la Propiedad Validation. Este código funciona a medias:

Sub Main
   Dim oHoja    As Object
   Dim oCelda    As Object
   Dim oValida As Object

   oHoja = ThisComponent.getCurrentController.getActiveSheet()
   oCelda = oHoja.getCellByPosition(1,1)
   oValida = oCelda.Validation
   oValida.Type = 6
   MsgBox oValida.Type
End Sub

Las celdas tienen por defecto el tipo de validacion 0, que significa que
no tiene seleccionado. Con el tipo 6 le indicamos que debe tener el tipo
Lista.
Ahora, me indica que si, que efectivamente cambio su tipo de validación
a 6, pero no aparece el simbolo de seleccionar la lista.

Buscando en la página
http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/SheetCell.html#ValidationLocal
Leo sobre la validación:

After the data validation settings have been changed the validation has
to be reinserted into the property set.

Y es ahí donde ya me hice bolas. ¿Podrías ayudarme?

Nuevamente, mi compromiso es que toda información obtenida es entregada
de forma digerible a la comunidad.

***************************************************************

Estimado Eduardo...

Estoy en la mejor disposición de ayudarte, pero me parece conveniente que
estas consultas las hagas a la lista, se del valioso trabajo que estas
haciendo y se que lo regresaras a la comunidad, pero recuerda que hay varias
formas de obtener la información, muchos lo hacen en las listas, otros
leerán los manuales (como el mio), otros verán los videos (como los tuyos),
lo ideal es abarcar varias opciones, esto por supuesto es solo una
opinión...

Pasando a tu consulta, el manejo de las validaciones, tiene un "detalle"
técnico que me gustaría algún día el saber el ¿porque?, por ahora solo te
muestro el como...

Con la línea:

oValida = oCelda.Validation

En "teoría" accedes a los métodos y propiedades del objeto
ScTableValidationObj y efectivamente, cualquier consulta a las propiedades
de depuración (DBG_Properties, DBG_Methods) te dice que el objeto esta
correcto, incluso puedes cambiar algunas propiedades como Type y puedes
verificar el cambio como tu lo hiciste. Pero en la practica, para que
"realmente" tome los cambios realizados, hay que acceder a este objeto
usando el siguiente método:

oValida = oCelda.getPropertyValue("Validation")

Ahora si, cambiamos lo necesario:

oValida.Type = 6
oValida.ShowList = 2

Y aqui viene el punto importante, para que realmente se efectuen los
cambios, debes de "reinsertar" la propiedad en el objeto de la siguiente
manera:

oCelda.setPropertyValue("Validation", oValida)

"After the data validation settings have been changed the validation has to
be reinserted into the property set."

Traducción libre
"Después que la validación de datos se haya cambiado, la validación "debe"
ser reinsertada en el conjunto de propiedades.

Te comento otros detalles de la validación, en especial de las listas. Si
observamos la lista de posibilidades para las validaciones, tenemos la
siguiente lista con sus valores, tomada de la interfaz de usuario:

0 = Cada Valor
1 = Entero
2 = Decimal
3 = Fecha
4 = Hora
6 = Intervalo de celdas
6 = Lista
5 = Longitud de texto

Como ya lo notaste, este valor es la propiedad Type del objeto Validation,
nota como el valor 6 se repite, algo que en lo personal no me gusta... para
que OO sepa si se trata de un "intervalo de celdas" o de una "lista", hay
que pasarle el valor correcto al método setFormula1, es decir, "dependiendo"
de que valor le pases a este método, el objeto interpretara una u otra cosa,
veamos un ejemplo:

Si establecemos, la propiedade Type en 6 y

oValida.setFormula1( "E1:E10" )

El rango usado debe ser un rango válido para que sea reconocido como tal,
pero si quieres establecer una lista de valores, esta, tiene que ser
insertada con cada valor entrecomillado y separado por ";", por ejemplo

sTmp = "Uno;Dos;Tres"

La línea anterior te dara un error, bueno, no un error en tiempo de
ejecución, sino que NO establecera los valores de la lista correctamente,
pues como te decia, "cada valor" de esta, tiene que ir entrecomillado como
en:

sTmp = "Uno";"Dos";"Tres"

Pero la línea anterior tambien te dará un error, solo que ahora si en tiempo
de ejecución, para pasarle los datos correctamente, deben estar así, los
datos:

sTmp = """Uno""" & ";" &  """Dos""" & ";" &  """Tres"""

Ahora si, pruebalo y veras que nos muestra correctamente los datos en la
lista, ¿pero ya viste que cantidad de comillas?, una opción es crear una
función que integre las comillas por nosotros, como en:

   m = Array("Uno","Dos","Tres","Cuatro","Cinco")
   sTmp = JuntarEnLista(m)

Donde la función JuntarEnLista es:

Function JuntarEnLista( ByVal m ) As String
Dim co1 As Long

    For co1 = LBound(m) To UBound(m)
        m(co1) = """" & m(co1) & """"
    Next
    JuntarEnLista = Join( m, ";" )

End Function


Ahora si, tu ejemplo completo seria:

Sub Main
Dim oHoja As Object
Dim oCelda As Object
Dim oValida As Object
Dim sTmp As String
Dim m

       oHoja = ThisComponent.getCurrentController.getActiveSheet()
       oCelda = oHoja.getCellByPosition(1,1)
       oValida = oCelda.getPropertyValue("Validation")

       m = Array("Uno","Dos","Tres","Cuatro","Cinco")
       sTmp = JuntarEnLista(m)
       oValida.Type = 6
       oValida.ShowList = 2
       oValida.setFormula1( sTmp )
       oCelda.setPropertyValue("Validation", oValida)

End Sub


Y muy obediente te muestra la flecha de selección, checalo y me dices...

Saludos

Mauricio

Responder a