miércoles, 16 de octubre de 2013

Terminando Servicios de Windows cuando se cuelgan

Me ha pasado que he querido reiniciar un servicio de windows, y el servicio se cuelga al darle restart o stop, y la única forma de que reinicie, es reiniciando completamente el equipo, pero esto no puede ser una respuesta que le das a tu cliente, en un servidor de producción.

Por lo tanto me puse a investigar y encontré lo siguiente para Windws 2008 Server.

Primero hay que traer el nombre del servicio como se ve en la siguiente imagen:

Abrir el CMD y ejecutar el siguiente comando:
sc queryex "service name"

Este nos listara la información del servicio que le dijimos por su nombre.

Obtenemos su PID, y se lo pasamos a la siguiente instruccion:
taskkill /F /PID "Service PID"

Eso detendrá el servicio. y si no esta dañado, podremos prenderlo nuevamente.

lunes, 18 de febrero de 2013

Meta datos de CRM 2011 desde SQL 2008

La siguiente instrucción en SQL nos permite conocer los meta datos de un picklist de CRM 2011

SELECT AttributeName,AttributeValue, Value   
FROM StringMap   
WHERE AttributeName  like '%Gender%' 

Lo que hay que resaltar son 2 cosas.

  1. La tabla que consulta "StringMap" que contiene todos los picklist del CRM
  2. Como buscar el atributo en el where, con su nombre del campo en el CRM

sábado, 30 de junio de 2012

jQuery con Grids y Checkboxes

El siguiente ejemplo muestra como hacer grupos de selección dentro de un gridview.

Para esto creo una clase que representara los items del grid (esto lo dejo a consideración de cada quien, también puede llenarse con Datatables y/o otras fuentes de datos.

public class ItemGrid
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public int GroupKey { get; set; }
}

El CodeBehind de la pagina será el siguiente:

public partial class Default : System.Web.UI.Page
{

    #region [Eventos]
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            cargaGrid();
        }
    }

    #region [Grid]
    protected void cargaGrid(){
        gvServicios.DataSource = GeneraRegistros();
        gvServicios.DataBind();
    }
    #endregion

    #endregion

    #region [Getters]
    public List<ItemGrid> GeneraRegistros()
    {
        List<ItemGrid> listado = new List<ItemGrid>();
        listado.Add(new ItemGrid() { Id = 1, Nombre = "Servicio 1", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 2, Nombre = "Otro Servicio", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 3, Nombre = "N servicio", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 4, Nombre = "R Servicio", GroupKey = 3 });
        listado.Add(new ItemGrid() { Id = 5, Nombre = "segundo de N", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 6, Nombre = "tercero de N", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 7, Nombre = "R segundo", GroupKey = 3 });
        listado.Add(new ItemGrid() { Id = 8, Nombre = "R tercero", GroupKey = 3 });
        listado.Add(new ItemGrid() { Id = 9, Nombre = "muchos servicios", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 10, Nombre = "Decimo Servicio", GroupKey = 1 });

        listado.Add(new ItemGrid() { Id = 11, Nombre = "Decimo Servicio", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 12, Nombre = "Otro para el uno", GroupKey = 1 });
        listado.Add(new ItemGrid() { Id = 13, Nombre = "ya son muchos", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 14, Nombre = "este es del 2 grupo", GroupKey = 2 });
        listado.Add(new ItemGrid() { Id = 15, Nombre = "Este es el ultimo", GroupKey = 1 });

        return listado;
    }
        
    #endregion
}

 

Ahora veamos el html y scripts

Primero el body:

<asp:GridView ID="gvServicios" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="Id" HeaderText="Identificador" />
                <asp:BoundField DataField="Nombre" HeaderText="Servicio" />
                <asp:TemplateField HeaderText="Grupo">
                    <ItemTemplate>
                        <asp:Label ID="lblGroupKey" runat="server" Text='<%# Eval("GroupKey") %>'></asp:Label>
                        <asp:HiddenField ID="IDVal" runat="server" Value='<%# Eval("GroupKey") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="chkType" runat="server"  onclick='<%# "SingleSelector(this," + Eval("GroupKey") +")" %>' />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

El valor de GroupKey lo coloco en un hiddenfield, para manipularlo, y en un Label, para que se vea el grupo con el que se trabaja, en otra columna tendremos el check box: chkType, que llama a una función en jscript (SingleSelector) la cual tiene 2 parámetros, el primero es el mismo checkbox que lo llama, y el segundo parámetro es el identificador del grupo.

En el header tendremos la importación de jQuery, así como nuestra función de agrupamiento

<head runat="server">
    <title></title>
    <script src="Scripts/jQuery1.7.2.js" type="text/javascript"></script>
    <script type="text/jscript">
        
        function SingleSelector(chk, group) {
            var count = 0;
            //Recorrer todos los elementos del grid
            $('#gvServicios tr').each(function () {
                //Obtener el id del grupo seleccionado
                var vargrupo = $(this).find("input[id*='IDVal']").val();
                var selec = $(this).find("input[id*='chkType']");

                if (group == vargrupo) {
                    if (chk.name != selec.attr("name")) {
                        selec.attr("disabled", chk.checked == true ? true : false);
                        count++;
                    }
                }
            });
        }
    </script>
</head>

Lo primero que hace esta función es recorrer todos los elementos del grid, luego obtenemos el grupo que tiene ese renglón, y el check asociado a ese grupo. Lo siguiente a realizar es la comparativa del grupo, si son iguales, revisamos que sean diferentes el checkbox que se paso en la función, y el checkbox del renglón en el que nos encontramos, esto es para que el elemento que se esta seleccionado siempre este habilitado. Luego se establece para todos los elementos que no son el seleccionado y que pertenecen al grupo, como deshabilitados, si el checkbox que se paso en la función esta checkado.

Perdón si no es tan clara la redacción, pero a veces es mejor verlo en funcionamiento.

Gridj

Como se puede apreciar en la imagen, solo nos permitirá seleccionar un elemento del grupo a la vez.

 

Espero que les sea de utilidad.

viernes, 25 de mayo de 2012

jQuery datepicker y asp.net

Pues me puse a investigar como usar el datepicker de jQuery, ya que creo que es mas ligero que el de ajax.

Y en la implementación tenia que deshabilitar la entrada manual al textbox, pero o sorpresa, no se puede usar la opción de readonly, o de enabled del textbox, por que si no no funciona esto, y la solucion, la tenia también jQuery, resumamos el requerimiento

  • Bloquear el textbox
  • Formatear la fecha
  • disparar funcionalidad al seleccionar la fecha
  • Mostrar el datepicker a partir de una imageny aquí esta el código:
$('#txtFInicio').attr('disabled', true);
$('#txtFFinal').attr('disabled', true);
//Agregar datepickers
var imgurl = '<%= ResolveUrl("~/Images/calon.gif") %>';
$('#txtFInicio').datepicker({
showOn: 'button', buttonImageOnly: true, buttonImage: imgurl
, dateFormat: 'yy-mm-dd'
, onSelect: function () {
//Si la fecha final tiene valor, validar la fecha inicial
if ($('#txtFFinal').val() != "") {
if (!validaFechas($('#txtFInicio').val(), $('#txtFFinal').val())) {
alert("La fecha final debe ser mayor a la fecha inicial");
$('#txtFInicio').val("");
}
}
}
});

Para obtener la url de la imagen sin problemas uso la siguiente linea:


var imgurl = '<%= ResolveUrl("~/Images/calon.gif") %>';

El metodo ResolveURL es un metodo de .Net que convierte la url en algo entendible, ya que como recordaran la tilde ~ nos manda a raíz del directorio, pero eso no lo interpreta el html, si no .Net, y esta rutina se encarga de convertirlo en algo que el html pueda interpretar.

Bueno eso es todo lo necesario

Checkboxlist y jQuery II

Bueno en el post pasado, especifique como obtener todos los valores seleccionados. Ahora veamos como ver si un valor en especifico del listado esta seleccionado. cabe mencionar que es importante saber cuantos elementos hay en el listado, para ir a ese índice y validarlo.

var Complementarios = $('#<%=chkOptions.ClientID%> :checkbox')[0].checked ? 0 : 1;


lo que hago es validar el checkbox por su índice, y evalúo si esta seleccionado o no.


Y de pilón agrego como deseleccionar todos los elementos dentro de un checkboxlist. personalícenlo si necesitan hacer lo contrario.


$('#<%=chklist.ClientID%> input:checkbox:checked').each(function () {
$(this).attr('checked', false);
});

Checkboxlist y jQuery I

Primero vamos a ver como se obtienen todos los elementos seleccionados de un checkboxlist. Para eso tenemos el siguiente codigo

function obtenerGuidsServicios() {
var seleccion = "";
$('#<%=chklist.ClientID%> input:checkbox:checked').each(function () {
//seleccion += $(this).parent().text() + ","; //para el texto
if (seleccion.length == 0) {
seleccion = $(this).val();
}
else {
seleccion += "," + $(this).val(); //
}
});
return seleccion;
}

Es importante tener la variable donde se van a arrojar los valores de la selección. en este caso hago una concatenación de esos valores por una coma, pero la idea general es lo importante.

También tengo entre comentarios, como obtener el valor del texto asociado a ese chechbox dentro del listado

Radiobuttonlist desde jQuery

Lo que necesitaba hacer era obtener el índice seleccionado del radiobuttonlist para que dependiendo de eso, realizar mas acciones (sencillo no?).

El chiste era obtener el acceso adecuado a la estructura html del radiobuttonlist.

Bueno aquí esta el código

 //Seleccion del radio buton para filtros
$('#<%=rblopc2.ClientID%> :radio').click(function () {
//casos
switch ($('#<%=rblopc2.ClientID%> input').index(this)) {
case 0:
//Mostrar un div
$('#<%=dvRangos.ClientID%>').show();

//Funcionalidad

break;
case 1:
//
$('#<%=dvServicios.ClientID%>').show();
HideFechas();
break;
case 2:
//Funcionalidad

break;
}
});



Las limitantes que encuentro, es que se deben saber que valores puede tomar el radiobuttonlist, ya que a partir de ahí se realizarían los casos para la funcionalidad