[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

[Sharepoint 2010]Error occurred in deployment step ‘Retract Solution’: Cannot start service SPUserCodeV4 on computer

diciembre 1, 2010 1 comentario

Buenas,

image

Aquí rápido un como solucionar este error si es que les ocurre. Como bien lo dice el mensaje al parecer tenemos un servicio detenido así que solo tenemos que iniciarlo, para ello vamos hacemos lo siguiente:

1.- Central Administration -> System Settings -> Manage services on server

2.- Localizamos el servicio de "Microsoft SharePoint “Microsoft SharePoint Foundation Sandboxed Code Service" y lo iniciamos

Listo!!

espero que les sea de utilidad.

Etiquetas de Technorati: ,,
Categorías: Errores, Sharepoint, Tips

2do Concurso Nacional de Diseño Industrial de Genomma Lab Internacional

noviembre 9, 2010 Deja un comentario

Aquí les comparto este concurso para la gente de diseño, si les interesa abajo esta la liga del sitio oficial para mayor información.

concurso_diseño

Genomma Lab Internacional S.A.B. de C.V. convoca a la Creatividad, Innovación, y Originalidad de Estudiantes Universitarios al diseñar un envase para shampoo en tres distintas capacidades. Pon en práctica tus conocimientos, demuéstranos tu imaginación y preséntanos tus propuestas.

Bases del concurso:

  • Participan estudiantes de 18 años en adelante que cursen las carreras de Diseño Industrial, Diseño Gráfico, Arquitectura y carreras afines.
  • La inscripción de proyectos no tiene ningún costo.
  • Las propuestas se recibirán en: Edificio Corporativo Zentrum piso 21, Av. Santa Fe no. 495, Col. Santa Fe Cruz Manca, C.P. 05349, México, D.F.
  • La fecha límite de inscripción es el 12 de noviembre del 2010 a las 17 horas.
  • La participación es de manera individual.
  • El participante acepta al momento de enviar su propuesta la cesión de los derechos patrimoniales de la obra a Genomma Lab Internacional, S.A.B. de C.V.

Liga del concurso http://ht.ly/30qGg

Etiquetas de Technorati: ,,,,
Categorías: .NET

[Sharepoint 2010] La fórmula contiene un error de sintaxis o no se admite.

septiembre 9, 2010 3 comentarios

buenas…

Aquí de nuevo un error de SharePoint que para variar es poco descriptivo. El escenario es el siguiente: El SO esta en Inglés y SharePoint 2010 también pero instale el paquete de lenguaje en Español entonces.

Quiero agregar una formula para un campo calculado, ya saben de Tipo Calculated y la función es de lo más sencilla:

        <Formula>=DATEDIF([ColumnaInicio],[ColumnaFin],"d")</Formula>

Están de acuerdo que es muy sencilla, pero al desplegar mi solución me muestra el siguiente error:

image

Solución

Pues parece que SharePoint también tiene dolores de cabeza con la región y este rollo de los idiomas. Solo basta con escribir la Función en Inglés y en lugar de usar comas “,” usar punto y coma “;”. Entonces la Formula queda de esta manera:

    
    <Formula>=DATEDIF([ColumnaInicio];[ColumnaFin];"d")</Formula

Y con esto queda solucionado el problema.

Notas: Esto es en la definición de un campo desde un XML, y hay que tener en cuenta lo del idioma ya que si todo esta en Inglés debe funcionar correctamente tal y como lo dice el MSDN. Otra es que si su campo en el atributo DisplayName tiene espacios ejemplo “Dia Inicial“ así deben colocarlo en la formula (extrañamente SharePoint toma el nombre de la columna del DisplayName y no del Name ¿qué raro no?

Saludos.

Etiquetas de Technorati:
Categorías: Errores, Sharepoint

The content type with Id [GUID] defined in feature [GUID] was found in the current site collection or in a subsite.

septiembre 9, 2010 Deja un comentario

¿De qué va este error? Se trata de un despliegue puede ser de lo más normal, pero conforme nuestra aplicación de Sharepoint crece con más y más campos se puede volver compleja la administración de tantos campos, tantos ContentType’s y tantas Listas. Para no hacer el cuento largo el error puede ocurrir (como lo es en mi caso) porque tenemos repetido el ContentType.

Solución

Buscar el ContentType en nuestra solución y ver el nombre seguro tenemos otro contentType con ese nombre pero con otro ID. Lo más fácil pero no lo correcto es colocar un Overwrite=«TRUE«
y el problema se «soluciona» pero realmente no se haría algo correcto ya que imaginen que tienen un ContentType con Correo Electrónico con ciertas características y otro con el mismo nombre que describe otra características totalmente diferentes, realmente necesitamos los 2 pero si sobre escribimos lo que sucederá es que tendremos 2 ContentType con el mismo nombre y Visual Studio nos dirá que tenemos este error entonces lo mejor es cambiara el nombre a estos ContentTypes si es que necesitamos los 2, sino es el caso pues habrá que eliminar uno.

 

Espero que les sea de utilidad.

 

Saludos.

Categorías: Errores, Sharepoint

[SharePoint 2010] Poblar datos en la instancia de una lista con datos múltiples (lookupmulti)

agosto 24, 2010 1 comentario

Buenas,

Creo que es el primer post de Sharepoint que escribo :P. Bueno les comento cual es el caso rápido como sabemos nosotros podemos poblar con datos una lista desde la instancia para esto contamos con un tag llamado Data y otro llamado DataSource. Yo ocupo el primero… y la sintaxis es más o menos asi

<?xml version="1.0" encoding="utf-8"?><Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <ListInstance Title="milista"
                OnQuickLaunch="TRUE"
                TemplateType="000000"
                FeatureId="bd6f49e7-68ac-4988-b6ad-eff181bfdd02"
                Url="listas/milista"
                Description="">    
    <Data>
      <Rows>
        <Row>
          <Field Name="Id">1</Field>
          <Field Name="Nombre">NOMBRE1</Field>
        </Row>
      </Rows>
    </Data>
  </ListInstance>
</Elements>

Hasta aquí todo bien, creo que esto lo encuentran en la documentación del MSDN-

http://msdn.microsoft.com/en-us/library/ms478860.aspx

Pero que pasa si quiero mandar múltiples valores por ejemplo en un campo Lookupmulti, bien aquí la solución lo que tenemos que hacer es lo siguiente:

<Data>
  <Rows>
    <Row>
      <Field Name="Id">1</Field>
      <Field Name="Nombre">1;#nombre1;#2;#nombre2</Field>
    </Row>
  </Rows>
</Data>

Solo tenemos que  separarlos con “;#” pero es importante que coloquemos el ID y el VALOR para que esto funcione, recuerden que solo es para campos que aceptan valores múltiples.

Espero que les sirva y sino lo pongo porque luego sirve de referencia para  mi, porque se me olvida 😛

Etiquetas de Technorati: ,
Categorías: Sharepoint, Tips

[Silverlight] Issue al extender algún control, mis controles dentro de este se generan nulos. Silverlight 3 y 4

May 1, 2010 1 comentario

Buenas,

Les platico de que va esto, imaginen que hacen una aplicación en donde tendrán un UserControl contenedor de otros Controles, como si fuera un Grid, StackPanel, etc. pero propio, es decir;  que nosotros lo creamos con estilo, funcionalidad y forma.

Primero creamos nuestro control, agregamos un nuevo UserControl al que llamaremos ContenedorPrincipal con el siguiente código XAML y cs.

XAML.

<Grid>
        <Rectangle Fill="Green" StrokeThickness="0" 
                   RadiusX="5"
                   RadiusY="5"  Margin="0" 
                   Canvas.ZIndex="-1"/>
        <Grid Margin="0">
            <Grid >
                <TextBlock x:Name="mensaje" Text="Mensaje" 
                           TextWrapping="Wrap" 
                           FontWeight="Bold" 
                           Foreground="White" Margin="0,2,0,0"                            
                           TextAlignment="Right" 
                           VerticalAlignment="Top" 
                           HorizontalAlignment="Center"                      >
                </TextBlock>
            </Grid>
            <Grid Margin="0,20,0,0">
                <StackPanel Margin="5,2" x:Name="contenedor" 
                            Canvas.ZIndex="2" />
                <Rectangle StrokeThickness="0" RadiusX="5" 
                           RadiusY="5" Margin="2" 
                           Fill="White" />
            </Grid>
        </Grid>
    </Grid>

Code Behind .cs

public string Texto
       {
           get { return mensaje.Text; }
           set { mensaje.Text = value; }
       }

       public StackPanel ControlHijo
       {
           get 
           {
               return contenedor.Children[0] as StackPanel;
           }
           set
           {
               contenedor.Children.Clear();
               contenedor.Children.Add(value);
           }
       }

Y nuestro control se ve así:

imageYa con el control, pensamos en reutilizarlo y dentro de el colocar todos los controles que necesitemos, de cualquier tipo, veamos como lo usariamos en una pagina xaml. Esto se haría así:

Agregamos la referencia del ensamblado de nuestro proyecto en el XAML:

xmlns:t="clr-namespace:IssueSilverlight"

luego dentro del Grid agregamos el control así:

        
<t:ContenedorPrincipal Texto="Mensaje del Contenedor Principal">
    <t:ContenedorPrincipal.ControlHijo>
        <StackPanel>
            <Button x:Name="botonPrueba" Content="Hola Mundo" 
                    Margin="5"
                        Width="100"/>
        </StackPanel>
    </t:ContenedorPrincipal.ControlHijo>
</t:ContenedorPrincipal>

Hasta este momento todo bien, si al boton que agregamos dentro del stackPanel le agregamos un evento como el Loaded, Click, etc, vean lo que sucede. Hacemos la prueba con el Loaded

private void botonPrueba_Loaded(object sender, RoutedEventArgs e)
{
    botonPrueba.Content = "nuevo mensaje";
}

Vean lo que sucede al correr la aplicación:

image

Me dice que mi botonPrueba no se ha creado y que es nulo :S, alguien me puede decir porque, si se supone que es su mismo evento Loaded. Por un momento pensé que era cosa de como se generan los controles en Silverlight, que primero se crea el Control Padre y por ultimo los hijos, pero NO, esto esta mal.

Ustedes que harían si les pasa esto, seguramente buscar en google, no?,pero que buscarían: “Object referece not set to an instance of an object”, no verdad, la verdad es que no tenemos muchas herramientas para buscar como resolver esto.

Bueno ps aquí mi solución, por si les pasa esto. Sin ser experto en la materia, les puedo decir que al parecer el problema es con el código XAML, al parecer no permite crear instancias de controles dentro de un contenedor como el que creamos, es decir; para el xaml nuestro control botonPrueba realmente no existe, esto al parecer por el x:Name, que aunque no nos marca error sucede. Es más si hacen esto en WPF les marca un error jajaja. “Qué cosas no?”

Entonces mi solución es, agregar al proyecto un archivo de código y crear nuestro control a patin, en puro code behind, claro nuestra clase debe heredar de UserControl e implementar una interface de ISupportInitialize, solo para Silverlight 4 porcierto jaja.

Código de mi control sin archivo .xaml

public class ContenedorCodeBehind : UserControl, ISupportInitialize
{
    private TextBlock mensaje;

    private StackPanel contenedor;

    public void BeginInit()
    {
        Grid gridPrincipal = new Grid();

        //Rectangulo
        Rectangle rectangle = new Rectangle();
        rectangle.Fill = new SolidColorBrush(Colors.Green);            
        rectangle.RadiusX = 5;
        rectangle.RadiusY = 5;
        Canvas.SetZIndex(rectangle, -1);            
        gridPrincipal.Children.Add(rectangle);

        //Grid que deberia Ser DockPanel
        Grid dockPanel = new Grid();

        Grid grid1 = new Grid();

        #region TextBlock

        //TextBlock
        mensaje = new TextBlock();
        mensaje.Text = "Mensaje";
        mensaje.TextWrapping = System.Windows.TextWrapping.Wrap;
        mensaje.FontWeight = FontWeights.Bold;
        mensaje.Foreground = new SolidColorBrush(Colors.White);
        mensaje.Margin = new Thickness(0, 2, 0, 0);
        mensaje.TextAlignment = TextAlignment.Right;
        mensaje.RenderTransformOrigin = new Point(0, 0);
        mensaje.HorizontalAlignment = HorizontalAlignment.Center;
        mensaje.VerticalAlignment = VerticalAlignment.Top;

        #endregion TextBlock

        grid1.Children.Add(mensaje);
        dockPanel.Children.Add(grid1);


        Grid grid2 = new Grid();
        grid2.Margin = new Thickness(0, 20, 0, 0);
        contenedor = new StackPanel();
        contenedor.Margin = new Thickness(5, 2, 5, 2);
        Canvas.SetZIndex(contenedor, 2);
        grid2.Children.Add(contenedor);


        Rectangle rec = new Rectangle();
        rec.StrokeThickness = 0;
        rec.RadiusX = 5;
        rec.RadiusY = 5;
        rec.Margin = new Thickness(2);

        rec.Fill = new SolidColorBrush(Colors.White);            

        grid2.Children.Add(rec);
        dockPanel.Children.Add(grid2);
        gridPrincipal.Children.Add(dockPanel);

        Content = gridPrincipal;
    }

    public void EndInit()
    {
        //throw new NotImplementedException();
    }

    public StackPanel ControlHijo
    {
        get
        {
            return contenedor.Children[0] as StackPanel;
        }

        set
        {
            contenedor.Children.Clear();
            contenedor.Children.Add(value);
        }
    }

    public string Texto
    {
        get
        {
            return this.mensaje.Text;
        }
        set
        {
            this.mensaje.Text = value;
        }
    }
    
    
}

Si se dan cuenta es el mismo control solo que sin el archivo .XAML. Ahora lo agregamos a nuestra pagina como el anterior y comentamos el código del otro control e incluso agregamos el mismo botonPrueba.

<Grid x:Name="LayoutRoot" Background="White">
    <t:ContenedorCodeBehind Texto="Control sin archivo .xaml">
        <t:ContenedorCodeBehind.ControlHijo>
            <StackPanel>
                <Button x:Name="botonPrueba" Content="Hola Mundo"
                        Margin="5" Loaded="botonPrueba_Loaded"
                    Width="100"/>
            </StackPanel>
        </t:ContenedorCodeBehind.ControlHijo>
    </t:ContenedorCodeBehind>
    <!--<t:ContenedorPrincipal Texto="Mensaje del Contenedor Principal">
        <t:ContenedorPrincipal.ControlHijo>
    <StackPanel>
        <Button x:Name="botonPrueba" Content="Hola Mundo" 
                Margin="5" Loaded="botonPrueba_Loaded"
                    Width="100"/>
    </StackPanel>
</t:ContenedorPrincipal.ControlHijo>
    </t:ContenedorPrincipal>-->
</Grid>

Y si ahora ejecutamos la aplicación… Sorpresa!!!! falla de nuevo jajajaja, naaa ya todo funciona correctamente :D, y ya podemos reutilizar nuestro control contenedor. Eso me pasa por querer hacer tantas cosas desde xaml a patín, mejor usar Expression, aunque este error pasa igual si lo usan :P. Para que vena que es verdad un video con los dos controles y el código fuente.

Video.

Proyecto.

image

Que les sea leve el día!!!

Categorías: .NET

Red Bull Street Style World Final 2010 Action Clip

Categorías: .NET

[WPF] Manejo de Temas de Estilos, Resource Dictionary

abril 24, 2010 4 comentarios

Buenas,

Aquí con un post sobre como majear los estilos en una aplicación de WPF. Les platico el escenario, Imaginen que ya terminamos una aplicación que ya funciona y todo, pero queremos que el Layout se vea mejor, ustedes saben eso de la UX (User Experience), entonces pensamos en agregar la opción de que cambie el Estilo de nuestra aplicación (cómo lo que se hace en ASP.NET :P). Bueno ps aquí un pequeño post de como hacer esto.

1.- Creamos una nueva aplicación de WPF, y agregamos este código en la Ventana Principal.

<Grid x:Name="host">
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,96,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
        
        <Menu Height="23" HorizontalAlignment="Left" Margin="12,0,0,0" Name="menu1" VerticalAlignment="Top" Width="80" >
            <MenuItem Header="Diseño" >
                <MenuItem Header="Temas">
                    <MenuItem Header="Azul" Tag="Azul" Click="Selected_Theme" />
                    <MenuItem Header="Rojo" Tag="Rojo" Click="Selected_Theme" />
                    <MenuItem Header="Verde" Tag="Verde" Click="Selected_Theme" />
                </MenuItem>
            </MenuItem>
        </Menu>
    </Grid>

2.- Luego  agregamos una carpeta que se llame “Temas” en donde colocaremos los diccionarios de recursos para nuestros temas. Dentro de esta carpeta vamos a agregar los respectivos diccionarios, en este caso Azul.xaml, Rojo.xaml y Verde.xaml.

Este es el código para recurso.

Azul.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="Azul" TargetType="{x:Type Control}">
        <Setter Property="Background" Value="Blue" />
    </Style>
</ResourceDictionary>

Rojo.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="Rojo" TargetType="{x:Type Control}">
        <Setter Property="Background" Value="Red" />
    </Style>
</ResourceDictionary>

Verde.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
    <Style x:Key="Verde" TargetType="{x:Type Control}">
        <Setter Property="Background" Value="Green" />
    </Style>
    
</ResourceDictionary>

Como se pueden dar cuenta solo estoy cambiando la propiedad Background, eso solo como ejemplo, porque en la practica estos archivos llevan un montón de código que se genera por lo regular con Expression Blend 😀

Los archivos quedan así:

image

Ahora en el evento de Click de los elementos del menú, colocamos el siguiente código:

private void Selected_Theme(object sender, RoutedEventArgs e)
{
    MenuItem menu = sender as MenuItem;
    string tema = menu.Tag as string;            
    AplicaEstilo(tema);
}

Y por ultimo el método de de AplicarEstilo, que tiene este código:

private void AplicaEstilo(string tema)
{

    string uri = string.Format("{0}{1}.xaml", rutaTemas, tema.ToString());

    Collection<ResourceDictionary> stylesDiccionario = new Collection<ResourceDictionary>();

    IEnumerable controles = LogicalTreeHelper.GetChildren(this.host);
    
    ResourceDictionary diccionario = new ResourceDictionary();
    diccionario.Source = new Uri(uri, UriKind.RelativeOrAbsolute);
    Style nuevo = diccionario[tema] as Style;

    
    
    foreach (object c in controles)
    {
        if (c is Control)
        {
            ((Control)c).Style = nuevo;
        }
    }            

}

 

Cabe mencionar, que en el foreach solo aplico a los elementos que heredan de Controls, ya que la propiedad background no aplica en todos los elementos. Pero vaya si ejecutamos la aplicación funciona más o menos así:

image

Aquí el código fuente, que por cierto esta en VS 2010 :p

image

Etiquetas de Technorati: ,,,
Categorías: Ejemplos, WPF

[Humor] En Bones también ven a los Simpson :P

Buenas,

hoy viendo un capitulo de Bones, eh notado algo curioso, que se les ha pasado una radiografía de los Simpson :P, para ser exactos de Homero, imagen que seguramente ya muchos conoce, los invito a que echen un vistazo aquí una imagen

image

El capitulo es el numero 7 de la quinta temporada, llamado “The Dwarf in the Dirt”, Saludos!!

Categorías: Humor

[Silverlight 4] Cómo correr Silverlight 4 en Visual Studio 2010 RC

marzo 5, 2010 3 comentarios

Buenas,

Actualmente trabajo en un proyecto con Silverlight 3, en esta versión no hay soporte para mostrar HTML, porque lo que tengo que hacer una serie de trucos con javascript para poder mostrar el HTML. Como ya sabrán resulta que la versión de Silverlight 4 esta a punto de ser liberada, por lo que hay que hacer pruebas porque seguro cuando salga a producción será en esta versión.

Mi problema es que Silveright 4 solo corre en VS 2010 (según me dijeron), por lo que ya descargue e instale Visual Studio 2010 RC, entonces quise instalar Silverlight 4 para hacer mis pruebas pero resulta que no lo puedo instalar porque VS 2010 ya es RC y Microsoft aun no libera la versión de los tools para el RC. #FAIL.

Aquí un truco de que podemos hacer para hacer pruebas en lo que estos productos se libera.

1. cuando tengamos en pantalla este mensaje:

image 

Antes de que cerremos, nos dirigimos a la unidad principal de nuestra maquina, en este caso la unidad C:\.

2. Abrir el archivo ParameterInfo.xml que se encuentra en la carpeta C:\1eb31413031af402db9ce97a1b69bc, ya que lo abrimos vamos a borrar las líneas 13 a 41.

Este es el texto que se debe borrar:

<BlockIf DisplayText="Visual Studio 2010 Beta 2 or Visual Web Developer Express 2010 Beta 2 that matches the language version of Silverlight Tools 4 must be installed before installation of Silverlight Tools can continue.  Silverlight Tools is available in other languages at &lt;A HREF=&quot;http://go.microsoft.com/fwlink/?LinkId=177432&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=177432&lt;/A&gt;.">
  <Not>
    <Or>
      <Equals LeftHandSide="10.0.21006" BoolWhenNonExistent="false">
        <RegKeyValue Location="HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\Setup\VS\BuildNumber\1033" />
      </Equals>
      <Exists>
        <RegKey Location="HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\Setup\Microsoft Visual Web Developer 2010 Express Beta 2 - enu" />
      </Exists>
    </Or>
  </Not>
</BlockIf>
<BlockIf DisplayText="The Visual Web Developer feature for Visual Studio 2010 Beta 2 must be installed before installation can continue.">
  <Not>
    <Or>
      <And>
        <Exists>
          <RegKey Location="HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\InstalledProducts\Visual Web Developer" />
        </Exists>
        <Exists>
          <RegKey Location="HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\Packages\{349C5850-65DF-11DA-9384-00065B846F21}" />
        </Exists>
      </And>
      <Exists>
        <RegKey Location="HKLM\Software\Microsoft\VWDExpress\10.0\Packages\{349C5850-65DF-11DA-9384-00065B846F21}" />
      </Exists>
    </Or>
  </Not>
</BlockIf>

3. Luego ejecutamos el archivo SPInstaller.exe. Como se pueden dar cuenta en la imagen si se pude instalar aunque dice Beta 2 😛

image

4. Por ultimo vamos a actualizar unos datos en el registro de Windows en la siguiente ruta:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\DesignerPlatforms\Silverlight

y cambiamos el valor de SilverlightHost  de v3.0 a v4.0

Y listo ya podemos trabajar con Silverlight 4 en Visual Studio 2010 RC 😀

image

Espero que les sea de utilidad. Saludos!!!

Etiquetas de Technorati: ,,
Categorías: .NET

[IIS7 -Errores] The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map

enero 27, 2010 1 comentario

De nuevo platicandoles un detalle al momento de publicar un Servicio de WCF dentro de IIS7, sobre Windows 7. Lo publico correctamente pero al escribir la direccion en el navegador me muestra lo siguiente:

image_thumb_1b5ca94b 

Esto al parecer es configuración de nuestro IIS (IIS 7 en mi caso), esto es porque en nuestros handler mappings no está registrado el tipo de archivo que trato de ver en mi caso la extensión es svc. Un Servicio de WCF

image

Para solucionar esto necesitamos registrar todos los mappings básicos en nuestro IIS, esto lo hacemos con una instrucción desde línea de comandos en la siguiente ruta:

"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\

Ya en esta ruta ejecutamos:

ServiceModelReg.exe -r –y

image

Y listo, claro no se les olvide reiniciar su IIS 😀

Technorati Tags: ,,,
Categorías: Errores, IIS 7.0, Tips, WCF

[Tips] The breakpoint will nor currently be hit. No symbols have been loaded fot this document

enero 27, 2010 Deja un comentario

Buenas,

Aquí platicándoles lo que me paso con Visual Studio, que no podía debuguear. Les platico mi escenario tengo una aplicación Web de WCF, ahí tengo un Web Services el cual quiero debuguear, este ya está publicado por lo que intento hacer el atacch de IIS y no me permite, me muestra el siguiente mensaje en el breakpoint.

image

Para solucionarlo solo verifique que mi sitio dentro del IIS estuviera en el Application Pool en classic.

image

Y luego reinicie mi IIS desde línea de comandos con la instrucción iisreset, y listo ya todo funcionó correctamente. 😀

En otra ocasión les platico como hacer el attach, que es muy útil cuando tenemos un servicio publicado y queremos hacer debug 😀

Technorati Tags: ,,

[Windows] Organiza tu Escritorio en 3D con Bump Top

enero 25, 2010 1 comentario

Con todas las caracteristicas que trae windows 7, entre ellas la de mutitouch, aquí una herramienta de terceros que va muy bien con Windows (porque hay que decir que también existe para MAC), y aquí una provadita de lo que pueden hacer

Aqui el sitio oficial para descargarlo 😀

http://bumptop.com/download.php

Technorati Tags: ,,
Categorías: Tools, Windows, Windows 7