[SharePoint 2010] Obtener los elementos de una lista y llenar un Combo desde jQuery

Buenas,

Un post rápido, esto me llevo más tiempo de lo planeado y para que no me vuelva a ocurrir dejo el código necesario para hacer esto. La idea principal del código es de llenar un combo con el valor de alguna columna especifica de la lista. Esto se hace en una página personalizada aspx (Application page).

Aquí esta el código:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        ExecuteOrDelayUntilScriptLoaded(getWebUserData, "sp.js");
        function getWebUserData() {
            var context = SP.ClientContext.get_current();
            var list = context.get_web().get_lists().getByTitle('Pozo');

            var oCamlQry = new SP.CamlQuery();
            oCamlQry.set_viewXml('<View><Query/></View>');

            var items = list.getItems(oCamlQry);

            context.load(list);
            context.load(items);
            context.executeQueryAsync(function () {
                var listEnumerator = items.getEnumerator();

                while (listEnumerator.moveNext()) {
                    var title = listEnumerator.get_current().get_item("Nombre")
                    $('#selectPozos').append('<option value="value" selected="selected">' + 
                    title + '</option>');
                }
            },
            function (sender, args) { alert("error in inner request: " + args.get_message()); });
       }
    });
 </script>

Dentro de este código es necesario mandar un Query vacío al método getItems, ya que no de hacer esto manda el error “Unknown Error”. Si tienen alguna duda, no duden en escribir.

[C#] Como leer un archivo Excel con OleDbConnection

Buenas,

Aquí un un post rápido, esto muchas veces lo aplico en el trabajo y aun no se porque no tengo ya un componente. Bueno aquí el código sin más rollo

public class Program
{
    static void Main(string[] args)
    {
        string rutaArchivoExcel = @"rutaArchivoExcel.xls";
        string connString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;
            Data Source={0};Extended Properties=Excel 8.0", rutaArchivoExcel);

        OleDbConnection oledbConn = new OleDbConnection(connString);
        try
        {
            // Open connection
            oledbConn.Open();

            // Create OleDbCommand object and select data from worksheet Sheet1
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM [EMAIL$]", oledbConn);

            OleDbDataReader reader = cmd.ExecuteReader();
            while (reader.Read()) { String folio = reader.GetString(0); }
            reader.Close();

        }
        catch (Exception ex) { throw new Exception(ex.Message); }
        finally {  oledbConn.Close(); }
    }
}

 

Saludos!

@norrojas

[SQL] Procedimientos almacenados – trabajando con Transacciones

Buenas,

Muchas veces, cuando trabajamos con datos y queremos agregar un registro (por ejemplo de un Usuario), tenemos la necesidad de hacer inserción en más de una tabla, normalmente escribimos algo así:

INSERT INTO [Message] ([UserId],[Subject],[Body],[SentDate],[Status])
VALUES(@UserId, @Subject, @body, GETDATE(), 1)

INSERT INTO UserRoles (UserId, [Student])
VALUES(@UserId, 1)

Sin embargo, hacer esto no es la mejor opción, que si ocurre un error dentro del procedimiento almacenado; puede ocurrir que se agregue el registro en la primera tabla pero en la segunda no, esto ocasionará una inconsistencia en nuestra base de datos.

Para solucionar esto hacen su aparición las Transacciones, y esta es su definición (MSDN)

Transacción

Una transacción es una unidad única de trabajo. Si una transacción tiene éxito, todas las modificaciones de los datos realizadas durante la transacción se confirman y se convierten en una parte permanente de la base de datos. Si una transacción encuentra errores y debe cancelarse o revertirse, se borran todas las modificaciones de los datos.

SQL Server funciona en los siguientes tres modos de transacción.

Transacciones de confirmación automática

Cada instrucción individual es una transacción.

Transacciones explícitas

Cada transacción se inicia explícitamente con la instrucción BEGIN TRANSACTION y se termina explícitamente con una instrucción COMMIT o ROLLBACK.

Transacciones implícitas

Se inicia implícitamente una nueva transacción cuando se ha completado la anterior, pero cada transacción se completa explícitamente con una instrucción COMMIT o ROLLBACK.

Transacciones de ámbito de lote

Una transacción implícita o explícita de Transact-SQL que se inicia en una sesión de MARS (conjuntos de resultados activos múltiples), que solo es aplicable a MARS, se convierte en una transacción de ámbito de lote. Si no se confirma o revierte una transacción de ámbito de lote cuando se completa el lote, SQL Server la revierte automáticamente.

Una ves que sabemos esto, vamos aplicarlo a un procedimiento.

Primero la hay que saber la estructura de un Procedimiento almacenado, que es más o menos así:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> 
    -- Add the parameters for the stored procedure here
    <@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
    <@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insertar el bloque de instruccíones a ejecutra
    SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO

Y la estructura de una transacción es esta:

Begin Tran NombreTransaccion--Inicio de la transacción con su nombre Tadd o el que elijas.

    /*Bloque de instrucciones a ejecutar en la Transacción
    ---------------------------------------
    ---------------------------------------*/

Commit Tran NombreTransaccion--Confirmación de la transacción.

Rollback Tran NombreTransaccion--Reversión de la transacción.

El procedimiento completo contiene este código:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Norberto Rojas Reyes
-- Create date: 14 de Febrero de 2013
-- Description:    Se encarga de realizar un registro de un  nuevo usuario
-- =============================================
CREATE PROCEDURE usp_AddNewUsaurio
    -- Add the parameters for the stored procedure here
    @userId uniqueidentifier,
    @clientId uniqueidentifier,
    @roleId int,
    @firstName nvarchar(75),
    @lastName nvarchar(75),
    @loginName nvarchar(50),
    @emailAddress nvarchar(50),
    @passwordHash nvarchar(100),
    @passwordSalt nvarchar(10),
    @securityQuestionId uniqueidentifier,
    @answerHash nvarchar(100),
    @answerSalt nvarchar(10),
    @countryId int,
    @zipCode int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    Begin Tran TransactionAddNewUser

    Begin Try

        INSERT INTO [User]([UserId], [ClientId],[Role],
                            EmailAddress,[FirstName],
                            [LastName],[LoginName],[PasswordHash],[PasswordSalt],
                            [SecurityQuestionId],[SecurityAnswerHash],[SecurityAnswerSalt],
                            [CountryId],[PostalCode],RequirePasswordChange,CreatedOn)
                    VALUES(@userId, @clientId,@roleId,
                            @emailAddress,@firstName,
                            @lastName,@loginName,@passwordHash,@passwordSalt,
                            @securityQuestionId,@answerHash,@answerSalt,
                            @countryId,@zipCode,0,GETDATE())

        INSERT INTO UserRoles (UserId, [Student]) VALUES(@userId, 1)
        COMMIT TRAN TransactionAddNewUser
    End try
    Begin Catch
        Rollback TRAN TransactionAddNewUser
    End Catch
END
GO

 

Con esto tenemos, nuestro procedimiento listo para usarse.

Saludos!

@norrojas

[TFS] Cambiar la ruta de mapeo de un proyecto

Buenas,

Cuando mapeamos un proyecto del TFS en nuestra maquina y lo agregamos a “Mis documentos” o un ruta que de por si ya es muy grande, podemos encontrarnos con este error

image

Y esto claro se debe a que Windows tiene un limite para las rutas de los archivos, no se exactamente cual es ese limite  ¡pero vaya!… ya no podemos agregar un archivo, folder o proyecto con cierto número de caracteres en el nombre. Cuando nuestro proyecto no esta en el TFS, esto lo solucionamos moviendo el proyecto a raíz de la unidad “C:\” y listo.

Pues bien, pero como no es mi caso aquí una guía rápida de como cambiar el mapeo de un proyecto.

Esto se realiza, administrando los Workspace que tenemos, para esto seleccionamos la opción en File –>Source Control –> Workspaces…, y seleccionamos la opción de editar.

image

Se muestra la ruta actual, y ahora seleccionamos la ruta a donde queremos cambiar el proyecto. Al terminar Visual Studio nos muestra una alerta indicando los cambios y preguntando si queremos actualizar.

image

Listo! es una configuración sencilla y espero que les ayude.

 

Saludos @norrojas.

[Windows Phone] Prepara un ambiente de desarrollo para Windows Phone–WP8 en VMWare

Buenas,

Es muy común, que hoy en día trabajemos con diferentes plataformas, por lo que tener diferentes ambientes de desarrollo en una sola maquina resulta más que complicado. Por esta razón en este post vamos a revisar los pasos para preparar una maquina virtual con Windows 8 X64 y el SDK de Windows Phone 8.

Comenzamos…!

1.- Esta virtualización la vamos a realizar con VMWare, con las siguientes características

image

2.- Vamos a crear un nueva maquina virtual, con la opción de personalizar la creación de la maquina.

image

3.- Seleccionamos la opción Workstation 9.0, en la opción de Hardware compatibility.

image

4.- Seleccionamos la opción con la que vamos a instalar el sistema operativo, que en mi caso es con el ISO.

image

5.- Agregamos un nombre de usuario, contraseña y la clave del producto, para después agregar nombre a la maquina virtual y la ubicación.

image

6.- Configuramos el CPU.

image

7.- Configuramos la memoria RAM, que en este caso es de 4GB (Recomendado).

image

8.- Creamos un nuevo disco virtual, y en tipo de disco seleccionamos SCSI. Sobre el espacio es recomendable un espacio en disco duro de 60 GB, y mantener la maquina en un solo archivo.

image

9.- Especificamos el nombre del disco duro y terminamos con la creación de la maquina virtual. Antes de arrancar la maquina virtual, es necesario editar la configuración del hardware, en este caso del procesador,  es este caso la opción “Virtualize Intel VT x/EPT or AMD-V/RVI”.

image

10.- En este punto tenemos que hacer cierta configuración en el archivo vmx, para esto vamos a ubicar el archivo y abrir con el bloc de notas y agregue la siguiente línea hypervisor.cpuid.v0 = ”FALSE”.

image

11.- Ahora iniciamos la maquina, e instalamos el sistema operativo de Windows 8. Una vez que termino la instalación vamos activar la característica de Hyper-V.

image

12.- Ahora instalamos el SDK de Windows Phone 8.

image

image

13.- Por ultimo instalamos el Visual Studio 2012, para eso hay que registrarnos (en caso de tener ya el Visual Studio 2012 instalado, omitimos este paso).

image

Listo!, ya tenemos preparado nuestro ambiente de desarrollo para Windows Phone 8 Guiño.

Ahora hacemos una prueba para que veamos que todo funciona. Podemos seleccionar la versión:

image

Listo!

image

Saludos @norrojas

[How to] Crear un servicio de Windows

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: ,,,

[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.

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

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: ,

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

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: ,,