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:
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. <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) %>');">
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) %>');">
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:
y el archivo ASP que verifica el stock tiene este códigofunction 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";}
{
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";}
Cita:
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.<%@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
%>
<!-- #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
%>
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.