Autor Tema: Referencias  (Leído 2247 veces)

Desconectado xavi

  • Administrador
  • Habitual
  • *****
  • Mensajes: 213
Referencias
« en: Noviembre 02, 2017, 06:51:49 pm »
Palabras clave: referencias, librerias
Autor: Xavi
Extraído de: Foro MVP-Access

Antecedentes
Escenario.
Se está programando en Office 2010. Se tiene marcada la referencia a la biblioteca de Excel (14.0).
Si se manda la aplicación a un cliente que disponga de una versión superior, la aplicación automáticamente adaptará la versión de la librería a la versión superior
Si se manda la aplicación a un cliente que disponga de una versión inferior, el sistema no es capaz de adaptarse y "casca"

La solución óptima pasa por NO UTILIZAR las bibliotecas y referenciar genéricamente. Pero eso es muy engorroso si hay muchas declaraciones en la base de datos.

La solución que yo utilizo se basa en utilizar un módulo dónde se declaran las variables que se utilizaran en toda la aplicación.

El código el módulo (después la explicación):

Código: [Seleccionar]
Option Compare Database
Option Explicit

' Definimos las bibliotecas a utilizar
#Const UseObjectLibrary_XLS = True
#Const UseObjectLibrary_OLK = True
#Const UseObjectLibrary_FSO = False
#Const UseObjectLibrary_MSO = False

' ##################################################    EXCEL
#If UseObjectLibrary_XLS Then
    Public Const blnUseObjectLibrary_XLS    As Boolean = True
    Public xlsApp                  As Excel.Application
#Else
    Public Const blnUseObjectLibrary_XLS    As Boolean = False
    Public xlsApp                  As Object
    Public Const xlVeryHidden = 2
    Public Const xlPrintNoComments = -4142
    Public Const xlLandscape = 2
    Public Const xlAutomatic = -4105
    Public Const xlDownThenOver = 1
    Public Const xlPrintErrorsDisplayed = 0
    Public Const xlDelimited = 1
    Public Const xlTextQualifierDoubleQuote = 1
    Public Const xlWorkbookDefault = 51
    Public Const xlOpenXMLWorkbook = 51
    ' Validaciones de datos
    Public Const xlValidateList = 3
    Public Const xlValidateDecimal = 2
    Public Const xlValidAlertStop = 1
    Public Const xlGreaterEqual = 7
    Public Const xlBetween = 1
    ' Bordes
    Public Const xlEdgeLeft = 7
    Public Const xlEdgeTop = 8
    Public Const xlEdgeBottom = 9
    Public Const xlEdgeRight = 10
    Public Const xlContinuous = 1
    Public Const xlColorIndexAutomatic = -4105
    Public Const xlHairline = 1
    Public Const xlMedium = -4138
    Public Const xlThick = 4
    Public Const xlThin = 2
   
#End If

' ##################################################    OUTLOOK
#If UseObjectLibrary_OLK Then
    Public Const blnUseObjectLibrary_OUT    As Boolean = True
    Public olkApp           As Outlook.Application
    Public olkNs            As Outlook.Namespace
    Public olkFolder        As Outlook.Folder
    Public olkItems         As Outlook.Items
    Public olkRestrictedItems   As Outlook.Items
    Public olkMailItem      As Outlook.MailItem
    Public olkPrp           As Outlook.UserProperty
    Public olkAccount       As Outlook.Account
    Public olkAttach        As Outlook.Attachment
#Else
    Public Const blnUseObjectLibrary_OUT    As Boolean = False
    Public olkApp           As Object
    Public olkNs            As Variant
    Public olkFolder        As Object
    Public olkMail          As Variant
    Public olkPrp           As Variant
    Public olkAccount       As Variant
    Public olkAttach        As Variant
    Public Const olMailItem = 0
    Public Const olMSG = 3
    Public Const olByValue = 1
    Public Const olByReference = 4
    Public Const olFormatPlain = 1
    Public Const olFormatHTML = 2
#End If

' ##################################################    Microsoft Scripting Runtime
#If UseObjectLibrary_FSO Then
    Public fso              As Scripting.FileSystemObject
    Public fsoFile          As File
    Public fsoDrive         As Drive
#Else
    Public fso              As Object
    Public fsoFile          As Object
    Public fsoDrive         As Object
    Public Const ForReading = 1
#End If

' ##################################################    Microsoft Office x.xx
' La Object Library en los FileDialog
#If UseObjectLibrary_MSO Then
    Public fDialog          As Office.FileDialog
#Else
    Public fDialog          As Object
    Public Const msoFileDialogOpen = 1
    Public Const msoFileDialogSaveAs = 2
    Public Const msoFileDialogFilePicker = 3
    Public Const msoFileDialogFolderPicker = 4
#End If

Este código está copiado durante el periodo de desarrollo.
En mis aplicaciones, generalmente, se utilizan 4 bibliotecas adicionales: Excel, Outlook, FileSystem y Office. En alguna aplicación también se utiliza Word.

Después de las opciones vemos un primer bloque dónde se definen, como directiva, unas variables que indican si se va a utilizar o no la biblioteca. En este caso vemos que las de Excel y Outlook si mientras que FSO y Office no.

Después existen los distintos bloques IF..THEN...ELSE (también como directiva) dónde se evalúa la constante anterior para realizar las declaraciones de variables adecuadas a la utilización o no de la biblioteca.

En el bloque Excel vemos que, cuando se utiliza la biblioteca, la variable xlsApp se declara como Excel.Application mientras que, si no se utiliza, se declara como Object.
También vemos que, cuando no se utiliza la biblioteca, se declaran todas las constantes que se van a ir utilizando durante la aplicación.

En el caso de Outlook se ve más clara aun la diferencia entre declarar como Object/Variant o explicitamente.

Obviamente, las declaraciones a nivel de procedimiento desaparecen.

En definitiva se trata de ir cambiando el valor de las primeras constantes.
--> al programar: marcamos las bibliotecas y ponemos las constantes de directiva a True. Ello nos proporciona acceso a todos los métodos y constantes de la biblioteca
--> al dejar de programar: desmarcamos las bibliotecas y ponemos las constantes a False.
En ese momento conviene lanzar el depurador por si hubiéramos incluido alguna nueva constante específica de la biblioteca.
« Última modificación: Diciembre 13, 2017, 06:42:24 pm por xavi »