Blog de Jorge Pedraza

mayo 1, 2012

Maestro detalles con Entity Framework en Windows Forms

Filed under: Aplicaciones Windows — JorgePedraza @ 5:37 pm
Tags: , , ,

Hola, el presente articulo tiene como intención resaltar una forma rápida y sencilla de trabajar con la tecnología Entity Framework bajo el ambiente de Windows Forms Application. Para esto se muestra las secuencias clave del desarrollo de una solución basada en un formulario Windows, el cual a través de Entity Framework se gestionará determinada Base de datos, tal es el caso de SQL server 2008 R2 Express.

Requisitos:

  1. Microsoft Visual Studio 2010 SP1.
  2. Microsoft SQL Server 2008 R2 o Superior.
  3. Experiencia en desarrollo con Base de Datos.
  4. Conocimiento sobre Entity Framework.
  5. Microsoft Windows 7 o superior.

Contenido Clave:

Para generar el desarrollo de la solución base, se debe iniciar una instancia de Visual Studio 2010 SP1 donde se crea nuevo proyecto del tipo Windows Forms Application, con un nombre especifico, por ejemplo WindowsApplicationEF. Ahora a continuación se procede con las siguientes indicaciones:

1. Agregar archivo demoEF.mdf 2. Establecer estructura demoEF.mdf   3. Establecer diagrama de demoEF.mdf
AdddemoEF DbdemoEF DiagramaSQLsrvDEMOEF
4. Agregar ModeldemoEF.edmx 5. Establecer archivo demoEF.mdf 6. Seleccionar tablas especificas
AddEF EntityDMW1 EntityDMW2
7. Verificar entidades creadas 8. Establecer SubTotal para DetOrden 9. Calcular MontoBruto para EncOrden
ModeldemoEF ExtensionDetOrden ModeldemoEFplusCode
10. Seleccionar Form1 11.Agregar DataGridViews y botones 12. Parametrizar DataGridView1
EncOrden
SlnDemoEF MDEFWFSE GridView1EditColumns
13. Parametrizar DataGridView2
DetOrden
14. Verificar interfaz de Usuario 15. Establecer código de desarrollo
GridView2EditColumns MDEFWFA CodigoDemoEF
16. Realizar prueba de ejecución
MDEFWF

Nota Importante: Esta solución no incluye más opciones ni validaciones de usuario, ya que la intención principal de la misma es representar una alternativa base para crear soluciones futuras de mayor grado de complejidad a través de una vía solida y precisa.

Código Fuentes:

  • WindowsApplicationEF (Visual Basic 2010, Windows Forms Application, SQL Server 2008 R2 Express, Entity Framework)

En Resumen:

Una vez más se puede apreciar una alternativa simple y productiva de crear soluciones Windows con base de datos a través de tecnologías actuales y de proyección futura dentro de la plataforma .NET, como es Entity Framework.

Enlaces de Interés:

Anuncios

septiembre 4, 2011

Maestro Detalles ADO.NET en WPF

Filed under: Aplicaciones Windows — JorgePedraza @ 10:17 am
Tags:

Hola, el presente artículo intenta resaltar de forma rápida y sencilla el desarrollo de una aplicación de datos de última generación (Aplicación Maestro Detalles) donde involucra tecnologías actuales de Microsoft .

Esta aplicación de ejemplo del tipo Windows está comprendida en tres aspectos de interés como: presentación grafica de la aplicación para el usuario (WPF Windows Presentation Foundation), Manipulación de datos (ADO.NET) y finalmente repositorio de datos (SQL Server Compact 4.0).

Con esta información se busca ofrecer una base fundamental para el desarrollo y expansión de soluciones en diferentes escenarios de forma genérica como es el caso de otros motores de base de datos y aplicaciones relacionadas con tecnologías.

Índice:

  1. Requisitos.
  2. Conceptos Claves para este Articulo.
  3. Diagrama entidad relación de Base Datos del Ejemplo (Maestro Detalles).
  4. Esquema del Documento (Document Outline) – Aplicación Demo WPF.
  5. Arquitectura de la Aplicación WPF con Maestro Detalles ADO.NET.
  6. ItemTemplate de ListBox WPF
  7. Representación y enlaces de ItemTemplate del ListBox desde XAML.
  8. Código de Aplicación Maestro Detalles ADO.NET en WPF
  9. Código Fuente.
  10. En Resumen.
  11. Enlaces de Interés.

1. Requisitos:

  1. Microsoft Visual Studio 2010 SP 1
  2. Microsoft Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0
  3. Experiencia con Microsoft Visual Basic 2010 o C# 2010
  4. Experiencia con ADO.NET

2. Conceptos claves para este Articulo:

  • WPF: Windows Presentation Foundation (WPF) es un sistema de presentación grafica de ultima generación para construir aplicaciones clientes Windows con experiencias de usuario visualmente impresionantes.
  • XAML: Es un lenguaje de marcado basado en XML, que se utiliza para implementar la apariencia de una aplicación de forma declarativa.
  • SQL Server Compact 4.0 : Es una base de datos compacta ideal para incrustarse en aplicaciones de escritorio y web. Este ofrece funcionalidad de base de datos relacional en un espacio reducido: un sólido almacén de datos, un procesador de consultas de optimización y una conectividad confiable y escalable.
  • DataSet : Es un caché de memoria interna de datos y representa un componente fundamental de la arquitectura de ADO.NET. Un DataSet puede contener uno o más tablas llamadas DataTable que a su ves puede ser relacionadas por uno o más objetos de relación llamados DataRelation.

3. Diagrama entidad relación de Base Datos del Ejemplo (Maestro Detalles):

EntidadRelacionDB

4. Esquema del Documento (Document Outline) – Aplicación Demo WPF:

XAMLyDesign Document OutlineWPF
     

Descripción a nivel de XAML

Window:     Representa una Ventana de la aplicación Windows
  Resources:   Forma sencilla de reutilizar objetos y valores comúnmente definido.
    DataSet (myds) Elemento proxy establecido para el objeto mydscode del tipo DataSet
    CollectionViewSource (EncDocViewSource) Elemento proxy establecido para el objeto MasterEncDocViewSource del tipo CollectionViewSource.
    CollectionViewSource (EncDoc_DetDocViewSource) Elemento proxy establecido para el objeto DetailEncDoc_DetDocViewSource del tipo CollectionViewSource.
  Grid:   Define un área de cuadrícula flexible que se compone de filas y columnas.
    ListBox (lbxEncDoc) Caja de Lista para mostrar datos del DataTable (EncDoc)
    Button (btnProximoEncDoc) Botón para invocar instrucción próximo registro dentro del MasterEncDocViewSource.View
    TextBox (txtNombre) Caja de Texto para mostrar o establecer datos en el campo Nombre del DataTable (EncDoc)
    Button (btnNuevoEncDoc) Botón para invocar instrucción Nuevo Registro dentro del MasterEncDocViewSource.View
    ListBox (lbxDetDoc) Caja de Lista para mostrar datos del DataTable (DetDoc)
    Button (txtCifra) Caja de Texto para mostrar o establecer valor numérico en el campo Cifra del DataTable (DetDoc)
    Button (btnNuevoDetDoc) Botón para invocar instrucción Nuevo Registro dentro del DetailEncDoc_DetDocList.View
    Button (btnQuitarDetDoc) Botón para invocar instrucción Quitar Registro actual dentro del DetailEncDoc_DetDocList.View
    Button (btnUpdate) Botón para invocar rutina de actualización de datos contra el origen de datos.
    Button (btnQuitarEncDoc) Botón para invocar instrucción Quitar Registro actual dentro del MasterEncDocViewSource.View
    Button (btnBuscar) Botón para invocar rutina de filtro de datos
    Button (btnTodos) Botón para invocar instrucción Quitar filtro de datos
    Button (btnOrdenar) Botón para invocar instrucción de ordenación de datos.

5. Arquitectura de la Aplicación WPF con Maestro Detalles ADO.NET:

FlujoAr

6. ItemTemplate de ListBox WPF:

ItemTemplateAndAppWPF

         

Descripción a nivel de XAML

ListBox(lbxEncDoc)         Caja de Lista en WPF
  ItemTemplate       Obtiene o establece el DataTemplate utilizado para mostrar cada elemento.
    DataTemplate     Describe la estructura visual de un objeto de datos.
      Grid   Define un área de cuadrícula flexible que se compone de filas y columnas.
        ColumnDefinition Define propiedades específicas de la columna que se aplican a elementos Grid.
        ColumnDefinition  
      TextBlock   Proporciona un control ligero para mostrar pequeñas cantidades de contenido de flujo.
      TextBlock    

7. Representación y enlaces de ItemTemplate de ListBox desde XAML:

ItemTemplateXAML3

8. Código de Aplicación Maestro Detalles ADO.NET en WPF:

A continuación se comenta algunos aspectos claves del código fuente en Visual Basic 2010 necesario para dar marcha a la aplicación planteada:

ADONETWPFVB

9. Código Fuente:

  • DemoWpf4Adonet (Visual Basic 2010, WPF 4, ADO.NET, SQL Server Compact 4)

10. En Resumen:

La aplicación Demo Maestro Detalles ADO.NET en WPF 4 descrita en este artículo ofrece un acceso directo a determinada estrategia de desarrollo de aplicaciones de última generación relacionado con actuales tecnologías Microsoft como WPF 4, SQL Server Compact 4.0, ADO.NET, etc. Y así establecer una alternativa sólida para dar inicio y continuidad a soluciones más compleja de forma rápida y segura.

11. Enlaces de Interés:

febrero 4, 2011

Debug y Trace

Filed under: Aplicaciones Windows — JorgePedraza @ 7:38 pm
Tags: , , ,

Debug y Trace en .NET

Introducción

Las funciones de depuración integradas en Visual Studio 2010 son lo suficientemente potentes como para poder encontrar y subsanar la mayoría de los errores (de Sintaxis y lógicas) pero, en algunos casos, necesitará agregar instrucciones de seguimientos en su código que le permitirán comprender por qué la aplicación tiene comportamiento inadecuado. este sistema resulta especialmente útil cuando los problemas se producen únicamente en las aplicaciones compilidas que ya han sido previamente instalada en la maquina de destino. Por fortuna .NET Framework ofrece varias clases que simplifican esta tarea, como lo son las Clase Debug y Trace.

Requerimientos:

  • Framework 4.0
  • Microsoft Visual Studio 2010 (Plataforma de Desarrollo)
  • Microsoft Windows 7 o Superior

 Contenido:

Trace (Clase)

Debug (Clase)

Proporciona un conjunto de métodos y propiedades que le ayudan a realizar el seguimiento de la ejecución del código. No se puede heredar esta clase Proporciona un conjunto de métodos y propiedades que ayudan a depurar el código. No se puede heredar esta clase.
Ambas clases comparten métodos y Propiedades en comun:

Propiedades públicas

AutoFlush
Obtiene o establece si debe llamarse a Flush en Listeners después de cada escritura.
IndentLevel
Obtiene o establece el nivel de sangría.
IndentSize
Obtiene o establece el número de espacios de una sangría.
Listeners
Obtiene la colección de los agentes de escucha que está supervisando los resultados del seguimiento.

Métodos públicos

Assert
Sobrecargado. Comprueba una condición y muestra un mensaje si ésta es false .
Close
Vacía el búfer de resultados y, a continuación, cierra Listeners .
Fail
Sobrecargado. Emite un mensaje de error.
Flush
Vacía el búfer de resultados y hace que los datos almacenados en el búfer se escriban en Listeners .
Indent
Aumenta la propiedad IndentLevel actual en uno.
Unindent
Disminuye la propiedad IndentLevel actual en uno.
Write
Sobrecargado. Escribe información sobre el seguimiento en los agentes de escucha de seguimiento de la colección Listeners .
WriteIf
Sobrecargado. Escribe información acerca del seguimiento en los agentes de escucha de seguimiento de la colección Listeners si una condición es true .
WriteLine
Sobrecargado. Escribe información sobre el seguimiento en los agentes de escucha de seguimiento de la colección Listeners .
WriteLineIf
Sobrecargado. Escribe información acerca del seguimiento en los agentes de escucha de seguimiento de la colección Listeners si una condición es true .

Las clases Debug y Trace son idénticas y exponen los mismos métodos. La única diferencia que existe entre ellas es que las llamadas a los métodos de la clase Debug se incluirán en la aplicación compilada sólo si la constante de compilación Debug se encuentra definida, mientras que las llamadas a los métodos de la clase Trace sólo se incluye si la constante de compilación Trace se encuentra definida. De forma predeterminada, el tipo de configuración Debug define estas dos constantes de compilación, mientras que el tipo de configuración Realease define únicamente la constante Trace. De esta forma, la salida de la clase trace estará incluida en todas las aplicaciones compiladas en el modo Release.

Trace (Clase)

Debug (Clase)

Sub MiProc()

Trace.WriteLine("Escritura de MiProc")

Trace.Indent()

Trace.WriteLine("Dentro de MiProc")

Trace.Unindente()

Trace.WriteLine("Salir de MiProc")

End Sub

Sub MiProc()

Debug.WriteLine("Escritura de MiProc")

Debug.Indent()

Debug.WriteLine("Dentro de MiProc")

Debug.Unindente()

Debug.WriteLine("Salir de MiProc")

End Sub

 

switchs Proporciona una clase base abstracta (MustInherit en Visual Basic) para crear nuevos modificadores de depuración y seguimiento. Existen dos tipos de switchs predefinidos:

TraceSwitch (Clase)
BooleanSwitch (Clase)
Proporciona un modificador de varios niveles para controlar los resultados del seguimiento y la depuración sin volver a compilar el código. Proporciona un modificador de activación/desactivación sencillo que controla los resultados de la depuración y del seguimiento.

Cuando se establece el nivel de seguimiento con un archivo de configuración, se especifica un valor entero que se corresponda con un miembro de enumeración en lugar del miembro de enumeración en sí, tal y como se muestra en el siguiente ejemplo.

<configuration>
<system.diagnostics>
<switches>
<add name="mySwitch" value="4" />
</switches>
</system.diagnostics>
</configuration>

En la siguiente tabla se muestra la relación que existe entre los miembros de la enumeración TraceLevel y las entradas correspondientes del archivo de configuración.

Nivel de seguimiento Valor del archivo de configuración
Off 0
Error 1
Warning 2
Info 3
Verbose 4

Nombre de Miembros

Error
Envía mensajes de control de errores.
Info
Envía mensajes informativos, advertencias y mensajes de control de errores.
Off
No envía ningún mensaje seguimiento ni de depuración.
Verbose
Envía todos los mensajes de seguimiento y depuración.
Warning
Envía advertencias y mensajes de control de errores.

 

TraceSwitch (Clase)
BooleanSwitch (Clase)
Private Shared myTraceSwitch As New TraceSwitch("MySwitch", "Description")
myTraceSwitch.Level = TraceLevel.Info
Trace.WriteLineIf(myTraceSwitch.TraceError, "It displayed because it lower then info")
Dim dataSwitch As New BooleanSwitch("Data", "ModulodeNivel Establecido!")
If dataSwitch.Enabled Then
MsgBox("Si esta Habilitado el Nivel Data")
Else
MsgBox("No esta Habilitado el Nivel Data")
End If

 

Código Fuente :TestDebugTrace (Visual Basic 2010)

Conclusión: Estas clases son de gran utilidad al momento de hacer seguimiento en aquellas aplicaciones compilidas que ya han sido instaladas en el sitio de destino del cliente. Cuya finalidad es ayudar a Descubrir Posible comportamiento inesperado que no se habían presentado durante la fase de Desarrollo de la Aplicación.

Fuentes:

julio 27, 2010

Runtime Intelligence Services

 

Desde hace tiempo, la ofuscación ha sido tema de gran interés en el area de desarrollo de software alrededor de maquinas virtuales como es el .NET Framework de Microsoft. Y esto siempre fue tratada por soluciones como Dotfuscator de la Empresa (preemptive), la cual brinda una series de opciones vinculadas con la optimización y protección de código contra la ingeniería reversa.

Una de esas opciones es la Instrumentación de código de una aplicación a través de la herramienta Dotfuscator CE (Versión de comunidad) la cual se puede llegar a utilizar con soporte del servicio gratuito de preemptive llamado Portal gratuito de Runtime Intelligence Services.

Requisitos Previos:

  • Conocimiento sobre Reflexión (Framework 2.0 o Superior).
  • Conocimiento sobre la herramienta Dotfuscator.
  • Desarrollo .NET Framework (Visual Basic o C#).
  • Conexión a Internet para gestion interna de aplicación.

Marco Teorico:

En principio este tema describe la instrumentación como el mecanismo base para incorporar a determinada aplicación final ciertas funcionalidades adiccionales a través de la inyección código, tal es el caso de atributos. Todos esto con el objectivo de lograr:

  • Seguimiento del uso
  • Detección de la alteración binaria
  • Expiración de las aplicaciones.

Que posteriormente dicha información sera almacenada en algún tipo de repositorio de datos especifico en tiempo real, desde el cual sera gestionado y visualizado a través de reportes estadísticos, los cuales permitira ofrecer una mejor perspectiva de la ejecución de nuestra aplicación. Para fines de este articulo se enfocara en el servicio gratuito de Runtime Intelligence Services como almacén central de información.

Instrucciones básicas de uso:

Antes de comenzar las instrucciones básicas, debe establecer previamente un valor de configuración del tipo Booleano, llamada OptIn a raíz de la aplicación, que posteriormente será tratado a través de una propiedad estática solo de lectura llamada OptIn, la cual estará situado en cierta parte la clase estática Program.  Ya con este previo paso se crea una bandera para realizar el ajuste de seguimiento de la aplicación y así dar continuidad a la instrumentación de código.

Paso1 Paso2 Paso3
paso4 paso5 paso6
paso6 paso7 paso8
paso9 paso10 Test0
Test1 Test2  

En Resumen:

Se ha resaltado una alternativa para hacer seguimiento de nuestras aplicaciones en tiempo real a través de servicios de tercero, como es el portal gratuito de Runtime Intelligence Services de la empresa preemptive. Claro que en algunas ocaciones van a necesitar tratar escenarios más completo para los cuales se sugiere un mayor enfoque integral del tema, ademas de tener como opción el uso de herramientas y servicios de carácter comercial de preemptive .

Links de Interés:

Para mayor enfoque:

julio 5, 2010

Busquedas en DataGridView

Filed under: Aplicaciones Windows — JorgePedraza @ 5:47 am
Tags: , , , ,

Hola, la presente intenta mostrar un procedimiento de interés relacionado con ADO.NET. Cuando se trabaja con aplicaciones de base datos se puede apreciar un gran porcentaje el uso de filtrado de datos, para  el cual se va citar un clásico escenario de búsqueda rápida de filas dentro de un control DataGridView.

Dicho escenario es una aplicación Windows donde contiene controles sensibles a datos, tal es el caso del DataGridView, además de poseer un mecanismo de vinculación y gestión de datos. En esta aplicación se establece otros elementos de interés como caja de texto y etiqueta. El manejo de la aplicación se basa en introducir un criterio de búsqueda aproximado o exacto dentro de determinada caja de texto, y de acuerdo a la primera coincidencia se establece como resultado la selección dinámica de la fila contenida dentro del control DataGridView.

BRDGV
Requisitos:

  • .NET Framework 2.0 o superior.
  • Motor de Base de Datos Sql Server 2005 o superior.
  • Experiencia base con la capa ADO.NET 2.0 o superior.
  • Fundamento de Base de datos Sql Server 2005 o Superior.

Puntos relacionados con este tema:

  • DataAdapter: Representa el objeto encargado de procesa información entre determinado origen y destino de datos. Para fine del tema se va utiliza la clase SqlDataAdapter enfocado en base de datos Sql Server.
  • DataTable: Represente la réplica virtual de una tabla de cierto origen o estructura personalizada de datos.
  • DefaultView: Obtiene una vista personalizada de un Datatable que puede incluir una vista filtrada o una posición del cursor
  • DataGridView: Representa el control base en forma de cuadricula para la visualización y gestión de datos vinculado en determinado DataTable.
  • Windows Forms: Es el control principal de interfaz grafica que actúa como contenedor de controles de gestión de usuario.

Descripción del Algoritmo para Búsqueda rápida de fila en un control DataGridView:

  1. Se declara 3 variables:
    • Posicion del  tipo Integer,  el cual representa la posición de un registro.
    • Ncolumn del tipo String,  el cual representa el nombre de columna para filtro.
    • Strsort del tipo String, el cual representa el nombre de columna para Ordenar.
  2. Se actualiza el valor de la variable Strsort según el caso selectivo de la columna establecida para la ordenación.
  3. El valor de la variable Strsort se pasa al método Sort de la vista del DataTable que está vinculado al objeto DataGridview.
  4. Se crea un DataTable temporal llamado tablaT desde la vista actualizada.
  5. Se declara un arreglo de DataRow llamado filas, el cual se llenara a partir de la selección de determinados registros en base a un criterio, bien sea aproximado o exacto.
  6. Se consulta la longitud de dicho arreglo, para determinar  el índice del primer DataRow y fijarlo en la variable posición.
  7. Se escribe un bloque condicional para seleccionar o no la fila del DataGridView en base al valor de la variable posición.

Descripción del codigo fuente relacionado con el Algoritmo:

Dim dtpersonas As New Data.DataTable ‘Datatable especifico para Almacenar datos.
Dim columna As Integer = 0 ‘Valor numero de la columna del DataGridView.
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBuscar.TextChanged
If txtBuscar.Text <> “” Then ‘Verifica que la caja de texto no este vacia

        Dim posicion As Integer = –1 1
Dim Ncolumn As String = DataGridView1.Columns(columna).Name ‘Obtiene el Nombre de Columna actual del DataGridView.
Dim Strsort As String = “”

        Select Case DataGridView1.Columns(columna).HeaderCell.SortGlyphDirection ‘Obtiene nivel de ordenación establecido sobre la columna del DataGridView. 2
Case SortOrder.Ascending ‘En Caso de ser Ascendente
Strsort = Ncolumn & ” Asc” ‘Se fija el nombre de columna y la marca Asc
Case SortOrder.Descending ‘En Caso de ser Descendente
Strsort = Ncolumn & ” Desc” ‘Se fija el nombre de columna y la marca Desc
End Select

        dtpersonas.DefaultView.Sort = Strsort ‘Se Actualiza la vista segun el nivel de ordenación establecido. 3
Dim tablaT As DataTable = dtpersonas.DefaultView.ToTable ‘Se crea un DataTable temporal en base a la Vista del DataTable Actual. 4
Dim filas() As DataRow = tablaT.Select(DataGridView1.Columns(columna).Name & ” like ‘” & txtBuscar.Text & “%'”) ‘Se establece y ejecuta filtro de llenado de arreglo de DataRow. 5

        If filas.Length > 0 Then posicion = tablaT.Rows.IndexOf(filas(0)) ‘Se establece en la variable posicion el Indice de la primera fila del arreglo del DataRow desde tablaT. 6

        If posicion > -1 Then ‘Verifica que posicion es mayor –1.7
DataGridView1.Item(columna, posicion).Selected = True ‘Caso verdadero se selecciona la fila del DataGridView.
Else
DataGridView1.Item(columna, DataGridView1.CurrentRow.Index).Selected = False ‘Caso falso se Deselecciona la fila del DataGridView.
        End If

    Else
        DataGridView1.Item(columna, DataGridView1.CurrentRow.Index).Selected = False ‘En caso de Caja de texto de Busqueda este vacio, se Deselecciona la fila del DataGridView.
End If

End Sub

Nota Importante: Algo que no se está incluyendo en este tema, es la validación de la entrada de datos relacionado con el criterio de búsqueda. Y esto se debe a que  el procedimiento planteado esta susceptible a errores con la introducción de instrucciones o caracteres especiales por ejemplo: %, ‘, $, etc. Para el cual queda como tarea adicional realizar las respectivas validaciones.

En Resumen: Con este procedimiento se logra satisfacer cierto escenario relacionado con el filtrado de datos a nivel de control de usuario, tal es el caso del DataGridView y todo esto relacionado con la manipulación de criterio de búsquedas aproximado o exacto generado por parte del usuario final.

Anexo código fuente para ilustra el tema: Búsquedas en DataGridView (Visual Basic 2010 y SQL Server 2008)

Blog de WordPress.com.