April 2008 - Artículos

El uso de las Cintas de Opciones (Ribbon) y VBA (Visual Basic for Application). RibbonAndVBA

En este artículo se va a tratar a un nivel básico de las Cintas de Opciones (Ribbon) y su uso con VBA.

Ribbon a nivel de base de datos.

Si uno está acostumbrado a usar Barras de Herramientas Personalizadas deberá de cambiar el “chip” bueno jejeej cambiar no, olvidarse totalmente de ese concepto para entrar a un nuevo mundo del Ribbon que “supera” a las Barras pero que incomoda al tener que aprender varios conceptos nuevos y los siguientes son alguno de ellos,
  • El Ribbon va asociado a un formulario o informe o a la aplicación.
  • El Ribbon que esté asociado a un formulario sólo está activo cuando dicho formulario al estar abierto no sea emergente y esté visible, cualquier cambio de valor de estas dos últimas propiedades hace que el Ribbon desaparezca.
En caso de asociar el Ribbon a la base de datos este estará en cache mientras dure la sesión de la aplicación pudiendo ser sustituido por otra al abrir un formulario o informe volviendo a ser visible al cerrar los objetos comentados.Usando la interface de Access se puede establecer el Ribbon del siguiente modo,
  • Botón Office | Opciones de Access | Base de datos actual | Opciones de barra de herramientas y de la cinta de opciones | Nombre de banda de opciones:
 

 

Con código de VBA usando la propiedad “CustomRibbonID” del objeto Database.

  • CodeDb.Properties("CustomRibbonID") = "rbbInicio"
O para crearla,
  • CodeDb.Properties.Append CodeDb.CreateProperty("CustomRibbonID", dbText, "rbbInicio")
En todos los casos hace falta reiniciar la base de datos para hacer visible el Ribbon.

 

Ribbon a nivel de objetos formulario (form) o informe (report).

Sencillo, sencillo, no hay más que rascar de lo que se indica aquí y de modo parecido a la sección anterior hay un método visual y otro a través de código VBA.Usando el método visual y en modo edición de un form o report,
  • Hacer visible la Hoja de propiedades (Alt + Entrar) | Solapa: Otras | Nombre de banda de opción.

 

Con código de VBA usando la propiedad “RibbonName” del objeto Form o Report.
  • Me.Properties("RibbonName") = "rbbNombreRibbon"

 

Ribbon, planteamiento de uso.

A la conclusión que he llegado trasteando con esta nuevo bicho de Access 2007 es sencilla pero para llegar a ella me he tenido que pelear unas cuantas horas con él, en realidad es como se aprende y ¡¡salen un montón de notas!!.Para obtener una aplicación con Ribbon hace falta los siguiente,
  • Usar un Ribbon (rbbPrincipal) a nivel de base de datos, tal como se ha comentado en la sección anterior Ribbon a nivel de base de datos.
  • Usar Ribbon independientes para los formularios e informes (rbbFormA, rbbFormB, rbbSub1FormA, rbbSub2FormA, rbbReportA, etc.) que se irán activando y desactivando conforme el objeto tome el foco, tal como se comenta en la sección Ribbon a nivel de formulario (form) o informe (report).
Así de sencillo, no hay más.

Si uno es observador y está familiarizado con las convenciones de nombre podrá comprobar en los nombres de ejemplo de las Cintas de Opciones, como también se indica Sub de subformulario. Si dentro de un formulario existen uno o más subformularios estos también tienen (como formulario que es) la propiedad RibbonName para activar un Ribbon, al activar subFormA se dispara el Ribbon rbbSub1FormA, al tomar el foco subFormB el anterior desaparece y queda activo rbbSub1FormB, ¡genial! Como efecto visual es muy bueno y atractivo.

 

Ribbon ejemplo práctico.

Vayamos a visualizar lo comentado hasta ahora, descargar el ejemplo propuesto al final del artículo llamado test.RibbonAndVBA en Attachment.

Al abrir la base de datos se inicia con un formulario inicial de presentación, al pulsar el botón Aceptar se presenta un nuevo form llamado frmTest con dos grandes botones y un tercero para cerrarlo.

Antes de continuar hay que indicar que previo a abrirse los formularios se activa la Cinta de Opciones llamada rbbPrincipal y es la única visible en estos momentos.Volvemos a frmTest y pulsamos el primer botón grande, “Activar Cinta de Opciones …” y se puede apreciar como ha desaparecido rbbPrincipal y se ha hecho visible rbbAyuda.

 

Ribbon y sus particularidades.

Continuando con la base de datos de test nos encontramos con dos formularios el z01_frmEmergente y z02_frmInvisible que sirven para observar dos particularidades imaginables por su nombre.
  • z01_frmEmergente es un formulario con su propiedad emergente a True, al activar la cinta de opciones rbbAyuda y tras clicar el botón se observa que esta cinta aparece y desaparece inmediatamente por lo que no se aconseja usar este tipo de formularios si debe de usarse una cinta.
  • z02_frmInvisible es visible al abrirlo, activamos la cinta rbbAyuda usando el botón y a continuación clicamos Cambiar el estado de este formulario en invisible, voila, desaparece el form y la cinta. Es comprensible ya que el formulario pierde el foco y por tanto vuelve el Ribbon principal.

McPegasus, 30/04/2008

Publicado por McPegasus con 5 comment(s)
Archivado en: ,

Compatibilidad de la Cinta de opciones (Ribbon) hacia atrás, 2007 --> 2003, 2002 (XP), 2000, 97.

Este artículo trata sobre la compatibilidad que puede existir de usar una aplicación que integre Ribbon en versiones anteriores al Access 2007.

No hay compatibilidad, directamente ¡no funciona!, pero se va a tratar de cómo pueden convivir los dos sistemas, Barras de Herramientas Personalizadas y Cinta de Opciones (Ribbon).

Poco más hay que decir sobre el inicio en el Ribbon que no estén en los artículos siguientes,

Aprovecho para felicitar y promocionar estos artículos, ya que nos hacen ganar en semanas el aprendizaje de esta novedad en Access y avanzar a una velocidad de vértigo.

 

Necesidad:

Partiendo desde cero con el Ribbon y con una aplicación acabada del 2003, surge la necesidad de usarla en 2007 pero teniendo usuarios que utilizan 2003. Podría pensarse en instalar el Runtime del 2007 ya que es gratuito, pero tampoco quiero hacerlo ya que de ese modo no habría tenido la oportunidad que expongo aquí.

Esta aplicación en 2003 hace uso de 5 barras personalizadas que se activan/desactivan según necesidad del formulario o informe, incluso se habilitan o deshabilitan comandos según requerimientos del contenido del formulario.

En dicha versión todo funciona como cabe esperar, pero al abrir en 2007 las barras de herramienta personalizadas aparecen en el grupo de Complementos junto al resto de grupos predeterminados.

 

Planteamiento:
  • El primer paso fue conocer cómo funciona el XML con el Ribbon (obviaremos en este artículo).
  • El siguiente conocer qué instrucción se usa para activar una cinta de opciones usando VBA:
me.RibbonName = "NombreRibbon". Está en el segundo artículo comentado de Chea aunque la verdad :( lo releí tarde.
  • El tercero, usar dicha instrucción en Access 2003 y ver qué ocurre.
"Error de compilación: No se encontró el método o el dato miembro". Como era de esperar.

Por el error dado se deduce que es una propiedad del formulario en la versión 2007 y la ayuda dice al respecto:

La propiedad RibbonName con el que se obtiene o establece el nombre de la Cinta de opciones personalizada en un formulario o informe...

La duda que se tenía al principio era si hacía falta tener referenciada la librería de Microsoft 12.0 Object Library (mso.dll) para hacer uso del Ribbon y a este nivel de inicio con el Ribbon no es necesario pero simplemente a este nivel NO sirve para nada ya que sin las Acciones (OnAction) los controles son tan memos como los campos memos.

 

Solución:

Ante este error no queda más que buscar un método que podamos usar en 2003 y 2007 para poder compilar y crear un archivo 2003.mde, así que buscando buscando se llega a la siguiente conclusión: un formulario tiene propiedades intrínsecas y propiedades definidas por el usuario y todas ellas las encontramos en la colección Properties, por lo que, si usamos esa colección para referirnos a RibbonName, Access 2007 la reconocerá como una propiedad intrínsica y funcionará en consecuencia, mientras que Access 2003 no la reconocerá, pero la tomará como una propiedad personalizada y no producirá problemas; resumiendo que con la sintaxis Me.Properties.Item("RibbonName") = "NombreRibbon" no se produce error al compilar en 2003 y funciona en 2007.

     If SysCmd(acSysCmdAccessVer) = "12.0" Then
        Me.Properties.Item("RibbonName") = "NombreRibbon"
    Else
        'Usar procedimiento para establecer las barras de herramientas tradicionales.
    End If

Ahora llega lo más serio y es volver a mi desconocido Lenguaje de Marcado Extensible el lenguaje XML y montar de nuevo los comandos.

Se adjunta el ejemplo test.Ribbon2007vsBHP2003 donde se demuestra lo expuesto en este artículo.

En este ejemplo también puedes encontrar los siguientes ejemplos,
  • Como usar la propiedad Información adicional (Tag) de un control de imagen para cuando, al abrir el formulario, se establezca la imagen según una ruta relativa a la aplicación. Es decir, puedes descargar la aplicación en cualquier ruta que al abrir la imagen que está vincula aparece en el control.
  • Al cerrar el formulario de Inicio cómo conocer si la base de datos es MDE, según el valor de la propiedad la aplicación se cerrará o lo hará sólo el formulario.
  • Como conocer la versión comercial, versión interna y versión de compilación del Access que está ejecutando la aplicación.
  • Como crear una Barra de Herramientas Personalizada para versiones de Access 2003 y anteriores por código, incluso con las imágenes icono que están externas a la aplicación. 
McPegasus, 25/04/2008 
Publicado por McPegasus con 2 comment(s)

Magia potagia y ases en la manga I

Este artículo va a resultar un poco raro porque va a contar cosas algo raras que he estado haciendo con Access 2007 y en el mismo orden en que han vagado mis ideas de un lado para otro: ninguno.

Resulta que ando últimamente hechizado por la magia de las consultas a base de una tabla de números consecutivos que combinamos con otra tabla sin establecer relaciones, de manera que el resultado es un producto cartesiano que luego filtramos. Es una técnica conocida pero, en general poco usada ¿Qué pasa si echamos una pastilla efervescente en la clara de huevo? ¿Y si cocemos un huevo en el microondas? ¿Y si me suturo la herida del dedo con Super Glue? Yo soy de los que tienen que probar, aunque ya lo hayan hecho otros, y estas consultas raras me permiten experimentos sin tener que fregar luego la gaseosa derramada. Esta vez me lo he pasado tan bien que tengo que contarlo, como Dominguín después de lo de Ava Gadner.

Usar memos para crear un calendario sin usar casi código

Ya dije que la cosa era un poco rara y, como seguirá siendo rara, empezamos por el final. Éste es el formulario:

 

image

 

Y éste es todo el código:

Option Compare Database
Option Explicit

Private Sub Comando45_Click()
TempVars!AñoInicial = Nz(TempVars!AñoInicial, Year(Date)) + 1
Me.Anyo.Requery
End Sub  

Private Sub Comando46_Click()
TempVars!AñoInicial = Nz(TempVars!AñoInicial, Year(Date)) - 1
Me.Anyo.Requery
End Sub

 

Pero, para hacer esto no necesitaba usar alguna de las cosas raras que he usado. Para lo que las he necesitado ha sido para conseguir esto otro:

 

image

 

Tabla Calendar:

image

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Se trata de crear un informe que presente tantos calendarios mensuales como sean necesarios para mostrar todos los periodos anotados en un conjunto de registros. Y todo el código VBA que necesita es éste:

Option Compare Database
Option Explicit

Private Sub EncabezadoDelGrupo0_Format(Cancel As Integer, FormatCount As Integer)
TempVars!AñoInicial = Me.Anyo.Value
End Sub

Private Sub Report_Close()
TempVars.Remove ("AñoInicial")
End Sub

Private Sub Report_Open(Cancel As Integer)
TempVars!AñoInicial = Year(DMin("Fecha", "qryFestivosVirtuales"))
End Sub

Números y fechas

Una fecha es un número, por lo que si a una serie de números le sumamos una fecha, tenemos una serie de fechas. Podemos añadir campos calculados para mes, año o día de la semana. Hace falta una tabla, que llamaremos Números (sí, con acento, en español) con un campo que llamaremos Número y que llenamos con números consecutivos y que nos va a servir para muchas más cosas. Con sólo esa tabla podemos hacer una consulta así:

SELECT [número]+DateSerial(Year(Date()),Month(Date()),1)-1 AS Fecha, Format([fecha],"dddd") AS Dsemana, (Month([fecha])) AS Mes, (1+(([fecha]-2)\7)) AS Fila
FROM Números;

El resultado es una cosa así:

 

image

 

Nos sale un campo raro que se llama fila y que usaremos más adelante para unos cálculos. Si guardamos esta consulta como "Fechas Virtuales" y sobre ella hacemos una de referencias cruzadas usando el día de la semana como encabezados de columna.

 

TRANSFORM Min([Fechas virtuales].Fecha) AS MínDeFecha
SELECT [Fechas virtuales].Fila, Month([fecha]) AS mes, Year([fecha]) AS Anyo
FROM [Fechas virtuales]
GROUP BY [Fechas virtuales].Fila, Month([fecha]), Year([fecha])
PIVOT [Fechas virtuales].Dsemana In ("lunes","martes","miércoles","jueves","viernes","sábado","domingo");

Obtenemos el siguiente resultado:

image

¡Juer! ¿Y dónde está eso del producto cartesiano? Tranqui, de momento no hace falta, ya lo usaremos luego. Ahora, de momento, vamos a ponerlo en un formulario para que quede más mono:

image

image

 

 

 

La magia y el producto cartesiano (¿Descartes y magia? :-S)

Muy fácil de hacer el calendario, pero no sirve para nada; para eso es mucho más sencillo utilizar un MonthViewer ActiveX. Le faltan las fechas en colores marcando los distintos periodos que tenemos guardados en nuestra tabla Calendar.

Cogemos nuestra tabla:

image 

Abra Cadabra...

 

SELECT [start Time]+[número]-1 AS Fecha, Calendar.ID
FROM Calendar, Numeros
WHERE ((([start Time]+[número]-1)<=[end time]))
ORDER BY [start Time]+[número]-1;

image

Le Voilá!

image

Hemos sacado todas las fechas correspondientes a los periodos de nuestro calendario. Y todavía no hemos escrito una línea de código.

Pero... Si nos fijamos, se trata de un formulario continuo y, si cambiamos el color del texto en un campo de un registro, se cambiará en todos. Podríamos usar formato condicional, pero falla más que una escopeta de feria y, además, iba a ser lento.

Un memo en la manga

Sabemos que los controles que muestran campos memos tienen una propiedad TextFormat que, usando etiquetas HTML permite mostrar el texto en formato de texto enriquecido. Si al cuadro de texto le ponemos como origen un campo de distinto tipo, no admite el formato de texto enriquecido, pero, si usamos un campo calculado, sí que nos lo va a admitir. Vamos, que como no sabe qué tipo de campo es, se porta como un memo.

O sea, que si en un campo calculado con formato de texto enriquecido añadimos las etiquetas correspondientes, se mostrará en rojo (o como nos de la gana si usamos las etiquetas correctas:

<font color=red>" & Día([fecha]) & " </font>

Sólo tenemos que coger nuestra consulta de Fechas Virtuales, combinarla con la consulta de Festivos Virtuales y, donde coincidan ponerle las etiquetas para que luego se muestre en rojo:

SELECT [Copia de Fechas virtuales].*, IIf(Not IsNull([qryFestivosVirtuales].[Fecha]),"<font color=red>" & Day([Copia de Fechas virtuales.fecha]) & " </font>",Day([Copia de Fechas virtuales].[fecha])) AS Expr1
FROM [Copia de Fechas virtuales] LEFT JOIN qryFestivosVirtuales ON [Copia de Fechas virtuales].Fecha = qryFestivosVirtuales.Fecha
ORDER BY IIf(Not IsNull([qryFestivosVirtuales].[Fecha]),"<font color=red>" & Day([Copia de Fechas virtuales.fecha]) & " </font>",Day([Copia de Fechas virtuales].[fecha]));

El resultado, mostraría registros así:

image

 

Con esa consulta creamos una consulta de referencias cruzadas como la que hicimos antes:

TRANSFORM Min(FechasyFestivosVirtuales.Expr1) AS MínDeExpr1
SELECT FechasyFestivosVirtuales.Mes, FechasyFestivosVirtuales.Anyo, FechasyFestivosVirtuales.Fila
FROM FechasyFestivosVirtuales
GROUP BY FechasyFestivosVirtuales.Mes, FechasyFestivosVirtuales.Anyo, FechasyFestivosVirtuales.Fila
PIVOT [FechasyFestivosVirtuales].Dsemana In ("lunes","martes","miércoles","jueves","viernes","sábado","domingo");

Y hacemos con ella el origen de un formulario calendario como el que teníamos antes, pero los controles originales (en amarillo), los ocultamos y añadimos unos campos calculados que tengan su origen en ellos y cuyo formato de texto sea Texto enriquecido.

image

 

Después de tapar los controles invisibles con los nuevos controles calculados y reajustar los tamaños, nos queda una cosa así:

image

Que, cuando usemos como subformulario, al vincular por meses con el formulario principal, nos mostrará sólo los días de cada mes.

De la misma manera, podríamos haber construido un subinforme. Ya sólo queda insertar suficientes subformularios o subinformes para que cubran todo el periodo.

Pero ¿Hasta qué fecha? ¿Tendremos números suficientes? ¿Cómo seleccionamos las fechas? ¿Dónde co...o están esas líneas de código? ¿A dónde iba Dominguín a las siete de la mañana?

La respuesta en el próximo capítulo.

Publicado por Chea con 13 comment(s)

Plantillas de tablas y plantillas de Sharepoint en Access 2007

Este artículo es continuación del anterior y fue publicado en El rincón del experto en febrero.

En Access 2007 disponemos de una serie de plantillas para crear tablas específicas con todos sus campos con sólo un par clics de ratón. También disponemos de plantillas para crear directamente listas de Sharepoint de la misma manera. Si nos fijamos, comprobamos que ambas listas de plantillas coinciden casi por completo y, como veremos más adelante, no se trata de pura coincidencia; también veremos que usar las plantillas nos proporciona más funcionalidades que la simple creación automática de una tabla

image image

WSSTemplateID y WSSFieldID

Ya nos habíamos fijado en un artículo anterior en que, al crear una tabla usando la plantilla de "Contactos", tenemos la posibilidad de añadir funcionalidades de importar o exportar desde "Contactos" de Outlook utilizando los comandos acCmdAddFromOutlook y acCmdSaveAsOutlookContact o las macros equivalentes. También habíamos visto que la tabla tenía una propiedad WSSTemplateID con valor 105 y que casi cada campo de la tabla tenía una propiedad WSSFieldID indicando con qué campo de la plantilla se corresponde; las tablas creadas con la plantilla tienen esas propiedades pero también se las podemos asignar usando VBA a las tablas que queramos y obtendremos el mismo resultado.

¿Ocurrirá lo mismo con el resto de las plantillas? Podemos probar.

Podemos crear una tabla usando la plantilla "Eventos" y, luego, comprobar sus propiedades WSSTemplateID y WSSFieldID utilizando el siguiente código:

Public Function fPropCampos(Tabla As String) As String
Dim i As Integer
Debug.Print "Plantilla: " & CurrentDb.TableDefs(Tabla).Properties("WSSTemplateID")

For i = 0 To CurrentDb.TableDefs(Tabla).Fields.Count - 1
    On Error Resume Next
    Debug.Print CurrentDb.TableDefs(Tabla).Fields(i).Properties("WSSFieldID")
    Err.Clear
Next i

End Function

Llamando a la función pasando el nombre de la tabla, obtenemos en la ventana de inmediato la siguiente relación:

Plantilla: 106
Title
EventDate
EndDate
Location
Description
Attachments

Es decir, que sí que existen esas propiedades en las demás plantillas de tabla, pero ¿Para qué sirven? El prefijo WSS del nombre de las propiedades nos da una pista: Se refieren a Windows Sharepoint Services; o sea, que son plantillas e ID de campo de Sharepoint. Más adelante probaremos a crear una lista de Sharepoint usando las plantillas y veremos que, al importarla, tiene las mismas propiedades que la tabla que hemos creado en Access más alguna otra específica de Sharepoint, pero, de momento vamos a centrarnos en para qué sirven estas propiedades en la tabla que hemos creado en Access.

Cabe pensar que, lo mismo que pasa con los contactos, podríamos exportar/importar datos de nuestra tabla de eventos o de tareas a su equivalente de Outlook, pero de momento no es así. Esperemos que en futuras versiones lo contemplen.

 

Probar nuestra tabla en Sharepoint

Sin embargo, si disponemos de un servidor Sharepoint, sí que le podemos encontrar alguna utilidad. Exportar nuestra tabla es bastante sencillo

image

Sólo hay que elegir la opción correspondiente en la opción "Lista de Sharepoint", del grupo "Datos externos" de la cinta de opciones, o, aún más sencillo, usando el menú contextual que aparece al pulsar con el botón derecho del ratón sobre la tabla que queremos exportar, como se muestra en la imagen superior. Luego sólo hay que indicarle al asistente en que sitio de Sharepoint queremos ubicar la lista.

image

 

Al abrir la lista que hemos creado al exportar nuestra tabla, vemos que Sharepoint la ha tratado de una manera especial: Ha reconocido que se trata de un calendario y nos la muestra en una vista que recuerda mucho al calendario de Outlook.

 image

 

Conectar con Outlook

¿De Outlook hemos dicho? Vaya, si parece que se pone interesante... Vemos que entre las posibles acciones tenemos la de conectar con Outlook. Pues probemos:

image

Al seleccionar la opción, el asistente nos abre Outlook y nos pregunta si queremos conectar el calendario

image

Naturalemente, decimos que sí y !Eureka! ya tenemos nuestro calendario añadido en Outook, y vamos a probarlo ahora mismo añadiendo una cita

image

Después de refrescar nuestra ventana de Sharepoint, comprobamos que la cita que acabamos de escribir en Outlook ya es visible desde Sharepoint

 

image

Es decir, que podemos tener sincronizado nuestro calendario de Outlook con el de Sharepoint. Pero estábamos hablando de Access ¿Está sincronizado el calendario con nuestra tabla de Access? Evidentemente, no, puesto que hemos exportado la tabla, de manera que nuestra BD no guarda ninguna relación con la lista de Sharepoint, pero podemos probar a vincularla y es lo que vamos a hacer.

 

Vincular la lista de Sharepoint a Access 2007

Borramos la tabla Eventos de nuestra de BD de Access y vinculamos la lista de Sharepoint que estamos manejando. Con los asistentes es muy fácil.

image

 

 

image 

 

Al abrir la tabla vinculada, vemos que ya está nuestra anotación y, además, vamos a probar a meter otra

image

En Sharepoint los cambios se reflejan en cuanto refrescamos la ventana

image

¿Y en Outlook? ¡También! Le voilá!

image

Aún hay más. En Outlook, podemos, por ejemplo, poner alarmas y en Sharepoint hacer que se nos notifique por correo electrónico cada vez que nuestra lista cambie y, como la tenemos vinculadas desde Access, significa que modificando la tabla eventos desde Access, se generarán alarmas en Outlook y se enviará un correo avisando desde Sharepoint.

 image

Otras plantillas

De manera parecida ocurre si en, vez de Eventos, hubiéramos exportado Tareas. Sharepoint la habría tratado de una forma especial, con una vista específica, y podríamos haberla conectado con las tareas de Outlook. Con otras plantillas, aunque no tengan conectividad con Outlook, siguen teniendo un tratamiento específico en Sharepoint, puesto que precisamente se trata de eso, de plantillas de Sharepoint, para las que esta aplicación tiene preparadas vistas específicas.

Más plantillas de Sharepoint

Las plantillas de Sharepoint no se limitan a las que se muestran en los desplegables de Access 2007. Cuando creamos una lista desde el sitio de Sharepoint tenemos bastante más posibilidades y, si las exportamos a Access 2007 y comprobamos sus propiedades como hacíamos al principio, vemos que todas ellas tienen sus propiedades WSSTemplateID y WSSFieldID. He aquí unas cuantas plantillas de Sharepoint con el valor de su WSSTemplateID

WSSTemplateID Template
100 Custom List
101 Document Library
102 Survey
103 Links
104 Announcements
105 Contacts
106 Events
107 Tasks
108 Discussion Boards
109 Picture Library
112 User Information
115 Form Library
119 Wiki Page Library
120 Custom List in DataSheet View
150 Project Tasks
1100 Issue Tracking

Algunas de ellas coinciden con nuestras plantillas de Access, pero si las creamos en Sharepoint y probamos a importarlas, podemos comprobar que tienen algunos campos más.

La mayoría de esos campos adicionales son de uso interno de Sharepoint y no son necesarios en Access; es más, si comprobamos la lista de "Eventos" que antes hemos creado en Access, exportado a Sharepoint y luego vuelta a vincular a Access, vemos que tiene más campos que los originales, sin que hayamos tenido que intervenir, lo cual nos tranquiliza: Aunque nuestras tablas en Access no incluyan esos campos, ya los creará Sharepoint cuando los necesite.

Si, desde una tabla importado de una lista, creamos un formulario automáticamente, veremos que la mayoría de esos campos adicionales no se muestran en el formulario. La explicación está en que tienen otra propiedad, más: ColumnHidden = True.

Hay otros campos que no coinciden y que sí que se muestran al crear el formulario. Se trata de campos que no son de uso interno pero que en Access tienen menos funcionalidad, por ejemplo, porque no existe una herramienta para mostrar el calendario de eventos.

 

Conclusiones

Las plantillas de tablas de Access son algo más que simples asistentes para crear unas pocas tablas: añaden a estas tablas una serie de propiedades que serán útiles para integrarlas con otras aplicaciones y nos dan pistas para una mayor integración en el futuro.

Hay que empezar a conocer Sharepoint. Por un lado, se está convirtiendo en eje de la integración entre las distintas aplicaciones de Office, por otro, como back end de Access añade a esta aplicación posibilidades antes impensables.

Publicado por Chea con 2 comment(s)

Contactos de Outlook en Access 2007

Para que la Evas no tenga razón cuando nos achaca que nos prodigamos poco, copio aquí el artículo que publique en El Rincón del experto en enero.

En Access 2007 es muy fácil añadir un botón a un formulario para que se puedan agregar contactos desde Outlook o guardar el registro de nuestro formulario como un contacto de Outlook. Basta con sólo seguir unos pasos.

Generar la tabla

La tabla que usemos para los contactos tiene que tener unas características concretas.

Sin entrar ahora en detalle de cuáles son éstas, la forma más sencilla de conseguirlo es crear la tabla usando la plantilla “Contactos” en “Plantillas de tabla”, en la pestaña “Crear”, grupo “Tablas” de la cinta de opciones.

clip_image002

Generar el formulario

La tabla se genera automáticamente con todos los campos necesarios.  Guardamos la tabla como “Contactos” y, pulsando directamente en la opción “Formulario”,  también de la pestaña “Crear”, se genera, sin más, un formulario de “Contactos” completo

clip_image004

clip_image006

Generar el código

Ahora debemos crear el código para interactuar con Outlook. De momento, nos centraremos en “Agregar contacto desde Outlook” y luego no habrá más que repetir el proceso para “Guardar como contacto de Outlook”

clip_image008

Pasamos el formulario a la vista “Diseño” y añadimos un botón. Se abrirá la ventana del asistente, pero en esta ocasión no nos sirve de mucho; mejor establecemos las propiedades manualmente.

clip_image010

Le cambiamos el nombre, las propiedades “Título”, “Organización de pies de imagen”, “Imagen” y estilo del fondo para que quede más bonito.

El código irá en el evento clic del botón.

Usar un procedimiento de evento

clip_image012

En la propiedad del botón “Al hacer clic” podemos poner [Procedimiento de evento] y luego en el editor de VBA,  crear un procedimiento como éste:

Private Sub btnAgregarOutlook_Click()

    DoCmd.RunCommand acCmdAddFromOutlook

End Sub

Usar una macro

El código es tan sencillo, una única línea de código, que parece que no merece la pena usar una macro en su lugar. Sin embargo, una macro incrustada es una buena alternativa, pues en lo sucesivo, al copiar y pegar nuestro botón, también se copia y pega la macro que lleva inrustada.

Si, en vez de seleccionar [procedimiento de evento] en la propiedad “Al hacer clic”, pulsamos sobre el botón con los tres puntos que aparece a la derecha y elegimos el Generador de macros”, sólo tenemos que elegir la acción “Agregar comando” y el comando “Agregar desde Outlook” para crear una macro incrustada que consiga el mismo efecto que con el código DoCmd.RunCommand acCmdAddFromOutlook

Es decir, que para agregar un contacto desde Outlook podemos utilizar el código

·        DoCmd.RunCommand acCmdAddFromOutlook

O la macro

  • EjecutarComando AgregarDesdeOutlook

Probar la aplicación

Ya sólo nos queda probar. Pasamos a vista formulario, presionamos el botón y Voilá!

clip_image014

Podemos repetir los mismos pasos para el botón “Guardar como contacto de Outlook”, sabiendo que en este caso el código sería:     

  • DoCmd.RunCommand acCmdSaveAsOutlookContact

Y la macro:

  • EjecutarComando GuardarComoContactoDeOutlook

Probar con una tabla distinta

Quizás queramos usar como contactos una tabla que no hayamos generado con la plantilla, por ejemplo, porque estamos aprovechando una aplicación o unos datos antiguos. Si hemos usado una macro, no tenemos más que copiar y pegar los botones en el viejo formulario y, si lo hemos hecho con código, tendremos además que crear el código de los eventos.

Es muy sencillo y en un instante ya lo estamos probando, y… ¡No funciona!

¿Qué está ocurriendo?

Ya habíamos comentado que la tabla debe tener una características concretas que la plantilla nos las daba hechas.

De alguna forma debemos decirle a Outlook qué campos de nuestra tabla se corresponde con cada uno de su plantilla. La forma de hacerlo es creando o modificando para esa tabla la propiedad WSSTemplateID de manera que tenga el valor 105 y, para cada uno de los campos que lo precisen,  la propiedad WSSFieldID de manera que indique con qué campo de la plantilla se corresponde.

En el Access Team Blog explican cómo modificar esas propiedades y en mi página hay un complemento para hacerlo fácilmente.

Estas propiedades sirven para más tipos de plantillas que la de contactos. Si su nombre empieza por WSS es porque hacen referencia a plantillas de SharePoint y les vamos a encontrar especial utilidad en este entorno, pero todo eso es ya materia suficiente para tratar en un artículo aparte.

Publicado por Chea con 2 comment(s)
Archivado en:

¡Por fin la Runtime de Access 2007 en español!

Se ve que las figuras del Access Team Blog, que son los que suelen hacer estos anuncios, se ha ido de fin de semana antes que el currito encargado de poner las actualizaciones en la web de descargas, pero un avispado usuario de los grupos de noticias de Access en español, "Ceac", ha observado que ya está disponible la versión en español y nos ha dado el aviso.

Podemos descargarla en https://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=d9ae78d9-9dc6-4b38-9fa6-2c745a175aed

Publicado por Chea con 4 comment(s)

Access 2007. Cambiar de banda de opciones (Ribbon) usando VBA

Cargar las bandas de opciones

Las distintas bandas de opciones, o "Ribbons", que se vayan a usar en una aplicación deberían cargarse todas al arrancar la aplicación y luego, sobre la marcha, ir cambiando de unas a otras. Podemos usar el método LoadCustomUI, compartido con otras aplicaciones de Office, para cargar los distintos Ribbons, pero si los tenemos guardados en una tabla UsysRibbons (específica de Access)  es innecesario, pues Access al abrirse se encarga de cargarlos. Por tanto, salvo que existe algún motivo muy especial en sentido contrario, la mejor opción para guardar una cinta de opciones en Access es en una tabla UsysRibbons.

Asignar las bandas de opciones a formularios, informes y aplicación

Ribbon genérico y Ribbons contextuales

Los Ribbons van asociados bien a la aplicación, bien a un formulario o informe. En el primer caso, hablamos de un Ribbon genérico y en los otros dos, de Ribbons contextuales, tanto una como los otros, tienen propiedades específicas para indicar cuál es la cinta de opciones que le corresponde.

Propiedades para asignar la banda de opciones

En el caso de los contextuales en formularios e informes, la propiedad es "Nombre de la banda de opciones", en VBA Form.RibbonName o Report.RibbonName, y la encontramos cercar del final de la lista de propiedades del formulario o informe.

image

En el Ribbon genérico de la base de datos, la propiedad sería CurrentDb.Properties("CustomRibbonID") en VBA, pero la podemos asignar directamente pulsando el Botón de Office|Opciones de Access|Base de datos actual|Nombre de la banda de opciones.

image

Cambiar de banda de opciones

El Ribbon contextual de formularios o informes se puede cambiar sobre la marcha, pero el genérico, el de la aplicación, se asigna al arrancar ésta. Aunque cambiemos la propiedad CustomRibbonID, esto no tendrá efecto hasta que cerremos y volvamos a abrir la aplicación.

Por el contrario, el Ribbon contextual de formularios o informes se puede cambiar sobre la marcha, aunque debe estar cargado previamente. Basta con decir

me.RibbonName = "NombreRibbon"

para cambiar éste. Sin embargo, son pocas las ocasiones en que puede ser necesario cambiar el Ribbon una vez abierto el formulario o informe y, lo habitual es que esté asociado a ellos, por lo que es suficiente con que la propiedad "Nombre de la banda de opciones" tenga asignado un valor para que, al recibir el foco el formulario o informe, cambie el Ribbon al indicado en esta propiedad.

Combinar bandas de opciones o hacer que se muestren solas

Los Ribbons contextuales de nuestros formularios o informes se mostrarán, normalmente combinados con el Ribbon genérico de nuestra aplicación y con los Ribbons propios de Access.

Nuestros Ribbons pueden mostrarse combinados con los Tabs de los Ribbons propios de Access (Inicio, Diseño, Herramientas...). Esto puede parecer cómodo en un primer momento, pues nos muestra opciones contextuales sin obligarnos a diseñar nada, pero luego nos damos cuenta de que puede estar mostrándonos opciones que no deseamos mostrar y que otras, que pueden resultar útiles, no se mostrarán cuando usemos la Runtime.

Mostrar sólo las bandas de opciones personalizadas

Evitar que se muestren otros Ribbons que los nuestros personalizados, es bien sencillo: En el texto XML correspondiente a nuestra cinta de opciones, damos valor verdadero a la propiedad StarFromScratch:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    <ribbon startFromScratch="true">

Si la aplicación tiene asignado un Ribbon genérico, éste se combinará con los contextuales de formularios e informes si es que existen y, si no existen, será el predeterminado.

Mostrar sólo la banda de opciones del objeto que tiene el foco

Si al entrar en un formulario o informe, queremos que sólo se muestre el Ribbon asignado en la propiedad "Nombre de banda de opciones", RibbonName, basta con dejar en blanco la propiedad de la aplicación CustomRibbonID que hemos visto que podíamos asignar en Botón de Office|Opciones de Access|Base de datos actual|Nombre de la banda de opciones.

Si queremos no usar una cinta de opciones para la aplicación y, sin embargo, que los distintos Ribbons contextuales de los formularios compartan opciones en común, tendremos que copiar en pegar en cada uno de ellos el conjunto de Tabs, grupos o controles que queremos que compartan.

Publicado por Chea con 8 comment(s)
Archivado en: