[SQL] Crear procedimientos almacenados con múltiples filtros opcionales

febrero 11, 2015 Deja un comentario

El título es muy descriptivo, ya que este escenario; suele ser muy común en el desarrollo de software. Al ser un escenario concurrido, existen muchas alternativas para darle solución. En este post vamos a mostrar un ejemplo de cómo hacerlo, de manera rápida y sencilla.

Procedimiento almacenado (motor de base de datos)

Un procedimiento almacenado de SQL Server es un grupo de una o varias instrucciones Transact-SQL o una referencia a un método de Common Runtime Language (CLR) de Microsoft (Microsoft, 2015).

Escenario en cuestión
Tenemos que realizar una búsqueda en la base de datos por más de cinco campos opcionales. Esto en más de una tabla, por el negocio (no hablaremos del negocio), es decir; tenemos un tipo de caja, que si selecciona si es chica, mediana o grande se filtra por este tipo, sino se selecciona ninguna; se regresan los registros que correspondan a los tres tipos que tenemos en la base. A esto nos referimos cuando hablamos de campos opcionales.

Tenemos diferentes casos, según los tipos de datos.

Enteros
Para un entero, como su valor no puede ser nulo desde código ( a menos que se declare int?) el valor que se asigna por defecto es un ‘0’, para estos casos podemos usar el siguiente ejemplo

Lee el post completo aquí: http://wp.me/p3a45l-lI

Categorías:SQL Server Etiquetas: ,

[How to] Crear un servicio de Windows

junio 22, 2012 Deja un comentario

Buenas,

En una de mis actividades del día tengo que crear un Servicio de Windows que se encargue de depurar algunas tablas en la Base de Datos, y como parte de mi intento por seguir escribiendo en este Blog, aquí les platico como es que hago este servicio.

Lo primero es Crear el Proyecto:

1.- Creamos un proyecto desde Visual Studio, con la plantilla de: “Windows Service”

image

Asignamos el nombre correspondiente. Lo que vemos en el proyecto son dos archivos, uno llamado Service1.cs y el Program.cs.

 

image

Para observar el código de Service1.cs basta con hacer clic derecho en el fondo gris que nos aparece y seleccionar ver código, o bien presionando F7, como se pueden dar cuenta, aquí estás los métodos para iniciar el Servicio y para Detenerlo. Aquí escribiéremos el código que necesitemos para cuando se ejecuten estos eventos.

Bien ahora podemos editar algunas de las propiedades de nuestro servicio como son:

  Nombre Descripción
Propiedad pública AutoLog Indica si los comandos Iniciar, Detener, Pausar y Continuar deben notificarse en el registro de eventos.
Propiedad pública CanHandlePowerEvent Obtiene o establece un valor que indica si el servicio puede controlar notificaciones de los cambios de estado de la alimentación del equipo.
Propiedad pública CanHandleSessionChangeEvent Obtiene o establece un valor que indica si el servicio puede controlar eventos de cambio de sesión recibidos de una sesión de Terminal Server.
Propiedad pública CanPauseAndContinue Obtiene o establece un valor que indica si se puede pausar y reanudar el servicio.
Propiedad protegida CanRaiseEvents Obtiene un valor que indica si el componente puede generar un evento. (Se hereda de Component).
Propiedad pública CanShutdown Obtiene o establece un valor que indica si se debe informar al servicio de que el sistema se está cerrando.
Propiedad pública CanStop Obtiene o establece un valor que indica si puede detenerse el servicio una vez se ha iniciado.
Propiedad pública Container IContainer that contains the Component.’ data-guid="820b3092646429b7ca584d7070fb2741">IContainer that contains the Component.’ data-guid="820b3092646429b7ca584d7070fb2741">Obtiene IContainer que contiene Component. (Se hereda de Component).
Propiedad protegida DesignMode Component is currently in design mode.’ data-guid="92b14b816d9ff2682c4a51ee3ff07f92">Component is currently in design mode.’ data-guid="92b14b816d9ff2682c4a51ee3ff07f92">Obtiene un valor que indica si Component está actualmente en modo de diseño. (Se hereda de Component).
Propiedad pública EventLog Obtiene un registro de eventos que se puede utilizar para escribir la notificación de llamadas de comandos de servicio, como Iniciar y Detener, en el registro de eventos de aplicación.
Propiedad protegida Events Component.’ data-guid="41716543b8cc97b6827325125b214887">Component.’ data-guid="41716543b8cc97b6827325125b214887">Obtiene la lista de controladores de eventos asociados a Component. (Se hereda de Component).
Propiedad pública ExitCode Obtiene o establece el código de salida para el servicio.
Propiedad protegida ServiceHandle Obtiene el identificador del control de servicios para el servicio.
Propiedad pública ServiceName Obtiene o establece el nombre corto utilizado para identificar el servicio en el sistema.
Propiedad pública Site ISite of the Component.’ data-guid="75f8b75e7a6898f869c5d0fb7d4dd047">ISite of the Component.’ data-guid="75f8b75e7a6898f869c5d0fb7d4dd047">Obtiene o establece ISite de Component. (Se hereda de Component).

Por el momento solo editaré el nombre del Servicio, ya que las opciones que trae por defecto sirven para mi propósito.

Para hacer más practico el ejemplo, simularé mi tarea y limpiaré una tabla cada 12 horas, entonces en el método OnStart, coloco el siguiente código:

protected override void OnStart(string[] args)
{
    Timer timer = new Timer { Enabled = true, Interval = 43200000 }; //43200000  son 12 horas
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    timer.Start();
}

Y en el Handler del timer, colocaré mi código:

 

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //TODO: Código para limpiar mi tabla
    new ProcesoLimpiar().Ejecutar();
}

Este código se ejecutará en mi caso, cado 12 horas.

2.- Agregar un Instalador.

Ahora para terminar vamos a agregar un instalador a nuestro servicio. Para hacer nos colocamos en modo de diseño de nuestro servicio, clic derecho y Add Installer.

En este punto se  agregará una clase llamada ProjectInstaller.cs, que contiene dos archivos, serviceInstaller1 donde indicaremos el nombre del servicio y el tipo de inicio. Además de el nombre a mostrar y una descripción de lo que hace la aplicación. Estos dos últimos datos serán los que se mostrarán en el listado de servicios de Windows.

Por último, si seleccionamos el otro elemento, serviceProjectInstaller1, podemos seleccionar el tipo de cuenta con la que queremos que se ejecute el servicio.

image

Con esto tenemos listo nuestro servicio de Windows.

3.- Instalación y Desinstalación

Desde la línea de comandos podemos instalar/desinstalar un servicio Windows. El comando InstallUtil.exe se instala automáticamente con Visual Studio y podemos ejecutarlo a través de Visual Studio Command Prompt.

Instalación:

InstallUtil.exe miEjecutable.exe

Desinstalación

InstallUtil.exe /u miEjecutable.exe

 

Listo, esto es todo. Espero que les sea de utilidad.

Technorati Tags: ,,,
Categorías:C#, how to, Tips, Windows

[C#] Access to the path {0} is denied. Solución

Buenas,

De regreso al blog, en esta ocasión es más enserio. Aquí hablando de un error común cuando hablamos de acceder a Carpetas o Archivos desde nuestra aplicación.

Seguramente hay muchas opciones para darle solución a esto, y la más común es simplemente ir dicha carpeta, o archivo hacer clic derecho ir a Propiedades y deshabilitar el checkbox de “Read-only”.

Pero que ocurre cuando es una aplicación de escritorio y no tenemos acceso a dicho archivo, bueno para este escenario aquí propongo una solución:

Imaginen que queremos abrir un archivo de texto, con esta instrucción

FileStream fileStream = new FileStream(rutaArchivo, FileMode.Open);

Si nuestro archivo tiene activa la propiedad de “Read-only”, entonces nos mostrará el siguiente error:

image

Para solucionar esto es necesario desactivar la propiedad de solo lectura, y eso lo hacemos con la siguiente instrucción, antes de intentar abrir el archivo en cuestión:

File.SetAttributes(rutaArchivo, 
    File.GetAttributes(rutaArchivo) & ~FileAttributes.ReadOnly);

Con esto ya podemos leer archivos, imágenes, etc. El detalle aquí que puede ocurrir es si nuestra aplicación no se ejecuta como administrador.

Espero que les sea de utilidad.

Saludos.

Categorías:C#, Errores, Tips Etiquetas: , ,

[Cocos2d] Aprendiendo a desarrollar un videojuego para iOS (bases de Objective-c)

diciembre 1, 2011 3 comentarios

Antes de Iniciar

Debido al trabajo (y al agrado del tema), estaré desarrollando un juego para iOS, así que me ha ocurrido la idea de hacer tutoriales sobre este tema (así como en algún momento lo hice con XNA). Este es el primero de ellos y aquí vamos a comenzar.

Ya saben un poco de introducción, para que vean de qué va esto y para aquellos que no tengan la menor idea (como yo), aquí vamos aprendiendo de la mano de estos tutoriales, así que si notan que hago algo mal favor de indicarlo en los comentarios. Tengan en cuenta que la mayoría de los conceptos y definiciones de lo que se describe a continuación son de mi interpretación, y con un lenguaje común. No son las definiciones que encontrarás en Google.

Iniciamos

iOS es el sistema operativo con el que trabajan los dispositivos de Apple como son: IPhone, IPod Touch y el IPad. Para poder trabajar sobre este Sistema Operativo contamos con un Framework llamada Cocos2d, el cual trabaja con un lenguaje llamado Objective-C. Este lenguaje a mi parecer es un poco similar a C (no sé si tenga fundamentos en él, pero de que se parece según yo sí).

Para poder trabajar con lo que vamos a ver a lo largo de estos Tutoriales, es necesario contar con un ambiente de desarrollo, el cual está compuesto por:

  • 1. Una MAC (bien puede ser una virtual, es así como yo trabajo porque no tengo MAC).
  • 2. Tener instalado Xcode, que es el IDE que contiene el Framework de Cocos2d .

Ahora veamos un poco de conceptos básicos para trabajar con Objective-C en Cocos2d.

Las Clases

Como lo entiendo (no específicamente hablando de POO) podemos decir que una Clase representa un concepto (lo que se les ocurra). Por ejemplo cuando desarrollamos un juego tenemos cosas como: menú, opciones, nivel, etc. Podemos tener una clase que represente cada uno de estos conceptos. Entonces entiéndase que cada concepto que modelemos es una Clase.

En Objective-C las clases se dividen en 2 archivos:

  • Un archivo con extensión .h
  • Un archivo con extensión .m

Porque lo hacen así, la verdad es que no sé, me da la impresión que tiene que ver con la manera de implementar dicha clase. A mi experiencia con .Net y principalmente con C# tiene que ver con las Interfaces y clases en este Framework (como son los WCF). A donde voy con esto es que en el archivo .H se encuentra la implementación (el código es si de cada método, función y propiedad) de lo que se define en el archivo .M (que es donde se encuentra la interfaz).

 

Sobre el Framework y el IDE

Entendiendo por Framework como un conjunto de clases, digamos que Cocos2d es un conjunto de clases definidas para la creación de juegos en 2D de manera fácil y rápida. El software de XCode incluye el Framework y las plantillas necesarias para trabajar.

Aquí podemos ver una imagen general del entorno de desarrollo

clip_image002

Algo interesante del IDE, es que nos compila en tiempo de edición, es decir; nos va indicando el momento en que tenemos un error o una alerta y basta con hacer clic en el área de notificaciones para que nos indique cual es la situación del error o alerta (muy similar a Visual Studio).

Como se puede observar tenemos un explorador de archivos del lado izquierdo y en la parte inferior una ventana de salida (así se llamaría en Visual Studio “output”), que nos indica lo que ocurre con la aplicación.

A grandes rasgos es lo que necesite para comenzar, así que creo que conforme comiencen a tirar código conoceremos más cosas del IDE, por el momento con esto nos basta.

Adentrando un poco más a Objective-c

Para poder iniciar con el código, es necesario mencionar ciertas cosas básicas del lenguaje, que aunque quizá algunas ya sepan, pero aun así las escribiré ya que a mí me parecen fundamentales.

 

Tipos de datos

En Objective-c existen varios tipos de datos, pero aquí describo los más comunes.

Int

Tipo de datos que se utilizar para almacenar un número entero sin decimales, por ejemplo 1. El ejemplo de un número entero es:

int contador = 1;

Por default este tipo de dato está representado en base 10, pero del mismo modo, un int puede ser expresado en base 16 (hexadecimal) precediendo el número con 0X. Por ejemplo

int contadorHexadecimal = 0xFFA2;

Y para representar un número entero en base 8 (Octal) puede ser expresado precediendo el número con un 0. Por ejemplo

int contadorOctal = 024;

float

Tipo de datos que se utilizar para almacenar un número decimal con un punto, por ejemplo 14.34567. El ejemplo de un número decimal con un punto es:

float radio = 14.34;

Vamos con los Strings (texto).

Char

Tipo de dato que se utilizar para almacenar un solo carácter, como una letra, un signo numérico, dígito o caracteres de espacio. Por ejemplo:

char myChar = ‘n’;

char myChar = ‘1’;

char myChar = ‘:’;

NSString

A diferencia de int, float, char, etc. Este tipo de dato es una Clase y almacena un arreglo de caracteres de tipo Char, por ejemplo: “hola mundo”. Por el hecho de ser una clase para poder implementarla tenemos que instanciarla, es decir; crear un objeto.

La sintaxis para usarlo es el siguiente:

NSString *mensaje = @”Hola mundo, desde Objective-c”;

Se puede observar que antes del nombre de la variable se encuentra un “*”, esto significa que “*mensaje” en realidad es un puntero a una instancia de la clase NSString (a alguien le suenan esos punteros).

Por otro lado está el “@” antes de iniciar el texto, si fuera C# diría que es una cadena literal y su capacidad multi-linea, pero en Objective-c leí por ahí que en torno a una cadena es la manera estándar de indicar cuando inicia y cuando termina.

 

NSNumber

Lo interesante de este tipo de datos (que también es una clase) es que puede almacenar diferentes tipos base, como int, float, etc. Además es mucho más flexible que usar los tipos base ya que podemos hacer sus respectivos Cast incluso a un string. La sintaxis para usarlo es el siguiente:

NSNumber *nuevoNumero = [NSNumber numberWithInt:10];

Aquí viene lo que en un principio vi y dije: “que demonios”, pues como pueden observar para inicializar el objeto *nuevoNumero de la Clase NSNumber lo hacemos asignándole cosas extrañas dentro de los [] , pero no se preocupen esto es más sencillo de lo que parece, recuerden que NSNumber es una Clase, por lo tanto lo que está dentro los corchetes es la llamada al método numberWithInt que recibe como argumento el número 10 y nos regresa un NSNumber (verdad que es más sencillo). En C# sería algo así:

System.Int32 nuevoNumero = System.Int32.ObtenerNumero(“10”)

Donde ObtenerNumero es una método de extensión (alumnos yo haría algo así).

Imprimir en pantalla

Bien aquí es muy similar a como se hace en el lenguaje C, ya que para imprimir es de la siguiente forma

· %i para enteros

· %f para flotantes

· %@ para objetos (NSString)

Para ser el primer post, creo que aquí le dejemos.

 

Saludos.

Technorati Tags: ,
Categorías:Cocos2d, Objective-c

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_X". The conflict occurred in database "DB", table "TableName", column ‘id’.

septiembre 12, 2011 Deja un comentario

Buenas,

Aquí de regreso con el blog. Les platico rápido resulta ser que hay un cambio en la Base de Datos y tengo que agregar unas cuantas tablas, para colocar unos catálogos. Bien ya que tengo estas tablas tengo que agregar unas cuantas relaciones, pero al querer guardar el diagrama SQL Server Management Studio me escupe este mensaje: “The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_X". The conflict occurred in database "DB", table "TableName", column ‘id’.” Como ya lo saben estos chicos de Microsoft no son muy explícitos con sus mensajes.

Así que revisando la relación que se crea, que se ve más o menos así:

 

image

(Para obtener esta cuadro de dialogo, seleccionamos la tabla de la llave foránea y hacemos clic derecho, y seleccionamos Relationships)

Solo tenemos que cambiar la propiedad de “Comprobar datos existentes al crear o habilitar de nuevo.” a un valor NO y listo. Como es un ambiente de desarrollo, eliminar los datos no será problema. Atención en esto que en producción no creo que sea algo bueno.

Con esto se soluciona el mensaje que pone a prueba nuestra paciencia. Espero les ayude.

Saludos.

Technorati Tags: ,,

[Sharepoint 2010] Custom Actions en Sharepoint 2010 dese Visual Studio

enero 3, 2011 2 comentarios

Buenas,

El escenario es el siguiente, necesito colocar un Grupo de acciones dentro de la página de Configuración del Sitio, para dar mantenimiento a unas listas. (limpiar en mi caso). Esto lo podemos hacer, desde la Interface de usuario, pero aquí el objetivo es hacerlo desde nuestra aplicación de SharePoint para que solo despleguemos y esta haga todo el trabajo, además es practico, entre menos configuremos manualmente nuestra aplicación mejor.

Una vez platicado que quiero hacer, les platico como hacerlo:

1.- Tener un Feature.

  • Cuando creamos un proyecto de SharePoint 2010 desde Visual Studio 2010, por default agrega un Feature con el que podemos trabajar, le podemos agregar nombre, descripción etc. Cómo hacemos esto: Abrir Visual Studio, Crear Nuevo Proyecto-> SharePoint 2010->Empty SharePoint Project.

image

2.- Ahora agregamos un ElementManifest a nuestro feature, en el archivo Feature1.Template.xml

image

El XML queda más o menos así:

<Feature xmlns="http://schemas.microsoft.com/sharepoint/" 
        ActivateOnDefault="FALSE"
        AlwaysForceInstall="FALSE"
        AutoActivateInCentralAdmin="FALSE" Hidden="FALSE" Scope="Web"
        Description="Permite Limpiar las Listas"
        Title="Limpiar Listas 11">
    <ElementManifests>
      <ElementManifest Location="Listassss\Elements.xml" />
    </ElementManifests>
</Feature>

 

La parte de Location se refiere al XML que contiene la definición de nuestro Grupo de Acciones, y como lo agregamos de la siguiente manera, clic derecho en nuestra solución->Add->New Item…, y seleccionamos Empty Element, con el nombre que mejor les guste: mis caso Listassss

image

3.- Aquí viene la definición de nuestro Grupo de Acciones, y las acciones mismas. En mi caso solo un link que apunta a mi blog, pero podemos agregar un query string para poder manipular datos de nuestras listas den el evento Load de alguna ASPX que tengamos. El XML se ve así:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomActionGroup Description="Revisar el Blog del desarrollador" 
                     Id="BlogDelNor" ImageUrl="/_layouts/images/medios/agregar.png"
                      Location="Microsoft.SharePoint.SiteSettings" Sequence="10000" Title="My ContentPipeline">
  </CustomActionGroup>
  <CustomAction GroupId="BlogDelNor" Id="CustomFeatureLink"  Location="Microsoft.SharePoint.SiteSettings"
                Sequence="10001"
                Title="My Content Pipeline">
    <UrlAction Url="https://mspnor.wordpress.com" />
  </CustomAction>
</Elements>

Con esto es más que suficiente para agregar un grupo en nuestras Configuraciones del Sitio, algo curioso aquí es que si se dan cuenta agregueen la propiedad Location el valor de Microsoft.SharePoint.SiteSettings porque ahí es donde quiero que se vea este Grupo de Acciones, pero aquí les dejo la documentación del MSDN sobre los diferentes sitios en donde podemos agregarlos: http://msdn.microsoft.com/en-us/library/bb802730%28office.14%29.aspx

Y bien el resultado que obtenemos al hacer esto es el siguiente:

 

image

Es un post rápido y sencillo, pero seguro saca a alguien de un apuro y sino, mínimo me sirve de referencia, porque luego se me olvida.

Saludos.

Etiquetas de Technorati:

Categorías:Ejemplos, Sharepoint, Tips

[TFS] Deshacer cambios de cierto usuario en un workspace diferente

diciembre 14, 2010 Deja un comentario

Buenas,

Aquí rápido un tip de como liberar archivos que estén bloqueados por un usuario que ya no trabaja en nuestra empresa, que se fue y dejo atrapados proyectos o archivos, o que por alguna extraña tenían en una maquina virtual y por eso de la fiestas  o que se yo se les olvido la contraseña del Windows Server y no la pueden recuperar (no digo que me paso a mi, solo digo que puede suceder). Lo que tenemos que hacer es lo siguiente desde el prompt de Visual Studio.

tf undo $/pathArchivoOSolucion /workspace:nombredeWrokspace; domino\usuario /server:nombreServidor/recursive

Y listo, con esto liberamos los archivos a los que ya no tenemos acceso, espero que les sirva.

Saludos.

Etiquetas de Technorati: ,
Categorías:TFS, Tips
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.