lunes, 5 de octubre de 2015

Recorrer Tabla SQL con un cursor y actualizar columna Primary Key

Si estas buscando algo como el  SqlDataReader  en SQL y un while (reader.read()) este es el equivalente en SQL Server.
Para recorrer una tabla  y actualizar los valores de una columna  utilizando un cursor. En este caso numeré una columna que necesitaba fuera la primary key de 1 en  1

declare @filas int,@idPais int,@idEstado int,@idCiudad int,@idCodigoPostal int
declare @contador int
set @contador=1;
DECLARE cCursor CURSOR
FOR
     SELECT idPais,idEstado,idCiudad,idCodigoPostal from CodigosPostales 
     OPEN cCursor;
FETCH cCursor INTO @idPais,@idEstado,@idCiudad,@idCodigoPostal
WHILE (@@FETCH_STATUS = 0)
BEGIN
Update CodigosPostales set ID=@contador  where idPais=@idPais AND idEstado=@idEstado AND idCiudad=@idCiudad AND idCodigoPostal=@idCodigoPostal
set @contador=@contador+1;
FETCH cCursor INTO @idPais,@idEstado,@idCiudad,@idCodigoPostal
END
CLOSE cCursor;
DEALLOCATE cCursor;








domingo, 20 de septiembre de 2015

MVC Control with read/write actions and views, using Entity Framework (Solución con la base de datos)

     Recientemente comenzé a estudiar MVC y ahora que llegué al capítulos de la base datos Azure  y a probarla con la creación de Controles tuve muchos problemas como los describo a continuación.

Primero intenté  obtener una cuenta de Windows Azure, y Microsoft no me permitió en todo mi  día libre obtener acceso a la base de datos de prueba.


Cuando intenté creando la base de datos  "SistemaPruebas" en mi SQL Server 2014, voy a intento crear el  control  de el  siguiente modo

y Me lanza un error "mvc scaffolding does not support entity framework 6 or later" y supuse que era por la base de datos. Pero fui al internet e investigué y pense que como decian poniendo el  framework 5 se solucionaría el problema.
Pues lo instalé por la Package Manager Console  y me lanzaba un error de que no  reconocía el termino  "provider" y  tome como referencia un proyecto con una base de datos .mdf , me base en un proyecto  que si me funciona e hice estos cambios al web.config del root

<add name="SistemaPruebas" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\SistemaPruebas.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
    <add name="ApplicationServices" connectionString="Data Source=(LocalDB)\v11.0;Integrated Security=True;AttachDBFilename=|DataDirectory|\aspnetdb.mdf" providerName="System.Data.SqlClient" />

Luego me lanzo este error


y fuí y comentarizé la siguiente línea en web.config

 <!--<providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>-->

No olviden hacer Build cada vez que hagan cambios al web.config

y vuelvan a intentar crear el control
finalmente el  resultado  es maravilloso
Crea el control con sus metodos

public class PhotoController : Controller
    {
        private PhotoSharingContext db = new PhotoSharingContext();

        //
        // GET: /Photo/

        public ActionResult Index()
        {
            return View(db.Photos.ToList());
        }

        //
        // GET: /Photo/Details/5

        public ActionResult Details(int id = 0)
        {
            Photo photo = db.Photos.Find(id);
            if (photo == null)
            {
                return HttpNotFound();
            }
            return View(photo);
        }

        //
        // GET: /Photo/Create

        public ActionResult Create()
        {
            return View();
        }

        //
        // POST: /Photo/Create

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Photo photo)
        {
            if (ModelState.IsValid)
            {
                db.Photos.Add(photo);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(photo);
        }

        //
        // GET: /Photo/Edit/5

        public ActionResult Edit(int id = 0)
        {
            Photo photo = db.Photos.Find(id);
            if (photo == null)
            {
                return HttpNotFound();
            }
            return View(photo);
        }

        //
        // POST: /Photo/Edit/5

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Photo photo)
        {
            if (ModelState.IsValid)
            {
                db.Entry(photo).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(photo);
        }

        //
        // GET: /Photo/Delete/5

        public ActionResult Delete(int id = 0)
        {
            Photo photo = db.Photos.Find(id);
            if (photo == null)
            {
                return HttpNotFound();
            }
            return View(photo);
        }

        //
        // POST: /Photo/Delete/5

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Photo photo = db.Photos.Find(id);
            db.Photos.Remove(photo);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }

y 5 vistas  de  la carpeta View/Photo
Create.cshtml
Delete.cshtml
Details.cshtml
Edit.cshtml
Index.cshtml

Todo el  código Html <.< todo  todo lo crea.

Esta fué mi reseña creando  controles con scaffoling y entityframework
Saludos


sábado, 22 de agosto de 2015

Programación T SQL para llenar o actualizar una tabla

Me vi en la necesidad de agregar todos los productos en  todos los almacenes para poder realizar mis pruebas del  sistema de administración. Programé el siguiente método. que tardó 13 segundos  la primera vez y 7 la segunda vez (cuando ya existían todas las filas)
Lo que hace es buscar por cada producto (5520)  si  éste maneja inventario y si  es así agrega  a cada almacén (23 en total) la cantidad de 500 productos en  existencia.

DECLARE @idProducto char(5)='1';
DECLARE @idAlmacen char(2)='1';
DECLARE @inventario bit;

BEGIN TRY
WHILE  CAST(@idProducto as int)<5520
BEGIN
WHILE  CAST(@idAlmacen as int)<=23
BEGIN
Select @inventario=CAST((Select Inventario from AdmProductos where idProducto=@idProducto) as bit)   
if @inventario=1
BEGIN
IF EXISTS (Select * from AdmProductosAlmacenes where idAlmacen=@idAlmacen AND idProducto=@idProducto)
Update AdmProductosAlmacenes set Entradas=0,Salidas=0,Existencia=500 where idAlmacen=@idAlmacen AND idProducto=@idProducto
        ELSE
Insert into AdmProductosAlmacenes values (@idProducto,@idAlmacen,0,0,0,0,500);
END
else 
print('el producto #'+@idProducto+' no maneja inventario');
select @idAlmacen=(CAST(@idAlmacen as int)+1)

END
   set @idAlmacen='1';
   select @idProducto=(CAST(@idProducto as int)+1)
   print('Producto #'+@idProducto);
END
END TRY
BEGIN CATCH
     print(ERROR_MESSAGE());
END CATCH

sábado, 8 de agosto de 2015

Como hacerle una consulta a otra consulta? Subqueries SQL Server

En ocasiones realizamos consultas que quedan casi perfectas, o nuestro poco conocimiento nos permite arreglar el  resultado sin enredarnos más. Bueno pues para eso usen las consultas sobre consultas
Observen la siguiente imagen fué creada con el siguiente código:

SELECT DISTINCT venta.idVenta, producto.Producto, venta.Precio, 
(SELECT SUM(Cantidad) AS Expr1 FROM Abonos WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS TotalAbonado, 
(SELECT venta.Precio - SUM(Cantidad) AS Expr1 
FROM Abonos AS Abonos_1 
WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS Saldo, 
CONVERT (varchar(10), venta.FechaVenta, 103) AS Fecha FROM Ventas AS venta 
LEFT OUTER JOIN Abonos AS abono ON abono.idCliente = venta.idCliente AND abono.idVenta = venta.idVenta 
LEFT OUTER JOIN Productos AS producto ON producto.idProducto = venta.idProducto 
WHERE venta.idCliente = 1 AND venta.Pagado = 'False' AND venta.Cancelado = 'False'
No importa si no entienden la consulta.. se les va a presentar el caso.
Pero que es eso de null¡ cuando no se encuentran pagos de un artículo las columnas total abonado  y Saldo me aparecen en  blanco
Pues para eso le voy a hacer otra consulta a esta tabla y con el  uso  de la sentencia isnull asignaré valores ami antojo, quedando de la siguiente forma:

Select idVenta,Producto,Precio,isnull(TotalAbonado,0) TotalAbonado,isnull(Saldo,Precio) Saldo,Fecha from  (Select tu primera consulta) as #Temp
o así para traer todas las columnas
Select  * from  (Select tu primera consulta) as #Temp

y si no  entendiste algo  aquí está la consulta completa
Select * from  (SELECT DISTINCT venta.idVenta, producto.Producto, venta.Precio, 
(SELECT SUM(Cantidad) AS Expr1 FROM Abonos WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS TotalAbonado, 
(SELECT venta.Precio - SUM(Cantidad) AS Expr1 
FROM Abonos AS Abonos_1 
WHERE (idCliente = abono.idCliente) AND (idVenta = abono.idVenta)) AS Saldo, 
CONVERT (varchar(10), venta.FechaVenta, 103) AS Fecha FROM Ventas AS venta 
LEFT OUTER JOIN Abonos AS abono ON abono.idCliente = venta.idCliente AND abono.idVenta = venta.idVenta 
LEFT OUTER JOIN Productos AS producto ON producto.idProducto = venta.idProducto 
WHERE venta.idCliente = 1 AND venta.Pagado = 'False' AND venta.Cancelado = 'False' ) as #Temp

y el resultado visual,donde la venta 4 no  tiene abonos y muetra valores en las columnas que antes eran null


Sé que lo  vas a necesitar ;)


sábado, 25 de julio de 2015

Ejecutar función de Javascript cada cierto tiempo por cierto tiempo

Esta vez necesitaba programar el  autoguardado  de una página  y me metí con los 3 eventos del tiempo de javascript. Investigando  y cometiendo muchos errores dí  finalmente con  esta página
https://www.pedroventura.com/javascript/funciones-javascript-setinterval-clearinterval-settimeout-2/
Donde nos  explican los 3 eventos

FUNCIONES JAVASCRIPT – SETINTERVAL() CLEARINTERVAL() SETTIMEOUT() – 2

Mi código  quedó así
Solamente para javascript,  este es un evento  invocado  desde servidor

 var repeticion;
    function ParpadeoGuardadoAutomatico() {
        repeticion = window.setInterval("Parpadeo()", 500);
        window.setTimeout("clearTimeout(repeticion);", 4100);
    }

    function Parpadeo() {
        if ((document.getElementById('imgAutoGuardado').style.display == 'block'))
            document.getElementById('imgAutoGuardado').style.display = 'none';
        else
            document.getElementById('imgAutoGuardado').style.display = 'block';
    }


Lo que hace es cada vez que mi Timer  se activa hace sus procesos en el servidor y llama al evento 
ParpadeoGuardadoAutomatico();
Este evento  crea la variable repetición que dice que se ejecute el  cambio  de visibilidad de la imagen cada medio  segundo, esto  sucedería infinitamente si no  destruyera la variable con clearTimeout(repeticion);, pero  además le tuve que indicar en que momento  se va a  detener el parpadeo  y le puse a los 4 segundos,  apenas aparece y desaparece 4 veces.


Para los que no saben que es el  Timer de asp,net
<div style='text-align:right; position:absolute; right:0px; top:0px;'>
    <img id="imgAutoGuardado" style="display:block;" src="../../Imagenes/Iconos/AutoGuardado.fw.png" />
        <asp:UpdatePanel ID="UpdatePanel16" runat="server">
        <ContentTemplate>
        <asp:Timer ID="TimerAutoGuardado" Interval="10000" runat="server" ontick="TimerAutoGuardado_Tick"></asp:Timer>
        <asp:HiddenField ID="HiddenContadorGuardado"  Value="0" Visible="true" runat="server" />
        </ContentTemplate>
        <Triggers>
        <asp:AsyncPostBackTrigger ControlID="TimerAutoGuardado" EventName="Tick" />
        </Triggers>
        </asp:UpdatePanel>
    </div>






lunes, 20 de julio de 2015

Visual Studio Lento al correr

En el web config..
<compilation debug="true"  optimizeCompilations="true" targetFramework="4.0">

En la barra de menu
  Build/Debug/Delete All Break points

martes, 7 de julio de 2015

Concatenar columnas basándose en sentencia case

Concatenar columnas  basándose en condiciones
-Distintos valores si es nullo o no
-Espacios al final
-Unir columnas generadas con sentencia case

Select RTRIM(paciente.Nombre)+' '+RTRIM(paciente.Ap_Paterno)+' '+ RTRIM(paciente.Ap_Materno) Paciente,
paciente.Sexo,CAST((DATEDIFF(DAY,paciente.Fecha_Nacimiento,GETDATE())/365)as CHAR(15))+' años'  Edad,
CASE WHEN (cie10Urgencias1.Diagnostico IS NULL) THEN '' ELSE cie10Urgencias1.Diagnostico+' ['+cie10Urgencias1.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Urgencias2.Diagnostico IS NULL) THEN '' ELSE cie10Urgencias2.Diagnostico+' ['+cie10Urgencias2.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Urgencias3.Diagnostico IS NULL) THEN '' ELSE cie10Urgencias3.Diagnostico+' ['+cie10Urgencias3.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Urgencias4.Diagnostico IS NULL) THEN '' ELSE cie10Urgencias4.Diagnostico+' ['+cie10Urgencias4.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Urgencias5.Diagnostico IS NULL) THEN '' ELSE cie10Urgencias5.Diagnostico+' ['+cie10Urgencias5.idDiagnostico+']'+CHAR(10) END AS Cie10Urgencias,
CASE WHEN (cie10Hospital1.Diagnostico IS NULL) THEN '' ELSE cie10Hospital1.Diagnostico+' ['+cie10Hospital1.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Hospital2.Diagnostico IS NULL) THEN '' ELSE cie10Hospital2.Diagnostico+' ['+cie10Hospital2.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Hospital3.Diagnostico IS NULL) THEN '' ELSE cie10Hospital3.Diagnostico+' ['+cie10Hospital3.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Hospital4.Diagnostico IS NULL) THEN '' ELSE cie10Hospital4.Diagnostico+' ['+cie10Hospital4.idDiagnostico+']'+CHAR(10) END +
CASE WHEN (cie10Hospital5.Diagnostico IS NULL) THEN '' ELSE cie10Hospital5.Diagnostico+' ['+cie10Hospital5.idDiagnostico+']'+CHAR(10) END AS Cie10Hospital,
RTRIM(usuario.Nombre)+' '+RTRIM(usuario.Ap_Paterno)+' '+ RTRIM(usuario.Ap_Materno) Médico
from AdmIngresosPacientes as ingresos
LEFT JOIN ExpPacientes as paciente on paciente.idPaciente=ingresos.idPaciente
LEFT JOIN ExpNotaIngresoUrgencias as notaUrgencias on notaUrgencias.idPaciente=ingresos.idPaciente AND notaUrgencias.idIngreso=ingresos.idIngreso
LEFT JOIN ExpNotaIngresoHospital as notahospital on notahospital.idPaciente=ingresos.idPaciente AND notahospital.idIngreso=ingresos.idIngreso
LEFT JOIN ExpUsuarios as usuario on usuario.idUsuario=ingresos.Doctor
LEFT JOIN ExpCie10_Diagnosticos as cie10Urgencias1 on cie10Urgencias1.idDiagnostico=notaUrgencias.DiagnosticoCie10_1
LEFT JOIN ExpCie10_Diagnosticos as cie10Urgencias2 on cie10Urgencias2.idDiagnostico=notaUrgencias.DiagnosticoCie10_2
LEFT JOIN ExpCie10_Diagnosticos as cie10Urgencias3 on cie10Urgencias3.idDiagnostico=notaUrgencias.DiagnosticoCie10_3
LEFT JOIN ExpCie10_Diagnosticos as cie10Urgencias4 on cie10Urgencias4.idDiagnostico=notaUrgencias.DiagnosticoCie10_4
LEFT JOIN ExpCie10_Diagnosticos as cie10Urgencias5 on cie10Urgencias5.idDiagnostico=notaUrgencias.DiagnosticoCie10_5
LEFT JOIN ExpCie10_Diagnosticos as cie10Hospital1 on cie10Hospital1.idDiagnostico=notahospital.DiagnosticoCie10_1
LEFT JOIN ExpCie10_Diagnosticos as cie10Hospital2 on cie10Hospital2.idDiagnostico=notahospital.DiagnosticoCie10_2
LEFT JOIN ExpCie10_Diagnosticos as cie10Hospital3 on cie10Hospital3.idDiagnostico=notahospital.DiagnosticoCie10_3
LEFT JOIN ExpCie10_Diagnosticos as cie10Hospital4 on cie10Hospital4.idDiagnostico=notahospital.DiagnosticoCie10_4
LEFT JOIN ExpCie10_Diagnosticos as cie10Hospital5 on cie10Hospital5.idDiagnostico=notahospital.DiagnosticoCie10_5