Cuando liberas una tecla

Hola de nuevo
Tengo la siguiente duda.
¿Es posible saber exactamente en qué momento se libera una tecla?, es decir, cuando presionas una tecla hay dos eventos, presionar y liberar.
Todo es a consecuencia de un grid en el que tengo una consulta con datos de un servidor postgres, al desplazarse por el grid, se tenían que actualizar varios controles con los valores que les correspondiera (algunos de los controles toman su datos de unas vistas). El problema es que en algunas ocasiones no actualizaba los datos (o por lo menos eso parecía) porque algunos controles quedaban en blanco.
Probé de casi todo, relaciones, filtros, hasta consultas parametrizadas de mis vistas (poco lógico, lo sé) y al final opté por: "Si estoy trabajando en un servidor, utilicemos el motor del servidor" (ooooohhhh! ;-) ).
Ahora estoy utilizando consultas parametrizadas desde el servidor, la cuestión es que en el evento AfterRowColChange, ejecuto todas mis consultas y actualizo los valores del formulario, sólo que ahora si mantienes presionadas alguna de las teclas Up Arrow, Down Arrow, el grid se desplaza más lento.
Mi idea es que si puedo saber en qué momento se libera la tecla en ese momento ejecutar las consultas.
Espero haberme explicado. Gracias

1 Respuesta

Respuesta
El evento de presionar una tecla implica presionar y soltarlo, antes de soltarlo aun no se ha disparado el evento, mismo con el click, la documentación dice claramente que es al presionar y soltar, con respecto a los grid yo particularmente utilizo el evento when o valid de los text en las columnas del grid, es una cuestión de gusto y tengo mejores resultados allí, ahora que se vuelva lento no se si se soluciona con eso, por que si ejecutas consultas con cada movimiento no es lo más recomendable, pero hay que probarlo.
De hecho la idea inicial era no hacerlo de este modo, pero como te comentaba, cuando manejaba las vistas (porque los datos están en un servidor postgres) relacionadas, las tablas sí se posicionaban en donde debía, pero los controles del formulario no siempre se actualizaban o quedaban en blanco; entonces al hacer alguna validación con los valores de los controles no siempre lo hacía bien. Para hacer la actualización de los controles utilicé "GO TOP" para que se ejecutara la relación y "Refresh" para los controles y/o el formulario pero tampoco funcionó.
Después de dar algunas vueltas, me encontré que con las consultas sí actualiza los datos correctamente y como no hay más datos que los que pedí, no hay problema con la incongruencia de información (no sé por qué, pero así fue, así fue...)
Si de algo sirve, estoy utilizando un servidor postgres instalado en linux, me conecto vía ODBC y los equipos de desarrollo y clientes son Windows Vista, por cierto en éstos equipos al momento de enviar a imprimir y regersar al formulario de origen queda la pantalla con "fantasmas" (en algunas partes de la pantalla) de la impresión que se acaba de enviar.
Gracias
Ok, ¿estas usando la función REQUERY()?, ¿Antes del refresh?, particularmente no trabajo con vistas remotas, trabajo si con MYSQL, que es casi lo mismo que POSTGRES, pero trabajo con Paso SQL, envío los comandos por SQLEXEC() y me los devuelve en un cursor, este cursor lo vinculo al grid y listo, las vistas remotas se vuelven inestables e ineficientes cuando crecen la información, ademas no sabemos lo que hace por detrás de nuestro programa, eso me preocupa cuando hablamos por encima de 500mil registros.
Pega un pedazo de código aquí en la parte del problema.
Precisamente, como las vistas remotas son un verdadero relajo, estoy haciendo consultas, sólo tengo una vista remota cargada completa (v_consulta) y es la que está vinculada al Grid, de ésta tomo los parámetros para realizar mis otras consultas y actualizar datos.
Los parámetros son mEstado, mAnalisis y mConsec
      mAnalisis=v_consulta.di_analisis_n
      mEstado=v_consulta.di_estado_c
      mConsec=v_consulta.di_consec_n
Armo mis consultas y ejecuto
      "gnconn" es mi variable de conexión
wq_consulta = "SELECT * "+;
"FROM expedientes "+;
"WHERE ex_estado_c=?mEstado AND ex_analisis_n=?mAnalisis AND ex_consec_n = ?mConsec "+;
"ORDER BY ex_analisis_n, ex_consec_n"
SQLEXEC(gnconn, wq_consulta, "vw_expedientes")
wq_consulta = "SELECT * "+;
"FROM dictamen "+;
"WHERE di_estado_c=?mEstado AND di_analisis_n=?mAnalisis AND di_consec_n = ?mConsec "+;
"ORDER BY di_analisis_n, di_consec_n"
SQLEXEC(gnconn, wq_consulta, "vw_dictamen")
wq_consulta = "SELECT * "+;
"FROM folios "+;
"WHERE fo_estado_c=?mEstado AND fo_analisis_n=?mAnalisis AND fo_consec_n = ?mConsec "+;
"ORDER BY fo_analisis_n, fo_consec_n"
SQLEXEC(gnconn, wq_consulta, "vw_folios")
wq_valor = v_consulta.di_estado_c
wq_consulta = "SELECT regiones.re_nombre_c, regiones.re_clave_n, estados.es_clave_c "+;
"FROM estados LEFT OUTER JOIN regiones ON estados.es_region_n = regiones.re_clave_n "+;
"WHERE estados.es_clave_c = ?wq_valor "+;
"ORDER BY estados.es_clave_c, estados.es_region_n"
SQLEXEC(gnconn, wq_consulta, "qry_regiones")
wq_valor = v_consulta.ex_region_n
wq_consulta = "SELECT sa_nombre_c, sa_clave_n, sa_region_n "+;
"FROM salas "+;
"WHERE sa_region_n = ?wq_valor "+;
"ORDER BY sa_clave_n"
SQLEXEC(gnconn, wq_consulta, "qry_salas")
wq_valor = v_consulta.di_estado_c
wq_consulta = "SELECT ci_nombre_c, ci_clave_n, ci_estado_c "+;
"FROM circuitos "+;
"WHERE ci_estado_c = ?wq_valor "+;
"ORDER BY ci_clave_n"
SQLEXEC(gnconn, wq_consulta, "qry_circuito")
wq_valor = v_consulta.ex_circuito_n
wq_consulta = "SELECT au_nombre_c, au_clave_n, au_circuito_n "+;
"FROM autoridad "+;
"WHERE au_circuito_n = ?wq_valor "+;
"ORDER BY au_clave_n"
SQLEXEC(gnconn, wq_consulta, "qry_autoridad")
wq_valor = v_consulta.di_tipo_n
wq_consulta = "SELECT ca_supuesto_c, ca_clave_n, ca_alcances_t, ca_acciones_t, ca_medidas_t, ca_sentencia_n "+;
"FROM causales "+;
"WHERE ca_sentencia_n = ?wq_valor "+;
"ORDER BY ca_supuesto_c"
SQLEXEC(gnconn, wq_consulta, "qry_causales")
*SET FILTER TO ca_sentencia_n = wq_valor IN qry_causales
SELECT v_consulta
WITH ThisFormSet.frm_principal.PgsAnalisis.pgAntecedentes && Pestaña Antecedentes
WITH .cont_juicio && Contenedor Juicio
IF vw_expedientes.ex_amparo_c= "J" &&& Tipo de Juicio &&& SI NULIDAD
.Parent.Opt_tipo.Value = 1
.label8.caption="Región"
.label9.caption="Sala"
.CmbEx_Autoridad_n.Visible=.f.
.CmbEx_Circuito_n.visible=.f.
.CmbEx_region_n.Visible=.t.
.CmbEx_sala_n.Visible=.t.
WITH .CmbEx_region_n
.RowSource = 'qry_regiones'
.ColumnCount = 2
.ColumnWidths = '500,60'
.BoundColumn = 2
.BoundTo = .T.
.Requery
.Value = v_consulta.ex_region_n
.Refresh
ENDWITH
WITH .CmbEx_sala_n
.RowSource = 'qry_salas'
.ColumnCount = 2
.ColumnWidths = '500,60'
.BoundColumn = 2
.BoundTo = .T.
.Requery
.Value = v_consulta.ex_sala_n
.Refresh
ENDWITH
.Cmmd_nue_Auto.Visible= .F.
ELSE &&& SI AMPARO
.Parent.Opt_tipo.Value = 2
.label8.caption="Circuito"
.label9.caption="Autoridad"
.CmbEx_region_n.Visible=.f.
.CmbEx_sala_n.Visible=.f.
.CmbEx_Autoridad_n.Visible=.t.
.CmbEx_Circuito_n.visible=.t.
WITH .CmbEx_Circuito_n
.RowSource = 'qry_circuito'
.ColumnCount = 2
.ColumnWidths = '500,60'
.BoundColumn = 2
.BoundTo = .T.
.Requery
.Value = v_consulta.ex_circuito_n
.Refresh
ENDWITH
WITH .CmbEx_Autoridad_n
.RowSource = 'qry_autoridad'
.ColumnCount = 2
.ColumnWidths = '500,60'
.BoundColumn = 2
.BoundTo = .T.
.Requery
.Value = v_consulta.ex_autoridad_n
.Refresh
ENDWITH
.Cmmd_nue_Auto.Visible= .t.
ENDIF && Fin Tipo de Juicio
IF ISNULL(vw_expedientes.ex_fecnoti_d) && Si no hay Fecha de notificación
.oleEx_fecnoti_d.DoVerb(-3)
.oleEx_fecnoti_d.visible= .F.
.ChkEx_fecnoti_d.Value=0
ELSE
.oleEx_fecnoti_d.DoVerb(0)
.oleEx_fecnoti_d.visible= .T.
.OleEx_fecnoti_d.Object.Value = vw_expedientes.ex_fecnoti_d
.ChkEx_fecnoti_d.Value=1
.OleEx_fecnoti_d.refresh
ENDIF
ENDWITH && Fin contenedor Juicio
ENDWITH && Fin pestaña Antecedentes
WITH ThisFormSet.frm_principal.PgsAnalisis.pgCausal
WITH .CmbCa_clave_n
.RowSource = 'qry_causales'
.ColumnCount = 2
.ColumnWidths = '600,60'
.BoundColumn = 2
.BoundTo = .T.
.Requery
.Value = vw_dictamen.di_causal_n
.Refresh
ENDWITH
.lbl_Mod_alcances.Caption = "( M O D I F I C A D O )"
.lbl_Mod_acciones.Caption = "( M O D I F I C A D O )"
.lbl_Mod_medidas.Caption = "( M O D I F I C A D O )"
.lbl_Mod_alcances.Visible = .F.
.lbl_Mod_acciones.Visible = .F.
.lbl_Mod_medidas.Visible = .F.
DO CASE
** Alcances
CASE LEN(vw_dictamen.di_alcances_t) > LEN(qry_causales.ca_alcances_t)
.lbl_Mod_alcances.Caption = .lbl_Mod_alcances.Caption + " A M P L I A D O"
.lbl_Mod_alcances.Visible = .T.
CASE LEN(vw_dictamen.di_alcances_t) < LEN(qry_causales.ca_alcances_t)
.lbl_Mod_alcances.Caption = .lbl_Mod_alcances.Caption + " R E D U C I D O"
.lbl_Mod_alcances.Visible = .T.
** Acciones
CASE LEN(vw_dictamen.di_acciones_t) > LEN(qry_causales.ca_acciones_t)
.lbl_Mod_acciones.Caption = .lbl_Mod_acciones.Caption + " A M P L I A D O"
.lbl_Mod_acciones.Visible = .T.
CASE LEN(vw_dictamen.di_acciones_t) < LEN(qry_causales.ca_acciones_t)
.lbl_Mod_acciones.Caption = .lbl_Mod_acciones.Caption + " R E D U C I D O"
.lbl_Mod_acciones.Visible = .T.
** Medidas
CASE LEN(vw_dictamen.di_medidas_t) > LEN(qry_causales.ca_medidas_t)
.lbl_Mod_medidas.Caption = .lbl_Mod_medidas.Caption + " A M P L I A D O"
.lbl_Mod_medidas.Visible = .T.
CASE LEN(vw_dictamen.di_medidas_t) < LEN(qry_causales.ca_medidas_t)
.lbl_Mod_medidas.Caption = .lbl_Mod_medidas.Caption + " R E D U C I D O"
.lbl_Mod_medidas.Visible = .T.
ENDCASE
ENDWITH
SELECT v_consulta
ThisFormSet.frm_principal.Refresh
ThisFormSet.Form2.Refresh
w_men_causal = "Existe una incongruencia en la causal, esto se puede deber a que la clave no corresponda con el tipo de análisis"
IF vw_dictamen.di_causal_n <> qry_causales.ca_clave_n THEN
MESSAGEBOX(w_men_causal, 48, 'Verifique datos')
ThisFormSet.frm_principal.pgsAnalisis.ActivePage=1
ENDIF
ThisFormSet.frm_principal.Refresh
ThisFormSet.Form2.Refresh
Esto es lo que tengo en el Grid para cada vez que cambio de registro, ahora bien si mantengo la tecla presionada (sin soltarla), se ejecuta el código, por eso era la pregunta de si se puede controlar el evento Up.
Bueno en el código no puedo analizarlo todo por el corto tiempo que tengo, mi opinión en realidad era un cambio de metodología, pero siguiendo tu esquema tuve que re leer la pregunta, el problema inicial era la lentitud de tu grid, lógicamente por que el usuario se pasa paseando con el cursor, la lentitud es inevitable si pones consultas en varias ocasiones, ¿has probado mis sugerencias de programar en el evento when?, si no realizas mis sugerencias y me dices los resultados poco o nada puedo ayudarte, de lo contrario tendré que descartar la pregunta.
Ok, en el caso de las vistas relacionadas. No funcionó, todo sigue igual (incongruencia al mostrar la información)
Para el evento When en las columnas, coloqué el filtro y algunas carcaterísticas para mostrar los datos correctamente. Todo igual (lento)
Ejecutando SQLEXEC(). Muestra los datos correctamente aunque un poco lenta.
Al decir lento, me refiero a que el grid no se desplaza igual que si no tuviera ningún código adicional, pero sólo es una cuestión de apreciación.
Por otra parte, me cabo de dar cuenta que si acabo de encender mi equipo e iniciar el programa, el grid se mueve perfectamente y poco a poco se "alenta", lo que me hace pensar que seguramente en el transcurso de la operación "algo" se queda en memoria. Lo curioso es que únicamente es en éste sistema, todos los demás programas del equipo funcionan correctamente.
Gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas