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á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.