domingo, 18 de agosto de 2013

Crear un cursor con un query Dinamico



declare @str nvarchar(1000)
declare @cstr nvarchar(2000)
 declare @id varchar(200)

set @str=N' select a.idProducto from inv_MaestraDeInventario a ' 
set @cstr = 'DECLARE c1 CURSOR FOR ' + @str

exec sp_executesql @cstr 
open c1
FETCH NEXT
FROM c1 INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
print @id
FETCH NEXT
FROM c1 INTO @id
END
CLOSE c1
DEALLOCATE c1

viernes, 26 de abril de 2013

Telerik



Para crear una ventana telerik en runtime:

1-Debemos agregar un radwindowsManager
2-

   RadWindow ventana = new RadWindow();
            ventana.ID = "myVentana";
            ventana.Height =300;
            ventana.Width = 200;

            ventana.ReloadOnShow = true;
            ventana.VisibleOnPageLoad = true;
            ventana.NavigateUrl = "ventana.aspx";
            ventana.DestroyOnClose = true;


            if (RadWindowManager1.Windows.Count>0)// para borrar las ventanas anteriores esto
//le permite una sola ventana
            {
                RadWindowManager1.Windows.Clear();
            }
            RadWindowManager1.DestroyOnClose = true;
            RadWindowManager1.Windows.Add(ventana);


Invocar un ventana Jquery desde radwindowsmanager


1- en un boton colocar este codigo:
 RadWindowManager1.RadAlert("Esto es un menaje", 330, 180, "Aviso", "nulo", "null");// el parametro nulo es una funcion en el archivo JSScript1.js


2- crear un archivo .js llamado JSSCript1 con la siguiente funcion:


function nulo(arg) {
    //  radalert("radalert returned the following result:

" + arg + "

", 350, 250, "Result");
}


3-agregar este archivo a la pagina en el aspx:



       

miércoles, 24 de abril de 2013

User-Defined Table Types


En esta entrada vamos a usar un  UDT para grabar  y actualizar registros de una tabla en SQL SERVER 2008, esto me permitirá solamente enviar un parámetro a un store procedure de tipo UDT con todo los campos basado en una estructura que enviaremos desde C#  o varios registros a la vez.

1-Veremos lo que necesitamos hacer en SQL SERVER, estos script debemos ejecutarlo y previamente debe tener al menos una base de datos ya creada.


--Creando la tabla en SQL SERVER
CREATE TABLE [datos](
[id] [numeric](18, 0) NOT NULL,
[nombre] [nvarchar](50) NULL,
[edad] [numeric](18, 0) NULL,
 CONSTRAINT [PK_datos] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO




/*
Creando el tipo de datos UDF llamado typeDatos  
*/
create type typeDatos as table
(
      id       numeric(18),
      nombre   nvarchar(50),
      edad     numeric(18,2)
)
go

/*
Creando el store procedure para grabar
*/
create procedure  usp_grabar_datos
 @datos   typeDatos readonly
as

insert into datos 
select * from @datos
go 
/*
Creando el store procedure para actualizar
*/
create procedure  usp_actualizar_datos
 @datos   typeDatos readonly
as
declare @id numeric,
@nombre nvarchar(20),
@edad numeric

select @id=id,@nombre=nombre,@edad=edad  from @datos
 update datos set
 edad=@edad,
 nombre=@nombre
 where id=@id
go


/*
Este procedimiento en sumamente util ya que usted puede en su aplicacion web en el datatable tener registros nuevos y existentes y simplemente insertara los nuevos y actualizara los existentes.
*/


alter procedure usp_Insertar_Actualizar_Datos
 @datos   typeDatos readonly
 as
    --Actualiza los registros que ya existe
    UPDATE  datos
    SET nombre = t.nombre,
    edad=t.edad
    FROM dbo.datos d
    JOIN @datos t on t.id = d.id

--Inserta los registros que no estan en la tabla de SQL SERVER
    INSERT INTO  datos
    SELECT  *
    FROM    @datos t
    WHERE    t.id not in(SELECT id FROM dbo.datos)
     
go

2-Luego debemos crear una clase para crear nuestra conexion a la base de datos y dataset. la clase se llamara: clDatos.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;


 public static class clDatos
    {
        public static DataSet dt = new DataSet();
        public static DataRow fila;
        public static DataTable registro;



        public static void iniciar()
        {
            registro = new DataTable("datos");

            registro.Columns.Add("id", typeof(Int32));
            registro.Columns.Add("nombre", typeof(string));
            registro.Columns.Add("edad", typeof(Int32));


        }

        public static void agregar(Int32 id,string nombre, Int32 edad)
        {
            fila = registro.NewRow();
            fila["id"] = id;
            fila["nombre"] = nombre;
            fila["edad"] = edad;
            registro.Rows.Add(fila);

        }

    }

3-Luego de debemos crear una interface en .NET WEB, dentro de un formulario web en el div principal copiar este codigo:

debe crear tres textbox con los nombres de

txtID
txtNombre
txtEdad

         


4-Codigo que lleva la pagina en el archivo .cs:

  SqlConnection cn;
    DataTable registro=new DataTable();
    protected void Page_Load(object sender, EventArgs e)
    {
          cn = new SqlConnection("Data Source=.;Initial Catalog=demo;Persist Security Info=True;User ID=sa;Password=1234");
        if (!IsPostBack)
        {
            cn.Open();
            clDatos.iniciar();

        }
    }

    protected void btnActualizar_Click(object sender, EventArgs e)
    {
        cn.Open();
        SqlCommand cmdGrabar = new SqlCommand("usp_actualizar_datos", cn);
        cmdGrabar.CommandType = CommandType.StoredProcedure;


        SqlParameter tvpParam = cmdGrabar.Parameters.AddWithValue("@datos", clDatos.registro);
        tvpParam.SqlDbType = SqlDbType.Structured;
        cmdGrabar.ExecuteNonQuery();
    }
    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        clDatos.agregar(Convert.ToInt32(txtID.Text), txtNombre.Text, Convert.ToInt32(txtEdad.Text));
    }
    protected void btnGrabar_Click(object sender, EventArgs e)
    {
        cn.Open();
        SqlCommand cmdGrabar = new SqlCommand("usp_grabar_datos", cn);
        cmdGrabar.CommandType = CommandType.StoredProcedure;


        SqlParameter tvpParam = cmdGrabar.Parameters.AddWithValue("@datos", clDatos.registro);
        tvpParam.SqlDbType = SqlDbType.Structured;
        cmdGrabar.ExecuteNonQuery();
    }


viernes, 25 de enero de 2013

Problemas al invocar un proceso en ASP.NET


Actualmente estaba trabajando con una aplicación web la cual tiene un proceso que dura mas de 5 minutos, esto me estaba generando un error  el cual me detenia el proceso, para solucionar esto solo tenemos que aumentar el tiempoo en el IIS de la aplicación  en Request Execution timeout,  explicare a continuación como realizar este cambio.


Debemos ir al IIS y dar clic derecho sobre la aplicación o el directorio virtual


Seleccionamos Edit Configuration en el mismo podemos cambiar cualquier valor


En  la opción  Resquest execution timeout (seconds) : 9000