- si se entra ENTER y el campo es obligatorio llamara la tabla con un xbrowse para seleccionar un valor
- si se coloca un VALOR que no existe en la tabla te hara lo mismo, asi se obliga al usuario a seleccionar un dato si es necesario y no tiene que recordar tanto...
- si se coloca un VALOR que exista en la tabla entonce trae en este caso al campo siguiente el nombre del valor colocado en el get del codigo, este ejemplo lo hice con una tabla de proveedores, el cual solo me interesa obtener el codigo para grabarlo en otra tabla, el nombre es solo para mostrarlo sin guardarlo
Esta trabajado sobre tdolphin pero se puede adaptar a DBF, ADO o lo que quieran, cualquier duda estoy a la orden, no es nada del otro mundo, pero se que a alguien le servira asi como me sirvio a mi, saludos...
abro la tabla de proveedores
- Code: Select all Expand view
- cQryProvee := "SELECT * FROM proveedores ORDER BY pro_codigo ASC"
TRY
oQryProvee := TDolphinQry():New( cQryProvee, oDatos:oConex )
CATCH oError
MSGALERT( oError:description() + CRLF + CRLF + ;
"Error Ejecución de Sentencia en Tabla (proveedores): " + ;
CRLF + CRLF + cQryProvee, oDatos:cTitMsg )
RETURN
END
validacion en el GET
- Code: Select all Expand view
REDEFINE GET aGet[2] VAR aVar[2] ID 102 OF oFldx:aDialogs[1] UPDATE PICT "@!" ; // COD.PROVEEDOR
ACTION ( oQBtn := llamabrow( aVar[2], "proveedores", "pro_codigo" ,;
{"pro_codigo", "pro_nombre"} ,;
{"Código", "Nombre"} ) ,;
IIF( !oQBtn[1] ,;
( alert("DEBE SELECCIONAR PROVEEDOR...") ,;
aVar[3] := NIL, aGet[3]:REFRESH(), .f. ) ,;
( aVar[2] := oQBtn[2]:pro_codigo, aGet[2]:REFRESH() ,;
aVar[3] := oQBtn[2]:pro_nombre, aGet[3]:REFRESH() ,;
aGet[4]:SetFocus(), .t. ) ) ) ;
VALID ( IIF( oQryProvee:Seek(aVar[2], "pro_codigo") == 0 ,;
( oQBtn := llamabrow( aVar[2], "proveedores", "pro_codigo" ,;
{"pro_codigo", "pro_nombre"} ,;
{"Código", "Nombre"} ) ,;
( IIF( !oQBtn[1] ,;
( alert("DEBE SELECCIONAR PROVEEDOR...") ,;
aVar[3] := NIL, aGet[3]:REFRESH(), .f. ) ,;
( aVar[2] := oQBtn[2]:pro_codigo, aGet[2]:REFRESH() ,;
aVar[3] := oQBtn[2]:pro_nombre, aGet[3]:REFRESH(), .t. ) ) ) ) ,;
( alert("ENTRO VALOR QUE EXISTE") ,;
aVar[2] := oQryProvee:pro_codigo, aGet[2]:REFRESH() ,;
aVar[3] := oQryProvee:pro_nombre, aGet[3]:REFRESH(), .t. ) ) )
funcion que muestra el xbrowse para seleccionar
- Code: Select all Expand view
- FUNCTION llamabrow( aVar, cTabla, cCampo, aCampos, aTitulos ) // FUNCION PARA LLAMAR BROWSE EN BOTON DE GET...
// DEVUELVE ARRA
// 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, oDlg, oBrow, cSqlCmd, oQry, oError, ;
aBtn[2] ,;
lSelec := .f.
cSqlCmd := "SELECT * FROM " + cTabla + " ORDER BY " + cCampo + " ASC"
TRY
oQry := TDolphinQry():New( cSqlCmd, oDatos:oConex )
CATCH oError
MSGALERT( oError:description + CRLF + CRLF +;
"Error en Consulta, Sentencia: " + CRLF + CRLF + cSqlCmd, oDatos:cTitMsg )
RETURN( {.f., NIL} )
END
IF oQry:LastRec() = 0
MSGINFO( "No hay Registros Cargados en Tabla..." + cTabla, oDatos:cTitMsg )
RETURN( {.f., NIL} )
ENDIF
DEFINE DIALOG oDlg RESOURCE "DLG_BRW" of oWnd ;
TITLE " Seleccione " + aTitulos[1]
oBrow := TXBrowse():New( oDlg )
WITH OBJECT oBrow
:SetDolphin( oQry, .t., .t., aCampos )
:nMarqueeStyle := MARQSTYLE_HIGHLROW
:nColDividerStyle := LINESTYLE_BLACK
:nStretchCol := STRETCHCOL_LAST
:lColDividerComplete := .t.
:nHeaderHeight := 30
:l2007 := .t.
:lFooter := .t.
:lRecordSelector := .t.
:bClrStd := {|| IF( oQry:RecNo() % 2 == 0, {CLR_BLACK, CLR_WHITE}, {0, RGB(203,226,254)} ) }
:bKeyDown := {|nKey| IIF( nkey == 13 ,; // Si Pulsa ENTER
( lSelec := .t., oDlg:End() ), ) }
:bLDblClick := {|| ( lSelec := .t., oDlg:End() ) }
END WITH
oBrow:aCols[1]:cHeader := aTitulos[1]
oBrow:aCols[1]:bStrData := {|| IIF( oQry:LastRec() > 0, cValToChar( oQry: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( oQry:LastRec() > 0, cValToChar( oQry:FieldGet( aCampos[2] ) ), ) }
oBrow:aCols[2]:nHeadStrAlign := AL_LEFT
oBrow:aCols[2]:nDataStrAlign := AL_LEFT
oBrow:CreateFromResource(100)
// BOTON SELECCIONAR
REDEFINE BUTTONBMP aBtn[1] ID 201 OF oDlg UPDATE ;
ACTION ( lSelec := .t., oDlg:End() ) ;
BITMAP 2006 PROMPT "Seleccionar"
// BOTON CALCELAR
REDEFINE BUTTONBMP aBtn[2] ID 202 OF oDlg UPDATE ;
ACTION ( lSelec := .f., oDlg:End() ) ;
BITMAP 2004 PROMPT "Cancelar"
aBtn[2]:lCancel := .t.
ACTIVATE DIALOG oDlg CENTER
oQry:End()
RETURN( {lSelec, oQry} ) // FIN FUNCION PARA LLAMAR BROWSE EN BOTON DE GET...
luego le agregare en el xbrowse una busqueda secuencial, si alguien lo mejora, super...
espero alguien pueda sacarle provecho...
Uploaded with ImageShack.us[/img]
Uploaded with ImageShack.us[/img]
Uploaded with ImageShack.us[/img]