Filtrar datawindow y mostrar detalle del registro

Desde ya te agradezco por tu tiempo y por la ayuda que me puedas brindar; tengo lo siguiente:

Un Datawindow que contiene el listado de registros y otro datawindow que muestra el detalle de cada registro al seleccionar uno del listado, hasta allí todo funciona bien.

Cuando estoy buscando un registro en la lista mediante una caja de texto, se van filtrando los datos siempre y cuando haya un registro o registros que contengan dicha letra, pero si no hay ningún registro con dicha letra me arroja un error, el código de la caja de texto es el siguiente y esta dentro de un evento llamado keyup:

string ls_buscar
ls_buscar=this.text
if ls_buscar = "" then
dw_lista.SetFilter("")
else
ls_buscar="%" + trim(this.text)+"%"
dw_lista.SetFilter("upper(pre_nombre) like '"+ ls_buscar +"'")
end if
dw_lista.Filter( )

1 respuesta

Respuesta
1

¿Cuál es el error que sale?

Bueno, corregí mi problema en parte con el siguiente código:

string ls_buscar
integer fila
ls_buscar=this.text
if ls_buscar = "" then
dw_lista.SetFilter("")
else
ls_buscar= trim(this.text)+"%"
fila = dw_lista.find("upper(cli_nombres) like '"+ ls_buscar +"'",1,dw_lista.rowcount())
if fila>0 then
dw_lista.SetFilter("upper(cli_nombres) like '"+ ls_buscar +"'")
end if
end if
dw_lista.Filter( )

Es decir el código anterior me muestra todos los registros de acuerdo a lo que ingreso

Nombres:

Dante, Daniel, Ruben, Ronald, Doris

Si busco

D; aparecen Dante, Daniel, Doris

Pero si busco Du; no debe mostrarme ningún dato y me sigue mostrando Dante, Daniel, Doris

lo que deseo es que no muestre ningún registro debido a que no hay ningún registro que inicie con Du, que me avise con un msje; como lo puedo hacer

Allí estás usando las funciones find y filter, no es necesario usar las 2 funciones para buscar y filtrar a la vez.

En cuanto por qué te muestran los datos, tu código:

fila = dw_lista.find("upper(cli_nombres) like '"+ ls_buscar +"'",1,dw_lista.rowcount())
if fila>0 then
  dw_lista.SetFilter("upper(cli_nombres) like '"+ ls_buscar +"'")
end if

* cuando usas find al no encontrar el registro no ingresa a setfilter, porque no cumple la condición fila > 0, por lo tanto no filtra por el ultimo carácter que ingresaste, y te muestra datos que si cumplieron con la condición de filtrado anterior

Para saber si hay registros puedes usar la función rowcount

ROWCOUNT().- Obtiene el número de filas que están disponibles actualmente en un control DataWindow o DataStore.

if  dw_lista.rowcount() = 0 then
//messagebox('Titulo','No hay registros')
end if

Ahora si quieres algo más avanzado en el evento constructor del control datawindow colocas esto:

string ls_modify_string
string ls_error_string
long ll_x, ll_y
ll_x = (this.width - 700 )/ 2
ll_y = (this.height - 57 )/ 2
ls_modify_string = 'create text(band=foreground alignment="0" ' &
+ 'text="No se han encontrado registros" border="0" color="0" ' &
+ 'x="' + String(ll_x) + '" y="' + String(ll_y) + '" ' &
+ 'height="57" width="700" name=no_rows_found ' &
+ 'font.face="Arial" font.height="-8" font.weight="400" ' &
+ 'font.family="2" font.pitch="2" font.charset="0" ' &
+ 'background.mode="1" background.color="553648127" ' &
+ 'visible="1~tIF(RowCount()=0,1,0)")'
ls_error_string = Modify(ls_modify_string)

Lo que hace es mostrarte en el control datawindow 'No se han encontrado registros'

Saludos desde Lima-Peru

El código del find es para cerciorarme de que al menos hay un registro con esa(s) letra(s) y luego filtro; en caso no encuentre me muestra los registros que al menos cumplieron parte de la busqueda.

Si no utilizo find, al ingresar una letra diferente a las que hay en mis registros automaticamente me muestra error y alli se muestra el mensaje generado por tu codigo en el evento constructor. Te agradeceria me indiques como haces para que al momento de ir escribiendo una busqueda esta muestre aquellos registros que coinciden con el; pero considerando que si ingreso una letra que no forma parte de algun registro de los mostrados no me arroje del programa mas bien me muestre el mensaje que genera tu codigo.

Espero haberme explicado bien

El código para filtrar:

string ls_buscado
ls_buscado = trim( text )
if ls_buscado = '' or isnull(ls_buscado) then
   dw_lista.setfilter("")
else
   ls_buscado = upper(ls_buscado)
   dw_lista.setfilter("UPPER(string("+columna+")) like '"+ls_buscado+"'")
end if
Dw_lista.. filter()

Aquí hay un ejemplo como hacer una búsqueda interactiva: http://www.joomla-gnu.com/powerbuilder/búsqueda-interactiva-en-powerbuilder-115.html

En cuanto a lo que dices "Si no utilizo find, al ingresar una letra diferente a las que hay en mis registros automáticamente me muestra error" y "si ingreso una letra que no forma parte de algún registro de los mostrados no me arroje del programa", mi pregunta ¿cuál es error o problema?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas