Foros del Web » Programando para Internet » Javascript »

Problema con eventos y ajax

Estas en el tema de Problema con eventos y ajax en el foro de Javascript en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/06/2012, 15:47
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 1 mes
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.....
  #2 (permalink)  
Antiguo 08/06/2012, 02:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con eventos y ajax

Un comentario.

Dices que una vez ingresado el monto ya se descuenta del stock.

Que pasa si el usuario no completa el formulario...

No deberías verificar si el monto es correcto pero no realizar la operación hasta que se complete el formulario....ojo con la concurrencia si estas en un entorno multi usuario...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 08/06/2012, 06:32
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 1 mes
Puntos: 10
Respuesta: Problema con eventos y ajax

No, no me he dejado entender me parece. En este caso puntual, se trata de un formulario que se llena con datos ingresados previamente, y que por supuesto han sido validados. Lo que hace esta función es verificar en tiempo real si el monto que se esta ingresando supera al stock disponible. El valor que indico, de 15, fue ingresado así y fue aceptado porque en su momento había stock disponible, pero luego quedo, digamos 10, y al recargar el formulario, ese mismo día, hora u en otro momento, si me ubico en el input utilizando Tab o Ctrl+Tab, saltaba la función del evento onKeyUp y claro, como ahí indico this.value pues tomaba el que ya estaba ingresado, y no el que podría estar ingresándose.

Espero haberme explicado mejor ahora.

Gracias por tu interés.

Etiquetas: ajax, eventos, formulario, funcion, html, input
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:39.