Buscar en un datawindow sin presionar enter

Mi problema es este quiero hacer una búsqueda desde un singlelineedit el caso es que lo que quiero es que al momento de ir escribiendo automáticamente me muestre los resultados de la búsqueda por ejemplo:
Si en mi singlelineedit escribo una a en el datawindow me mostraría todos los datos que comiencen con una a y así sucesivamente hata que haya escrito la palabra completa.

2 Respuestas

Respuesta

Integer liFila

liFila = dw_Modelo.Find("Mid(bpctipproddet_num_mod_fig,1," + String(Len(sle_BuscaModelo.Text)) + ") = '" + sle_BuscaModelo.Text + "'", 1,dw_modelo.RowCount())

If liFila > 0 Then
dw_modelo.SelectRow(0,False)
dw_modelo.ScrollToRow(liFila)
dw_modelo.SelectRow(liFila,True)
End If

Integer liFila

liFila = dw_Modelo.Find("Mid(bpctipproddet_num_mod_fig,1," + String(Len(sle_BuscaModelo.Text)) + ") = '" + sle_BuscaModelo.Text + "'", 1,dw_modelo.RowCount())

If liFila > 0 Then
dw_modelo.SelectRow(0,False)
dw_modelo.ScrollToRow(liFila)
dw_modelo.SelectRow(liFila,True)
End If

Respuesta
1
Para poder solucionar tu problema debes crear un evento en el objeto singlelineedit, el cual puede tener como nombre ue_keyup y debes escoger en la sección Event ID: pbm_keyup.
Ahí deberás poner lo siguiente:
Suponiendo que el campo a buscar se llame des_cargo
Long ll_fila
ll_fila = dw_1.Find("des_cargo like '" + text + "%'",1,dw_1.Rowcount())
dw_1.selectrow(0,FALSE)
dw_1.selectrow(ll_fila,true)
dw_1.SetRow(ll_fila)
Cualquier duda solo pregunta, caso contrario
Puse el código tal como me dijiste pero no sale, se enfocan todos los registros, lo que pretendía era una búsqueda sensible, estoy usando Base de datos por eso, quería poner en mi sle_1 los datos de la persona(nombre, apellidos) o su código (1,2..), osea buscar por cualquiera de los 2 pero no me sale, con el código que me distes ni siquiera un registro busca, sa sombrean todos, espero que me ayudes de nuevo = muchas gracias por tu aporte.
Me parece muy raro que no funcione, lo he probado acá y funciona perfectamente, pero bueno, haber intenta con este código:
Long ll_fila
String ls_columna,ls_busca
ls_columna = nombre_del_campo //debe poner el nombre del campo a buscar
ls_busca = "left("+ls_columna+","+string(len(text))+") = '"+text+"'"
ll_fila = dw_1.Find(ls_busca,1,dw_1.Rowcount())
IF ll_fila>0 THEN
dw_1.selectrow(0,FALSE)
dw_1.selectrow(ll_fila,true)
dw_1.SetRow(ll_fila)
END IF
Tienes que tener encuenta las mayúsculas y minúsculas.
Acuérdate que el evento debe pertenecer al sle.
Cualquier otra duda solo pregunta.
Disculpa mi insistencia es que no me sale, bueno seré más especifico, quiero hacer un filtro y que me vaya saliendo con la ayuda de power builder, que apenas escribo una letra, me sale todo lo que empieza con esa letra y así conforme escriba vaya siendo más especifica la búsqueda, estoy trabajando con SQL server 2005, en mi DW no se si deba poner argumento de recuperación de todas manera pregunto derrapent por ahí esta mi error, aunque no le puse, poreso mi pregunta, por ayudame y disculpa que te moleste a cada rato, gracias.
Me olvide algo podrías explicarme paso a paso el código anterior, gracias.
Bueno entonces en vez de utilizar un sle, utiliza un dw externo (que puede llamarse dw_busqueda)con un solo campo (que puede llamarse búsqueda), para ello pones lo siguiente:
En el evento constructor del dw_busqueda:
dw_busqueda.SetTransObject(SQLCA)
dw_busqueda.InsertRow(0)
En el evento editchanged del dw_busqueda:
AcceptText()
String ls_texto,ls_busca
Int li_longitud
//Capturamos el texto ingresado en el dw_externo
ls_texto = Upper(GetItemString(row,"busqueda"))
//Sacamos la longitud del texto ingresado
li_longitud = len(ls_texto)
//Armamos nuestro filtro por el cual se mostrará los datos y lo almacenamos en la variable ls_busca
ls_busca = "upper(left(nombre_campo," + String(li_longitud) + ")) = '" + ls_texto + "'"
//Ejecutamos el Filtro
dw_registros.SetFilter (ls_busca)
dw_registros.Filter()
Nota: dw_registros, viene hacer el dw donde se encuentra toda la data y deseamos realizar los filtros, para ello deberá tener todos lo datos ya mostrados.
Bueno espero que con esto se solucione tu problema, caso contrario realiza un debug y vez donde está el problema.
Cualquier otra duda me avisas.
Insisti con el 1ero codigo y ya me salio algo.
Long ll_fila
ll_fila = dw_1.Find("des_cargo like '" + text + "%'",1,dw_1.Rowcount())
dw_1.selectrow(0,FALSE)
dw_1.selectrow(ll_fila,true)
dw_1.SetRow(ll_fila)
Pero la cosa es cuando hay 2 personas con el mismo apellido por ejem ARROYO no se muestran al principio del dw, si busco ARROYO VASQUEZ por ejem que tiene el código 3 se muestra al principio, pero si es ARROYO TORRES que esta en el código 20 no se se muestra al inicio del dw, y tengo que bajar hasta la parte final hasta encontrarlo, debería mostrarse al principio porque la búsqueda es como un filtrado. Ademas no se como o donde colocar UPPER para que me acepte las mayúsculas en el código, por favor explicame el 1ero código que me pusiste, gracias.
Bueno lo que puedes hacer es ordenar el dw por el campo a buscar, antes de hacer la búsqueda, luego al hacer la búsqueda siempre te mostrar el primero nombre que cumpla la condición, los demás estarán en la parte de abajo en forma consecutiva.
Para ordenar debes poner:
dw_1.SetSort("des_cargo A")
dw_1.Sort()
Esto debes ponerlo despues de hacer el retrieve.
Y para poder todo en mayuscula, corrige esta parte
ll_fila = dw_1.Find("des_cargo like '" + text + "%'",1,dw_1.Rowcount())
cambiala a:
ll_fila = dw_1.Find("upper(des_cargo) like '" + upper(text) + "%'",1,dw_1.Rowcount())
Otra forma que puedes hacer es usando el SETFILTER.
String ls_filtrar
Long ll_longitud
ll_longitud = len(text)
ls_filtrar = "upper(left(des_cargo,ll_longitud))='"+upper(text)+"'"
dw_1.SetFilter(ls_filtrar)
dw_1.Filter()
Con esta forma solo te mostrará todos los nombres que cumplan esa condición, los nombres que no cumplan no se visualizará.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas