domingo, 11 de diciembre de 2011

Análisis de dos bases de datos

 

Antecedentes

Se cuenta con dos bases que comparten estructuras comunes (Tablas, Stored procedures, triggers, etc). ambas bases de datos son utilizadas por la misma aplicación solo que en versiones distintas, de allí su diferencia. Se requiere analizar ambas bases de datos para poder sacar una relación de sus diferencias y realizar un empate de alguna de las estructuras.

 

Solución

Se desarrolló un Stored procedure que realiza un análisis desplegando dos conjuntos de resultados.

  1. Relación de estructuras con los siguientes atributos
    1. Contador: Identificador auto numérico de la tabla
    2. Tabla : Nombre del objeto de base de datos
    3. Esta en origen: Bandera señala si el objeto esta en la base de datos origen
    4. Esta en destino: Bandera señala si el objeto esta en la base de datos destino
    5. Cantidad de campos idéntica: La cantidad de atributos en ambos objetos es idéntica
    6. Calidad de campos idéntica: La calidad (Longitud, tipo de dato, manejo de nulos, idioma o COLLATE) de atributos en ambos objetos es idéntica
    7. Susceptible a analizar: Bandera que indica que la estructura u objeto origen difiere de su homóloga en la base de datos destino
  2. Detalle de las inconsistencias
    1. Tabla: Nombre de la tabla u objeto involucrada
    2. Orden: Identificador auto numérico de la tabla
    3. ColOrigen: Nombre de la columna o campo en la base de datos origen
    4. ColDestino: Nombre de la columna o campo en la base de datos destino
    5. Longitud distinta: La longitud del campo difiere de una base de datos a otra
    6. Null distinto: El manejo de nulos del campo difiere de una base de datos a otra
    7. Collate distinto: El idioma o COLLATE del campo difiere de una base de datos a otra
    8. Tipo de dato distinto: El tipo de dato del campo difiere de una base de datos a otra
    9. Campo no está en origen: El campo o atributo no esta en la base de datos origen
    10. Campo no esta en destino: El campo o atributo no esta en la base de datos destino

A continuación se anexa un ejemplo de ejecución:

image

Tanto el filtro como el tipo de objeto son campos que se pueden omitir. El primero dándole el valor de ‘%%’, el segundo simplemente dejando el valor vacío ‘’

lunes, 28 de noviembre de 2011

Problemas con Crystal Reports v8 (CR8) en Windows 7 de 64 bits (Win 7 x64)

 

Problemática

Se han suscitado en algunos proyectos en los que he estado involucrado diversos problemas relacionados a este tipo de instalación.

Como antecedentes y en específico, la aplicación es una Windows Application, esta desarrollada en VB NET (VS 2008) usando CR 8 con reportes que en su mayoría usan el controlador nativo de SQL server y su fuente de información en procedimientos almacenados (Stored procedures) desarrollador den T-SQL sobre la plataforma de base de datos SQL Server 2008.

La aplicación se ha instalado sobre diversos sistemas operativos(De 32 y 64 bits), que van desde Windows XP (Service pack 1), hasta Win 7.

La mayor cantidad de problemas han brotado sobre Windows vista y Windows 7 de 64 bits. El listado de problemas es tan extenso como variado y no será incluido explícitamente en esta publicación, pero por nombras las mas sobresalientes:

  • Errores indeterminados en cuya descripción se nombre la palabra HRESULT.
  • Errores nativos de Crystal Reports:
    • 20599
    • 20534
    • 20537
  • Errores de pre visualización:
    • Se despliega el reporte en blanco
    • Se intenta desplegar el reporte pero se queda inhibido (Pasmado)
    • Se pre visualiza momentáneamente el reporte cerrándose fracciones de segundo después Efecto Blink (Parpadeo)

 

Recomendaciones

 

A continuación se listan las recomendaciones que me han llevado a solucionar la mayoría (Prácticamente la totalidad) de los errores reportados o detectados en este escenario:

  • Quitar el prefijo “PROC(“ en la propiedad del Database/ Set Location de los reportes
  • Que el controlador utilizado en algún sub reporte no coincida con el del reporte que lo contiene. Por ejemplo: el controlador del reporte es OLEDB y el controlador del sub – reporte es SQL.
  • Que el procedimiento almacenado de la base de datos no cuenta con las siguientes prácticas
    • Lectura sucia masiva al inicio del procedimiento (SET TRANSACTION ISOLATION LEVEL READUNCOMMITTED)
    • Conteo de filas apagado en procedimientos que arrojan mas de un resultado (SET NOCOUNT ON)
    • Manejo explícito en tablas temporales de:
      • Nulos
      • Idioma (COLLATION)
      • Tipo de dato
    • Creación de tablas temporales explícitas [No crearlas al vuelo por medio de una consulta (INSERT - SELECT ó SELECT – INTO)]
    • Manejo constante de la cantidad de atributos de salida, esto quiere decir que no cambie ni la cantidad, tipo o nombre de los atributos o campos de salida resultados del procedimiento.
  • Falta de controladores o librerías para lo cual se debe de correr el paquete redistribuible para 32 bits. CRRedist2008_x86.msi. Se que el instalador es para un sistema operativo de 32 bits, no es un error, y no se debe de instalar el redistribuible para 64 bits aunque parezca en primera instancia lo mas adecuado o correcto, repito "NO” se debe de instalar CRRedist2008_x64, la versión que hace que los reportes funcionen óptimamente es el redistribuible de 32 bits que se menciona al inicio de este punto y de el cual se agrega vínculo de descarga, independientemente si el SO es de x64, lo correcto es el redistribuible de x32.
  • Bajar el UAC (User acceso control) de Windows 7 al mínimo
  • Que el idioma (collate) del servidor y la base de datos sea el mismo (SQL_Latin1_General_CP1_CI_AS)
  • Ejecutar siempre como administrador la aplicación realizando los siguientes pasos:
    • Entrar al menú inicio
    • Seleccionar el acceso directo a la aplicación
    • Dar clic derecho/ Propiedades
    • Elegir en la pestaña de “Compatibilidad”
    • Dar clic en el botón “Cambiar la configuración para todos los usuarios”
    • En el agrupador “Modo de compatibilidad”, seleccionar “Ejecutar este programa en modo de compatibilidad” y seleccionar de la lista desplegable “Windows XP Service Pack 3”
    • En el agrupador “Nivel de privilegio”, seleccionar “Ejecutar este programa como administrador” y dar clic en “Aceptar”
    • Presionar nuevamente el comando “Aceptar” en el cuadro de dialogo de las propiedades
    • Algunos problemas de pre visualización de reportes se solucionan Instalando CR8 completo en el cliente
  • Espero les sea de utilidad.

    jueves, 24 de noviembre de 2011

    ¿Como se si el valor de un campo existe en todas las tablas que contengan dicho campo, si no se en cuantas tablas existe el campo? (Base de datos SQL 2008)

     

    Problemática

    Creo que la propia pregunta nos dice la problemática, pero voy a poner un ejemplo para clarificar las cosas de manera mas puntual.

    Tenemos un ERP con un catálogo de artículos, en la base de datos se cuenta la tabla que sustenta el catálogo mas un sin fin de tablas de apoyo que albergan bitácoras, Kardex, ventas, facturas, etc., etc. dentro de dichas tablas existen relacionados artículos.

    La relacione entre el catálogo de artículos y estas tablas esta establecida por la clava única de cara articulo que se almacena en el campo CveArt.

    Nos solicitan encontrar dentro de la base de datos todos los lugares en los que el artículo con clave 777 se encuentra, y como no conocemos la totalidad de las tablas que contemplan este campo, y mucho menos si el artículo con clave 777 se encuentra allí.

     

    Solución

    Existen varias opciones para realizar esta búsqueda, algunas mas complejas que otras, yo les voy a proporcionar mi solución, la cual ya evaluarán ustedes si es compleja o no.

    Primero descarguen de la siguiente liga un Stored procedure de mi autoría:

    Stored procedure para buscar valores de campos en todas las tablas de una BD

    A continuación anexo el ejemplo de ejecución para el caso de nuestro ejemplo:

     

    EXEC PIRM_SelValCamTabla 'CveArt', 777

    El resultado sería algo similar a lo siguiente

    Contador Tabla Registros
    1 Kardex 23747
    2 Ventas 2110
    3 CatalogoArt 1
    4 Rembolsos 0
    5 Cancelaciones 1
    6 Bitacora 24171
    7 Devoluciones 1
    8 Recibos 0

     

    En donde la primera columna (Contador) es un simple identificador interno de la tabla de paso utilizada para desplegar la información. La segunda es el nombre de la tabla y la tercer es la cantidad de registros encontrados en esa tabla que contienen el valor 777 para el campo CveArt

    Espero les sea de utilidad.

    Problema de páginas en blanco con IE9

     

    Problemática

    Después de instalar IE9 y tratar de navegar, las páginas se cargaban correctamente ya que al pasar el ratón por encima se visualizaba la ayuda contextual de todos los elementos y me permitía inclusive darles CLICK, mas sin embargo la página se quedaba en blanco.

    Solución

     

    ·Cierra todas las sesiones del Internet Explorer.

    · Entra al menú inicio

    · Teclea Opciones de internet

    · Presiona Enter

    · CLICK en la pestaña Opciones Avanzadas

    · Revisa que este seleccionada la opción Usar procesamiento por software en lugar de procesamiento por GPU, la cual esta dentro de la rama Gráficos acelerados

    · CLICK OK

    · Abre el Internet Explorer

    Este TIP se obtuvo de la siguiente liga:

    http://answers.microsoft.com/en-us/ie/forum/ie9-windows_7/ie9-beta-gives-blank-screen/e0167934-da23-4f1f-ac34-c0b5d0891aa9

    Solo fue traducido para su comodidad por un servidor y le agradezco mucho el consejo a

    Steven de Microsoft Answers Support Engineer

    jueves, 17 de noviembre de 2011

    Error: The server could not load DCOM. (Microsoft SQL Server, Error: 7404)


    Problemática
    Al iniciar mi servidor de SQL server 2008 R2 me marcó el siguiente error:
    The server could not load DCOM. (Microsoft SQL Server, Error: 7404)
    ME deja entrar en aparente normalidad pero a la hora de querer restaurar una base de datos el error vuelve suceder y aunque me despliega el cuadro de dialogo correspondiente a la restauración, y me permite ir a buscar el archivo BAK para proceder con la misma, no me despliega el archivo en el listado por lo cual no puedo seleccionara para terminar con el proceso.

    Solución
    Se encendió el servicio del SQL Browser desde: Inicio/ Panel de control/ Herramientas administrativas/ Servicios/ SQL Server Browser. Además de configurarlo para que iniciara de manera automática
    image
    Espero les sea de utilidad.

    lunes, 29 de agosto de 2011

    Búsqueda de objetos dentro de programables (Stored procedures, vistas, funciones, triggers) de Microsoft SQL Server

     

    Antecedentes:

    Se tiene la necesidad de encontrar en cuantos y cuales (En donde exactamente) programables (Stored procedures, vistas, funciones, triggers) se encuentra un objeto de base de datos (Tabla, campo, índice o programable).

    Esto resulta muy útil para realizar un análisis de impacto. Ponemos un ejemplo, ampliar la longitud del campo “CLABE” de la tabla “CuentasBancarias” ya que no se da abasto para las longitudes manejadas en el sector bursátil.

    Solución propuesta

    Se cuenta con dos Stored Procedures que nos van a apoyar a esta búsqueda. El primero se llama sp_helptext_Plus y no es otra cosa que una versión modificada del stored del sistema de nombre sp_Helptext que nos ayuda a obtener el código de cualquier programable.

    El otro stored procedure es el que hace el trabajo pesado. Se llama P_BusCadTxtProgramables y el ejemplo de ejecución para la problemática planteada en este caso es la siguiente:

     

    EXEC P_BusCadTxtProgramables   

    @PS_Cadena = ‘CuentasBancarias’,

    @PS_TabFisica ='tmpCuentasBancarias’

    En donde el parámetro @PS_Cadena recibe el valor de la cadena de caractéres que se desea cnontrar y el parámetro @PS_TabFisica recibe el nombre de la tabla física en donde se van a guardar los resultados de la búsqueda. Si se ejecuta de esta manera, el stored procedure genera la tabla ‘tmpCuentasBancarias’ y posteriormente puede ser consultada por el usuario.

     

    Si solo se le envía el primer parámetro:

    EXEC P_BusCadTxtProgramables   

    @PS_Cadena = ‘CuentasBancarias’

    Los resultado de la búsqueda son desplegados al final de le ejecución. Para cualquier duda, quedo a sus órdenes.

    jueves, 11 de agosto de 2011

    Convertir números a letras en Microsoft SQL Server

     

    Me topé con el problema de actualizar masivamente un campo que un componente de la aplicación había calculado en base a un importe de la misma tabla. Debido a que necesitaba hacer la actualización masiva tanto de importes numéricos como de su equivalente en letras, busqué en internet y encontré estas 5 funciones jutas en un BLOG de un colega.

    Las funciones las pueden bajar en un archivo comprimido en esta liga. Las funciones están numeradas en base a como se deben de generar en la base de datos, siendo la última función la que realmente hace el trabajo.

    Dentro de las funciones hay comentarios con instrucciones sobre su uso, así como ejemplos de ejecución, espero les sean de utilidad

    miércoles, 16 de febrero de 2011

    DTA ( Database Engine Tunning Advisor ) en SQL 2008

    Antecedentes:

    Al tratar de ejecutar el DTA en SQL 2008 me marca error de conexión para el Log In SA.

    Después de agotar las opciones que todos mis colegas se habían tomado la molestia de publicar en internet (En su mayoría para SQL 2005).

     

    Se descargaron varios Scripts para generar las estructuras (Tablas y Stored procedures) que se decían necesarios para que el DTA funcionara.

     

    Al ejecutar estos scripts se generaron parcialmente las estructuras ocasionándome otro mensaje de error

     

    Solución

    Se generó un script  (Anexo a esta liga) de una BD MSDB de una instancia de SQL 2008 en la que el DTA si estuviese funcionando y se corrió sobre el servidor involucrado.