martes, 3 de noviembre de 2009

Creacion de Componentes COM++, Desde el inicio - Parte II.

Veamos, con este ejemplo que sera mas interesante y trataremos de hacerlo lo mas detallado para que sea entendible en su realizaciòn. la idea de este ejemplo es el de crear un componente pero que este este alojado del lado del servidor de componentes como un puente entre el cliente y el servidor de BD, esta forma de realizar proyectos nos ayuda a colocar los procesos que necesitan mas recursos de procesamiento ya que hara el trabajo sera este servidor de componentes y no el cliente.
Veamos la siguiente imagen que representa lo que vamos a realizar:



Como Uds ven tenemos un recurso mas en este modelo que es el servidor de componentes, en la parte I tenemos los proyectos Clientes y COMClientes que son alojados en el lado del cliente, ahora crearemos otro proyecto mas que lo alojaremos en el lado del servidor, veamos creamos nuevamente un proyecto con el nombre COMPLUSCliente y dentro de ella una clase DCliente, como se muestra en la siguiente estructura:





Bien este ultimo proyecto a diferencia de otros debe tener la característica de poder ser alojado en el lado del servidor y poder ejecutar transacciones, para esto este proyecto debe tener agregada la siguiente referencia a la libreria COM+ Services Type Library para cargar las clases de soporte para el manejo de transacciones y comunicacion.





Una vez realizado este dentro de la clase DCliente del proyecto COMPLUSCliente, crearemos la siguiente función como se muestra a continuaciòn casi igual que la funcion que teniamo en la clase Cliente:



Function rsClientes(ByVal xFiltro As String) As ADODB.Recordset
    'La conexión a la base de datos
    Dim cn As ADODB.Connection: Set cn = New ADODB.Connection
    Dim sql As String
    sql = "select CompanyName from Customers " & _
            "where CompanyName like '" & xFiltro & "%'" & _
            "order by CompanyName"

    cn.Open "Provider=SQLNCLI; " & _
             "Initial Catalog=Northwind; " & _
             "Data Source=PRINCESA; " & _
             "integrated security=SSPI; persist security info=True;"
     ' El recordset para acceder a los datos
    Dim rs As ADODB.Recordset: Set rs = New ADODB.Recordset

    ' Abrir el recordset de forma estática:
    rs.Open sql, cn, adOpenStatic

    Set rsClientes = rs
End Function



Ahora en el proyecto COMCliente eliminaremos la función que existía y la reemplazaremos por la siguiente función:



Function getClientes(ByVal xFiltro As String) As ADODB.Recordset
 Dim xCliente As Object
 Set xCliente = CreateObject("COMPLUSCiente.DCliente")

 Dim rs As New ADODB.Recordset
 Set rs = xCliente.rsClientes(xFiltro)

 If rs.RecordCount > 0 Then
 Set getClientes = rs
 Else
 Set getClientes = Nothing
 MsgBox "No existe datos para esta consulta"
 End If
 
End Function



Como vemos la referencias a proyectos de servicios es mediante la asigancion CreateObject y haciendo referencia al proyecto y clase a usar como se muestra en el código anterior. en el proyecto Clientes debemos modificar la consulta de la forma siguiente:



If Me.txtClientes.Text = "" Then
    MsgBox "Ingrese a lo menos un caracter", vbCritical, "Sist Clientes"
Else
 Dim xcliente As COMCliente.Cliente
 Set xcliente = New COMCliente.Cliente

 Dim rs As New ADODB.Recordset
 Set rs = xcliente.getClientes(Me.txtClientes.Text)
    'Llenamos el Listbox
    While Not rs.EOF
        Me.lstCliente.AddItem (rs!CompanyName)
        rs.MoveNext
    Wend
End If



Creando los instaladores:
Volvemos a generar los archivos compilados del proyecto Clientes y COMCliente de la misma forma como en la primera parte.
Ahora seleccionamos el proyecto COMPLUSCliente y crearemos la DLL, nos ubicamos en el servidor de componentes y nos vamos a Panel de control --> Herramientas administrativas y seleccionamos Servicios de Componentes, dentro de esta nos ubicamos hasta la raíz Aplicaciones COM+, seleccionamos y creamos una nueva aplicación como indica la figura:





Al ubicarnos en esta pestaña nos iremos hasta crear una nueva Aplicación vacía con el nombre igual al proyecto creado y en la opción de tipo de activación se debe seleccionar Aplicación de Servidor, como se ilustra aquí:





Luego en el tipo de identidad de la aplicación seleccionaremos Usuario interactivo que es el usuario creador de la aplicación y administrador del equipo y finalizamos la creación de la aplicación en el lado del servidor, una vez realizado nos desplazamos hasta la raiz de componentes de nuestra aplicacion:





Lo que haremos para finalizar esta aplicación es ubicar la dll creada COMPLUSCliente.dll la debemos seleccionar y arrastrar hasta la carpeta componentes o soltar al lado derecho seleccionado la carpeta componentes.





Y esta debe quedar como se indica en la figura anterior con esto ya estara activado nuestro componente en el lado del servidor.
Lo que nos falta es crear los instaladores para poder ser instalado en el lado del cliente para que nuestro cliente se pueda comunicar, para esto seleccionamos la aplicación COMPLUSCliente y seleccionamos la opción exportar:







En esta opción lo que crearemos es instalar nuevos componentes en el cual debemos seleccionar la ruta donde se generara el archivo instalador y escribiremos el nombre COMPUSCliente.MSI





Con esto hemos creado los instaladores al lado del cliente, donde se generaran dos archivos...





Con esto hemos completado la realización de este esquema de trabajo.


Ahora nos falta realizar pruebas de mantenimientos, como realizar algunos cambios en los componentes si que afecte a los clientes, creación de componentes mediante generacion de TLB's, La Seguridad... y como lo  hacemos en .NET... creo que primero debemos aprender como funciona actualmente varios sistemas existentes para entrar enel mundo de la plataforma .Net... Saludos.



Creacion de Componentes COM++, Desde el inicio - Parte I.

En este primer ejemplo sera, realizar una consulta de los clientes que concuerden con lo ingresado en el textbox, esta se conectara a la base Northwind del servidor de BD SQL 2008.


Bien veamos, crearemos un formulario donde el textbox se llamara txtCliente, y el listbox se llamara lstClientes, como se muestra en la siguiente imagen.





Este proyecto debe tener referenciada la biblioteca para el acceso a datos (Microsoft Activex Data Objects 2.8 Library), asi como mostramos en la siguiente figura:




Dentro del botón colocaremos la consulta hacia la base de los clientes que filtraremos para ser llenados dentro del listbox.



    'La conexión a la base de datos
    Dim cn As ADODB.Connection: Set cn = New ADODB.Connection
    Dim rs As ADODB.Recordset: Set rs = New ADODB.Recordset
      
    Dim sql As String
    sql = "select CompanyName from Customers " & _
            "where CompanyName like '" & Me.txtClientes & "%'" & _
            "order by CompanyName"

    cn.Open "Provider=SQLNCLI; " & _
             "Initial Catalog=Northwind; " & _
             "Data Source=PRINCESA; " & _
             "integrated security=SSPI; persist security info=True;"
  
    ' Abrir el recordset de forma estática:
    rs.Open sql, cn, adOpenStatic
    'Llenamos el Listbox
    While Not rs.EOF
        Me.lstCliente.AddItem (rs!CompanyName)
        rs.MoveNext
    Wend
    rs.Close
    cn.Close



Como vemos es una consulta simple, en esta primera etapa la consulta la realizamos en el mismo proyecto o capa del usuario.
Ahora realizaremos un cambio crearemos un proyecto del tipo DLL Activex, con el nombre COMCliente, donde trasladaremos esta consulta a este proyecto, con lo cual estamos logrando la separación entre la capa del usuario y la capa de acceso a datos.
La estructura de proyectos quedara como la siguiente figura:





Como tenemos dos proyectos, para lograr que estos se comuniquen debemos de crear una referencia del Proyecto Clientes agregamos una referencia al proyecto no compilado es decir al proyecto COMCliente.vbp, el compilado nos referimos recién después de generar la dll es decir al COMCliente.dll.... mas adelante veremos como hacemos esto:




Bien, ahora en este proyecto nuevo crearemos una funcion  que devuelva un recordset con la informacion de los clientes filtrados, para lo cual necesitamos enviarle el parametro del filtro, como se indica en el siguiente codigo, esto lo agregamos en la Clase Cliente del proyecto COMCliente.



Function rsClientes(ByVal xFiltro As String) As ADODB.Recordset
    'La conexión a la base de datos
    Dim cn As ADODB.Connection: Set cn = New ADODB.Connection
    Dim sql As String
    sql = "select CompanyName from Customers " & _
            "where CompanyName like '" & xFiltro & "%'" & _
            "order by CompanyName"

    cn.Open "Provider=SQLNCLI; " & _
             "Initial Catalog=Northwind; " & _
             "Data Source=PRINCESA; " & _
             "integrated security=SSPI; persist security info=True;"
     ' El recordset para acceder a los datos
    Dim rs As ADODB.Recordset: Set rs = New ADODB.Recordset

    ' Abrir el recordset de forma estática:
    rs.Open sql, cn, adOpenStatic

    Set rsClientes = rs
End Function



Una vez realizado esto, volvemos al proyecto Clientes, para usar este proyecto de acceso a datos y cargar nuestro listbox, dentro del boton mostrar escriberemos lo siguiente:



If Me.txtClientes.Text = "" Then
    MsgBox "Ingrese a lo menos un caracter", vbCritical, "Sist Clientes"
Else
 Dim xcliente As COMCliente.cliente
 Set xcliente = New COMCliente.cliente

 Dim rs As New ADODB.Recordset
 Set rs = xcliente.rsclientes(Me.txtClientes.Text)
    'Llenamos el Listbox
    While Not rs.EOF
        Me.lstCliente.AddItem (rs!CompanyName)
        rs.MoveNext
    Wend
End If



Con esta forma de trabajo separamos en capas la funcionalidad de lo que queremos hacer, como nos representa la siguiente figura, pero este tipo de DLL's son las que se alojan en el mismo cliente, el esfuerzo para consultas pesadas o es mas pesadas y con una alta concurrencia a la base de datos hara que nuestro sistema se vuelva mas pesado.
Lo realizado acá se puede representar en la siguiente figura:




Lo siguiente se realizar los ejecutables, para ser llevados a instalarse al cliente, para esto primero se debe de empezar con las DLL's de mas bajo nivel aquellas que no tengan referencia a ni un proyecto, en este caso empezaremos con COMCliente.
Seleccionamos el proyecto y en el menú archivo seleccionaremos Genera COMCliente.dll que es la compilación para la generación de la DLL.






una vez generada esta dll seleccionamos el proyecto Clientes y ahora hacemos referencia a esta dll creada.




Una vez realizado esto desde el mismo menu seleccionamos generar Clientes.exe, para crear el exe a instalar,
finalmente estos dos archivos se alojan en el cliente y previo registro de esta dll con el comando REGSVR32.