martes, 31 de enero de 2017

clase Utilidades

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Collections;
using System.IO;
using System.Data;
using System.Web.UI.WebControls;

namespace SistemaCreditos.Clases
{
    public class Utilidades
    {
        Conexion con = new Conexion();
        string error = "",sql="",a="";
        SqlDataReader r;
     
        public void llenaCombosId(string cadena, string item,string id, ref DropDownList ddl)
        {

            //try
            //{
                ddl.Items.Clear();
                r = con.Reg(cadena);
                while (r.Read())
                {
                    ddl.Items.Add(new ListItem(r[item].ToString(),r[id].ToString().Trim()));
                }
                r.Close();
            //}
            //catch (Exception ex)
            //{
            //    return;
            //}
        }
     
        //Para llenar Reportes
        public void GetDate(ref string hora, ref string fecha)
        {
            r = con.Reg("select GETDATE();");
            if (r.Read())
            {
                DateTime x = Convert.ToDateTime(r[0]);
                hora = x.ToShortTimeString();
                fecha = x.ToShortDateString();
            }
        }

        public DateTime GetDate()
        {
            DateTime x = DateTime.Today;
            r = con.Reg("select GETDATE();");
            if (r.Read()) x=Convert.ToDateTime(r[0]);
            return x;
        }
     

        public  string  DateTime_A_BD(string fecha){
            return "'" + Convert.ToDateTime(fecha).ToShortDateString() + " " + Convert.ToDateTime(fecha).TimeOfDay + "'";
        }

        public bool Exists(string cad)
        {
        r=con.Reg(cad);
        if (r.Read()) return true;
        else return false;
        }


        public string ObtenNombreCliente(int idCliente)
        {
            sql = "Select RTRIM(Nombre)+SPACE(1)+RTRIM(ApellidoPaterno)+SPACE(1)+RTRIM(ApellidoMaterno) from Clientes  where idCliente=" + idCliente;
            r = con.Reg(sql);
            if (r.Read()) return r[0].ToString();
            else return "";
        }

     

        public string Age(DateTime birthday)
        {
            DateTime now = DateTime.Today;
            int age = now.Year - birthday.Year;
            if (now < birthday.AddYears(age)) age--;
            return age.ToString();
        }

        public string ObtenValor(string cadena)
        {
            r = con.Reg(cadena);
            if (r.Read()) return r[0].ToString();
            else return "";
        }

     
    }
}

jueves, 22 de diciembre de 2016

Proyecto MVC no funciona bien en Visual Studio 2013

Antes abrí proyectos  ejemplos en Visual Studio 2012 y los estudiaba con regularidad, ahora después de un año tengo el Visual Studio 2013 intento  abrir los proyectos y me aparece el siguiente error.


Cambien el Entity de muchas formas. la Version del .Net

Analizando el  código vi que nunca entraba al método seed del Inicializador y me fui  a buscar en el Web.config alguna línea que me estuviera impidiendo la carga de datos

 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0"/>
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>

Este  es el bloque que comentarizé para que entrara a cargar datos y el  proyecto  funcionara.
Además hice un proyecto  desde cero en V S 2013 que funciona perfecto, supong oque este código es viejo  y sólo funcionaba en el V S 2012.


martes, 19 de julio de 2016

MemberShip de ASP.NET con Visual Studio 2013

Debido  a que utilizo el  Visual Studio 2013 los tutoriales para entrar a la configuración del sitio web no me funcionaron entré  de la siguiente forma, voy a  la consola

con cd.. me regreso en la ruta hasta llegar a C:/
Después  lanzo
cd C:\Program Files\IIS Express\
 iisexpress.exe /path:C:\windows\microsoft.net\framework\v4.0.30319\asp.netwebadminfiles /vpath:"/asp.netwebadminfiles" /port:8095 /clr:4.0 /ntlm



Aquí la señal de que iniciamos IIS Express, enseguida vamos al navegador y  escribimos

http://localhost:8095/asp.netwebadminfiles/default.aspxapplicationPhysicalPath=C:\Users\Marilu\Documents\VisualStudio2013\Projects\WebMemberShip\WebMemberShip&applicationUrl=/
Donde lo violeta es la ruta a el proyecto.
Esta es la página principal, después entro a seguridad y me aparece el error del proveedor.
Entonces instalo SQL Express  (SQLEXPR_x86_ENU.exe). 
Después me dice que no encuentra los procedimientos y tablas de la base de datos y voy a configurar la base de datos en la siguiente ruta.
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe


Y en la base de datos se refleja así

Entonces vuelvo a ejecutar las instrucciones para entrar a la configuración del sitio web y  en la pestaña seguridad me aparece correctamente la siguiente vista.

Hasta aquí continué con el  tutorial

Videotutorial ASP.NET Membership/Roles Login Controls (Máster en Tecnologías Web)

https://www.youtube.com/watch?v=4s2vCFaxJeo



viernes, 4 de marzo de 2016

SqlDataSource no enlaza a mis Combox

Estaba trabajando  con los combos de devexpress y funcionaban bien, estaba haciendo animaciones en los  div  que los  contenían y se me ocurre poner la propiedad  visible="false" en un intento  de mantener el  estado de  esos divs entre postbacks, entonces dejan de enlazarse los combos.
Solución
continuar  usando  style="display:none; " y jquery  para mostrar y  ocultar.



  <dx:ASPxComboBox ID="cmbMedicoReferente" ValueField="idMedico" runat="server" DataSourceID="SqlDataSource3"
                                        Width="80%">
                                        <Columns>
                                            <dx:ListBoxColumn FieldName="Medico" Caption="Médico" />
                                        </Columns>
                                    </dx:ASPxComboBox>

 <asp:SqlDataSource ID="SqlDataSource3" runat="server"
        ConnectionString="<%$ ConnectionStrings:DB_CHSJConnectionString %>"
        SelectCommand="Select  idMedico,RTRIM(Nombre)+' '+RTRIM(Ap_Paterno)+' '+RTRIM(Ap_Materno) Medico from MR ">

miércoles, 17 de febrero de 2016

Devexpress no reconoce los UpdatePanels de AJAX

A control with ID 'treeView' could not be found for the trigger in UpdatePanel 'UpdatePanel5'

 <asp:UpdatePanel ID="UpdatePanel5" runat="server">
            <ContentTemplate>
                <asp:HiddenField ID="HiddenTCPagina" runat="server" />
                <asp:HiddenField ID="HiddenTCPK_Name" runat="server" />
                <asp:HiddenField ID="HiddenTCIdIngreso" runat="server" />
            </ContentTemplate>
            <Triggers>
                  <asp:AsyncPostBackTrigger ControlID="treeView" EventName="NodeClick" />
            </Triggers>
        </asp:UpdatePanel>

Estoy usando un ASPxSplitter de Devexpress y no reconoce mi  treeview en otro  SplitterPane
Esta línea ya la utilizé y funciona correctamente en otro  update panel
<asp:AsyncPostBackTrigger ControlID="treeView" EventName="NodeClick" />

Intenté viendo el  código  fuente y cambiándole el nombre de distintas maneras
Encontré la respuesta en esta  página

En  el Load de mi página  registré el  control treeView

AsyncPostBackTrigger trigger = new AsyncPostBackTrigger(); trigger.ControlID = treeView.UniqueID;// pgFormVersionSetup.FindControl("btnUpload").UniqueID; trigger.EventName = "NodeClick"; UpdatePanel5.Triggers.Add(trigger);

lunes, 15 de febrero de 2016

Tab Pane Boostrap cambiar de pestaña por Java Script

Página con  referencia completa

// Select all tabs$('.nav-tabs a').click(function(){
    $(this).tab('show');
})

// Select tab by name$('.nav-tabs a[href="#home"]').tab('show')

// Select first tab$('.nav-tabs a:first').tab('show'

// Select last tab$('.nav-tabs a:last').tab('show'

// Select fourth tab (zero-based)$('.nav-tabs li:eq(3) a').tab('show')

miércoles, 13 de enero de 2016

Llenar el TreeVew de ASP.NET con tabla Base de Datos


La tabla en SQL Server  consta de 3 columnas principales
idNodo es la PK
Nodo  es el  texto o  descripción del nodo
idNodoPadre es el  nodo  del que se desprende el nodo hijo.


 protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                int total = Convert.ToInt32(u.ObtenValor("Select MAX(idNodo) from TreeView"));
                for (int i = 0; i < total; i++)
                {
                    string sql = "Select idNodo,Nodo from TablaTreeviews where idNodoPadre=" + i + " order by idNodo";
                    SqlDataReader r;
                    r = con.Reg(sql);
                    while (r.Read())
                    {
                        if (i == 0)
                        {
                            TreeView.Nodes.Add(new TreeNode(r["Nodo"].ToString().Trim(), r["idNodo"].ToString().Trim()));
                        }
                        else
                        {
                            TreeNode nodo = BuscarNodo(TreeView.Nodes, i.ToString());
                            nodo.ChildNodes.Add(new TreeNode(r["Nodo"].ToString().Trim(), r["idNodo"].ToString().Trim()));
                        }
                    }
                }
            }
        }

        TreeNode BuscarNodo(TreeNodeCollection collec, string value)
        {
            TreeNode nodo = new TreeNode();
            for (int i = 0; i < collec.Count; i++)
            {
                if (collec[i].Value.Equals(value))
                    return nodo = collec[i];
                else
                {
                    if (collec[i].ChildNodes.Count>0)
                    nodo = BuscarNodo(collec[i].ChildNodes, value);
                    if (nodo.Value.Equals(value)) return nodo;
                }
            }
            return nodo;
        }

Encuentra la clase conexión aquí

lunes, 11 de enero de 2016

Clase Conexion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Runtime.InteropServices;
using System.Collections;
using System.IO;
using System.Data;
using System.Web.UI.WebControls;
using System.Configuration;

namespace SistemaExpediente.Clases
{
    public class Conexion
    {
        public SqlConnection CON;
        private SqlCommand Comando = new SqlCommand();

        public Conexion()
        {


//string cnx = "Data Source=NOMBRESERVIDOR;Initial Catalog=NOMBREDEMIBASEDEDATOS;Persist Security Info=True;User ID=sa;Password=MICONTRASENA";

ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["DB_CHSJConnectionString"];

string cnx =settings.ConnectionString;

CON = new SqlConnection(cnx);        }

        ~Conexion()
        {
            try { CON.Close(); }
            catch (Exception e) { Console.WriteLine(e.Message); }
            CON.Dispose();
        }

        public void cerrar()
        { CON.Close(); }

        public int Accion(string Cad)
        {
            int x;
            try
            {
                CON.Open();
                Comando.Connection = CON;
                Comando.CommandText = Cad;
                x = Comando.ExecuteNonQuery();
                cerrar();
                return x;
            }
            catch
            {
                cerrar();
                CON.Open();
                Comando.Connection = CON;
                Comando.CommandText = Cad;
                x = Comando.ExecuteNonQuery();
                cerrar();
                return x;
            }
        }

     
        public DataTable GetSelect(string commandText)
        {
            DataTable TABLA = new DataTable("Tmp");
            try
            {
                int i;
                CON.Close();//movi
                CON.Open();
                SqlCommand CMD = new SqlCommand(commandText, CON);
                SqlDataReader REG = CMD.ExecuteReader();
                for (i = 0; i < REG.FieldCount; i++)
                {
                    TABLA.Columns.Add(REG.GetName(i), REG.GetFieldType(i));
                }
                while (REG.Read())
                {
                    DataRow ROWS = TABLA.NewRow();
                    for (i = 0; i < REG.FieldCount; i++)
                    {
                        ROWS.SetField(i, REG[i]);
                    }
                    TABLA.Rows.Add(ROWS);
                }
                REG.Close();
                CON.Close();
                return TABLA;
            }
            catch (SqlException Ex)
            {

            }
            return TABLA;
        }

     

        public SqlDataReader Reg(string Cad)
        {
            try
            {
                cerrar();
            }
            finally
            {
                try
                {
                    CON.Open();
                    Comando.CommandText = Cad;
                    Comando.Connection = CON;
                }
                catch (Exception Er)
                {

                }
            }
            try { return Comando.ExecuteReader(); }
            catch { return null; }
        }

    }
}

Guardar Tablas en Memoria caché y utilizarlas en todas las páginas

A menudo, una aplicación puede aumentar el rendimiento si almacena en memoria los datos a los que se tiene acceso con más frecuencia y cuya creación requiere un tiempo de procesamiento significativo. Por ejemplo, si su aplicación procesa grandes cantidades de datos utilizando una lógica compleja y, a continuación, los devuelve en un formato de informe que es consultado frecuentemente por los usuarios, resulta eficiente evitar la creación de dicho informe cada vez que un usuario lo solicita. De manera similar, si su aplicación incluye una página que procesa datos complejos pero que no se actualiza frecuentemente, no resulta eficiente que el servidor vuelva a crear dicha página en cada solicitud.
Cita de Microsoft
Este es un ejemplo de cómo  guardo  la configuración de mi  sitio web,  en  este caso  se trata de una tabla de  mi base de datos que  guarda los campos que son obligatorios por cada página. Existe una interfaz donde el usuario  puede cambiar esta configuración y se actualiza la base de datos y la tabla en la cache. La tabla de cargará una sola vez cuando se inicie la aplicación, se actualizará cuando  haya cambios en la base de datos (Desde la aplicación,  aun NO sé como  hacerlo con  dependencia de SQL). y se destruirá cuando de la memoria cuando  pase cierto  tiempo, o  se cierre o  reinicie la aplicación.



Expiración

Además de utilizar el barrido, ASP.NET quita automáticamente los elementos de la memoria caché cuando expiran. Al agregar un elemento a la memoria caché se puede establecer su expiración de acuerdo con la tabla siguiente.
Tipo de expiración
Descripción
Fecha de expiración variable
Especifica el intervalo de tiempo que debe transcurrir desde el último acceso al elemento para que éste expire. Por ejemplo, puede establecer que un elemento expire 20 minutos después del último acceso en caché.
Expiración absoluta
Especifica que un elemento expira en un momento determinado, sin tener en cuenta la frecuencia con que se ha tenido acceso al mismo. Por ejemplo, puede establecer que un elemento expire a las 6:00 p.m. o al cabo de cuatro horas.



Ejemplos de código de los dos tipos de expiración
Cache.Insert("Cache_ConfiguracionPorPagina", tablaAE, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(1)); //Sólamente se borra si  pasó el tiempo indicado y no  se accedió a ella

 Cache.Insert("Cache_ConfiguracionPorPaginaSE", tablaSE, null,DateTime.Now.AddMinutes(1),System.Web.Caching.Cache.NoSlidingExpiration); // Se estingue en el tiempo indicado,  se acceda o no a la tabla en cache


Creé la clase Utilidades.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaExpediente.Clases;
using System.Data.SqlClient;
using System.Collections;
using System.IO;
using System.Data;
using System.Web.UI.WebControls;
using System.Web.Caching;

namespace SistemaExpediente.Clases

{
    //Agregue  la herencia de : System.Web.UI.Page línea para usar la cache
    public class Utilidades //: System.Web.UI.Page
    {
        Conexion con = new Conexion();
        string error = "", sql = "", a = "";
        SqlDataReader r;

        /*********CACHE***********/

        //Si no  existe la tabla la crea, si  existe la reemplaza
        /// <summary>
        /// Inicializa las tablas que se guardarán en  la memoria caché
        /// </summary>
        public void CreateAllTablesCache()
        {
            DataTable tablaAE = new DataTable(); //Absolute Expiration
            DataTable tSN = new DataTable();
            tablaAE = con.GetSelect("SELECT *  FROM dbo.View_TablaValidaciones");
            tSN = con.GetSelect("Select * from ConfiguracionSiNo");
            System.Web.HttpContext.Current.Cache.Insert("Cache_ConfiguracionPorPagina", tablaAE, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(1)); //Sólamente se borra si  pasó el tiempo indicado y no  se accedió a ella
            System.Web.HttpContext.Current.Cache.Insert("Cache_ConfiguracionSiNo", tSN, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(1));  //Sólamente se borra si  pasó el tiempo indicado y no  se accedió a ella
            //Cache.Insert("Cache_ConfiguracionPorPaginaSE", tablaSE, null, DateTime.Now.AddMinutes(20), Cache.NoSlidingExpiration); // Se estingue en el tiempo indicado,  se acceda o no a la tabla en cache
        }
        /// <summary>
        /// Si  una tabla caducó  de la memoria caché,  se vuelve a crear con  este método
        /// </summary>
        /// <param name="key">El nombre de la tabla a crear</param>
        /// <returns>Regresa un objeto  DataTable</returns>
        public DataTable CreateTableCache(string key)
        {
            DataTable table = new DataTable(); //Absolute Expiration
            if (key != "")
            {
                if (key == "Cache_ConfiguracionPorPagina") table = con.GetSelect("SELECT *  FROM dbo.View_TablaValidaciones");
                if (key == "Cache_ConfiguracionSiNo") table = con.GetSelect("Select * from ConfiguracionSiNo");
            }
            if(table.Rows.Count>0)
            System.Web.HttpContext.Current.Cache.Insert(key, table, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(1)); //Sólamente se borra si  pasó el tiempo indicado y no  se accedió a ella    
            return table;
        }

        public void RemoveALLTablesCache()

        {
            if (System.Web.HttpContext.Current != null)
            {
                System.Web.HttpContext.Current.Cache.Remove("Cache_ConfiguracionPorPagina");
                System.Web.HttpContext.Current.Cache.Remove("Cache_ConfiguracionSiNo");
            }
        }
        /// <summary>
        /// Para obtener valores escalares de una DataTable en la memoria cache
        /// </summary>
        /// <param name="table">Nombre de la tabla</param>
        /// <param name="filtro">Parámetros utilizados en el 'where' del select al DataTable para obtener  el  valor</param>
        /// <param name="valor">El valor a regresar, de la fila obtenida </param>
        /// <returns>Un string con el  valor</returns>
        public string TableValue(DataTable table,string [] filtro,string valor)
        {
            string f = "";
            for (int i = 0; i < filtro.Length; i++) f += filtro[i] + " AND "; 
            f=f.Substring(0,f.Length-5);
            return table.Select(f)[0][valor].ToString();
        }
        
        /// <summary>
        /// Validación de campos que son iguales en todo el sistema 
        /// </summary>
        /// <param name="t">DataTable a buscar</param>
        /// <param name="c">Valor de la columna campo</param>
        /// <param name="ctrol">Regresa el control que contiene el error</param>
        /// <param name="conte">Regresa el id del  Div HTML  que contiene el error</param>
        /// <param name="msjVal">Regresa un mensaje de validación a mostrar en una ventana de mensajes para el usuario</param>
        /// <returns>Regresa true si el campo es obligatorio y false si no lo es</returns>
        public bool VlGn(DataTable t, string c, ref string ctrol,ref string conte,ref string msjVal)
        {
            ctrol = TableValue(t, new string[] { "Pagina='TODAS'", "Campo='" + c + "'" }, "idValidacion").ToString().Trim();
            conte = TableValue(t, new string[] { "Pagina='TODAS'", "Campo='" + c + "'" }, "Contenedor").ToString().Trim();
            msjVal = TableValue(t, new string[] { "Pagina='TODAS'", "Campo='" + c + "'" }, "Mensaje").ToString().Trim();
            return Convert.ToBoolean(TableValue(t, new string[] { "Pagina='TODAS'", "Campo='" + c + "'" }, "Caracter"));
        }
       /// <summary>
        /// Regresa id de el  control de la validación
       /// </summary>
       /// <param name="t">DataTable a buscar</param>
       /// <param name="c">Valor de la columna campo</param>
       /// <param name="ctrol">Regresa el control que contiene el error</param>
        /// <returns>Regresa id de el  control de la validación</returns>
        public string idVlGn(DataTable t, string c,ref bool ctrol)
        {
            return TableValue(t, new string[] { "Pagina='TODAS'", "Campo='" + c + "'" },c).ToString().Trim();
        }

        //Campos necesarios para la validación

        /// <summary>
        /// Metodo para realizar la validación de campos.Recibe parámetros referenciados con el control, el DIV contenedor y el mensaje de validación
        /// </summary>
        /// <param name="t">DataTable a buscar</param>
        /// <param name="pagina"></param>
        /// <param name="c">Valor de la columna campo</param>
        /// <param name="ctrol">Regresa el control que contiene el error</param>
        /// <param name="conte">Regresa el id del  Div HTML  que contiene el error</param>
        /// <param name="msjVal">Regresa un mensaje de validación a mostrar en una ventana de mensajes para el usuario</param>
        /// <returns>Regresa true si el campo es obligatorio y  false si no lo es</returns>
        public bool Vl(DataTable t, string pagina, string c, ref string ctrol, ref string conte,ref string msjVal)
        {
            ctrol = TableValue(t, new string[] { "Pagina='" + pagina + "'", "Campo='" + c + "'" }, "idValidacion").ToString().Trim();
            conte = TableValue(t, new string[] { "Pagina='" + pagina + "'", "Campo='" + c + "'" }, "Contenedor").ToString().Trim();
            msjVal = TableValue(t, new string[] { "Pagina='" + pagina + "'", "Campo='" + c + "'" }, "Mensaje").ToString().Trim();
            return Convert.ToBoolean(TableValue(t, new string[] { "Pagina='"+pagina+"'", "Campo='" + c + "'" }, "Caracter"));
        }


        //Regresa la tabla obtenida de la cache 

        /// <summary>
        /// Regresa la tabla obtenida de la cache, si la tabla no existe la agrega a la cache llamando al submétodo CreateTableCache
        /// </summary>
        /// <param name="key">Nombre de la tabla</param>
        /// <returns>Tabla de la memoria caché</returns>
        public DataTable GetTableCache(string key)
        {
            DataTable tabla = new DataTable();
            tabla = (DataTable)System.Web.HttpContext.Current.Cache.Get(key);
            if (tabla == null)  tabla = CreateTableCache(key);
            return tabla;
        }

    }

}

Además inicializo las tablas al comenzar la aplicación en mi  archivo  Global.asax


        void Application_Start(object sender, EventArgs e)

        {
            u.CreateAllTablesCache();
        }

        void Application_End(object sender, EventArgs e)

        {
            u.RemoveALLTablesCache();
        }
Y la utilizo en todas las páginas de este modo.

/************VALIDACION***************/


        string ctrlVal = "", conte = "",msjVal="", p = "NotaIngresoHospital";

 DataTable t =u.GetTableCache("Cache_ConfiguracionPorPagina");
else if (u.Vl(t, p, "ExploracionFisica", ref ctrlVal, ref conte, ref msjVal) && txtExplFisi.Text.Equals("")) return msjVal;

Si  el campo 'ExploracionFisica' de la página 'NotaIngresoHospital' es positivo Y el  textbox  txtExplFisi  se encuentra en  blanco, regresa el mensaje de error y los valores de los controles, que vienen por referencia  y con  estos valores hago mis procedimientos con JavaScript.


Puedes buscar la clase conexión en este mismo blog









Ver dependencia de Objetos en SQL

Si  cambiaste el nombre de una tabla procedimiento almaceno, vista etc, puedes ver la dependencia de objetos con la siguiente query.


Select SO.object_id,referenced_id,referencing_id,referenced_entity_name,name,type_desc
from sys.sql_expression_dependencies  sqldep
INNER JOIN sys.objects SO on SO.object_id=sqldep.referencing_id
where sqldep.referenced_entity_name ='ExpNotaIngresoHospital'


Si la columa referenced_id aparece NULL  la referencia está rota, osea debes ir a el script a cambiar el nombre del objeto


Por ejemplo:
Eliminé la tabla
ExpExpedienteGeneral que se encuentra en el script  de la vista  view_ExpedienteGeneral.
Si  ejecuto el script para buscar referencias rotas:

Select SO.object_id,referenced_id,referencing_id,referenced_entity_name,name,type_desc
from sys.sql_expression_dependencies  sqldep
INNER JOIN sys.objects SO on SO.object_id=sqldep.referencing_id
where  referenced_id is null


Aparece en una de las referencias la tabla ExpExpedienteGeneral. Esto  también puede pasar si  cambié el  nombre de un objeto o una columna.




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;
        }