Nuevo control para tablas referenciadas en ASP.net

Nuestras bases de datos están plagadas de tablas de referencia. Manejar estas tablas y sus referentes en SQL es muy fácil y, casi siempre, la manera mas óptima de trabajar.
Pero hay veces en que las descripciones de referencia son muy grandes, y si bien el SQL lo resolvería igual de rápido, transferir repetidas veces muchos bytes por la web no es muy óptimo.
¿ Que pasaría si pudiéramos hacer que el cliente resuelva todas las relaciones ?.
Siguiendo con la política de ahorrar recursos de servidor SQL y transferencia de datos, aquí les dejo este control que resuelve el tema permitiendo que el cliente se encargue de todo.

Imaginemos una empresa cuya carta de productos es pequeña, pero que el nombre de cada uno de ellos es una descripción verdaderamente grande. Si la base de datos esta bien normalizada, en la tabla de Pedidos, habría un código o id de producto. De tal forma que si un cliente quiere hacer un pedido deberíamos, primero, relacionar la tabla de Pedidos con la de Productos para obtener esta larga descripción en cada ítem del pedido. Y segundo enviarlo por la web para poder mostrarlo en el cliente. Esto no solo ocuparía recursos de servidor sino, lo que es mas doloroso aun, recursos de web.

Con este nuevo control llamado Referencia podremos enviar al cliente la tabla de Productos y la de Pedidos. El cliente se encargará de obtener las descripciones para cada código de producto sin ocupar recursos de web o de servidor SQL extra.

Veamos las propiedades de este control, que es un ScriptControl por lo tanto necesita de un ScriptManager disponible en la página para funcionar:

Propiedad Tipo Descripción Defecto
IdProveedor String Id del control ProveedorDatosServidor que provee la tabla referenciante. String.Empty
IdProveedorReferencia String Id del control ProveedorDatosServidor que provee la tabla de referencia. String.Empty
ColumnaClave String Nombre de la columna de la tabla referenciante cuyo valor servirá para seleccionar los registros en la tabla de referencia. String.Empty
ColumnaDescripcion String Nombre de la columna de la tabla de referencia que se agregará a la tabla referenciante. String.Empty

El código de ejemplo que muestro a continuación es parte de la página Products en el Proyecto Demo que pueden bajarse libremente de aquí y que muestra el uso de este control mas la utilización de los datos para ser vistos en una grilla.

<MM2:ProveedorDatosServidor ID="Products" runat="server" WebMethod="ManejoProducts">
</MM2:ProveedorDatosServidor>
<MM2:ProveedorDatosServidor ID="Categories" runat="server" WebMethod="ManejoCategories">
   <Ordenes>
       <MM2:OrdenDatos Columna="CategoryID" />
   </Ordenes>
</MM2:ProveedorDatosServidor>
<MM2:ProveedorDatosServidor ID="Suppliers" runat="server" WebMethod="ManejoSuppliers">
   <Ordenes>
       <MM2:OrdenDatos Columna="SupplierID" />
   </Ordenes>
</MM2:ProveedorDatosServidor>
<MM2:Referencia ID="RefSupp" runat="server" ColumnaClave="SupplierID" ColumnaDescripcion="CompanyName"
            IdProveedor="Products" IdProveedorReferencia="Suppliers"></MM2:Referencia>
<MM2:Referencia ID="RefCateg" runat="server" ColumnaClave="CategoryID" ColumnaDescripcion="CategoryName"
            IdProveedor="Products" IdProveedorReferencia="Categories"></MM2:Referencia>

En esta sección de código vemos tres ProveedorDatosServidor: Products, Categories y Suppliers. La tabla Products es la referenciante mientras que Categories y Suppliers son tablas de referencia. Estas últimas deberán aparecer ordenadas por su ID.
Los dos controles Referencia, RefSupp y RefCateg, están configurados para relacionar a Products con Suppliers y Products con Categories respectivamente, generando una columna llamada RefSupp_CompanyName y otra RefCateg_CategoryName en la tabla Products.
Podremos usar estas nuevas columnas en grillas o formularios como si fueren columnas naturales de Products, ya que para el punto de vista de los controles que consuman este Proveedor ambas columnas son reales.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s