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"/>