<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-27440916</atom:id><lastBuildDate>Fri, 27 Nov 2009 12:30:58 +0000</lastBuildDate><title>Lobyte =Julio César Soria Padilla=</title><description>Un sitio de referencias y casos en el desarrollo de sistemas computacionales.</description><link>http://lobyte.blogspot.com/</link><managingEditor>noreply@blogger.com (lobyte)</managingEditor><generator>Blogger</generator><openSearch:totalResults>69</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-8615845109222052739</guid><pubDate>Wed, 05 Aug 2009 19:12:00 +0000</pubDate><atom:updated>2009-08-05T13:18:54.492-07:00</atom:updated><title>Útil Link sobre Triggers en SQL Server</title><description>En algún momento estaba haciendo un disparador al update en la tabla y necesitaba comparar el valor anterior vs. el nuevo valor del update y no sabia como y bueno santa solución en el podoroso Internet. Este es el link con la explicación y ejemplos:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devjoker.com/contenidos/Tutorial-de-Transact-SQL/278/Triggers-en-Transact-SQL.aspx"&gt;http://www.devjoker.com/contenidos/Tutorial-de-Transact-SQL/278/Triggers-en-Transact-SQL.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-8615845109222052739?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2009/08/util-link-sobre-triggers-en-sql-server.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-3326194291318111134</guid><pubDate>Wed, 05 Aug 2009 19:06:00 +0000</pubDate><atom:updated>2009-08-05T12:09:48.161-07:00</atom:updated><title>Excelente Link con util script SQLServer2k y diccionario de tablas de Sistema</title><description>Buscando información para obtener en modo SQL los resultados de ejecución de jobs en SQL Server 2000 -Jobs History- me entontre este últil script y el mapa correspondiente al diccionario de las tablas de sistema de SQL Server!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dbagroup.cl/blog/?p=66"&gt;http://dbagroup.cl/blog/?p=66&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-3326194291318111134?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2009/08/excelente-link-con-util-script.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-3598428689874600907</guid><pubDate>Wed, 04 Mar 2009 17:41:00 +0000</pubDate><atom:updated>2009-03-04T09:43:58.376-08:00</atom:updated><title>Query Triggers asociados a que Tabla SQL Server</title><description>&lt;p&gt;SELECT po.name as Tabla, tr.name as [Trigger Name] &lt;/p&gt;&lt;p&gt;FROM sysobjects po&lt;/p&gt;&lt;p&gt;JOIN sysobjects tr ON tr.parent_obj = po.id&lt;/p&gt;&lt;p&gt;WHERE tr.xtype = 'TR'AND po.xtype = 'U'&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-3598428689874600907?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2009/03/query-triggers-asociados-que-tabla.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-4159042435034628210</guid><pubDate>Fri, 12 Sep 2008 15:47:00 +0000</pubDate><atom:updated>2008-09-12T09:03:22.073-07:00</atom:updated><title>Hotkeys en un DataGridView</title><description>En un formulario Windows agregar un DataGridView cargarlo con datos para implementar la funcionalidad de teclas calientes, por ejemplo al Ctrl+F aplica un calculo al Ctrl+R refresca la rejilla, etc.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt; Agregar métodos que responden a la combinación de teclas&lt;br /&gt;&lt;br /&gt;Private Sub &lt;strong&gt;ctrl_KeyUp&lt;/strong&gt;(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)&lt;br /&gt;Dim ctrl As Control = DirectCast(sender, Control)&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub InitializeEvents()&lt;br /&gt;'AddHandler Me.DataGridView1.KeyPress, AddressOf txt_KeyPress&lt;br /&gt;'AddHandler Me.DataGridView1.KeyDown, AddressOf txt_KeyDown&lt;br /&gt;AddHandler Me.DataGridView1.KeyUp, AddressOf &lt;strong&gt;ctrl_KeyUp&lt;/strong&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt; Funcionalidad a ejecutar al detectar la combinación de teclas sobre un renglon de la rejilla al evento KeyUp&lt;br /&gt;&lt;br /&gt;Private Sub DataGridView1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.&lt;strong&gt;KeyUp&lt;/strong&gt;&lt;br /&gt;     Select Case e.KeyData&lt;br /&gt;               Case e.KeyCode.Control + e.KeyCode.F 'Aplica Calcluo&lt;br /&gt;                              MessageBox.Show("Ejecutar AplicaCaluloX())&lt;br /&gt;               Case e.KeyCode.Control + e.KeyCode.R 'Refrescar contenido-Databinding-&lt;br /&gt;                             MessageBox.Show("Ejecutar RefrescarRejilla()")&lt;br /&gt;&lt;br /&gt;     End Select&lt;br /&gt;End Sub&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-4159042435034628210?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/09/hotkeys-en-un-datagridview.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-7224472503112272975</guid><pubDate>Fri, 12 Sep 2008 15:40:00 +0000</pubDate><atom:updated>2008-09-12T08:45:22.096-07:00</atom:updated><title>Leer entrada de app.config VS.NET 2005</title><description>&lt;strong&gt;1. Agregar archivo app.config&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5245161052369580706" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_o4stxlzNpWc/SMqOL-Qz8qI/AAAAAAAAAC0/zqF_0FEbhjs/s400/appconfig.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2--Leer de app.config&lt;/strong&gt;&lt;br /&gt;Configuration.ConfigurationManager.AppSettings.Item("AplicarFactorDiseñoPaq").ToString.Length&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-7224472503112272975?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/09/leer-entrada-de-appconfig-vsnet-2005.html</link><author>noreply@blogger.com (lobyte)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_o4stxlzNpWc/SMqOL-Qz8qI/AAAAAAAAAC0/zqF_0FEbhjs/s72-c/appconfig.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-928426600622873783</guid><pubDate>Thu, 11 Sep 2008 16:23:00 +0000</pubDate><atom:updated>2008-09-11T09:33:54.720-07:00</atom:updated><title>Referencia de Uso de la herramienta: JetBrains DotTrace con ADO.NET</title><description>Esta herramienta ayuda a medir es el tiempo que se toma cada una estas operaciones para mostrar los datos. Esta herramienta te permite mediante la técnica de "code profiling" conocer el tiempo y cantidad de veces de cada una de las llamadas a los métodos de tu aplicación, incluido el código de .NET.&lt;br /&gt;&lt;br /&gt;En este pagina se describe el uso de esta interesante herramienta, yo la utilice porque al poblar un GridView de asp.net con un sqldatareader se tardaba muchisimo al solicitar unos 20,000 registros y con esta herramienta encntré en donde se hacia el cuello de botella.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx"&gt;http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La referencia es parte de un conjunto de articulos muy interesantes relacionados con la utilización de la herramienta con uso de objetos ADO.NET&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx"&gt;Performance: Lectura de Datos con ADO.NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx"&gt;Performance: Lectura de Datos con ADO.NET II&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/cwalzer/archive/2007/09/24/anti-pr-225-cticas-i-acceso-a-datos-con-ado-net.aspx"&gt;Performance: Lectura de Datos con ADO.NET III&lt;/a&gt;&lt;br /&gt;Performance: Datos en Memoria con ADO.NET IV&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-928426600622873783?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/09/referencia-de-uso-de-la-herramienta.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-2567134640534005243</guid><pubDate>Thu, 11 Sep 2008 14:49:00 +0000</pubDate><atom:updated>2008-09-11T07:59:33.679-07:00</atom:updated><title>Store Procedure devuelve Información de Tablas de BD en SQL Server</title><description>&lt;strong&gt;create procedure dbo.p_sizetablesas&lt;/strong&gt;&lt;br /&gt;Begin transaction&lt;br /&gt;/***Procedimiento creado por KM para ver el tamaño de las tablas de una base de datos*/&lt;br /&gt;SET NOCOUNT ON&lt;br /&gt;declare @nombre_tabla varchar(100)&lt;br /&gt;declare @propietario varchar(40)&lt;br /&gt;declare @uid int&lt;br /&gt;declare @nombre_completo varchar(150)&lt;br /&gt;declare @nombre_db varchar(256)&lt;br /&gt;&lt;br /&gt;create table #resultados&lt;br /&gt;(nombre varchar(50), filas decimal(12,0), reservado varchar(40),&lt;br /&gt;data varchar(40), tamaño_indice varchar(20),&lt;br /&gt;no_usado varchar(20))&lt;br /&gt;&lt;br /&gt;declare tablas cursor&lt;br /&gt;for select a.uid , propietario = left( b.name,40), tabla =  a.name&lt;br /&gt; from sysobjects a, sysusers b&lt;br /&gt; where type = 'U' and a.uid = b.uid  order by tabla&lt;br /&gt;&lt;br /&gt;select @nombre_db = db_name()&lt;br /&gt;&lt;br /&gt;OPEN tablas&lt;br /&gt;FETCH NEXT FROM tablas&lt;br /&gt;into @uid, @propietario, @nombre_tabla&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;BEGIN &lt;br /&gt;  if @uid = 1   &lt;br /&gt;  begin      &lt;br /&gt;          insert #resultados           &lt;br /&gt;          exec sp_spaceused @nombre_tabla   &lt;br /&gt; end  &lt;br /&gt; else    &lt;br /&gt;   begin       &lt;br /&gt;        SET @nombre_completo = rtrim(ltrim(@nombre_db))+'.' + ltrim(rtrim(@propietario))  +'.'+ @nombre_tabla         &lt;br /&gt;       insert #resultados             &lt;br /&gt;       exec sp_spaceused @nombre_completo&lt;br /&gt;  end   &lt;br /&gt;FETCH NEXT FROM tablas INTO @uid, @propietario, @nombre_tabla&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;CLOSE tablas&lt;br /&gt;DEALLOCATE tablas&lt;br /&gt;&lt;br /&gt;select * from #resultadosorder by filas desc&lt;br /&gt;Commit Transaction&lt;br /&gt; go&lt;br /&gt;&lt;br /&gt;--ejecutarlo en query analizer&lt;br /&gt;&lt;strong&gt;exec p_sizetables&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Referencia&lt;br /&gt;&lt;a href="http://www.lawebdelprogramador.com/codigo/codigo.php?idp=794&amp;amp;id=89&amp;amp;texto=SQL"&gt;http://www.lawebdelprogramador.com/codigo/codigo.php?idp=794&amp;amp;id=89&amp;amp;texto=SQL&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-2567134640534005243?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/09/store-procedure-devuelve-informacin-de.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-8200552326078746497</guid><pubDate>Thu, 11 Sep 2008 14:37:00 +0000</pubDate><atom:updated>2008-09-11T08:28:54.026-07:00</atom:updated><title>Query a cadena XML</title><description>&lt;div&gt;&lt;br /&gt;&lt;div&gt;Crear:&lt;br /&gt;1. El esqueleto de la tabla para poder hacer el select&lt;br /&gt;2. El store procedure que hace el query de la cadeana XML basado en el esqueleto de la tabla&lt;br /&gt;3. Ejecutar el Store Procedure con la cadena XML (probar en el query analizer)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;1--La Tabla -Esqueleto&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE [dbo].[&lt;strong&gt;SKUsCARGA&lt;/strong&gt;] ( [CveProducto] [varchar] (20) NOT NULL , [DescProductoTerrSub] [varchar] (150) NOT NULL , [Territorio] [varchar] (20) NOT NULL , [SubTerritorio] [varchar] (20) NOT NULL , [Tecnica] [varchar] (50) NOT NULL , [Precio] [varchar] (10) NOT NULL , [Tamanio] [varchar] (50) NOT NULL , [Pocision] [varchar] (50) NOT NULL , [Apoyo] [varchar] (50) NOT NULL , [FechaAlta] [datetime] NOT NULL , [UsrAlta] [varchar] (20) NOT NULL )&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;--2. El Store Procedure&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;CREATE PROCEDURE &lt;strong&gt;dbo.PruebaXML&lt;/strong&gt;&lt;br /&gt;@xmlCargaSKUs text&lt;br /&gt;as&lt;br /&gt;Declare @idoc int&lt;br /&gt;--Ejecutar el sp que carga en memoria el docuemnto XML.&lt;br /&gt;EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlCargaSKUs&lt;br /&gt;--El Query al docto XML&lt;br /&gt;SELECT CveProducto, Territorio, SubTerritorio, Tecnica, Precio, Tamanio, Pocision, Apoyo&lt;br /&gt;FROM &lt;strong&gt;OPENXML&lt;/strong&gt; (@idoc, '/SKUsCARGA/SKU')&lt;br /&gt;WITH SKUsCARGA&lt;br /&gt;--Descargar documento XML de la memoria.&lt;br /&gt;EXEC sp_xml_removedocument @idoc&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;--3. La ejecucion del store procedure con el paso de la cadena XML&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;skuscarga&gt;&lt;sku apoyo="''NINGUNO''/" pocision="''DERECHA''" tamanio="''1" precio="''60''" tecnica="''GRATIS''" subterritorio="''FCA''" territorio="''FCA''" cveproducto="''832''"&gt;&lt;sku apoyo="''NINGUNO''/" pocision="''DERECHA''" tamanio="''1" precio="''60''" tecnica="''GRATIS''" subterritorio="''FCA''" territorio="''FCA''" cveproducto="''805''"&gt;&lt;sku apoyo="''NINGUNO''/" pocision="''DERECHA''" tamanio="''1" precio="''52.9''" tecnica="''A" subterritorio="''FCA''" territorio="''FCA''" cveproducto="''824''"&gt;&lt;/skuscarga&gt;&lt;/div&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5244785851028463410" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_o4stxlzNpWc/SMk48YWL3zI/AAAAAAAAACs/ypwWVZYILMk/s400/xmlexec.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-8200552326078746497?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/09/query-cadena-xml.html</link><author>noreply@blogger.com (lobyte)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_o4stxlzNpWc/SMk48YWL3zI/AAAAAAAAACs/ypwWVZYILMk/s72-c/xmlexec.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-1387199564369359233</guid><pubDate>Sun, 10 Aug 2008 16:04:00 +0000</pubDate><atom:updated>2008-08-10T09:06:24.227-07:00</atom:updated><title>Requerimiento implementacion Gestión de Facturas</title><description>&lt;span style="font-weight: bold;"&gt;Implantación de la Base de Datos (Back-End)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-Deberá ser con el manejador de base de datos Access o SQL Server 2000&lt;br /&gt;-Deberá diseñar una base de datos bajo los conceptos de normalización y su respectiva integración referencial de la información.&lt;br /&gt;-Deberá modelar la entidad Cliente, Empleado, Producto y Factura. Para cada entidad definirás los atributos básicos para poder operar la factura.&lt;br /&gt;-Si decide utilizar SQL Server 2K puedes usar Store Procedures o Vistas en la implantación o cadenas SQL en el Front-End&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementación de la GUI (Front-End)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-Deberá ser utilizando Visual Basic NET 2005 o 2008 con el lenguaje Visual Basic .NET&lt;br /&gt;-El tipo de aplicación puede ser ASP.NET -Web- o aplicación de escritorio&lt;br /&gt;-Puedes hacerlo en capas, con objetos, etc. como tú desees.&lt;br /&gt;-Sólo deberá implementar la interfaz GUI para la factura.&lt;br /&gt;&lt;br /&gt;¿Qué debe permitir la aplicación para trabajar con las facturas?&lt;br /&gt;-    El sistema deberá permitir al usuario gestionar facturas: dar de alta, eliminar y hacer modificaciones a facturas existentes.&lt;br /&gt;-    El sistema deberá permitir seleccionar de una fuente de datos los productos -su descripción- que la empresa tiene a disposición para su venta y que se exponen en la factura (la factura deberá permitir contener de 1 a N productos sin repetir).&lt;br /&gt;-    El sistema deberá permitir seleccionar de una fuente de datos los clientes -su nombre o denominación social- registrados a los que se expide una factura.&lt;br /&gt;-    El sistema deberá permitir modificar los productos incluidos en la factura; es decir cambiar la cantidad o el producto.&lt;br /&gt;-    El sistema deberá calcular automáticamente el importe de cada producto de acuerdo a la cantidad solicitada, el subtotal, importe de IVA -manejarlo al 15%- y gran total.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Entrega de Fuentes :&lt;br /&gt;&lt;br /&gt;-    El archivo de la base de datos de Access o el archivo de respaldo de la Base de datos si decidiste implementar con SQL Server 2K.&lt;br /&gt;&lt;br /&gt;-    El proyecto de Visual Basic NET 2005 con el código fuente de la operación de la factura.&lt;br /&gt;&lt;br /&gt;Aspectos principales a evaluar:&lt;br /&gt;&lt;br /&gt;-    Con respecto a la base datos el modelo Entidad-Relación implementado&lt;br /&gt;-    Con respecto a la GUI de la gestión de la factura, facilidad de uso al usuario, forma de interactuar con la base de datos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-1387199564369359233?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/08/requerimiento-implementacion-gestin-de.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-2868863922733562820</guid><pubDate>Sun, 10 Aug 2008 15:10:00 +0000</pubDate><atom:updated>2008-08-10T09:04:06.109-07:00</atom:updated><title>Formato separador miles a número en SQL Server</title><description>DECLARE @val float&lt;br /&gt;SET @val = '12456.00'&lt;br /&gt;SELECT CONVERT(varchar(50), CONVERT(money, @val), 1)&lt;br /&gt;&lt;br /&gt;--Salida&lt;br /&gt;12,456.00&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-2868863922733562820?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/08/formato-separador-miles-nmero-en-sql.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-4145386234554959810</guid><pubDate>Thu, 14 Feb 2008 19:10:00 +0000</pubDate><atom:updated>2008-02-14T11:20:04.078-08:00</atom:updated><title>Uso de pwdencrypt y pwdcompare en SQL Server 2K</title><description>Estás dos funciones en SQL Server permiten cifrar y descifrar valores y que son muy últiles para guardar información no legible en la base de datos.&lt;br /&gt;&lt;br /&gt;Ejemplo de uso:&lt;br /&gt;&lt;br /&gt;--Devuelve la cadena cifrada.&lt;br /&gt;select &lt;strong&gt;pwdencrypt&lt;/strong&gt;('abcde')&lt;br /&gt;--el resultado es: 0x0100841F6D61428B6A7C1E497428DA4F77201E9C15CE03B39414324ADFC9BEDF7C73FCEC7120D2AEEEACA1732737&lt;br /&gt;--Este valor es el que almacenamos en nuestra tabla, por ejemplo un numero de cuenta o una contraseña, de esta manera si alguien ingresa a esta tabla no sabrá a que valor pertenece.&lt;br /&gt;&lt;br /&gt;--Ahora comparamos el texto en claro con lo que se almacena en la BD, regresa 1 si son iguales, sino cero.&lt;br /&gt;&lt;br /&gt;select &lt;strong&gt;pwdcompare&lt;/strong&gt;('abcde',0x0100841F6D61428B6A7C1E497428DA4F77201E9C15CE03B39414324ADFC9BEDF7C73FCEC7120D2AEEEACA1732737)&lt;br /&gt;&lt;br /&gt;Ahora veremos un store procedure en donde recibe el texto en claro -un password- y lo compara&lt;br /&gt;con el que esta en la BD cifrado.&lt;br /&gt;&lt;br /&gt;CREATE PROCEDURE dbo.spu_SelectUsr&lt;br /&gt;@Usuario varchar(15),&lt;br /&gt;@Passwd varchar(15)&lt;br /&gt;AS&lt;br /&gt;&lt;br /&gt;Set nocount on;&lt;br /&gt;&lt;br /&gt;Declare @ExisteCta bit&lt;br /&gt;set @ExisteCta = 0&lt;br /&gt;&lt;br /&gt;SELECT    @ExisteCta = 1&lt;br /&gt;FROM         USUARIO&lt;br /&gt;WHERE     (Usuario = @Usuario) AND (&lt;strong&gt;pwdcompare&lt;/strong&gt;(@Passwd, PasswdCifrado)=1)&lt;br /&gt;if @ExisteCta = 0&lt;br /&gt;begin&lt;br /&gt;       Raiserror 13000 'No existe la cuenta de acceso proporcionada.'            &lt;br /&gt;       Return&lt;br /&gt;end&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;Link otros ejemplos&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/gladchenko/archive/2005/04/06/41083.aspx"&gt;http://msmvps.com/blogs/gladchenko/archive/2005/04/06/41083.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-4145386234554959810?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/02/uso-de-pwdencrypt-y-pwdcompare-en-sql.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-228305925297745914</guid><pubDate>Thu, 14 Feb 2008 18:30:00 +0000</pubDate><atom:updated>2008-02-14T10:34:41.145-08:00</atom:updated><title>Control para graficar en asp.net</title><description>Recientemente tuve la necesidad de graficar unos datos en el web, y mi sorpresa fue que visual studio net 2005 no incluye un control para ello, mi otra opción era sacarlo con Crystal Reports o un control y encontré este gratuito que me parecio muy bueno y además free.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.carlosag.net/Tools/WebChart/Default.aspx"&gt;http://www.carlosag.net/Tools/WebChart/Default.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La guía de uso rápido o tutorial:&lt;br /&gt;&lt;a href="http://www.carlosag.net/Articles/WebChartTutorial.aspx"&gt;http://www.carlosag.net/Articles/WebChartTutorial.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-228305925297745914?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/02/control-para-graficar-en-aspnet.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-4551478985123177821</guid><pubDate>Thu, 14 Feb 2008 18:28:00 +0000</pubDate><atom:updated>2008-02-14T10:29:41.760-08:00</atom:updated><title>Herramientas gratis para SQL Server</title><description>Excelente link en donde podrán encontrar útiles herramientas para SQL Server 2k-2005&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.sqlteam.com/mladenp/archive/2007/11/20/Free-SQL-Server-tools-that-might-make-your-life-a.aspx"&gt;http://weblogs.sqlteam.com/mladenp/archive/2007/11/20/Free-SQL-Server-tools-that-might-make-your-life-a.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-4551478985123177821?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2008/02/herramientas-gratis-para-sql-server.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-4627437225148083798</guid><pubDate>Thu, 27 Sep 2007 22:23:00 +0000</pubDate><atom:updated>2007-09-27T15:56:59.221-07:00</atom:updated><title>row-locks en operaciones SQL-Insert/Update/Delete</title><description>Este es un tip que me paso un cuate llamado Christian que es DBA en SQL Server. Para no pongan de rodillas a su servidor de base de datos SQL Server&lt;br /&gt;&lt;br /&gt;Un link de referencia adicional es:&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/323630"&gt;http://support.microsoft.com/kb/323630&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"A veces por cuestiones de performance o necesidad de trabajar con un conjunto de registros grandes, es conveniente hacerlo parcialmente, es decir, en "pedazos". Esto puede suceder porque al trabajar con millones de registros se generen demasiados row-locks y consuman toda la memoria y el query falle en su ejecución."&lt;br /&gt;&lt;br /&gt;Aquí un query de ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SET NOCOUNT ON&lt;/strong&gt; --QUITAMOS LOS MENSAJES DE CONTEO DE REGISTROS AFECTADOS YA QUE LO PERSONALIZAMOS&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DECLARE @Afectados bigint&lt;/strong&gt; --DECLARAMOS UNA VARIABLE PARA ACUMULAR LOS REGISTROS AFECTADOS&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DECLARE @Afec bigint&lt;/strong&gt; --DECLARAMOS UNA VARIABLE PARA SABER CUANTOS ACUMULO EN CADA PASO&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SET @Afectados = 0&lt;/strong&gt; --INICIALIZAMOS EL ACUMULADO&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Borra:&lt;/strong&gt; --ETIQUETA PARA SALTO&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SET Rowcount 1000&lt;/strong&gt; --ESTA SENTENCIA ES LA MAS IMPORTANTE: LE DECIMOS AL SQL QUE LA SIGUIENTE SENTENCIA SOLO AFECTARÁ A 1000 REGISTROS (AUNQUE EXISTAN MÁS)!!!!!!.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DELETE Facturas&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;WHERE Fecha_factura &lt; '2007/01/01'&lt;/strong&gt; --EJECUTAMOS NUESTRA SENTENCIA, ESTA ES SOLO UN EJEMPLO Y SUPONDREMOS QUE LA SENTENCIA POR SÍ SOLA AFECTARÍA MILLONES DE REGISTROS.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SET @Afec = @@Rowcount&lt;/strong&gt; --OBTENEMOS CUANTOS REGISTROS AFECTO (SOLAMENTE AL FINAL QUE YA NO HAYA REGISTROS POR AFECTAR DEVOLVERÁ CERO, DE LO CONTRARIO DEVOLVERÁ LOS 1000 QUE CONFIGURAMOS)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SET @Afectados = @Afectados + @Afec&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;print 'Afectados: ' + CONVERT(varchar,@Afectados)&lt;/strong&gt; --AQUÍ VAMOS IMPRIMIENDO EL ACUMULADO DE LOS REGISTROS QUE VA AFECTANDO PARA DARNOS UNA IDEA DE CUANTO LEVA. (Ver pantalla resultado al final)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;if @Afec &gt; 0 goto borra&lt;/strong&gt; --SI EL NUMERO DE REGISTROS QUE AFECTO EL DELETE ES MAYOR A CERO (ES DECIR QUE AUN HAY MÁS REGISTROS POR BORRAR) REGRESA A EJECUTAR EL DELETE.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;set rowcount 0&lt;/strong&gt; --RESETEAMOS EL ROWNCOUNT PARA QUE YA AFECTE NORMAL&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El resultado se vería como la siguiente imágen:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5115015629440224722" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_o4stxlzNpWc/RvwvnU1bDdI/AAAAAAAAABs/kzc4eSqdzww/s400/row-locks.JPG" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-4627437225148083798?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/09/row-locks-en-operacione-sql.html</link><author>noreply@blogger.com (lobyte)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_o4stxlzNpWc/RvwvnU1bDdI/AAAAAAAAABs/kzc4eSqdzww/s72-c/row-locks.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-4481607136471226156</guid><pubDate>Thu, 27 Sep 2007 21:20:00 +0000</pubDate><atom:updated>2007-09-27T14:43:45.169-07:00</atom:updated><title>Tipos Nulables para valores NULL en Bases de Datos</title><description>Hace unos días hice una clase de tipo Entity que la poblabla con registros de una tabla de una Base de Datos y la mayoría de sus valores eran opcionales, es decir nulos así que utilice el concepto de tipos nulables del framework 2.0. Con esta clasecilla insertaba regsitros con valores nulos.&lt;br /&gt;&lt;br /&gt;Public Class Cuestionario  &lt;br /&gt;'Los miembros privados nulables&lt;br /&gt;Private _otroIdiomaHabla As Nullable(Of Byte)   &lt;br /&gt;Private bolv1 As Nullable(Of Boolean)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--los métodos públicos de acceso a los miembros privados.&lt;br /&gt; Public Property OtroIdiomaHabla() As Nullable(Of Byte)     &lt;br /&gt;  Get      &lt;br /&gt;     Return Me._otroIdiomaHabla       &lt;br /&gt;  End Get       &lt;br /&gt;&lt;br /&gt; Set(ByVal value As Nullable(Of Byte))            &lt;br /&gt;     Me._otroIdiomaHabla = value       &lt;br /&gt; End Set   &lt;br /&gt;&lt;br /&gt;End Property&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'El uso de la clase&lt;br /&gt;Dim objCuestionario as new Cuestionario  &lt;br /&gt;'Asigno nada a su miembro&lt;br /&gt;objCuestionario.OtroIdiomaHabla = Nothing&lt;br /&gt;'Verifico el valor&lt;br /&gt;If objCuestionario.OtroIdiomaHabla.HasValue then&lt;br /&gt;      'Existe valor&lt;br /&gt;Else&lt;br /&gt;      'Sin valor&lt;br /&gt;End if&lt;br /&gt;&lt;br /&gt;'Cuando asigno valor a un comando como parametro a la ejecución de un store procedure 'pasamos el valor o un nothing implicito por el tipo nulable y  que equivale a un null en la columna de la tabla de la BD.&lt;br /&gt;cmd.Parameters.Add("@OtroIdiomaHabla", Data.SqlDbType.Bit, 1).Value = objCuestionario.OtroIdiomaHabla&lt;br /&gt;&lt;br /&gt;'En el store procedure asignamos un default al parametro y cuando pasamos el valor a través del parametro a nuestro objeto esteremos pasando un nothing que va equivaler al Null.&lt;br /&gt;CREATE PROCEDURE spuInserta&lt;br /&gt;   @OtroIdiomaHabla tinyint=NULL&lt;br /&gt;As&lt;br /&gt;Insert Into Tabla (OtroIdiomaHabla, ValorX)&lt;br /&gt;Values(@OtroIdiomaHabla, Default)&lt;br /&gt;Go&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-4481607136471226156?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/09/tipos-nulables-para-valores-null-en.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-3958917396854968355</guid><pubDate>Thu, 27 Sep 2007 21:16:00 +0000</pubDate><atom:updated>2007-09-27T14:19:15.430-07:00</atom:updated><title>Links a páginas de iconos</title><description>Como desarrolladores de aplicaciones WEB y de escritorio siempre necesitamos de iconos de todo tipo recientemente consulté dos páginas de iconos simpre utiles para que las agreguen a susu favoritos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iconfinder.net/"&gt;http://www.iconfinder.net/&lt;/a&gt;&lt;br /&gt;El siguiente link me lo paso mi cuate Gerardo Hdz.&lt;br /&gt;&lt;a href="http://www.iconarchive.com/"&gt;http://www.iconarchive.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-3958917396854968355?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/09/links-pginas-de-iconos.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-3579094999296155299</guid><pubDate>Thu, 27 Sep 2007 21:14:00 +0000</pubDate><atom:updated>2007-09-27T14:15:59.380-07:00</atom:updated><title>Los 7 pecados mortales de Ajax</title><description>un buen link teórico de lo bueno y malo de usar Ajax!&lt;br /&gt;&lt;a href="http://www.tufuncion.com/errores-ajax"&gt;http://www.tufuncion.com/errores-ajax&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-3579094999296155299?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/09/los-7-pecados-mortales-de-ajax.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-5391112194685871738</guid><pubDate>Wed, 02 May 2007 22:09:00 +0000</pubDate><atom:updated>2007-05-02T15:27:39.509-07:00</atom:updated><title>Serialización con .NET 2.0</title><description>Hace unos días tuve la necesidad de serializar un objeto y esto es lo que encontré para el Framework 2.0&lt;br /&gt;&lt;br /&gt;Imports System.Xml.Serialization&lt;br /&gt;Imports System.IO&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Private Sub SerilizarObj()&lt;/strong&gt;       &lt;br /&gt;      Dim serializar As XmlSerializer = New XmlSerializer(GetType(AreaBLL))     &lt;br /&gt;      'Creamos el objeto a serializar     &lt;br /&gt;      Dim objArea As New AreaBLL()       &lt;br /&gt;      objArea.IdArea = 1       &lt;br /&gt;      objArea.NombreArea = "MKT"       &lt;br /&gt;      objArea.AreaPadre = "Presidencia"      &lt;br /&gt;      'Archivo en donde vamos a colocar el objeto deshidratado.&lt;br /&gt;      Dim stream1 As New FileStream("C:\area.xml", FileMode.Create)    &lt;br /&gt;     'Serilizar &lt;br /&gt;      serializar.Serialize(stream1, objArea)      &lt;br /&gt;      stream1.Close()   &lt;br /&gt;&lt;strong&gt;End Sub&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Private Sub DesSerializarObj()&lt;/strong&gt;&lt;br /&gt;       'Obtener a memoria el archivo XML&lt;br /&gt;       Dim FileXML As FileStream = New FileStream("C:\area.xml", FileMode.Open) &lt;br /&gt;      'Crear un XMLSerializer para manejar la deserialización    &lt;br /&gt;       Dim serialize As XmlSerializer = New XmlSerializer(GetType(AreaBLL))  &lt;br /&gt;       'Crear el objeto que se va a rehidratar.     &lt;br /&gt;       Dim objArea As New AreaBLL      &lt;br /&gt;       'Deserializar el obj.     &lt;br /&gt;       objArea = serialize.Deserialize(FileXML)       &lt;br /&gt;       FileXML.Close()  &lt;br /&gt; &lt;strong&gt;End Sub&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-5391112194685871738?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/05/serializacin-con-net-20.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-157873316789096808</guid><pubDate>Tue, 17 Apr 2007 19:11:00 +0000</pubDate><atom:updated>2007-04-27T14:18:35.474-07:00</atom:updated><title>Ejemplo de Aplicación ASP.NET 2.0 en capas con DataSet Tipado</title><description>Para el desarrollo de esta aplicación utilizamos Visual Basic .NET con Visual Studio .NET 2005.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Estrucutura del proyecto ASP.NET&lt;br /&gt;&lt;/strong&gt;- Una carpeta App_Code con:&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_o4stxlzNpWc/RjJjZtXgLwI/AAAAAAAAABM/fhyrIbpJYkY/s1600-h/ProyectoDataSet.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5058214624816541442" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp2.blogger.com/_o4stxlzNpWc/RjJjZtXgLwI/AAAAAAAAABM/fhyrIbpJYkY/s400/ProyectoDataSet.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Una clase Area. Que hace uso de los métodos de la Clase del tipo Business Entities representada por un TableAdapter de un DataSet.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;Una clase DataSet. Contiene un DataSet tipado el cual contiene los TableAdapter que representan a cada uno de los objetos Entitie con sus respectivos métodos de Acceso a Datos.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt; &lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;- La forma Web “Area.aspx” representa a la capa GUI.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Las 3 capas&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;En una arquitectura en 3 capas tenemos la capa de presentación o GUI, en nuestro ejemplo son los archivos aspx. La capa de Negocio que en nuestro ejemplo la representan nuestras clases Entity ubicados en el DataSet Tipado y para cada objeto entidad existe un TableAdapter con los métodos necesarios para el Acceso a Datos. Y la clase Area que representa como una clase Control que se comunica con las clases Entity y sus metodos de acceso a datos para luego hacer DataBinding con controles en la GUI.&lt;/p&gt;&lt;strong&gt;Detalles de la Implementación&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Tenemos una tabla llamada Area para la cual queremos implementar una forma de mantenimiento. La pantalla a la que queremos dar funcionalidad con la arquitectura en 3 capas es:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5058215445155294994" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_o4stxlzNpWc/RjJkJdXgLxI/AAAAAAAAABU/6aIujqARTd0/s400/FormaWebDS.JPG" border="0" /&gt;&lt;br /&gt;Esta es la estructura de la tabla de la base de datos correspondiente al Area y los datos que regresa el store procedure que estaremos ejecutando.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5058216853904568098" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_o4stxlzNpWc/RjJlbdXgLyI/AAAAAAAAABc/V0r3x1-xcc4/s400/QueryDS.JPG" border="0" /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Implementación del DataSet que contiene a los TableAdapters que representan a nuestros objetos Business Entities.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Algunas de las formas de representar a los Business Entities en la apicación son:&lt;br /&gt;· XML&lt;br /&gt;· DataSet Genericos&lt;br /&gt;· DataSet Tipados&lt;br /&gt;· Componentes Business Entities personaizados&lt;br /&gt;· Componentes Business Entities con comportamiento CRUD&lt;br /&gt;&lt;br /&gt;Para nuestro ejemplo utiizaremos el caso de DataSet Tipados. En la siguiente imagen podemos observar como se representa nuestro Business Entiy Area y en la parte baja observamos los métodos de acceso a datos que nos permiten poblar al Businness Entity representado como un DataTable.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5058217231861690162" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_o4stxlzNpWc/RjJlxdXgLzI/AAAAAAAAABk/dsqmhfGtLG4/s400/DataSetTipado.JPG" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Implementación del Objeto Area.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Este objeto es como un objeto control que invoca a los métodos de acceso a datos definidos para cada TableAdapter&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#990000;"&gt;Imports Microsoft.VisualBasic&lt;br /&gt;&lt;br /&gt;Public Class Area&lt;br /&gt;&lt;br /&gt;Public Function ObtenerAreas() As DataSet1.AREADataTable&lt;br /&gt;Dim AreasAdapter As New DataSet1TableAdapters.AREATableAdapter()&lt;br /&gt;Dim Areas As DataSet1.AREADataTable = AreasAdapter.GetData&lt;br /&gt;Return Areas&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#990000;"&gt;End Class&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Podemos observar que esta clase crea una instacia del adaptador correspondiente al objeto Entity que deseamos trabajar en este caso: “AreaTableAdapter” luego invocamos su método de acceso a datos llamado GetData que nos regresa un DataTable con cada una de las áreas y que retornamos a la capa GUI para hacer DataBinding con un GridView.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Implementación de la capa de Presentación GUI&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En esta capa es en donde vamos a poblar los controles visuales. El GridView se carga durante el evento Load de la página aquí crea una instancia del objeto Control Area y éste expone un método público que obtiene las Area que nos regresa en un objeto DataTable con el cual hacemos DataBinding al GridView.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;Partial Class Default2&lt;br /&gt;Inherits System.Web.UI.Page&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Dim objArea As New Area&lt;br /&gt;&lt;br /&gt;Protected Sub &lt;strong&gt;Page_Load&lt;/strong&gt;(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load&lt;br /&gt;If Not Page.IsPostBack Then&lt;br /&gt;&lt;br /&gt;Dim objArea As New Area&lt;br /&gt;Me.GridView1.DataSource = objArea.ObtenerAreas&lt;br /&gt;Me.GridView1.DataBind()&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;'Implementación del Pagineo la Grid&lt;br /&gt;Protected Sub &lt;strong&gt;GridView1_PageIndexChanging&lt;/strong&gt;(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging&lt;br /&gt;Me.GridView1.PageIndex = e.NewPageIndex&lt;br /&gt;Me.GridView1.DataSource = objArea.ObtenerAreas()&lt;br /&gt;Me.GridView1.DataBind()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;'Borrar el registro seleccionado en el Grid&lt;br /&gt;Protected Sub &lt;strong&gt;GridView1_RowDeleting&lt;/strong&gt;(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting&lt;br /&gt;'Para detectar el segundo postback generado por el ButtonField del tipo Image se verifican sus coordenadas x y.&lt;br /&gt;If (Me.Request("x") Is Nothing) AndAlso (Me.Request("y") Is Nothing) Then&lt;br /&gt;&lt;br /&gt;Dim iAffect As Int16&lt;br /&gt;objArea = New Area&lt;br /&gt;iAffect = objArea.DeleteArea(Me.GridView1.Rows(e.RowIndex).Cells.Item(0).Text)&lt;br /&gt;Else&lt;br /&gt;Me.GridView1.DataSource = objArea.ObtenerAreas()&lt;br /&gt;Me.GridView1.DataBind()&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;'Al seleccionar un área se muestra en los controles independientes.&lt;br /&gt;Protected Sub &lt;strong&gt;GridView1_SelectedIndexChanged&lt;/strong&gt;(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged&lt;br /&gt;Me.LabelIdArea.Text = Me.GridView1.Rows(Me.GridView1.SelectedIndex).Cells.Item(0).Text&lt;br /&gt;Me.TextBox2.Text = Me.GridView1.Rows(Me.GridView1.SelectedIndex).Cells.Item(1).Text&lt;br /&gt;Me.TextBox1.Text = Me.GridView1.Rows(Me.GridView1.SelectedIndex).Cells.Item(2).Text&lt;br /&gt;Me.CheckBox1.Text = Me.GridView1.Rows(Me.GridView1.SelectedIndex).Cells.Item(3).Text&lt;br /&gt;End Sub &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;&lt;br /&gt;End Class&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Conclusión: Ésta es una de las formas propuestas por Microsoft.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-157873316789096808?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/04/ejemplo-de-aplicacin-aspnet-20-en-capas.html</link><author>noreply@blogger.com (lobyte)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_o4stxlzNpWc/RjJjZtXgLwI/AAAAAAAAABM/fhyrIbpJYkY/s72-c/ProyectoDataSet.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-6211036731935332532</guid><pubDate>Tue, 17 Apr 2007 19:10:00 +0000</pubDate><atom:updated>2007-04-26T14:41:27.597-07:00</atom:updated><title>Ejemplo de una Aplicación ASP.NET 2.0 en 3 capas con Colecciones de Objetos Personalizados</title><description>Para el desarrollo de esta aplicación utilizamos Visual Basic .NET con Visual Studio .NET 2005.&lt;br /&gt;La arquitectura es en 3 capas con uso del patrón Mapper.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Estrucutura del proyecto ASP.NET&lt;br /&gt;&lt;/strong&gt;- Una carpeta App_Code con 3 carpetas.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;La Carpeta Entities&lt;/em&gt;. Esta carpeta contiene a todos las clases que corresponden a los objetos de negocio del tipo entity, es decir objetos persistentes en la Base de Datos&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;em&gt;La Carpeta ColeccionesObj&lt;/em&gt;. Esta carpeta contiene a las clases que operan como colecciones de objetos de los objetos entity, es decir existe un objeto collecion por cada objeto Entity.&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;em&gt;La Carpeta Mappers&lt;/em&gt;. Esta carpeta contiene a las clases encargadas de crear objetos entity uno o más con los registros que obtiene de la base de datos y los objetos creados son consumidos por la capa de presentación. Los objetos mappers contienen los métodos necesarios para obtener y persistir los objetos del tipo Entity. Para cada objeto entity existe un objeto Mapper, pero cada uno de estos tiene el patrón Singleton para asegurar que exista una única instancia en toda la aplicación. Podriamos decir que este objeto es el encargado del acceso a datos y hace uso las objetos entity que devueve a la capa de presentación.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://bp3.blogger.com/_o4stxlzNpWc/RieupLtmlMI/AAAAAAAAAAc/32j6J3c48JY/s1600-h/ProyectoASPNET.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5055201129288602818" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp3.blogger.com/_o4stxlzNpWc/RieupLtmlMI/AAAAAAAAAAc/32j6J3c48JY/s400/ProyectoASPNET.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;-La forma Web “Area.aspx” representa a la capa GUI &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Las 3 capas&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En una arquitectura en 3 capas tenemos la capa de presentación o GUI, en nuestro ejemplo son los archivos aspx. La capa de Negocio que en nuestro ejemplo la representan nuestras clases Entity ubicados en la carpeta Entites y la capa de Acceso a Datos representada por los objetos Mappers en nuestra carpeta Mappers y la Capa de datos son los objetos de la Base de Datos en nuestro ejemplo se representa con store procedures. En este caso los objetos Mappers son los encargados de comunicar las 3 capas y pasar datos del mundo relacional al de objetos.&lt;br /&gt;&lt;/p&gt;&lt;a href="http://bp0.blogger.com/_o4stxlzNpWc/Riex_btmlNI/AAAAAAAAAAk/I7N1vnoTaAA/s1600-h/ProyectoASPNETExpandido.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5055204810075575506" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp0.blogger.com/_o4stxlzNpWc/Riex_btmlNI/AAAAAAAAAAk/I7N1vnoTaAA/s400/ProyectoASPNETExpandido.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Detalles de la Implementación&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Tenemos una tabla llamada Area para la cual queremos implementar una forma de mantenimiento. La pantalla a la que queremos dar funcionalidad con la arquitectura en 3 capas es:&lt;/p&gt;&lt;a href="http://bp2.blogger.com/_o4stxlzNpWc/RieyW7tmlOI/AAAAAAAAAAs/J9ZeAMWIgDE/s1600-h/FormaWeb.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5055205213802501346" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp2.blogger.com/_o4stxlzNpWc/RieyW7tmlOI/AAAAAAAAAAs/J9ZeAMWIgDE/s400/FormaWeb.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;Esta es la estructura de a tabla de la base de dato correspondiente al Area y los datos que regresa el store procedure que estaremos ejecutando.&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;a href="http://bp0.blogger.com/_o4stxlzNpWc/Riey5btmlPI/AAAAAAAAAA0/pj6l44JHVKo/s1600-h/Query.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5055205806507988210" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp0.blogger.com/_o4stxlzNpWc/Riey5btmlPI/AAAAAAAAAA0/pj6l44JHVKo/s400/Query.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Implementación de la clase Entity (Objeto de Capa de Negocio)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Algunas de las formas de representar a los Business Entities en la aplicación son:&lt;br /&gt;· XML&lt;br /&gt;· DataSet Genericos&lt;br /&gt;· DataSet Tipados&lt;br /&gt;· Componentes Business Entities personaizados&lt;br /&gt;· Componentes Business Entities con comportamiento CRUD&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Para nuestro ejemplo utilizaremos el caso de ”&lt;strong&gt;&lt;em&gt;Componentes Business Entities Personalizados&lt;/em&gt;&lt;/strong&gt;”.&lt;br /&gt;&lt;br /&gt;La clase Entity representa al objeto de negocio Area. Para ello agregamos una Clase en la carpeta Entities con el nombre AreaBLL.&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="color:#330099;"&gt;Imports Microsoft.VisualBasic&lt;br /&gt;&lt;br /&gt;Public Class AreaBLL&lt;br /&gt;&lt;br /&gt;Private _idArea As Integer&lt;br /&gt;Private _nombreArea As String&lt;br /&gt;Private _obsArea As String&lt;br /&gt;Private _esActivaArea As Boolean&lt;br /&gt;Private _fechaModificArea As Date&lt;br /&gt;Private _usrModificArea As String&lt;br /&gt;Private _idAreaPadre As Integer&lt;br /&gt;Private _AreaPadre As String&lt;br /&gt;&lt;br /&gt;Public Property IdArea() As Integer&lt;br /&gt;Get&lt;br /&gt;Return Me._idArea&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As Integer)&lt;br /&gt;Me._idArea = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Property NombreArea() As String&lt;br /&gt;Get&lt;br /&gt;Return Me._nombreArea&lt;br /&gt;End Get&lt;br /&gt;If value.Trim.Length &gt; 0 Then&lt;br /&gt;Me._nombreArea = value&lt;br /&gt;Else&lt;br /&gt;Throw New Exception("Debe proporcionar el nombre del área")&lt;br /&gt;End If&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Property ObsArea() As String&lt;br /&gt;Get&lt;br /&gt;Return Me._obsArea&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As String)&lt;br /&gt;Me._obsArea = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Property EsActivaArea() As Boolean&lt;br /&gt;Get&lt;br /&gt;Return Me._esActivaArea&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As Boolean)&lt;br /&gt;Me._esActivaArea = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Property FechaModificArea() As Date&lt;br /&gt;Get&lt;br /&gt;Return Me._fechaModificArea&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As Date)&lt;br /&gt;Me._fechaModificArea = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Property UsrModificArea() As String&lt;br /&gt;Get&lt;br /&gt;Return Me._usrModificArea&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As String)&lt;br /&gt;Me._usrModificArea = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Property IdAreaPadre() As Integer&lt;br /&gt;Get&lt;br /&gt;Return Me._idAreaPadre&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As Integer)&lt;br /&gt;Me._idAreaPadre = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Property AreaPadre() As String&lt;br /&gt;Get&lt;br /&gt;Return Me._AreaPadre&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As String)&lt;br /&gt;Me._AreaPadre = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;End Class&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;Podemos observar que se compone de propiedades privadas que representan a cada una de las columnas de la tabla. Para que dichas propiedades sean accesibles creamos los métodos públicos que leen o escriben en las propiedades. (Con esto implementamos el concepto de Encapsulamiento de la teoría de la Programación Orientada a Objetos).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Implementación de la clase colección para cada objeto Entity&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;Ahora requerimos construir una clase que nos permita contener una colección de objetos entidad. Si observamos la pantalla que deseamos dar funcionalidad tenemos una rejilla que debe poblarse con objetos entidad del tipo AreaBLL. Agregamos una clase que llamaremos Area_Coleccion y que debe heredar de la clase CollectionBase.&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="color:#993399;"&gt;Imports Microsoft.VisualBasic&lt;br /&gt;&lt;br /&gt;Public Class Area_Coleccion&lt;br /&gt;Inherits CollectionBase&lt;br /&gt;Default Public Property Item(ByVal index As Integer) As AreaBLL&lt;br /&gt;Get&lt;br /&gt;Return CType(List(index), AreaBLL)&lt;br /&gt;End Get&lt;br /&gt;Set(ByVal value As AreaBLL)&lt;br /&gt;List(index) = value&lt;br /&gt;End Set&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;Public Function Add(ByVal value As AreaBLL) As Integer&lt;br /&gt;Return (List.Add(value))&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Public Function IndexOf(ByVal value As AreaBLL) As Integer&lt;br /&gt;Return (List.IndexOf(value))&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Public Sub Insert(ByVal index As Integer, ByVal value As AreaBLL)&lt;br /&gt;List.Insert(index, value)&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Public Sub Remove(ByVal value As AreaBLL)&lt;br /&gt;List.Remove(value)&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Public Function Contains(ByVal value As AreaBLL) As Boolean&lt;br /&gt;Return (List.Contains(value))&lt;br /&gt;End Function&lt;br /&gt;End Class&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;Podemos observar que los métodos de esta clase reciben objetos del tipo Area. Es así que para cada objeto Entity que tengamos debemos crear un objeto Colección, esto si es que requerimos devolver una colección de objetos a la capa de datos. En nuestro ejemplo si requerimos poblar un GridView que muestra a un conjunto de objetos Area.&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Implementación de la clase Mapper para cada objeto Entity&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;Esta es la clase que se encarga de regresar un objeto Entity a la capa de presentación o una colección de objetos de acuerdo al método invocado.&lt;br /&gt;&lt;br /&gt;Como esta clase es la que accede a la base de datos utilizamos el DataBlock de Microsoft. Accedemos a los datos a través de store procedures. La cadena de conexión se encuentra en el archivo web.config&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Si observamos el método “&lt;strong&gt;GetAllArea&lt;/strong&gt;” retorna una colección de objetos del tipo Area_Colección. Se extraen los registros de base de datos a través de un SqlDataReader y luego se recorre a cada uno y con cada renglon se pobla un objeto Entity AreaBLL, luego el objeto poblado se agrega a la Colección de objetos Area y así sucesivamente para cada objeto creado de acuerdo a los registros de base de datos obtenidos en el SqlDataReader.&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="color:#006600;"&gt;Imports Microsoft.VisualBasic&lt;br /&gt;Imports Microsoft.ApplicationBlocks.Data&lt;br /&gt;Imports System.Data.SqlClient&lt;br /&gt;Imports System.Reflection&lt;br /&gt;Imports System.Data&lt;br /&gt;&lt;br /&gt;Public Structure AreaMapper&lt;br /&gt;Private _SQLCon As String&lt;br /&gt;&lt;br /&gt;'Propiedades necesarias para implementar la clase como Singleton.&lt;br /&gt;Private Shared mInstance As AreaMapper&lt;br /&gt;Private Shared mMutex As New System.Threading.Mutex()&lt;br /&gt;&lt;br /&gt;Public ReadOnly Property SQLCon() As Integer&lt;br /&gt;Get&lt;br /&gt;Return Me._SQLCon&lt;br /&gt;End Get&lt;br /&gt;End Property&lt;br /&gt;&lt;br /&gt;'Implementando la clase como Singleton.&lt;br /&gt;Public Shared Function GetInstance() As AreaMapper&lt;br /&gt;mMutex.WaitOne()&lt;br /&gt;If mInstance Is Nothing Then&lt;br /&gt;mInstance = New AreaMapper()&lt;br /&gt;End If&lt;br /&gt;mMutex.ReleaseMutex()&lt;br /&gt;Return mInstance&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Public Sub New()&lt;br /&gt;_SQLCon = ConfigurationManager.ConnectionStrings("TimonConnectionString").ToString()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;'Iniciar con la cadena de conexión&lt;br /&gt;Sub New(ByVal pSQLCon As String)&lt;br /&gt;_SQLCon = pSQLCon&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Public Function GetAllArea() As Area_Coleccion&lt;br /&gt;Dim dr As SqlDataReader = Nothing&lt;br /&gt;Try&lt;br /&gt;dr = SqlHelper.ExecuteReader(_SQLCon, Data.CommandType.StoredProcedure, "spSelectArea")&lt;br /&gt;Dim ListaAreas As New Area_Coleccion&lt;br /&gt;While dr.Read()&lt;br /&gt;ListaAreas.Add(PopulateArea(dr))&lt;br /&gt;End While&lt;br /&gt;Return ListaAreas&lt;br /&gt;&lt;br /&gt;Catch ex As SqlException&lt;br /&gt;Throw New Exception(ex.Message &amp; " En la rutina: " &amp;amp; MethodInfo.GetCurrentMethod.Name)&lt;br /&gt;Catch ex As Exception&lt;br /&gt;Throw New Exception(ex.Message &amp; " En la rutina: " &amp;amp; MethodInfo.GetCurrentMethod.Name)&lt;br /&gt;Finally&lt;br /&gt;If Not dr Is Nothing AndAlso Not dr.IsClosed Then&lt;br /&gt;dr.Close()&lt;br /&gt;End If&lt;br /&gt;End Try&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function PopulateArea(ByVal dr As SqlDataReader) As AreaBLL&lt;br /&gt;Dim ObjArea As New AreaBLL&lt;br /&gt;Try&lt;br /&gt;&lt;br /&gt;ObjArea.IdArea = Convert.ToInt32(dr(0)) 'IdArea&lt;br /&gt;ObjArea.NombreArea = Convert.ToString(dr(1)) 'NombreArea&lt;br /&gt;&lt;br /&gt;'ObsArea&lt;br /&gt;If Not dr(2) Is DBNull.Value Then&lt;br /&gt;ObjArea.ObsArea = Convert.ToString(dr(2))&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;'EsActivaArea&lt;br /&gt;ObjArea.EsActivaArea = Convert.ToByte(dr(3))&lt;br /&gt;'AreaPadre&lt;br /&gt;ObjArea.AreaPadre = Convert.ToString(dr(4))&lt;br /&gt;&lt;br /&gt;Return ObjArea&lt;br /&gt;&lt;br /&gt;Catch ex As SqlException&lt;br /&gt;Throw New Exception(ex.Message &amp; "En la rutina: " &amp;amp; MethodInfo.GetCurrentMethod.Name)&lt;br /&gt;Catch ex As Exception&lt;br /&gt;Throw New Exception(ex.Message &amp; "En la rutina: " &amp;amp; MethodInfo.GetCurrentMethod.Name)&lt;br /&gt;End Try&lt;br /&gt;End Function&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="color:#006600;"&gt;End Structure&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;Implementación de la capa de Presentación GUI&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En esta capa es en donde vamos a poblar los controles visuales con objetos Entity o listas de objetos Entity. Nosotros queremos que la cargarse la forma web se poble el GridView con los datos de todas las áreas que se encuentran en la tabla Area de la base de datos. Hacemos esto en el evento Load. Podemos observar como creamos un objeto de la clase AreaMapper y que para poblar el GridView ejecutamos su método GetAllArea y que lo establecemos como DataSource al GridView a esto se lo conoce como DataBinding con objetos de negocio.&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="color:#990000;"&gt;Partial Class _Default&lt;br /&gt;Inherits System.Web.UI.Page&lt;br /&gt;&lt;br /&gt;Private ObjAreaMapper As AreaMapper&lt;br /&gt;&lt;br /&gt;Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load&lt;br /&gt;If Not Page.IsPostBack Then&lt;br /&gt;ObjAreaMapper = AreaMapper.GetInstance()&lt;br /&gt;Call poblarDBGrid()&lt;br /&gt;Call poblarListaAreasPadre()&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub poblarDBGrid()&lt;br /&gt;Try&lt;br /&gt;Me.GridView1.DataSource = ObjAreaMapper.GetAllArea&lt;br /&gt;Me.GridView1.DataBind()&lt;br /&gt;Me.LabelTotalRegGrid.Text = "Total de Registros: " &amp; Me.GridView1.Rows.Count&lt;br /&gt;Catch ex As Exception&lt;br /&gt;Me.LabelInfo.Text = ex.Message&lt;br /&gt;End Try&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub poblarListaAreasPadre()&lt;br /&gt;Try&lt;br /&gt;&lt;br /&gt;Me.DropDownList1.DataSource = ObjAreaMapper.SelectAreas&lt;br /&gt;Me.DropDownList1.DataValueField = "IdArea"&lt;br /&gt;Me.DropDownList1.DataTextField = "NombreArea"&lt;br /&gt;Me.DropDownList1.DataBind()&lt;br /&gt;&lt;br /&gt;Catch ex As Exception&lt;br /&gt;Me.LabelInfo.Text = ex.Message&lt;br /&gt;End Try&lt;br /&gt;End Sub&lt;br /&gt;End Class&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="justify"&gt;Este es un diagrama que expone de manera general la arquitectura de la aplicación desarrollada&lt;/p&gt;&lt;a href="http://bp2.blogger.com/_o4stxlzNpWc/Rikx9btmlQI/AAAAAAAAAA8/VZX-TzOtbMs/s1600-h/ArquitecturaApp.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5055626988180903170" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp2.blogger.com/_o4stxlzNpWc/Rikx9btmlQI/AAAAAAAAAA8/VZX-TzOtbMs/s400/ArquitecturaApp.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://bp3.blogger.com/_o4stxlzNpWc/Rik7MrtmlRI/AAAAAAAAABE/HigWiFGeLFg/s1600-h/DiagramaSecuencia.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5055637145778558226" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp3.blogger.com/_o4stxlzNpWc/Rik7MrtmlRI/AAAAAAAAABE/HigWiFGeLFg/s400/DiagramaSecuencia.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;Referencias&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms978496.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms978496.aspx&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;a href="http://builder.com.com/5100-6387-1049997.html"&gt;http://builder.com.com/5100-6387-1049997.html&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-6211036731935332532?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/04/ejemplo-de-aplicacin-aspnet-20-en-3.html</link><author>noreply@blogger.com (lobyte)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_o4stxlzNpWc/RieupLtmlMI/AAAAAAAAAAc/32j6J3c48JY/s72-c/ProyectoASPNET.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-8300923220608671506</guid><pubDate>Tue, 17 Apr 2007 18:48:00 +0000</pubDate><atom:updated>2007-04-17T12:09:58.439-07:00</atom:updated><title>Excelente artículo DateSet vs. Colecciones de Objetos</title><description>Este es el link a un excelente articulo que expresa ventajas y desventajas de usar DataSets y Colecciones de Objetos, cuando usar unos y otros. Muchas veces como desarrolladores utilizamos lo que nos dicen los manuales de microsoft o los libros, pero no sabemos tecnicamente que es mejor, tomamos lo que mejor entendemos o lo que nos parece más fácil, pero creo que esto no es del todo correcto.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/08/CuttingEdge/"&gt;http://msdn.microsoft.com/msdnmag/issues/05/08/CuttingEdge/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Algo de lo que dice este articulo con respecto a los DataSets es que estos implementan la serialización de manera automática, pero ésta tiene un costo muy considerable cuando se hace para miles de registros. Soportan la concurrencia optimista, el databinding , permiten la implementación de links lógicos entre tablas cuyo fin es hacer árboles hijos de datos, pero esto último comunmente no es utilizado.&lt;br /&gt;&lt;br /&gt;Con respecto a las colecciones de objetos cuya implementación requiere heredar de la clase&lt;br /&gt;CollectionBase son considerablemente más rápidos en la recuperación de datos entre las capas. Requieren un mayor trabajo de codificación.&lt;br /&gt;&lt;br /&gt;En conclusión el artículo propone pensar muy bien en usar DataSet ya que al parecer estos presentan más desventajas , claro esto depende de la funcionalidad que se requiera ya que los DataSet soportan funcionalidad que no soportan las colecciones de objetos aunque estos últimos presentan un mayor desempeño.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-8300923220608671506?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/04/excelente-artculo-dateset-vs.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-8231212869147485545</guid><pubDate>Fri, 23 Mar 2007 01:49:00 +0000</pubDate><atom:updated>2007-04-11T15:56:39.977-07:00</atom:updated><title>Utiles NET 2.0</title><description>&lt;p&gt;Crear y acceder a los métodos de un TableAdapter definido en un DataSet tipado.&lt;/p&gt;&lt;p&gt;'Esta función retorna una DataTable después de crear el TableAdapter y ejecutar el método definido en la mismo.&lt;br /&gt;Public Function ObtenerAreasXEsActiva() As DataSet1.AREADataTable&lt;br /&gt;    Dim AreasAdapter As New &lt;strong&gt;DataSet1TableAdapters.AREATableAdapter&lt;/strong&gt;()&lt;br /&gt;    Dim Areas As DataSet1.AREADataTable&lt;br /&gt;    Areas = AreasAdapter.GetDataByEsActivaArea(1)&lt;br /&gt;    Return Areas&lt;br /&gt;End Function&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Recuperar de web.config&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Forma 1:My.Settings.Item("ConnectionStringCaja")&lt;br /&gt;Forma 2:My.Settings.strSQLServer&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------&lt;br /&gt;Accesar a una celda de un GridView&lt;br /&gt;&lt;strong&gt;DataGridView1.Rows(0).Cells(0).Value = DateTime.Now 'Colocar el valor. &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;DataGridView1.Rows(0).Cells(0).Style.Format = "d"&lt;br /&gt;MessageBox.Show(DataGridView1.Rows(0).Cells(2).Value)&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Recuperar el valor de la celda seleccionada en el GridView por ejemplo al evento&lt;br /&gt;SelectedIndexChanged.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;sValor = &lt;strong&gt;Me.GridView1.Rows(Me.GridView1.SelectedIndex).Cells.Item(0).Text&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Condición necesaria para manejar el doble postback de un&lt;br /&gt;ButtonField del tipo image en un GridView. Por ejemplo al evento RowDeleting&lt;/p&gt;&lt;p&gt;Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting&lt;/p&gt;&lt;p&gt;&lt;strong&gt;If (Me.Request("x") Is Nothing) AndAlso (Me.Request("y") Is Nothing) Then&lt;br /&gt;&lt;/strong&gt;objArea = New AreaBLL&lt;br /&gt;objArea.DeleteArea(Me.GridView1.Rows(e.RowIndex).Cells.Item(0).Text)&lt;br /&gt;Else&lt;br /&gt;Me.GridView1.DataSource = objArea.ObtenerAreas()&lt;br /&gt;Me.GridView1.DataBind()&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Implementar el pagineo en el GridView&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.&lt;strong&gt;PageIndexChanging&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;'Asignar el nuevo índice d página solicitado.&lt;br /&gt;&lt;strong&gt;Me.GridView1.PageIndex = e.NewPageIndex&lt;/strong&gt;&lt;br /&gt;Me.GridView1.DataSource = objArea.ObtenerAreas()&lt;br /&gt;Me.GridView1.DataBind()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;End Sub&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-8231212869147485545?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/03/utiles-net-20.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-4337196483250533294</guid><pubDate>Fri, 23 Mar 2007 01:31:00 +0000</pubDate><atom:updated>2007-03-22T17:48:02.488-08:00</atom:updated><title>Utiles SQL Server</title><description>&lt;p&gt;Registros que están en A, pero no  en B &lt;/p&gt;&lt;p&gt;&lt;strong&gt;SELECT     NombreEmp  FROM    EMPLEADO   WHERE   (IdEmpleado NOT IN   (SELECT     IdEmpleado  FROM    EMPLEADO_AREA))&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;---------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Obtener registros duplicados&lt;/p&gt;&lt;p&gt;&lt;strong&gt;select au_lname  count(*) from dup_authors group by au_lname having count(*) &gt; 1&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Consulta con apostrofe&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Select ApPat From EmpleadoWhere ApPat = 'O''Rally'&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------------------------------&lt;/p&gt;Obtener sólo la fecha de un DateTime&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SELECT     CONVERT(CHAR(10), FechaAltaCustodia, 103) AS SoloFecha FROM         FOLIO_CUSTODIA&lt;/strong&gt;&lt;br /&gt;------------------------------------------------------------------------------------------&lt;br /&gt;Convert con redondeo&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Select Convert(numeric(3,0), 987.654)--Salida 988&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;------------------------------------------------------------------------------------------&lt;br /&gt;Case&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SELECT   Nombre, &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;EsActivo= CASE  &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; WHEN  EsActivo= 0 THEN 'No'    &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; WHEN  EsActivo= 1 THEN 'Si'    &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; END&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;FROM  Tabla1&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;------------------------------------------------------------------------------------------&lt;br /&gt;Uso de Exist&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;IF EXISTS(SELECT * FROM authors  WHERE au_fname = 'Elmer') &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;                PRINT "Existen los datos"&lt;br /&gt;ELSE                       &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;               RAISERROR('No existen los datos')&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;------------------------------------------------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-4337196483250533294?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/03/utiles-sql-server.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-5158186474753059605</guid><pubDate>Thu, 22 Mar 2007 19:12:00 +0000</pubDate><atom:updated>2007-03-22T17:31:25.265-08:00</atom:updated><title>Utiles VB.NET 1.1</title><description>VB NET ASP 1.1&lt;br /&gt;Recuperar el valor de una celda de un DataGrid&lt;br /&gt;&lt;br /&gt;En el evento&lt;br /&gt;DataGrid1.SelectedIndexChanged&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Session("Id") = Me.DataGrid1.SelectedItem.Cells(0).Text&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;VB NET ASP 1.1&lt;br /&gt;Recuperar el total de renglones en un DataGrid&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Session("TotalRenglones") = Me.DataGridMetricasMeta.Items.Count()&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;VB NET ASP 1.1&lt;br /&gt;Obtener el texto del item seleccionado, ya que el dropdownlist no cuenta con una propiedad text directamente.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Me.DropDownListProducto.Items(Me.DropDownListProducto.SelectedIndex).Text&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;VB NET ASP 1.1&lt;br /&gt;&lt;/appsettings&gt;&lt;br /&gt;Recuperar el valor de archivo web.config&lt;br /&gt;&lt;br /&gt;'Extraer la cadena de conexión del archivo web.config en una variable de aplicación.&lt;br /&gt;Application("ServerBD") = &lt;strong&gt;ConfigurationSettings.AppSettings("ServerBD")&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;VB NET ASP 1.1&lt;br /&gt;Poner texto en un dropdownlist como si se tratará de una caja de texto.&lt;br /&gt;&lt;br /&gt;&lt;authentication mode="Windows"&gt;&lt;strong&gt;Me.DropDownList1.SelectedItem.Text = "Seleccione un valor"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;VB NET ASP 1.1&lt;br /&gt;Ocultar columna del DataGrid&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Me.DataGridMetricasMeta.Columns(6).Visible = False&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------------------&lt;br /&gt;VB NET ASP 1.1&lt;br /&gt;Encontrar y seleccionar un item basado en un texto en un DropDownList&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;DropDownList1.SelectedValue = DropDownList1.Items.FindByText("Ilumina").Value&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Validar existencia de nulo en el resultado de un DataReader&lt;/p&gt;&lt;p&gt;&lt;strong&gt;If IsDBNull(dr("ObsDocto")) then&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;End if&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Pasar parametros a un comando&lt;/p&gt;&lt;p&gt;&lt;strong&gt;cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;cmd.Parameters.Add("@Name", SqlDbType.Int).Value = System.DBNull.Value--Valor nulo&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Ejecutar una Transacción ADO.NET&lt;/p&gt;&lt;p&gt;cn.Open&lt;/p&gt;&lt;p&gt;Dim &lt;strong&gt;trans&lt;/strong&gt; as SqlTrasaction = &lt;strong&gt;cn.BeginTransaction&lt;/strong&gt;&lt;br /&gt;Dim cmDel as New SqlCommand()&lt;/p&gt;&lt;p&gt;cmDel.Connection = cn&lt;/p&gt;&lt;p&gt;cmDel.Transaction = &lt;strong&gt;trans&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Try &lt;/p&gt;&lt;p&gt;cmDel.CommandText = "Delete TablaDetalle Where Product = 12" &lt;/p&gt;&lt;p&gt;cmDel.ExecuteNonQuery()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;cmDel.CommandText = "Delete TablaEnc Where Product = 12" &lt;/p&gt;&lt;p&gt;cmDel.ExecuteNonQuery()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;trans.Commit()&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Catch Ex as Exception &lt;/p&gt;&lt;p&gt;&lt;strong&gt;trans.Rollback()&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Finally &lt;/p&gt;&lt;p&gt;cn.Close()&lt;/p&gt;&lt;p&gt;End try&lt;identity impersonate="true"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-5158186474753059605?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/03/utiles-vbnet-11.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-27440916.post-5397772378703991978</guid><pubDate>Sun, 18 Feb 2007 20:11:00 +0000</pubDate><atom:updated>2007-02-18T13:03:37.768-08:00</atom:updated><title>Tipo Nullable</title><description>Por ejemplo el tipo entero (Integer en VB) no tenia forma de tener un valor nulo. Esto permite guardar valores nulos en la base de datos.&lt;br /&gt;&lt;br /&gt;'Declarar la variable&lt;br /&gt;Dim nul as Nullable(Of Integer)&lt;br /&gt;&lt;br /&gt;'Verificar el valor&lt;br /&gt;If nul.HasValue Then &lt;br /&gt;     'Tiene valor&lt;br /&gt;End if&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27440916-5397772378703991978?l=lobyte.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://lobyte.blogspot.com/2007/02/tipo-nullable.html</link><author>noreply@blogger.com (lobyte)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>