Yo lo hago de esta manera si te refieres al Get junto con Button, ojo esto lo tengo usando mysql y la clase tdolphin de Daniel, pero es 100% adaptable a DBF, espero le sirva a alguien o si es lo que necesitas, cualquier duda, aca estamos, saludos
codigo
REDEFINE GET aGetP[7] VAR aVarP[7] ID 108 OF oFolder:aDialogs[1] PICTURE '@!' ; // COD.CLINICA
ACTION( IIF( EMPTY( aVarP[7] := llamabrow( aVarP[7], "clinicas", "cli_codigo" ,;
{"cli_codigo","cli_nombre"}, {"Código","Nombre"} ) ), .F., .T. ) ) ;
VALID( IIF( !novacio( aVarP[7] ), .F. ,;
( bQry := buscar( aVarP[7], "clinicas", "cli_codigo" ) ,; // RECIBE array {logico(.t.,.f.), query}
IIF( !bQry[1], ( .F. ) ,;
( aVarP[8] := bQry[2]:cli_nombre, aGetP[8]:REFRESH(), .T. ) ) ) ) ) ;
WHEN ( !EMPTY( aVarP[1] ) )
codigo
FUNCTION llamabrow( aVar, cTabla, cCampo, aCampos, aTitulos )
// aVar -> contenedora del valor entrado (puede llegar vacio solo para seleccionar)
// cTabla -> nombre de la tabla para hacer el query
// cCampo -> nombre del campo para ordenar el query y hacer comparacion con aVar ((puede llegar vacio solo para seleccionar))
// aCampos -> contenedor de las var para el browse
// aTitulos -> contenedor de los titulos de las columnas
LOCAL oWnd
LOCAL oDlg
LOCAL oBrow
LOCAL cCodigo := aVar//SPACE(10) // CONTENEDOR QUE RETORNARA EL VALOR SELECCIONADO
LOCAL cSqlCmd // COMANDO QUE SE EJECUTARA EN SQL PARA CONSULTA...
LOCAL cQry // PARA HACER LA CONSULTA EN MYSQL...
LOCAL oError // CAPTURA LOS ERRORES DE MYSQL...
LOCAL aBtn[2]
//-------- INICIO CONEXION MYSQL Y CREACION DE LA CONSULTA --------------
IF EMPTY( aVar ) //.AND. EMPTY( cCampo )
cSqlCmd := "SELECT * FROM "+cTabla+" ORDER BY "+aCampos[1]+" ASC"
ELSE
cSqlCmd := "SELECT * FROM "+cTabla+" ORDER BY "+cCampo+" ASC"
ENDIF
TRY // INTENTO CONECTARME CON LA BASE DE DATOS...
cQry := TDolphinQry():New( cSqlCmd, oDatos:oConex ) //REALIZA CONSULTA CON TDolphin
CATCH oError // CAPTURA EL ERROR Y LO MUESTRO CON msgstop()
MSGALERT( "Error en Consulta, Sentencia: " + CRLF + CRLF + cSqlCmd, oDatos:cTitMsg )
RETURN( NIL )
END
//-------- HASTA ACA CONEXION MYSQL, ESTO ES LO IMPORTANTE PARA USO DE LAS TABLAS -----
// VERIFICO SI TABLA TIENE REGISTROS...
IF cQry:LastRec() = 0
MSGINFO( " No hay Registros Cargados en Tabla..." + cTabla, oDatos:cTitMsg )
RETURN ( cCodigo )
ENDIF
DEFINE DIALOG oDlg RESOURCE "DLG_BRW" of oWnd ; // DEFINICION DEL oDlg
TITLE "Seleccione " + aTitulos[1]
// DEFINICION DEL xBROWSE CON DATA
oBrow := TXBrowse():New( oDlg )
WITH OBJECT oBrow
:SetDolphin( cQry, .t., .t., aCampos ) // aCampos es pasado como parametros por la funcion que llama...
:nMarqueeStyle := MARQSTYLE_HIGHLROW
:nColDividerStyle := LINESTYLE_BLACK
:nStretchCol := STRETCHCOL_LAST
:lColDividerComplete := .t.
:nHeaderHeight := 30
:l2007 := .t.
:lFooter := .t.
:lRecordSelector := .t.
:bClrStd := {|| IF( cQry:RecNo() % 2 == 0, {CLR_BLACK, CLR_WHITE}, {0, RGB(203,226,254)} ) }
:bKeyDown := {|nKey| IIF( nkey == 13 ,; // SI PULSA Enter
( cCodigo := cValToChar( cQry:FieldGet( aCampos[1]) ), oDlg:End() ), ) }
END WITH
oBrow:aCols[1]:cHeader := aTitulos[1]
oBrow:aCols[1]:bStrData := {|| IIF( cQry:LastRec() > 0, cValToChar(cQry:FieldGet( aCampos[1] )), ) }
oBrow:aCols[1]:nHeadStrAlign := AL_LEFT
oBrow:aCols[1]:nDataStrAlign := AL_LEFT
oBrow:aCols[2]:cHeader := aTitulos[2]
oBrow:aCols[2]:bStrData := {|| IIF( cQry:LastRec() > 0, cValToChar(cQry:FieldGet( aCampos[2] )), ) }
oBrow:aCols[2]:nHeadStrAlign := AL_LEFT
oBrow:aCols[2]:nDataStrAlign := AL_LEFT
oBrow:CreateFromResource(100)
// FIN DEFINICION DEL xBROWSE CON DATA
//------ DEFINICION DE LOS BOTONES -------------------------
// BOTON SELECCIONAR
REDEFINE BUTTONBMP aBtn[1] ID 201 OF oDlg UPDATE ;
ACTION ( cCodigo := cQry:FieldGet( aCampos[1] ), oDlg:End() ) ;
BITMAP 2006 PROMPT "&Seleccionar" TEXTRIGHT
// BOTON CALCELAR
REDEFINE BUTTONBMP aBtn[2] ID 202 OF oDlg UPDATE ;
ACTION ( oDlg:End() ) ;
BITMAP 2004 PROMPT "Cancelar" TEXTRIGHT
aBtn[2]:lCancel := .T. // PARA CERRAR DIALOGO BOTON Cancelar
//------ FIN DEFINICION DE LOS BOTONES -------------------------
ACTIVATE DIALOG oDlg CENTER
cQry:End() // CIERRO LA CONSULTA
RETURN ( cCodigo ) // FIN MAESTRO
Codigo
FUNCTION novacio( cVar ) // VALIDA CAMPO NO QUEDE VACIO
IF EMPTY( cVar )
MSGALERT( "Campo no puede quedar Vacio.", oDatos:cTitMsg )
RETURN ( .F. )
ENDIF
RETURN ( .T. ) // FIN VALIDA CAMPO NO QUEDE VACIO
Codigo
FUNCTION buscar( cVar, cTabla, cCampo ) // BUSCA UN VALOR Y DEVUELVE EL REGISTRO COMPLETO PARA USAR LOS DEMAS DATOS DEL REGISTRO
// ULTIMA MODIFICACION Y ADAPTACION 23/08/2011
// DEVUELVE array CON VALOR LOGICO Y QUERY...
// SI {.t., query} ENCONTRO VALOR ENTRADO
//
// cVar := CONTROLA EL CAMPO POR EL CUAL SE HACE LA VALIDACION, ES DECIR ES EL CAMPO CLAVE
// EN CADA UNA DE LAS TABLAS, INCLUIDA POR JLY 07/03/2011
// cTabla := CONTROLA TABLA SOBRE LA CUAL SE HARA LA BUSQUEDA
// cCampo := CONTROLA CAMPO POR EL CUAL SE HARA LA BUSQUEDA EN LA TABLA
LOCAL cSqlCmd, cQry, oError, lExiste := .F.
IF LEN( ALLTRIM( cValToChar( cVar ) ) ) > 0 // SI ESCRIBIO ALGO HAGO query ...SINO RETORNO .f.
cSqlCmd := "SELECT * FROM "+cTabla+" ORDER BY "+cCampo+" ASC" // ORDENO LA TABLA ASCendente
TRY // INTENTO CONECTARME CON LA BASE DE DATOS...
cQry := TDolphinQry():New( cSqlCmd, oDatos:oConex ) //REALIZA CONSULTA CON TDolphin
CATCH oError // CAPTURA EL ERROR Y LO MUESTRO CON msgstop()
MSGALERT( "Error en Funcion buscar(), Sentencia: " + CRLF + CRLF + cSqlCmd, oDatos:cTitMsg )
RETURN( {.F., NIL} )
END
// VERIFICO SI TABLA TIENE REGISTROS...
IF cQry:LastRec() = 0
MSGINFO( " No hay Registros Cargados en Tabla..." + cTabla, oDatos:cTitMsg )
RETURN( {.F., cQry} )
ENDIF
IF cQry:Seek( cVar, cCampo ) = 0 // NO ENCONTRO VALOR ENTRADO
MSGALERT("Valor no existe...")
RETURN( {.F., cQry} )
ELSE
* msginfo("encontrado")
lExiste := .T.
ENDIF
ENDIF
RETURN( {lExiste, cQry} )
Dios no está muerto...
Gracias a mi Dios ante todo!