martes, 29 de diciembre de 2015

Caché de ASP.NET para guardar páginas con dependencia a SQL Server

Este tutorial hace que la página sólo se actualize cuando  hay cambios en la tabla en la base de datos a la que se le indicó su  dependencia. Pero tuve problema con el uso  de botones y  para cumplir con mi  objetivo  de guardar tablas en  caché y utilizarla en distintintas páginas.

Utilizé este Tutorial de Microsoft
Utilizé SQL Server 2008

Abrí la Consola
Apliqué el comando  (que es mi  versión actual de .NET Framework)
C:\Windows\Microsoft.NET\Framework\v4.0.30319

Después lanzé el siguiente comando
aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d Northwind -et -t Employees
Traducido yo lo usé así
aspnet_regsql.exe -S DESARROLLOCHSJ -U SA -P chsj.2014 -ed -d DB_CHSJ -et -t ConfiguracionPorPagina

Después creé mi cadena de conexión a SQL Server
Creé una página donde arrastré un control GridView






jueves, 10 de diciembre de 2015

Stored Procedure con parámetro tabla

Me vi en la necesidad de enviar  un parámetro  tipo tabla que contendría una lista de ID´ seleccionador por el  usuario desde la interfaz, y  para eso a programar desde  C# enviando la tabla. Encontré muchos tutoriales pero no me quedaba claro.

De esta  página obtuve el conocimiento principal.

En primer lugar  crear  'El tipo tabla'
Yo lo veo algo  así como plantillas que podremos usar muy precisamente acorde a sus 
tipos de columnas. Y como lo que quiero  es enviar una lista con los IDs seleccionados
Mi tipo de tabla solo contiene una columna int
CREATE TYPE IDS_TableType AS TABLE 
( ID INT );

Después crear el procedimiento  almacenado utilizando el tipo de tabla
recién declarado  'IDS_TableType'.

CREATE PROCEDURE SP_ReporteAgrupadoMedicos
    @TablaInterfaz IDS_TableType READONLY,
    @FechaInicio char(10),
    @FechaFin  char(10)
    AS 
    BEGIN
    SELECT  RTRIM(paciente.Nombre) + ' ' + RTRIM(paciente.Ap_Paterno) + ' ' + RTRIM(paciente.Ap_Materno) AS Paciente,
   CAST((DATEDIFF(DAY,paciente.Fecha_Nacimiento,GETDATE())/365) as CHAR(3))+' años' as Edad, 
   Procedencia=(
   case 
   when i.TipoIngreso=0 then tipoIngreso.Item
   when i.TipoIngreso=1 then 'Empresa en  convenio '+convenio.Empresa
   when i.TipoIngreso=2 then tipoIngreso.Item
   when i.TipoIngreso=3 then tipoIngreso.Item
   when i.TipoIngreso=4 then tipoIngreso.Item
   when i.TipoIngreso=5 then tipoIngreso.Item
   END), 
   dbo.FN_DiagnosticosCie10(i.idPaciente,i.idIngreso) Diagnostico,
   i.Doctor idDoctor,RTRIM(usuario.Nombre)+SPACE(1)+RTRIM(usuario.Ap_Paterno)+SPACE(1)+ RTRIM(usuario.Ap_Materno) Medico
   FROM  dbo.AdmIngresosPacientes AS i 
      LEFT JOIN dbo.ExpPacientes AS paciente ON i.idPaciente = paciente.idPaciente 
      LEFT JOIN AdmListasDesplegables tipoIngreso on tipoIngreso.id=i.TipoIngreso AND tipoIngreso.NombreLista='TipoIngreso'
      LEFT JOIN ExpEmpresasConvenios  convenio on convenio.id=i.EmpresaConvenio
      LEFT JOIN ExpUsuarios as usuario on usuario.idUsuario=i.Doctor
   where   i.FechaIngreso between +@FechaInicio+' 00:00:00' AND @FechaFin+' 23:59:59' 
   AND  Doctor IN (select id from @TablaInterfaz);
     END

Lo que ven es la cláusula  IN  mas info  Aquí
Hasta aquí el procedimiento  creado
-------------------------------------
Ahora para acceder a el  desde SQL Server, creamo una  variable tabla del tipo IDS_TableType 
que hicimos en el primer paso. Le cargamos datos con Insert  y por último 
mando llamar mi procedimiento almacenado enviando la tabla @LocationTVP 
DECLARE @LocationTVP 
AS IDS_TableType;
INSERT INTO @LocationTVP (ID)
    values 
    (1),(4),(58),(175),(176);    

EXEC SP_ReporteAgrupadoMedicos @LocationTVP,'10-12-2015','10-12-2015';
---------------------------------------------------------------
Y el  código para hacer lo mismo  desde C#. Yo estoy obteniendo de
una lista de CheckBoxes los elementos seleccionador y creando la tabla
addedCategories . Lo otro ya lo conocen y el DataTable dt  es
el  resultado que pueden usar para llenar GridViews.
 DataTable Procedimiento()
        {
            DataTable addedCategories = new DataTable();
            addedCategories.Columns.Add("Id");
            DataRow row;

                foreach (ListItem item in chkListaMedicos.Items)
                {
                    if (item.Selected)
                    {
                        row = addedCategories.NewRow();
                        row[0] = item.Value;
                        addedCategories.Rows.Add(row);
                    }
                }

            
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter("SP_ReporteAgrupadoMedicos",con.CON);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            da.SelectCommand.Parameters.Add("@TablaInterfaz", SqlDbType.Structured).Value=addedCategories;
            da.SelectCommand.Parameters.Add("@FechaInicio", SqlDbType.Char).Value = txtFechaInicio.Text;
            da.SelectCommand.Parameters.Add("@FechaFin", SqlDbType.Char).Value = txtFechaFin.Text;
            da.Fill(dt);
            return dt;
        }















miércoles, 9 de diciembre de 2015

Validar límite de caracteres en TextArea

Programando en ASP.NET me  encontré  con el problema de los TextBox  Multiline o TEXTAREA de html. Bueno el  detalle  está en que  Visual Studio (2010) no me renderiza el atributto maxlength del  control  y si el MaxLength  (el de servidor) no lo  respeta.  Y  entonces diseñé le  siguiente script  que consta de una caja de texto una etiqueta y el  evento  keydown de JavaScript

<asp:TextBox ID="txtDiagnosticoPersonal"   TextMode="MultiLine" Height="40px" onkeydown="onMaxLenght(event,20,this,'lblTotal1');" runat="server" Width="100%"></asp:TextBox>
<asp:Label ID="lblTotal1" runat="server" Text="0"></asp:Label>




function onMaxLenght2(e, numero, caja, etiqueta) {
    var keynum = window.event ? window.event.keyCode : e.which;
    if (keynum != 8)
        total = document.getElementById(caja.id).value.length + 1;
    else
        total = document.getElementById(caja.id).value.length - 1;

    if (total > numero && keynum != 8) {
        event.returnValue = false; 
    }
    else document.getElementById(etiqueta).innerText = (numero - total);
    document.getElementById(etiqueta).style.color = (total >= numero) ? 'red' : 'black';
    
    if (total > (numero + 1)) { /*Si  el  usuario pegó texto con Ctrl+V*/
        var texto = document.getElementById(caja.id).value;
        document.getElementById(caja.id).value = texto.substring(0, (numero - 1));
    }
}

Donde  20  es el número máximo de caracteres que aceptará la caja de texto y lblTotal la etiqueta que mostrará el número de caracteres restantes. La etiqueta indica cuantos caracteres se pueden aún capturar y cuando  se terminan aparece un cero en  rojo. Este script  también resta cuando se captura la tecla retroceso.
onkeydown="onMaxLenght(event,20,this,'lblTotal1');"





Este script  fué probado en Google Chrome







miércoles, 2 de diciembre de 2015

Cambiar Formato de fecha a DateTimePicker de Jquery


Depués de  intentar muchas cosas...

$(function () {
            $("#ContentPlaceHolder2_txtFechaProxCi").datepicker({ dateFormat: 'dd-mm-yy' }).bind("change", function () {
            })
        });

martes, 1 de diciembre de 2015

MaskedEditValidator de AJAX, detiene el funcionamiento de mi página

Tenía horas revisando los   errores de consola, hice dos páginas casi  idénticas y después de mucho pensar quite el  código del Masked edit Validator de AJAX. Ahora la página funciona correctamente, lo más difícil  de esto  es que los errores que me mandaba la consola del  navegador no  tienen  que ver en  absoluto con el problema pues  ahora que la página funciona correctamente sigue apareciendo el mismo  error.
  
<ajaxToolkit:MaskedEditValidator ID="MaskedEditValidator3" runat="server"
             ControlExtender="MaskedEditExtender3"
             ControlToValidate="TextBox3"
             IsValidEmpty="False"
             EmptyValueMessage="La hora es necesaria"
            InvalidValueMessage="Capture la hora"
             Display="Dynamic"
             TooltipMessage="Hora de la próxima cita"
             EmptyValueBlurredText="*"
             InvalidValueBlurredMessage="Incorrecto"/>

miércoles, 25 de noviembre de 2015

Mis notas de consulta

Diseño Web
http://codepen.io/juanbrujo/details/yGpAK/

Libro Jquery
https://github.com/leandono/librojquery

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




viernes, 20 de marzo de 2015

Tablas de mutiplicar con SQL Server

Este es sencillo ejemplo de como  usar el  ciclo  while
declare @x int=1
while @x<=10
begin
print @x;
set @x=@x+1
end


Este es un ejemplo de como usar los while anidados
Usando ciclos while anidados para imprimir las tablas de multiplicar en sql server,

declare @i int=1
while @i<=10
begin
declare @x int=1
while @x<=10
begin
print Cast(@i as nchar(2))+ ' * '+Cast(@x as nchar(3))+' ='+Cast(@i*@x as nchar(3));
set @x=@x+1
end
set @x=0
set @i=@i+1
end


sábado, 21 de febrero de 2015

Validar entrada de numeros enteros y decimales en javascript

Para números decimales por ejemplo 22.33   y  .44  , sólo acepta números y un punto
function onKeyDecimal(e,thix) {
        var keynum = window.event ? window.event.keyCode : e.which;
        if (document.getElementById(thix.id).value.indexOf('.') != -1 && keynum == 46)
            return false;
        if ((keynum == 8 || keynum == 48 || keynum == 46))
            return true;
        if (keynum <= 47 || keynum >= 58) return false;
        return /\d/.test(String.fromCharCode(keynum));
    }

Para validar número enteros, es decir sin puntos el siguiente método que sólo acepta números

function justNumbers(e) {
            var keynum = window.event ? window.event.keyCode : e.which;
            if ((keynum == 8 || keynum == 48))
                return true;
            if (keynum <= 47 || keynum >= 58) return false;
            return /\d/.test(String.fromCharCode(keynum));
        }

Para utilizarlos agrega el  evento keyprees a tu  caja de texto

<asp:TextBox ID="txtTalla"    MaxLength="3"  onkeypress="return justNumbers(event);" runat="server"></asp:TextBox>

Noten como  en el evento que validar los números decimales se requiere de el  parámetros this que nos ayuda a conocer el contenido  de la caja de texto

<asp:TextBox ID="txtPrecioCompra" onkeypress="return onKeyDecimal(event,this);" Width="80px"   MaxLength="8" runat="server"></asp:TextBox>