Antonio Linares wrote:
Estimado Jose Luis,
Prueba asÃ:
#include "FiveWin.ch"
function Main()
local oDlg, cBuscar := Space( 40 ), oCbx, aVacio := {}
USE clientes NEW SHARED // tu tabla
DEFINE DIALOG oDlg TITLE "Búsqueda" SIZE 320, 200
@ 1, 2 SAY "Buscar:" OF oDlg
@ 3, 2 COMBOBOX oCbx VAR cBuscar ITEMS aVacio ;
SIZE 200, 120 ;
STYLE CBS_DROPDOWN ; // <-- editable (con GET)
VALID BuscarYRecargar( oCbx, cBuscar ) // se dispara al dar ENTER
@ 3, 26 BTNBMP ... OF oDlg // otros controles
ACTIVATE DIALOG oDlg CENTER
return nil
function BuscarYRecargar( oCbx, cTexto )
local aItems := {}
cTexto := AllTrim( cTexto )
// ===== Aquà tu QUERY WHERE ... LIKE =====
// SQL (FWMaria/ADO/SQLite): SELECT nombre FROM clientes
// WHERE UPPER(nombre) LIKE '%" + Upper(cTexto) + "%'
//
// Equivalente con DBF (recorriendo y filtrando con AT):
IF ! Empty( cTexto )
clientes->( dbGoTop() )
WHILE ! clientes->( Eof() )
IF AT( Upper( cTexto ), Upper( clientes->nombre ) ) > 0
AAdd( aItems, clientes->nombre )
ENDIF
clientes->( dbSkip() )
END
ENDIF
// =========================================
// Reemplaza el array vacÃo / anterior por el nuevo:
oCbx:SetItems( aItems, .T. )
// (Opcional) Despliega la lista de inmediato para elegir:
// oCbx:Open()
return .T. // .T. para que el foco pueda salir del control
Si quieres que al dar Enter la lista se abra sola y el foco se quede en el GET (sin saltar al siguiente control), intercepta el Enter en el oGet y evitas la navegación por defecto:
// después de crear oCbx:
local bDef := oCbx:oGet:bKeyChar
oCbx:oGet:bKeyChar := { | nKey | ;
If( nKey == 13, ; // VK_RETURN
( BuscarYRecargar( oCbx, cBuscar ), ; // tu búsqueda
oCbx:Set( cBuscar ), ; // deja el texto tecleado
oCbx:Open(), ; // abre el desplegable
0 ), ; // 0 = no navegar
Eval( bDef, nKey ) ) } // resto de teclas normal
Y en BuscarYRecargar haz oCbx:SetItems( aItems, .T. ) y ya no necesitas el VALID (o puedes dejarlo también; no molesta).
Si usas TDbCombo (dbcombo con GET)
El método equivalente es SetItems( aItems, aList, .T. ) (III params). Lo mismo: búscalo en VALID y reemplaza el array.
¿Quieres que te adapte el ejemplo a tu motor concreto (FWMaria/ADO/SQLite o DBF) o a TDbCombo?
***********************
Antonio, uso es DBCOMMBO, fijate, el VALID se dispara al dar el ENTER, pero no lleva a la funcion, el valor entrado en el GET, pero si le doy al boton de despliegue del DBCOMBO, entonces se dispara el VALID y si lleva el valor entrado en el GET, necesito es que lo lleve al dar enter...estoy usando mysql.. gracias
REDEFINE DBCOMBO aGetLla[10] VAR aVarLla[10] ID 4004 OF oFldx:aDialogs[1] UPDATE ; // NOM.SEC.ORI
ITEMS aSecOri1 ;
LIST aSecOri2 ;
VALID ( nuevo_buscador( aVarLla[10], aGetLla[10] ) )
---------------
FUNCTION nuevo_buscador( cSecOriDes, oGetOriDes ) // NUEVO BUSCADOR DESDE DBCOMBO - 26/06/2026
? "nuevo_buscador: ", cSecOriDes
RETURN .t.
Dios no está muerto...
Gracias a mi Dios ante todo!