Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/06/2012, 15:47
Avatar de freesoftwarrior
freesoftwarrior
 
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 2 meses
Puntos: 10
Problema con eventos y ajax

Buenas tardes:
Aquí nuevamente solicitando el apoyo y orientación de ustedes. Gracias desde ya por ello.

Tengo un formulario con una pequeña rutina en Ajax que verifica si la cantidad ingresada (son dígitos por supuesto) no supera el stock disponible. La rutina de verificación funciona bien y la invoco de esta manera:

Cita:
<input type="text" id="cantidad<%= arrDBDataDetalles(0,J) %>" size="4"
value="<%= arrDBDataDetalles(3,J) %>"
class="texto_cantidad2" autocomplete="off"
onKeyPress="return acceptNum(event);"
title="Puede modificar la cantidad de items"
onKeyUp="showHint2(this.value,'<%= arrDBDataDetalles(2,J) %>',<%= arrDBDataDetalles(3,J) %>,<%= arrDBDataDetalles(0,J) %>);"
onChange="actualizarCantidad(this.value, '<%= arrDBDataDetalles(0,J) %>',<%= arrDBDataDetalles(3,J) %>,'<%= arrDBDataCatalogo(0,0) %>');">
La rutina Ajax la invoco con el evento onKeyPress y funciona bien ya que verifica la cantidad ingresada.... PERO, si por ejemplo el stock disponible es 5 y la cantidad mostrada es 15 (es decir, ese valor, 15, ya había sido ingresado previamente y validado, grabado en una base de datos y recuperado nuevamente, por eso el código ASP), pulso Tab y me voy al siguiente campo, Y SI REGRESO vía Ctrl + Tab pues "salta" la función y toma el valor 15 como si fuera un nuevo valor y obviamente mostrará el aviso correspondiente porque en stock sólo hay 5.

Resumiendo, si utilizando la tecla Tab o las teclas Ctrl + Tab (según sea el caso) me ubico en un campo, el que sea, verificará el monto mostrado AUNQUE no haya sido ingresado.

El código Ajax que uso es el siguiente

Cita:
function nuevoAjax()
{
var xmlhttp=false;

try
{xmlhttp = new XMLHTTPRequest();}
catch(err1)
{
try
{xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");}
catch (err2)
{
try
{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}
catch (err3)
{xmlhttp = false;}
}
}
return xmlhttp;
}

var xmlHttp
function showHint(str,codart,original,idcot)
{
if (str.length==0)
{
document.getElementById("txtHintD").innerHTML="";
document.getElementById("txtHintD").style.visibili ty="hidden";
return;
}

xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Su navegador no soporta AJAX");
return;
}

var url="../setup/ajax/ingAjaxVerificarStock.asp";

url=url+"?q="+str+"&codart="+codart+"&original="+o riginal+"&idcot="+idcot;
url=url+"&sid="+Math.random();
xmlHttp.onreadystatechange=stateChanged;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}

function stateChanged()
{
if (xmlHttp.readyState==4)
{
document.getElementById("txtHintD").innerHTML=xmlH ttp.responseText;
micontrol = unescape(xmlHttp.responseText);
arrMiControl=micontrol.split(",");
if(arrMiControl[0]=="ND")
{
document.getElementById("txtHintD").style.visibili ty="hidden";
document.getElementById("validarStock").value="";
document.getElementById("validarStockMontoOriginal ").value=arrMiControl[1];
document.getElementById("validarStockIdCampo").val ue=arrMiControl[2];
}
else
{
document.getElementById("txtHintD").style.visibili ty="visible";
if(xmlHttp.responseText != "ND")
{document.getElementById("validarStock").value="no ";}
//setTimeout("cerrarNumDoc()",5000);
}
}
}

function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");}
catch (e)
{xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");}
}
return xmlHttp;
}

function cerrarNumDoc()
{document.getElementById("txtHintD").style.visibil ity="hidden";}
y el archivo ASP que verifica el stock tiene este código

Cita:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>

<!-- #include file="../cabecera.asp" -->

<%
varCantidad=Request.QueryString("q")
varCodArt=Request.QueryString("codart")
varMontoOriginal=Request.QueryString("original")
varIdCot=Request.QueryString("idcot")

If varCantidad <> varMontoOriginal Then

Temp="Select * From Catalogo Where CodArt='" & varCodArt & "'"

Tabla1.Open Temp, Conexion
If CInt(Tabla1("Stock")) < CInt(varCantidad) Then
Response.Write("La cantidad que ha ingresado supera en " & varCantidad - Tabla1("stock") & " unidades el stock disponible.<br>El m&aacute;ximo disponible es de " & Tabla1("stock") &" unidades)")
Else
Response.Write("ND," & varMontoOriginal & "," & varIdCot)
End If
Tabla1.Close

Else
Response.Write("ND," & varMontoOriginal & "," & varIdCot)
End If

%>
Como aclaración, el archivo include es para conexión y otras variables que nada tienen que ver con esta función, es decir, por ahí no es el problema.

Pienso que la solución es poner alguna condición para que cuando obtenga el foco NO inicie la rutina de validación, pero no he logrado imaginar como incluirlo. Pensé en el evento onFocus pero eso no bloquearía el que se ejecute la función del evento onKeyPress. Probé colocando una condicional en el ASP para que sólo acepte números y nada más, pero igual, sigue mostrando el mensaje de advertencia como si hubiera sido ingresado la cantidad.

¿Alguna sugerencia?

Muchas gracias por su tiempo.
Un saludo desde Lima, Perú


SOLUCIONADO
Se me prendió el foco y opté por agregar una simple línea al código ASP. Considerando que el problema se presenta cuando al ubicarme en el campo mediante combinación de teclas (Tab o Ctrl + Tab) la función toma el valor del campo debido al this.value del evento onKeyUp (y esto debe ser así para poder comparar montos), se me ocurrió que el asunto es indicarle al sistema que si el monto ingresado es igual al monto original, pues que no haga nada (o lo mismo sería decirle que si el monto ingresado es diferente al monto original entonces HAZ algo). Y así fue como agregando las líneas en negrita en el código ASP logré solucionar mi dilema

Comparto por si a alguien le pueda ser útil en algún momento.

Última edición por freesoftwarrior; 07/06/2012 a las 21:31 Razón: Solucioné el problema.....