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.
Suscribirse a:
Entradas (Atom)