Estuve intentando horas de horas con el problema de cómo hacer para obtener la cantidad de días, meses y años, sin importar el lenguaje de programación. Pues el algoritmo al final es simple y lo voy a explicar brevemente.
Supongamos que recibimos dos fechas donde fecha de inicio es 1/1/2004 y fecha final es 30/11/2005. El objetivo final es obtener la cantidad de años, meses y días, pero que sea exacto y esto quiere decir que hay que tomar en cuenta que no todos los meses son de 30 días y que no todos los años tienen 365 debido al año bisiesto.
La solución yo la resolví en VB .Net con la función DateAdd Lo primero es calcular los años. Para eso calculamos la cantida de días totales y la dividimos entre 360 y extraemos la parte absoluta con Math.Abs.
Viene lo más complicadillo y es calcular los meses y los días. Para ambos casos, el truco está siempre es hacerle una suma a la fecha de inicio para irnos acercando a la fecha final. Entonces para calcular los meses hay que sumar a la fecha de inicio la cantidad de años que ya teníamos calculado. Del resultado que obtengo saco los meses y se lo resto a los meses de la fecha final.
Ejemplo VB .Net:
totalMeses = Math.Abs(final.Month - DateAdd(DateInterval.Year, _anios, inicio).Month)
Para calcular los días, la lógica es la misma. Lo que hay que hacer es sumar todos los meses a la fecha de inicio. Esto quiere decir que la cantidad de años que tengo calculado, lo convierto en meses y lo sumo con la cantidad de meses que obtuve en totalMeses. De esa suma, el resultado se lo sumo a la fecha de inicio original. Como le estoy sumando todos los meses a la fecha de inicio, nos va a quedar una fecha que se acerca más a la fecha final.
Finalmente, entonces se deduce que hay que sacar la diferencia en días de la fecha final con la fecha que obtuve en el último paso.
Y bueno, dej esta entrada para recordarme a mí mismo como fue que resolví el algoritmo, jaja!
Para poder saber si los resultados andan bien, se puede usar el siguiente sitio en el cual tiene una pequeña aplicación que hace esos cálculos: www.timeanddate.com
¿Por qué aguardas con impaciencia las cosas? Si son inútiles para tu vida, inútil es también aguardarlas. Si son necesarias, ellas vendrán y vendrán a tiempo. Amado Nervo
miércoles, 28 de octubre de 2009
martes, 20 de octubre de 2009
Asp.Net: Validator Controls
En ocasiones, el uso de los controles de validación se pueden volver un dolor de cabeza. Solo para mencionar una de las soluciones por la cual no se activan los validadores o el por qué por ejemplo el control CalendarExtender se comporta indevidamente mal, eso puede ser porque se está usando la propiedad SetFocusOnError. Con solo quitarla todo se puede solucionar.
jueves, 15 de octubre de 2009
PNG: Transparencias de PNG en IE6
Encontré un código perfecto para permitir transparencias en IE6. Es el primer código que veo que sí funcionan. El código que se puede guardar en un archivo *.js es el siguiente:
El enlace donde encontré éste código es: www.webmasterlibre.com
var arVersion = navigator.appVersion.split("MSIE")
var version = parseFloat(arVersion[1])
if ((version >= 5.5) && (document.body.filters))
{
for(var i=0; i<document.images.length; i++)
{
var img = document.images[i]
var imgName = img.src.toUpperCase()
if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
{
var imgID = (img.id) ? "id='" + img.id + "' " : ""
var imgClass = (img.className) ? "class='" + img.className + "' " : ""
var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
var imgStyle = "display:inline-block;" + img.style.cssText
if (img.align == "left") imgStyle = "float:left;" + imgStyle
if (img.align == "right") imgStyle = "float:right;" + imgStyle
if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
var strNewHTML = "<span " + imgID + imgClass + imgTitle
+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
img.outerHTML = strNewHTML
i = i-1
}
}
}
var version = parseFloat(arVersion[1])
if ((version >= 5.5) && (document.body.filters))
{
for(var i=0; i<document.images.length; i++)
{
var img = document.images[i]
var imgName = img.src.toUpperCase()
if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
{
var imgID = (img.id) ? "id='" + img.id + "' " : ""
var imgClass = (img.className) ? "class='" + img.className + "' " : ""
var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
var imgStyle = "display:inline-block;" + img.style.cssText
if (img.align == "left") imgStyle = "float:left;" + imgStyle
if (img.align == "right") imgStyle = "float:right;" + imgStyle
if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
var strNewHTML = "<span " + imgID + imgClass + imgTitle
+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
img.outerHTML = strNewHTML
i = i-1
}
}
}
El enlace donde encontré éste código es: www.webmasterlibre.com
domingo, 11 de octubre de 2009
Asp.Net: Control CustomValidator.
Necesitaba saber cómo implementar una función de validación del lado del cliente para el control Custom Validator; la respuesta la encontré en Mundo Programación
sábado, 3 de octubre de 2009
Ajax .Net: ¿Por qué desaparece el ModalPopup al escoger un item en el DropDownList?
Cada vez que ocurre un PostBack o un AutoPostBack dentro de un ModalPopupExtender, éste se cierra. La solución más rápida es poner éste código en el Head para poder mantener el estado del ModalPopupExtender.
Nota: El control ModalPopupExtender debe tener El atributo BehaviorID con un valor cualquiera. Dicho valor se puede usar en el código JS para poder hacer referencia al mismo de una forma más rápida.
<script type="text/javascript">
var _estadoModal;
function pageLoad() {
$addHandler($get("btnSalir"), "click", OnSalir_Click);
var mpe = $find("mpe");
mpe.add_shown(OnShowModal);
if (_estadoModal)
mpe.show();
}
function OnShowModal(sender) {
_estadoModal = true;
}
function OnSalir_Click(sender) {
_estadoModal = false;
}
</script>
Descargar ejemplo
Nota: El control ModalPopupExtender debe tener El atributo BehaviorID con un valor cualquiera. Dicho valor se puede usar en el código JS para poder hacer referencia al mismo de una forma más rápida.
<script type="text/javascript">
var _estadoModal;
function pageLoad() {
$addHandler($get("btnSalir"), "click", OnSalir_Click);
var mpe = $find("mpe");
mpe.add_shown(OnShowModal);
if (_estadoModal)
mpe.show();
}
function OnShowModal(sender) {
_estadoModal = true;
}
function OnSalir_Click(sender) {
_estadoModal = false;
}
</script>
Si en la variable "_estadoModal" está el valor true, entonces
se vuelve a ordenar que el ModalPopup se muestre. Esto hace
que le caiga encima a la instancia anterior que en realidad
ya esta muerta; lo que pasa es que el updatePanel no se a
refrescado y por eso parece que el ModalPopup nunca desapareció
de la pantalla, el efecto es rápido y parece que el Modalpopup
no se cierra.
Si en la variable "_estadoModal" está el valor "false",
entonces el ModalPopup desaparece ya que el Postback hace que
se cierre el ModalPopup y por ende el UpdatePanel se refresca
borrando la imagen del ModalPopup que se estaba mostrando.
NOTA: CUALQUIER OBJETO QUE HAGA UN POSTBACK O UN
AUTOPOSTBACK PROVOCAN QUE EL MODALPOPUPEXTENDER
SE CIERRE DE INMEDIATO. SIENDO MÁS ESPECÍFICOS,
EL MODALPOPUPEXTENDER SE CIERRA PORQUE ESTE
CONTROL NO MANTIENE SU ESTADO EN EL LADO DEL
CLIENTE DESPUÉS DE CADA POSTBACK O AUTOPOSTBACK.
se vuelve a ordenar que el ModalPopup se muestre. Esto hace
que le caiga encima a la instancia anterior que en realidad
ya esta muerta; lo que pasa es que el updatePanel no se a
refrescado y por eso parece que el ModalPopup nunca desapareció
de la pantalla, el efecto es rápido y parece que el Modalpopup
no se cierra.
Si en la variable "_estadoModal" está el valor "false",
entonces el ModalPopup desaparece ya que el Postback hace que
se cierre el ModalPopup y por ende el UpdatePanel se refresca
borrando la imagen del ModalPopup que se estaba mostrando.
NOTA: CUALQUIER OBJETO QUE HAGA UN POSTBACK O UN
AUTOPOSTBACK PROVOCAN QUE EL MODALPOPUPEXTENDER
SE CIERRE DE INMEDIATO. SIENDO MÁS ESPECÍFICOS,
EL MODALPOPUPEXTENDER SE CIERRA PORQUE ESTE
CONTROL NO MANTIENE SU ESTADO EN EL LADO DEL
CLIENTE DESPUÉS DE CADA POSTBACK O AUTOPOSTBACK.
Descargar ejemplo
Ajax .Net: ¿Por qué el TabContainer no aparece?
Puse el TabContainer y al ejecutar el sitio resulta que no se ve el TabContainer.
Solución: El problema es porque estaba agregando el TabContainer ¡a pata!, y olvidé ponerle a cada TabPanel el atributo runat="server". ¡jeje!
Solución: El problema es porque estaba agregando el TabContainer ¡a pata!, y olvidé ponerle a cada TabPanel el atributo runat="server". ¡jeje!
viernes, 2 de octubre de 2009
Ajax.Net: Soluciones a problemas de Ajax.
En el siguiente sitio se explican varias soluciones a problemas que podemos encontrar al trabajar con Ajax.net: ver sitio
Por ejemplo, en ese sitio encontré la solución para usar saber cómo mantener el ModalPopupExtender activo después de que ocurra un postback.
Más detalles del framework en http://www.asp.net/AJAX/Documentation/Live/Overview/default.aspx. En éste sitio está todo lo que se necesita para dominar Ajax .Net.
Por ejemplo, en ese sitio encontré la solución para usar saber cómo mantener el ModalPopupExtender activo después de que ocurra un postback.
Más detalles del framework en http://www.asp.net/AJAX/Documentation/Live/Overview/default.aspx. En éste sitio está todo lo que se necesita para dominar Ajax .Net.
miércoles, 23 de septiembre de 2009
Ajax .Net: ModalPopup y el control DropDownList.
¿Por qué al escoger un item de un DropDownList que está en un ModalPopupExtender, del lado del servidor siempre me devuelve el index del primer item?
Solución: Esto me estaba ocurriendo porque en el evento Page_Load existe un código para llenar el DropDownList, entonces cada vez que se escogía un item y se daba clic en el botón "Guardar" que esta también en el ModalPopup, sucedía que el ciclo de vida de la página pasaba otra vez por el evento Page_Load (lo cual es obvio) y por eso en otro método que tenía, siempre iba a recoger el mismo valor. La solución fue poner una variable de Sessión antes de que el DropDownList se vuelva a llenar.
Solución: Esto me estaba ocurriendo porque en el evento Page_Load existe un código para llenar el DropDownList, entonces cada vez que se escogía un item y se daba clic en el botón "Guardar" que esta también en el ModalPopup, sucedía que el ciclo de vida de la página pasaba otra vez por el evento Page_Load (lo cual es obvio) y por eso en otro método que tenía, siempre iba a recoger el mismo valor. La solución fue poner una variable de Sessión antes de que el DropDownList se vuelva a llenar.
martes, 15 de septiembre de 2009
Asp.Net: Recuperar ID de fila en GridView a partir de DataKeys
Recuperar el ID de una fila en GridView a partir de la propiedad DataKeys:
key = Convert.ToString(this.grid.DataKeys[this.grid.SelectedIndex].Value);
En la variable key queda un valor que representa el ID del registro. En el GridView se tuvo que haber definido mínimo un valor para la propiedad DataKeyNames. En caso de haber definido más de un DataKeyName, para poder recuperarlo sería de la siguiente forma:
key = Ctype(grid.DataKeys(gris.SelectedIndex).Item(1)
La propiedad Item(1) escoge el segundo Código de la colección DataKeyNames suponiendo que tenemos una clave primaria formada con dos campos.
La ventaja de esto es que podemos poner un columna oculta pero en el DataSource del GridView existe un Select que está recuperando esos valores de las columnas.
key = Convert.ToString(this.grid.DataKeys[this.grid.SelectedIndex].Value);
En la variable key queda un valor que representa el ID del registro. En el GridView se tuvo que haber definido mínimo un valor para la propiedad DataKeyNames. En caso de haber definido más de un DataKeyName, para poder recuperarlo sería de la siguiente forma:
key = Ctype(grid.DataKeys(gris.SelectedIndex).Item(1)
La propiedad Item(1) escoge el segundo Código de la colección DataKeyNames suponiendo que tenemos una clave primaria formada con dos campos.
La ventaja de esto es que podemos poner un columna oculta pero en el DataSource del GridView existe un Select que está recuperando esos valores de las columnas.
Ajax.Net: Más problemas con controles Ajax.Net
1º Tengo un ModalPopupExtender, el problema es que al hacer clic a un botón que está dentro del ModalPopup, éste hace que el modal desaparezca.
Eso ocurre, porque cualquier botón, textbox, etc, que haga Postback, ya sea porque tiene la propiedad AutoPostBack en True o porque se lanza el evento PostBack desde código Javascript, tendremos como resultado que el ModalPopup termine su función. El control ModalPopup está programado para que se cierre cuando ocurra un PostBack dentro de éste.
Solución: La solución es usar Web Services. De hecho esta es la forma que se debería utilizar para actualizar controles dentro de un ModalPopup. Además hay que usar un evento de control HTML para que del lado del servidor llame al WebService. Generalmente se usa el evento onblur el cual equivale a TextChanged de un TextBox, suponiendo que el caso es un TextBox, para otros controles se podría usar el evento onchange.
2º No funcionan los validadores en un ModalPopup.
Solución: Tanto los validadores como los controles que validan deben estar dentro de un ValidationGroup.
3º Mostrar ModalPopup programáticamente.
Exite un problema con éste control ya que la propiedad TargetControlID no puede estar vacía. El truco está en asignarle un control HTML del tipo Hidden y que tenga la propiedad runat="server". Luego, con ayuda de otro botón, se puede poner en code behind el código para mostrar al ModalPopup.
Ejemplo:
ModalPopupExtender1.Show()
La ventaja es que si estamos creando un modal con cuadros de texto dentro, éstos se pueden inicializar con el valor que queramos antes de que el modal aparezca.
Eso ocurre, porque cualquier botón, textbox, etc, que haga Postback, ya sea porque tiene la propiedad AutoPostBack en True o porque se lanza el evento PostBack desde código Javascript, tendremos como resultado que el ModalPopup termine su función. El control ModalPopup está programado para que se cierre cuando ocurra un PostBack dentro de éste.
Solución: La solución es usar Web Services. De hecho esta es la forma que se debería utilizar para actualizar controles dentro de un ModalPopup. Además hay que usar un evento de control HTML para que del lado del servidor llame al WebService. Generalmente se usa el evento onblur el cual equivale a TextChanged de un TextBox, suponiendo que el caso es un TextBox, para otros controles se podría usar el evento onchange.
2º No funcionan los validadores en un ModalPopup.
Solución: Tanto los validadores como los controles que validan deben estar dentro de un ValidationGroup.
3º Mostrar ModalPopup programáticamente.
Exite un problema con éste control ya que la propiedad TargetControlID no puede estar vacía. El truco está en asignarle un control HTML del tipo Hidden y que tenga la propiedad runat="server". Luego, con ayuda de otro botón, se puede poner en code behind el código para mostrar al ModalPopup.
Ejemplo:
ModalPopupExtender1.Show()
La ventaja es que si estamos creando un modal con cuadros de texto dentro, éstos se pueden inicializar con el valor que queramos antes de que el modal aparezca.
Ajax: Recuperar el ID de un control Web Server
En ocasiones hay que recuperar el ID de un control en Ajax.Net. en el código Javascript. Podemos usar el objeto getElementById, el objeto $get, $find, pero que ocurre si el objeto está en un ContentPlaceHolder. Si esto ocurre, el control en la página web toma un nombre de ID diferente; el nombre se complementa y para poner un ejemplo podría ser éste: ctl00_ContentPlaceHolder1_Button1
Para recuperar el ID exacto y poder usarlo correctamente, se puede usar la instrucción:
<%= expresion %>, donde expresion se cambia por el nombre del control que le asignamos del lado del servidor seguido de la propiedad ControlID.
Para recuperar el ID exacto y poder usarlo correctamente, se puede usar la instrucción:
<%= expresion %>, donde expresion se cambia por el nombre del control que le asignamos del lado del servidor seguido de la propiedad ControlID.
function fnTxt() {
var obj = $get('<%= TextBox1.ClientID %>');
...
}
Ajax: Lanzar un PostBack
Ejemplo para ejecutar un evento postback desde javascript usando el Ajax Framework:
function postbackFromJS(sender, e) { var postBack = new Sys.WebForms.PostBackAction(); postBack.set_target(sender); postBack.set_eventArgument(e); postBack.performAction(); }
Suscribirse a:
Entradas (Atom)